Различия между версиями 4 и 5
Версия 4 от 2017-01-15 16:29:43
Размер: 5534
Редактор: FrBrGeorge
Комментарий:
Версия 5 от 2017-01-15 16:43:44
Размер: 5765
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 67: Строка 67:
 Операция `++wrap` отличается от `wrap++~ тем, что значение wrap ''сначала увеличивается'', а потом только участвует в вычислении выражения (т. е. при первом же сравнении `wrap` равно уж не 0, а 1)  Операция `++wrap` отличается от `wrap++` тем, что значение `wrap` ''сначала увеличивается'', а потом только участвует в вычислении выражения (т. е. при первом же сравнении `wrap` равно уж не `0`, а `1`)
Строка 77: Строка 77:
 1*1=1 2*1=2 3*1=3 4*1=1
 1*2=2 2*2=4 3*2=6 4*2=8
 1*3=3 2*3=6 3*3=9 4*3=12
 ... ... ... ...
 5*1=5 6*1=6 7*1=7 8*1=8
 5*2=10 6*2=12 7*2=14 8*2=16
 5*3=15 6*3=18 7*3=21 8*3=24
 ... ... ... ...
 9*1=5 10*1=10 11*1=11 12*1=12
 9*2=10 10*2=20 11*2=22 12*2=24
 9*3=15 10*3=30 11*3=33 12*3=36
 ... ... ... ...
 1*1=1 2*1=2 3*1=3 4*1=1
 1*2=2 2*2=4 3*2=6 4*2=8
 1*3=3 2*3=6 3*3=9 4*3=12
 ... ... ... ...
 1*12=12 2*12=24 3*12=36 4*12=48
                              
 5*1=5 6*1=6 7*1=7 8*1=8
 5*2=10 6*2=12 7*2=14 8*2=16
 5*3=15 6*3=18 7*3=21 8*3=24
 ... ... ... ...
 5*12=60 6*12=72 7*12=84 8*12=96
                              
 9*1=5 10*1=10 11*1=11 12*1=12
 9*2=10 10*2=20 11*2=22 12*2=24
 9*3=15 10*3=30 11*3=33 12*3=36
 ... ... ... ...
 9*12=108 10*12=120 11*12=121 12*12=144

Вложенные циклы

  • (разбор Д/З)
  • Невложенный цикл по вводу (просто упражнение): ввести последовательность натуральных чисел, заканчивающуюся нулём. Посчитать количество нечётных чисел.
       1 #include <stdio.h>
       2 
       3 int main(int argc, char *argv[]) {
       4   int n, count;
       5 
       6    count = 0;
       7    scanf("%d", &n);
       8    while (n) {
       9        if(n%2==1) count++;
      10        scanf("%d", &n);
      11   }
      12   printf("Odds: %d\n", count);
      13   return 0;
      14 }
    

    Обратите внимание на то, что n — переменная, участвующая в условии. Таким образом scanf("%d", &n) становится в канонической схеме цикла и изменением, и инициализацией и поэтому встречается в тексте программы дважды. Избежать этого нельзя, потому что данные сначала надо ввести, потом проверить, а потом только обработать, и затем уже ввести новые.

  • Вложенные циклы — это просто выполнение одного цикла внутри другого. В следующем примере функция printf() будет вызвана 3*4==20 раз:

       1 #include <stdio.h>
       2 
       3 int main(int argc, char *argv[]) {
       4   int i,j;
       5 
       6   for (i=1; i<=4; i++)
       7     for (j=1; j<=5; j++)
       8       printf("%d*%d=%d\n", i, j, i*j);
       9 }
    

    Заметим, что функции printf() передаются четыре параметра — форматная строка и три числа (выражение i*j предварительно вычисляется). Каждое из этих чисел выводится printf-ом на месте соответствующего %d.

    • Таблица умножения в столбик — это не слишком красиво. Попробуем выводить всё умножение на j в одну строку, а перевод строки выводить в конце каждого внутреннего цикла. Параллельно заметим, что числа по %d выводятся разной длины, что портит таблицу. Воспользуемся явным указанием количества знакомест:

       1 #include <stdio.h>
       2 
       3 int main(int argc, char *argv[]) {
       4   int i,j;
       5 
       6   for (i=1; i<=4; i++) {
       7     for (j=1; j<=5; j++)
       8       printf("%2d *%2d = %3d  ", i, j, i*j);
       9     printf("\n");
      10   }
      11 }
    
  • Если попытаться вывести таким образом полную таблицу умножения от 1 до 12, получится некрасиво (строка будет слишком длинная). На самом деле место вывода перевода строки не должно быть привязано к концу внутреннего цикла. Заведём отдельный счётчик формул, и когда он будет равен 4, станем обнулять его и выводить перевод строки:
       1 #include <stdio.h>
       2 
       3 int main(int argc, char *argv[]) {
       4   int i, j, wrap;
       5 
       6   wrap = 0;
       7   for (i=1; i<=12; i++)
       8     for (j=1; j<=12; j++) {
       9       printf("%2d *%2d = %3d  ", i, j, i*j);
      10       if(++wrap==4) {
      11         wrap = 0;
      12         printf("\n");
      13       }
      14     }
      15 }
    

    Операция ++wrap отличается от wrap++ тем, что значение wrap сначала увеличивается, а потом только участвует в вычислении выражения (т. е. при первом же сравнении wrap равно уж не 0, а 1)

Домашнее задание

  1. (тренировочное упражнение) Посчитать сумму цифр числа

  2. Ввести последовательность натуральных чисел, заканчивающуюся нулём. Посчитать сумму всех цифр в последовательности.

  3. (тренировочное упражнение) ввести число N, проверить, является ли оно простым (поделить на все возможные делители от 2 до N/2; на самом деле до корень из N, но корни мы ещё не умеем извлекать)
  4. Вводится последовательность положительных чисел, завершающаяся 0. Посчитать количество простых чисел среди них
  5. <!> Вывести таблицу умножения «как в тетради», т. е.

     1*1=1     2*1=2     3*1=3     4*1=1
     1*2=2     2*2=4     3*2=6     4*2=8
     1*3=3     2*3=6     3*3=9     4*3=12
     ...       ...       ...       ...
     1*12=12   2*12=24   3*12=36   4*12=48
                                  
     5*1=5     6*1=6     7*1=7     8*1=8
     5*2=10    6*2=12    7*2=14    8*2=16
     5*3=15    6*3=18    7*3=21    8*3=24
     ...       ...       ...       ...
     5*12=60   6*12=72   7*12=84   8*12=96
                                  
     9*1=5     10*1=10   11*1=11   12*1=12
     9*2=10    10*2=20   11*2=22   12*2=24
     9*3=15    10*3=30   11*3=33   12*3=36
     ...       ...       ...       ...
     9*12=108  10*12=120 11*12=121 12*12=144

LecturesVMSH/C/2017-01-13 (последним исправлял пользователь FrBrGeorge 2017-01-15 16:43:44)