Язык Си в примерах/Таблица умножения: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Revert to revision 25925 dated 2008-01-07 17:49:26 by MaxSem using popups
м Категоризация по запросу на w:ВП:РДБ
Строка 136: Строка 136:
}
}
</source>
</source>
[[Категория:Язык Си в примерах|Таблица умножения]]

Версия от 10:24, 27 сентября 2009

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры

Задача: вывести на экран компьютера таблицу умножения размера n x n, где n вводит пользователь с клавиатуры.

Решение задачи:

 /* Программа 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;
 }

Переменные i и j соответствуют номеру строчки и номеру столбца.

Здесь мы встречаемся с циклом в цикле. Переменная внешнего цикла i сначала равна 1. Начинает работу внутренний цикл

        for(j = 1; j <= n ; j++) {
             printf ("%5d", i * j);
        }

— он печатает первую строчку таблицы.

Переменная внутреннего цикла j меняется от 1 до n включительно. При этом для каждого значения j печатается на экран результат произведения i * j.

формат вывода определяется как "%5d", что означает "печатать целое число, выделяя под него 5 позиций". При этом, если в числе меньше, чем пять разрядов, то оно придвигается к правому краю, а слева добавляются пробелы.

Когда заканчивается внутренний цикл, происходит переход на новую строчку (команда =printf ("\n") ). После этого переменная внешнего цикла i увеличивает своё значение на 1 и становится равна 2. Затем снова запускается внутренний цикл, и печатается вторая строчка таблицы умножения.

Пример работы программы (пользователь ввёл число 5 ):

bash$ ./table
Введите 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

Обсуждение понятия видимости переменных

Переменную j можно было бы объявить внутри первого цикла:

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

Как только вы начинаете новый блок (открываете фигурную скобку), вы можете объявить новые переменные. Эти переменные будут видны только внутри данного блока, и их называют локальными переменными блока. При этом вполне допустима ситуация, когда вы объявляете преременную имя которой совпадает, с одной из переменной объявленной снаружи. В этом случае внутри блока данное имя связывается с локальной переменной, и операции с этой переменной никак не влияют на состояние внешней переменной:

 int main() {
     int a = 1;             // Внешняя (по отношению к следующему блоку) переменная
     {                      // Новый блок можно начинать в любом месте
        int a;              // Локальная переменная блока
        a = 2;
        printf("inside %d\n", a);
     }                     // Конец видимости локальной переменной a
     printf("outside %d\n", a);  // Будет напечатано неизменившееся значение внешней переменной, то есть 1;
 }

Задания

1. В программе "Таблица умножения" cтроку

 for(j = 1 ; j <= n; j++)

замените на

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

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

2. В программе "Таблица умножения" cтроку

 printf("%5d", i * j)

замените на

 printf(" %05d", i * j)

и посмотрите, что получится.

3. Прочитайте о форматах для печати целых чисел в документации. Чему соответствуют форматы "%-10d", "%010d", %08x" ?

4. Что выведет следующая программа? Результат объясните

  #include<stdio.h>
  int main() {
      int a = 1;
      if(a > 0) {
          int a = a; // удивительным образом в этой строчке присутствуют две разных переменных --
                     // внешняя и локальная -- с одинаковым именем.
          a++;
      }
      printf("%d\n", a); 
  }