Пример 2.4: Программа находит наибольший общий делитель двух целых чисел.
#include
#include
int main ()
{
int x, y;
printf (“Введите два целых числа через пробел\n”);
int r = scanf (”%d%d”, &x, &y);
assert (r == 2);
while (x!= y)
printf (“НОД=%d\n”, x);
getchar ();
return 0;
}
Для проверки соответствия ввода пользователя требованиям программы мы сохраняем (=) результат выполнения scanf – количество успешно измененных переменных – в целочисленной переменной с именем r (int r), после чего требуем равенства её значения двум
(assert (r == 2);
Для этого и нужна директива препроцессора
#include
2.2.2. Цикл, который выполняется не меньше одного раза
Обратите внимание, что в цикле используется условие продолжения, а не завершения повторения! Это не цикл “до”, подобный REPEAT… UNTIL в Pascal, хотя назначение его то же – позволить телу цикла выполнится хотя бы один раз.
Пример 2.5: Решение предыдущей задачи.
#include
#include
int main ()
{
int x, y;
printf (“Введите два целых числа через пробел\n”);
int r = scanf (”%d%d”, &x, &y);
assert (r == 2);
do
while (x!= y);
printf (“НОД=%d\n”, x);
getchar ();
return 0;
}
2.2.3. Цикл с параметром (со счётчиком)
Пример 2.6: Вычислить факториал числа (n!=1×2×3×…×n).
#include
int main ()
{
int f=1, k, n;
printf (“Введите целое положительное число\n”);
scanf (”%d”, &n);
for (k=1; k <=n; k++)
printf (“n!=%d\n”, f);
getchar ();
return 0;
}
Для этого цикла в Си Рис. 6 из части о Паскале даже более нагляден, чем там! Особенно, если заменить в этом операторе k++ на k=k+1, что его работы не изменит. Разве, что только незаметно замедлит, поскольку унарные операции выполняются быстрее бинарных.
Цикл с параметром в Си больше похож на аналогичный оператор в древнем Бейсике – там тоже был шаг цикла и этим он был более гибким, чем соответствующий оператор Паскаля.
В Си возможен, например, такой оператор цикла с параметром:
for (i=100; i>=10; i=i-5) {…};
Здесь переменная i уменьшается от 100 до 10 с шагом 5 и, соответственно, тело цикла в фигурных скобках будет выполнено 19 раз.
В C есть только функции, а процедур нет.
Тело функции не может содержать в себе определения других функций.
Функцию можно вызвать из другой функции.
Оператор return возвращает выполнение программы в точку вызова функции.
При использовании return; функция не возвращает никакого значения.
При использовании такого вида – return выражение; результатом функции становится значение данного выражения. Тип этого выражения должен либо совпадать с типом функции, либо относиться к числу типов, допускающих автоматическое преобразование к типу функции.
Оператор return может не присутствовать в явном виде в теле функции. Тогда он подразумевается перед закрывающей тело функции фигурной скобкой. Эту подстановку производит сам компилятор.
Глобальные переменные описываются до функций, которые их будут “видеть”.
Пример 2.7: Из главной функции вызывается функция вычисляющая факториал.
#include
#include
int fakt (int n)
{
int f=1, k;
for (k=1; k <=n; k++)
return f;
}
int main (void)
{
int n;
printf (“Введите целое положительное число\n”);
scanf (”%d”, &n);
int f = fakt (n);
printf (“n! = %d\n”, f);
getchar ();
return 0;
}
4. Массивы и индексированные переменные
Пример описания одномерных массивов:
int x [15], y [30];
Пример описания двумерного массива:
float z [10] [20];
Нумерация элементов массива начинается с нуля.
Пример 2.9: Программа генерирует таблицу умножения и оформляет вывод результатов в матрицу 10 на 10 используя двумерный массив.
#include
#include
int main (void)
{
int i, k;
int a [10] [10];
for (i=0; i <10; i++)
for (k=0; k <10; k++)
a [i] [k] = i * k;
for (i=0; i <10; i++)
{
for (k=0; k <10; k++)
printf (”%d%s%d%s%d\t”, i,”*”, k,”=”, a [i] [k]);
printf (”\n”);
}
getchar ();
return 0;
}
5. Заглянем в вычислительную математику
Метод половинного деления
Пример 2.10: Найти корень уравнения X>2 – 3 = 0.
#include
#include
#include