В настоящее время я работаю над «Принципами программирования и практикой использования C++» Бьярна Страуструпа. Одно из упражнений «попробуй это» — реализовать квадратную функцию без использования оператора умножения. Я нашел решение:
int archaic_square(int v) {
int total = 0;
for (int i = 0; i < v; ++i) {
total += v;
}
return total;
}
int main() {
for (int i = 0; i < 100; ++i) {
cout << i << '\t' << archaic_square(i) << '\n';
}
}
Я знаю, что это работает и выводит квадрат целых чисел от 0 до 99, но я не понимаю, как это работает. Может ли кто-нибудь объяснить, что именно выводит функция, а также какая переменная total
будет при увеличении v
?
Я пробовал делать это на бумаге и работал над этим. Учитывая, что v
увеличивается на 1, как ввод v = 2
в функцию возвращает 4? Я, кажется, получаю 3 всякий раз, когда я работаю над этим вручную.
Я уверен, что это довольно простая проблема, я только начинаю и пытаюсь понять этот язык.
archaic_square()
устанавливает total
в ноль, а затем добавляет v
к total
ровно v
раз.
Секретное оружие программиста — отладчик. Отладчик позволяет вам запускать программу с контролируемой вами скоростью, чтобы вы могли не отставать и наблюдать за всем, что делает программа, как она это делает. Как видно из названия, он отлично подходит для отладки, но также бесценен для понимания логики кода без ошибок.
Если вы сомневаетесь, я бы посоветовал вам распечатать значение для каждой итерации внутри функции,
int archaic_square(int v) {
int total = 0;
for (int i = 0; i < v; ++i) {
total += v;
std::cout << "total= " << total << " where i= " << i << " \n"; // --- HERE ----
}
return total;
}
вы должны увидеть вывод как
2 where i= 0
4 where i= 1
(когда v передается как 2)
В функции archaic_square
я начинаю с 0, и это цикл повторяется v
раз, и каждый раз общее количество становится total
плюс v
, и это похоже на v * v
:
int archaic_square(int v) {
int total = 0;
for (int i = 0; i < v; i++) {
total += v;
}
return total;
}
Это просто, вы можете думать об умножении как:
например, я говорю 3 * 5
, это эквивалентно тому, что я говорю 5 + 5 + 5
или 3 + 3 + 3 + 3 +3
.
Точно так же эта функция суммирует N
количество N
раз. Например, скажем, я прошел v=5
.
Это будет работать следующим образом:
total= 5 + 5 + 5 + 5 + 5 = 25
.
Квадрат числа — это то же самое, что сложение этого числа столько раз, сколько это число. Это archaic_square(int v)
, и цель total
состоит в том, чтобы быть суммой добавления v
к себе v
раз. v
не увеличивается на 1 в этой функции, i
увеличивается.
В main
эта функция вызывается с i
, начиная с 0, добавляя 1 к себе в каждом цикле и продолжая, пока i
меньше 100. Оно не меньше 100, когда оно равно 100, поэтому оно останавливается на 99.
Важно отметить, что i
в archaic_square
не то же самое i
в main — это область видимости переменной. Они не знают друг друга. Важно отметить, что именно здесь важно int i
. Если бы вы использовали только i
, то ожидалось бы, что i
определено в другом месте за пределами этой области — вы получите сообщение об ошибке, если сделаете это здесь, и если вы сделаете это, а затем определите i
глобально, они будут мешать друг другу, и все это будет перерыв.
i
обычно используется как имя переменной цикла (итерации). так что вы увидите это много.
Следовательно: на консоль выводятся квадраты от 0 до 99.
Как новичок, это то, что я понял об этом решении после того, как много почесал голову, и я чувствую, что мой комментарий в этом коде функции является довольно хорошим объяснением для начинающих!
int archaic_square(int v)
{
int total =0;
for (int i = 0; i < v; ++i) //this loop will repeat v times (until i is less than v; keep increasing i)
{
total += v;
/*Let us take the example of v = 5. So variable 'i' (which is in the for loop) will keep incrementing by 1 if value is less than 5.
So loop will repeat 5 times. So each time loop repeats the new value of total will become
total = (total +5). This process will repeat 5 times. As value of the variable total is zero, the final value of total will be:
(total + 5) + (total + 5) + (total + 5) + (total + 5) + (total + 5).
[Since total value is 0, 5 is getting added 5 times, which is 25 which is 5 times 5]
Hence, this loop is doing multiplication.*/
}
return total;
}
Удачного кодирования!
Как получить результат 3 при отработке
archaic_square(2)
на бумаге? Это потому, что вы думаете, что «учитывая, что v увеличивается на 1»? Нет,i
увеличивается на 1.v
не меняется.