LINUX.ORG.RU

Не могу понять один момент в учебном исходнике Си.

 


0

0

В данный момент учусь по книге «Язык Си в примерах». В одном из уроков был предложен следующий исходник:

/* Программа table.c "Таблица умножения" */
 #include <stdio.h>
 int main()
 {
     int i, j, n; 
     printf ("Введите n: ");
     scanf ("%d", &n);  
     for(i = 1; i <= n ; i++) {
         for(j = 1; j <= n ; j++) {
              printf ("%5d", i * j);
         }
         printf("\n");
     }
     return 0;
 }

Потом в уроке объяснялся механизм работы программы. Типа «вот этот фрагмент кода делает это, а вот этот - вот это.» Сама же суть работы программы проста. Она просто использует введенное целое число для создания таблицы умножения от 1 до этого_самого_числа. Вот пример:

Введите n: 5
    1    2    3    4    5
    2    4    6    8   10
    3    6    9   12   15
    4    8   12   16   20
    5   10   15   20   25

Потом в задании было написано заменить строчку

 for(j = 1 ; j <= n; j++)
на
 for(j = n ; j > -n; j--)

и

Посмотрите что получилось.

Посмотрел. Получилось действительно интересно.

Введите n: 5
    5    4    3    2    1    0   -1   -2   -3   -4
   10    8    6    4    2    0   -2   -4   -6   -8
   15   12    9    6    3    0   -3   -6   -9  -12
   20   16   12    8    4    0   -4   -8  -12  -16
   25   20   15   10    5    0   -5  -10  -15  -20

Насчет отрицательных чисел все ясно. Но только мне непонятна причина возникновения последовательности «5 10 15 20». Если ввести 3, то последовательность будет «3 6 9». Почему так? Я вообще без понятий. Мне казалось, что горизонтальные строки должны были быть пронумерованы от 1 до введенного_числа



Последнее исправление: aaz893 (всего исправлений: 6)

А ты голову поверни на 90 градусов по часовой стрелке, продолжая глядеть в монитор.
И будет тоже самое (то что слево от нулей), честно!

nerdogeek
()

Строки стали колонками. И это не может не радовать.
Лучше java учи, больше будет возможностей к успеху в жизни потом придти, чем на ц.

nerdogeek
()
Ответ на: комментарий от nerdogeek

Лучше пусть учит и с и java. А точнее даже с++. На первом писать себе домашний софт ради удовольствия, а на java зарабатывать.

f1xmAn ★★★★★
()

Все неясности от невнимательности. Наше ассоциативное мышление иногда подводит, выдавая желаемое за действительное. Для того, чтобы понять как всё работает, выпиши вручную все значения перемножаемых переменных, посмотри как они получаются, т.е. прокрути программу в голове. Только так можно понять нюансы.

glibych ★★
()
Ответ на: комментарий от glibych

прокрути программу в голове

Я этим и занимался. Не помогло. Поэтому и прошу помощи. Насколько я понял, выполнение внутреннего for не должно влиять на внешний for. И уж тем более, это изменение ну никак не должно влиять на переменную «i».

aaz893
() автор топика

горизонтальные столбцы

wwhaat?

see on

printf(«\n»);

it end of line so Jfor is line , Ifor is vertical.

if u change Jfor on :

for(j = 1 ; j > -n; j--)

u get 1 column :

1

2

3

4

.

.

.

.

n

qulinxao ★★☆
()
Ответ на: комментарий от aaz893

мне непонятна причина возникновения последовательности «5 10 15 20». Если ввести 3, то последовательность будет «3 6 9».

Первые пять иттераций при начальном n=5:

1. i=1 j=5

2. i=2 j=5

3. i=3 j=5

1*5=5 2*5=10 3*5=15

Все правильно.

Смотри распечатку i по иттерациям:

Введите n: 5
    1    1    1    1    1    1    1    1    1    1
    2    2    2    2    2    2    2    2    2    2
    3    3    3    3    3    3    3    3    3    3
    4    4    4    4    4    4    4    4    4    4
    5    5    5    5    5    5    5    5    5    5

А так меняется j:

Введите n: 5
    5    4    3    2    1    0   -1   -2   -3   -4
    5    4    3    2    1    0   -1   -2   -3   -4
    5    4    3    2    1    0   -1   -2   -3   -4
    5    4    3    2    1    0   -1   -2   -3   -4
    5    4    3    2    1    0   -1   -2   -3   -4
glibych ★★
()
Ответ на: комментарий от aaz893

Там и нет влияния. Цикл for в любом случае выполняется 1 раз.

glibych ★★
()
Ответ на: комментарий от qulinxao

Годы тренировок на программируемом MK-64 не пропали даром и переросли в увлечение программированием. А ведь не сразу даже вообразишь какие задачи в 105 машинных кодов могут умещатся)))

glibych ★★
()
Ответ на: комментарий от glibych

Ошибся малость)

Первые пять иттераций

[fix] Первые три иттерации [/fix]

glibych ★★
()
Ответ на: комментарий от f1xmAn

Мне не нравится java - сложные приложения на этом языке по волшебным обстоятельствам получаются тормозными. Правда сам даже не пытался его изучать по этой причине.

glibych ★★
()

Мне казалось, что горизонтальные строки должны были быть пронумерованы от 1 до введенного_числа

Не должны, это был результат умножения на единицу. Тут он же в 4м столбце.

Kalashnikov ★★★
()
Ответ на: комментарий от glibych

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

f1xmAn ★★★★★
()

Я чего-то не понимаю или тебя удивляет почему 5*2=10, 5*3=15 и т. д.?

DesertFox
()
Ответ на: комментарий от glibych

Годы тренировок на программируемом MK-64 не пропали даром и переросли в увлечение программированием. А ведь не сразу даже вообразишь какие задачи в 105 машинных кодов могут умещатся)))

Да у Вас было детство буржуя! А на Б3-21 не хотите покодить? 60 шагов памяти... Зато когда отец принес на одну ночь МК-64, это был пир духа, у меня в него влезла 2D посадка на луну со сложным рельефом!

AIv ★★★★★
()

Ни хрена не понял, что тут не понятно…

Eddy_Em ☆☆☆☆☆
()

Начинали бы вы с K&R, ибо пример, честно говоря, какой-то уёбищный и мнится мне, что и вся книга написана в том же ключе.

Данная программа n раз (for (i = 1; i <= n; i++)) вызывает 2 оператора:

1. Вложенный цикл (for (j = n; j > -n; j--)), который при каждом вызове 2n раз (от n до -n, не включая -n) печатает (printf («%5d», i * j)) произведение текущих значений переменных i и j.

2. Функцию печатающую символ новой строки '\n'.

Допустим n равно 5, тогда на первой итерации внешнего цикла (т.е. для i равного 1), внутренний цикл будет работать так:

j = n = 5,      i * j = 1 *  5 =  5, печатаем  5
j = j - 1 =  4, i * j = 1 *  4 =  4, печатаем  4
j = j - 1 =  3, i * j = 1 *  3 =  3, печатаем  3
j = j - 1 =  2, i * j = 1 *  2 =  2, печатаем  2
j = j - 1 =  1, i * j = 1 *  1 =  1, печатаем  1
j = j - 1 =  0, i * j = 1 *  0 =  0, печатаем  0
j = j - 1 = -1, i * j = 1 * -1 = -1, печатаем -1
j = j - 1 = -2, i * j = 1 * -2 = -2, печатаем -2
j = j - 1 = -3, i * j = 1 * -3 = -3, печатаем -3
j = j - 1 = -4, i * j = 1 * -4 = -4, печатаем -4
j = j - 1 = -5, -5 не больше -n, выходим из цикла

После завершения работы внутреннего цикла, вызывается функция printf(«\n»), переводящая курсор на новую строчку. Внешний цикл начинает вторую итерацию, внутренний цикл работает так же, но на этот раз i равно 2:

j = n = 5,      i * j = 2 *  5 = 10, печатаем 10
j = j - 1 =  4, i * j = 2 *  4 =  8, печатаем  8
j = j - 1 =  3, i * j = 2 *  3 =  6, печатаем  6
j = j - 1 =  2, i * j = 2 *  2 =  4, печатаем  4
j = j - 1 =  1, i * j = 2 *  1 =  2, печатаем  2
j = j - 1 =  0, i * j = 2 *  0 =  0, печатаем  0
j = j - 1 = -1, i * j = 2 * -1 = -2, печатаем -2
j = j - 1 = -2, i * j = 2 * -2 = -4, печатаем -4
j = j - 1 = -3, i * j = 2 * -3 = -6, печатаем -6
j = j - 1 = -4, i * j = 2 * -4 = -8, печатаем -8
j = j - 1 = -5, -5 не больше -n, выходим из цикла

И т.д. пока i не станет больше n, что приведёт к выходу из внешнего цикла.

Nebuchadnezzar ★★★★
()
Последнее исправление: Nebuchadnezzar (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.