Язык Си в примерах/Таблица умножения: различия между версиями
Greck (обсуждение | вклад) Нет описания правки |
Поставил теги <source> |
||
Строка 5: | Строка 5: | ||
Решение задачи: |
Решение задачи: |
||
<source lang="c"> |
|||
/* Программа table.c "Таблица умножения" */ |
/* Программа table.c "Таблица умножения" */ |
||
#include <stdio.h> |
#include <stdio.h> |
||
Строка 20: | Строка 21: | ||
return 0; |
return 0; |
||
} |
} |
||
</source> |
|||
Переменные <tt>i</tt> и <tt>j</tt> соответствуют номеру строчки и номеру столбца. |
Переменные <tt>i</tt> и <tt>j</tt> соответствуют номеру строчки и номеру столбца. |
||
Строка 60: | Строка 61: | ||
Переменную <tt>j</tt> можно было бы объявить внутри певрого цикла: |
Переменную <tt>j</tt> можно было бы объявить внутри певрого цикла: |
||
<source lang="c"> |
|||
/* Программа table.c "Таблица умножения" */ |
/* Программа table.c "Таблица умножения" */ |
||
#include <stdio.h> |
#include <stdio.h> |
||
Строка 76: | Строка 78: | ||
return 0; |
return 0; |
||
} |
} |
||
</source> |
|||
Как только вы начинаете новый блок (открываете фигурную скобку), вы можете объявить новые переменные. Эти переменные будут видны только |
Как только вы начинаете новый блок (открываете фигурную скобку), вы можете объявить новые переменные. Эти переменные будут видны только |
||
Строка 118: | Строка 120: | ||
4. Что выведет следующая программа? Результат объясните |
4. Что выведет следующая программа? Результат объясните |
||
<source lang="c"> |
|||
#include<stdio.h> |
#include<stdio.h> |
||
int main() { |
int main() { |
||
Строка 128: | Строка 131: | ||
printf("%d\n", a); |
printf("%d\n", a); |
||
} |
} |
||
</source> |
Версия от 16:08, 5 июня 2007
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
Задача: вывести на экран компьютера таблицу умножения размера 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);
}