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

Содержимое удалено Содержимое добавлено
м формат
Нет описания правки
Строка 1:
Я считаю что [[Участник:Самохвалов|Cамохвалов]] тупой [[гомосексуал]]ист-педераст что [[Участник:Lvova|Анастасия Львова]] идиотка и она трахалась со [[Сталин]]ым и за это её ебали нацистские генералы [[Гитлер]]а ещё Самохвалова отъебли немцы-[[фашисты]] в немецком концлагере а потом отправили его в [[газенваген]]!
{{Содержание «Язык Си в примерах»}}
 
Задача: вывести на экран компьютера таблицу умножения размера n x n, где n вводит пользователь с клавиатуры.
 
Решение задачи:
 
<source lang="c">
/* Программа 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;
}
</source>
 
Переменные <tt>i</tt> и <tt>j</tt> соответствуют номеру строчки и номеру столбца.
 
Здесь мы встречаемся с циклом в цикле.
Переменная внешнего цикла <tt>i</tt> сначала равна 1.
Начинает работу внутренний цикл
 
<source lang="c">
for(j = 1; j <= n ; j++) {
printf ("%5d", i * j);
}
</source>
 
&mdash; он печатает первую строчку таблицы.
 
Переменная внутреннего цикла <tt>j</tt> меняется от 1 до <tt>n</tt> включительно.
При этом для каждого значения <tt>j</tt> печатается на экран результат произведения <tt>i * j</tt>.
 
формат вывода определяется как <tt>"%5d"</tt>, что означает "печатать целое число, выделяя под него 5 позиций". При этом, если в числе меньше, чем пять разрядов, то оно придвигается к правому краю,
а слева добавляются пробелы.
 
Когда заканчивается внутренний цикл, происходит переход на новую строчку
(команда =printf ("\n") ).
После этого переменная внешнего цикла <tt>i</tt> увеличивает своё значение на 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
 
==Обсуждение понятия ''видимости переменных''==
 
Переменную <tt>j</tt> можно было бы объявить внутри первого цикла:
 
<source lang="c">
/* Программа 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;
}
</source>
 
Как только вы начинаете новый блок (открываете фигурную скобку), вы можете объявить новые переменные. Эти переменные будут видны только
внутри данного блока, и их называют локальными переменными блока. При этом вполне допустима ситуация, когда вы объявляете преременную имя которой
совпадает, с одной из переменной объявленной снаружи. В этом случае внутри блока данное имя связывается с локальной переменной, и операции с этой переменной никак не влияют на состояние внешней переменной:
 
<source lang="c">
int main() {
int a = 1; // Внешняя (по отношению к следующему блоку) переменная
{ // Новый блок можно начинать в любом месте
int a; // Локальная переменная блока
a = 2;
printf("inside %d\n", a);
} // Конец видимости локальной переменной a
printf("outside %d\n", a); // Будет напечатано неизменившееся значение внешней переменной, то есть 1;
}
</source>
 
== Задания ==
 
1. В программе "Таблица умножения" cтроку
 
<source lang="c"> for(j = 1 ; j <= n; j++) </source>
 
замените на
 
<source lang="c"> for(j = n ; j > -n; j--) </source>
 
и посмотрите что получится.
 
2. В программе "Таблица умножения" cтроку
 
<source lang="c"> printf("%5d", i * j) </source>
 
замените на
 
<source lang="c"> printf(" %05d", i * j) </source>
 
и посмотрите, что получится.
 
3. Прочитайте о форматах для печати целых чисел в документации. Чему соответствуют форматы <tt>"%-10d"</tt>, <tt>"%010d"</tt>, <tt>%08x"</tt> ?
 
4. Что выведет следующая программа? Результат объясните
 
<source lang="c">
#include<stdio.h>
int main() {
int a = 1;
if(a > 0) {
int a = a; // удивительным образом в этой строчке присутствуют две разных переменных --
// внешняя и локальная -- с одинаковым именем.
a++;
}
printf("%d\n", a);
}
</source>