2011-04-26 4 views
-1

Я изучаю C, и у меня с трудом понимаются циклы и использование modulo. Я знаю, что Loops используются для сокращения программы, и Modulo используются, чтобы вытащить оставшуюся часть. Мое задание состояло в том, чтобы «написать программу на C, чтобы найти сумму отдельного положительного целого».Loops and Modulo

Я просто потратил несколько часов, пытаясь понять эту проблему. Я тоже экспериментировал.

 
    int n,d=0,s=0; 
    printf("\nEnter a number\n\n"); 
    scanf("%d",&n);

while(n>0) { d = n%10; s = s+d; n = n/10; } printf("\n sum of the individual digits = %d",s);

Мои вопросы:

Может кто-нибудь помочь мне понять поток этой программы? Почему используется Modulo? и Почему существует п = п/10

Experiements я сделал:

Когда я удален д = п% 10; line выводит цифры seperatley. поэтому он не вычисляется.

123 = т.е. 6 -> Это дает мне 136

Когда я извлекал линию п = п/10 Это не показывает мне выход. В заявлении printf есть параметр 's'

Спасибо заранее!

+0

Попробуйте запустить код по строке под отладчиком (храните часы на переменных 'n',' d' и 's'). – pmg

+0

Если вы удалите 'd = n% 10', он будет печатать' 0', потому что вы никогда не изменяете 's', изначально' 0'. Если вы удалите 'n = n/10', он будет зацикливаться навсегда, потому что вы никогда не изменяете' n', что всегда равно> 0. Некоторые эксперименты могут быть полезны, но трудно понять, как это происходит. Лучше было бы вставить printf-инструкции, которые расскажут вам, какие различные значения находятся на каждом шаге (или научиться использовать отладчик). –

ответ

6

Принимая по модулю в d = n % 10 делает d равен последней цифре n в базе 10. n = n/10 удаляет последнюю цифру n.

Modulo по существу берет остаток, так что скажем n = 123. Затем n/10 - 12 и n % 10 - 3.

Удаление n = n/10 означает, что n не изменяется между каждым запуском цикла, так что условие цикла n > 0 всегда верно и, следовательно, цикл продолжает идти, пока вы вручную не убить программу.

Вот след программы с n = 123. Первоначально d и s равны нулю.

while (n > 0) { // n is 123, which is greater than zero, so we enter the loop 
    d = n % 10; // 123 % 10 is 3, so d is now 3 
    s = s + d; // 0 + 3 is 3, so s is now 3 
    n = n/10; // 123/10 is 12, so n is now 12. 
}    // go back to the top of the loop 
while (n > 0) { // n is 12, which is still greater than zero 
    d = n % 10; // 12 % 10 is 2, so d is now 2 
    s = s + d // 3 + 2 is 5, so s is now 5 
    n = n/10; // 12/10 is 1, so n is now 1 
}    // go back to the top again 
while (n > 0) { // n is 1, which is still greater than zero 
    d = n % 10; // 1 % 10 is 1, so d is now 1 
    s = s + d; // 5 + 1 is 6, so s is now 6 
    n = n/10; // 1/10 is 0, so n is now 0 
}    // go back to the top 
while (n > 0) { // n is 0, which is not greater than zero, so we skip 
        // to after the loop body 
printf("\n sum of the individual digits = %d",s); 
+0

@hammer - визуальное представление может помочь. Мне трудно понять это. Можете ли вы на самом деле представить нам пример и показать мне, как он вычисляет? –

+1

@ Dylan Попробуйте выполнить поиск цифр на небольшом количестве на бумаге. Это может помочь вам понять, что происходит. Используйте 12, а затем 123, затем 1234. Думайте о 12 как о том, сколько 10 в двенадцать? Один, оставшийся 2. Это все подразделение, которое по модулю покупает вас. – jonsca

+0

Спасибо @hammer! –

2

Представьте, что у вас есть листок бумаги с отверстием в нем, достаточно большим, чтобы показать одну цифру. Чтобы получить сумму цифр, вы должны поместить эту бумагу над своим номером, чтобы показать цифру. Вы пишете эту цифру где-то. Затем вы сдвигаете свой номер вправо, чтобы десятки были под отверстием. Вы добавляете это к предыдущей цифре, которую вы записали, и так далее, пока осталось больше цифр.

Бумага с отверстием - это операция по модулю, а скользящее число справа на каждом шаге - деление на 10 операций.

И дать конкретный пример вычисления:

произнесите номер 576.

576 % 10 = 6 

поэтому мы снимали 6 и мы добавим, что к запущенной сумме 0, чтобы получить 6. Тогда вы целочисленное деление на 10:

576/10 = 57 

Теперь вы по модулю, что:

57 % 10 = 7 

поэтому мы снимали 7 и можно добавить, что к запущенной сумме 6, чтобы получить 13. Тогда это целочисленное деление на 10 разы:

57/10 = 5 

И снова по модулю:

5 % 10 = 5 

Мы снимали последнюю цифру и добавить его в текущей сумму, чтобы получить 18 - сумма цифр. Затем мы делим на 10 раз:

5/10 = 0 

И так как это нуль, условие цикла (n > 0) теперь ложно и мы в конце концов.

Таким образом, модуль используется для выбора самой правой цифры текущего номера, а деление используется для того, чтобы каждая цифра в свою очередь была самой правой цифрой.

0

Попробуйте эти:

int n = 12; 
printf("%d\n", n/10); 

int j = 12; 
printf("%d\n", j % 10); 

int x = 13; 
x = x/10; // right hand side of "=" get evaluated first 
printf("%d\n", x); 

Обратите внимание на выход в каждом конкретном случае.

Что касается последнего пункта:

while (n > 0) 
{ 
    // some code. 
} 

Это означает: В то время как значение n больше нуля пробег some code. Теперь, если вы не измените n, some code будет работать вечно. HTH.