
- •Министерство образования Республики Беларусь
- •1. Что такое программа на языке программирования
- •2. Общее знакомство с языком с
- •3. Структура простой программы на языке с
- •4. Что такое программа на языке с
- •5. Представление информации и типы данных в языке с
- •6. Константы
- •7. Переменные
- •8. Элементарный вВод и вывод информации
- •9. Выражения и операции
- •9.1. Арифметические операции
- •9.2. Операция изменения знака
- •9.3. Операции инкремента и декремента
- •9.4. Операция присваивания
- •9.6. Поразрядные логические операции
- •9.8. Логические операции и операции отношения
- •9.9. Условная операция «? :»
- •9.10. Операция последовательного вычисления
- •9.11. Операция определения требуемой памяти в байтах sizeof
- •9.12. Операция приведения типа (type)
- •10. Операторы управления вычислительным процессом
- •10.1. Операторы ветвления if и else
- •10.2. Оператор switch
- •10.3. Оператор цикла while
- •10.4. Оператор цикла do…while
- •10.5. Оператор цикла for
- •10.6. Бесконечные циклы
- •10.7. Другие управляющие средства языка с
- •10.8. Стандартные математические функции
- •11. Вычисление выражений и побочные эффекты
- •11.1. Преобразования типов при вычислении выражений
- •11.2. Побочные эффекты при вычислении выражений
- •12. Массивы
- •12.1. Описание массива
- •12.2. Инициализация массива
- •12.3. Ввод-вывод массива
- •12.4. Двумерные массивы (массивы массивов)
- •13. Указатели
- •14. Адресная арифметика
- •15. Массивы и указатели
- •15.1. Указатели и одномерные массивы
- •15.2. Указатели и двумерные массивы
- •16. Строки
- •17. Массивы строк
- •18. Функции
- •18.1. Определение функции в языке с
- •18.2. Возвращение значений из функции
- •18.3. Формальные и фактические параметры функции
- •18.4. Вызов функции
- •18.5. Объявление и определение функции: прототип функции
- •19. Передача параметров в функции
- •19.1. Способы передачи параметров в функции
- •19.2. Передача параметров в функции в языке с
- •19.3. Передача указателей в функции
- •20. Классы хранения и видимость переменных
- •20.1. Общие положения
- •20.2. Спецификаторы класса памяти
- •20.3. Область видимости функций
- •20.4. Глобальные переменные
- •20.5. Глобальные статические переменные
- •20.6. Локальные переменные
- •20.7. Статические локальные переменные
- •20.8. Регистровые переменные
- •20.9. Выводы
- •21. Организация памяти программы
- •22. Многофайловая компиляция (проекты)
- •23. Передача в функции массивОв
- •23.1. Передача одномерных массивов в функции
- •23.2. Передача двумерных массивов в функции
- •23.3. Передача в функции символьных строк
- •23.4. Возвращение указателей из функций
- •24. Функции с переменным количеством аргументов
- •24.1. Соглашения о вызовах: модификаторы функций
- •24.2. Объявление списка параметров переменной длины
- •25. Передача параметров в функцию main()
- •26. Указатели на функцию
- •27. Стандартные функцИи языка с
- •27.1. Функции для работы со строками
- •27.2. Функции для проверки символов и преобразования данных
- •27.3. Функция быстрой сортировки – gsort()
- •27.4. Функция двоичного поиска – bsearch()
- •28. Работа с файлами
- •28.1. Основные понятия
- •28.2. Основные функции для работы с файлами
- •28.3. Открытие и закрытие файлов
- •28.4. Ввод/вывод символов
- •28.5. Ввод/вывод строк
- •28.6. Форматированный ввод/вывод
- •28.7. Ввод/вывод блоков данных
- •28.8. Другие средства для работы с файлами
- •28.9. Ввод/вывод низкого уровня (префиксный доступ к файлам)
- •29. Типы, определяемые пользователем: Перечисления, структуры и объединения
- •29.1. Переименование типов – оператор typedef
- •29.2. Перечисления (enum)
- •29.3. Основные сведения о структурах
- •29.4. Структурные переменные в памяти компьютера
- •29.5. Доступ к полям структуры
- •29.6. Массивы структур
- •29.7. Структуры и функции
- •29.8. Объединения (union)
- •30. Динамическая память
- •30.1. Понятие динамического объекта
- •30.2 Создание и уничтожение динамических объектов
- •30.3 Динамическое размещение одномерных массивов и строк
- •30.4 Динамическое размещение двумерных массивов
- •30.5. Функции для работы с блоками памяти
- •31. Динамические структуры данных
- •31.1. Понятие структуры данных
- •31.2. Структуры, ссылающиеся на себя
- •31.3. Связанные списки
- •31.5. Очереди
- •Ниже приводятся примеры функций для очереди (структура элемента очереди совпадает со структурой элемента стека в примере выше):
- •32. Препроцессор языка с
- •32.1 Директива включения файлов
- •32.2. Директива определения макрокоманд (макросов)
- •32.3 Директива условной компиляции
- •32.4 Дополнительные директивы препроцессора
10.6. Бесконечные циклы
Одна из самых неприятных особенностей операторов цикла заключается в возможности образования бесконечного цикла (в зацикливании программы) там, где программист этого не ожидает. Причина зацикливания – условие выполнения цикла никогда не станет ложным из-за ошибок в программе.
void main(){
int x = 1, s = 0;
while (x < 11); // !!!!!!!!!!
{
s += x;
x++;
}
printf("s = %d\n", s);
}
В этом примере причина зацикливания – незаметная точка с запятой после while. Компилятор считает, что в цикле повторяется не составной оператор в {}, а пустой оператор. А так как в цикле x никогда не изменится, то и условие никогда не станет ложным. Но это не значит, что не может быть в цикле пустого оператора. Далее приведен пример правильного цикла с пустым оператором цикла.
void main(){
int x, s;
for (s = 0, x = 1; x < 11; s+= x, x++);
printf("s = %d\n", s);
}
Если все же вам в программе потребуется бесконечный цикл (а это иногда бывает нужно сделать), вы можете написать цикл, который никогда не кончается, опустив все три выражения в операторе for.
for (;;)
printf(“Бесконечный цикл\n”);
Можно также написать бесконечный цикл, используя в операторе while в качестве условия выражение, которое всегда истинно. Конечно, программу, выполнение которой не завершается, вроде как нельзя назвать корректной. Но, как вы увидите в дальнейшем, существуют способы прекратить исполнение и бесконечных циклов.
while (1)
printf(“Бесконечный цикл\n”);
10.7. Другие управляющие средства языка с
Бывают ситуации, когда необходимо прервать выполнение блока операторов независимо от каких-либо условий. Язык С предусматривает для этих целей четыре оператора: break, continue и return. Это так называемые операторы безусловной передачи управления.
Оператор break прекращает выполнение оператора цикла while, do…while, for и switch, в котором он непосредственно находится. Для выхода из группы вложенных циклов, надо использовать несколько операторов break.
int x;
while (1) {
printf(“Введите положительное число\n”);
scanf(“%d”, &x);
if (x > 0) break;
}
printf(“x = %d\n”, x);
Оператор continue можно использовать только внутри тела цикла. Данный оператор возвращает управление к началу цикла, пропуская оставшуюся его часть. В результате его выполнения управление переносится:
1) для цикла for на секцию выражения_3;
2) для циклов while и do…while на вычисление выражения и определения необходимости завершения цикла.
Задача. Найти сумму четных чисел из диапазона от 1 до 10.
int x = 2, s = 0;
while (x < 11) {
s += x;
x += 2;
}
printf(“s = %d\n”, s);
============================================
int x = 1, s = 0;
while (x < 11) {
if (x%2 == 1) {
x++;
continue;
}
s += x;
x++;
}
printf(“s = %d\n”, s);
============================================
int x, s = 0;
for (x = 2; x < 11; x+=2)
s += x;
printf(“s = %d\n”, s);
============================================
int x, s = 0;
for (x = 1; x < 11; x++) {
if (x%2 == 1) continue;
s += x;
}
printf(“s = %d\n”, s);
Оператор return переносит управление из текущей функции в точку ее вызова, т.е. прерывает выполнение функции. Его мы рассмотрим позднее.
Оператор goto осуществляет безусловную передачу управления на метку в пределах текущей функции. Так использовать этот оператор уж очень не рекомендуется из-за запутанности и сложности понимания программы с ним, рассматривать его мы не будем, т.к. любую программе с goto можно написать без goto.
Задача. Вычислить значение функции на интервале [a;b] в n равноудаленных точках. Обеспечить контроль введенных и полученных данных.
#include <stdio.h>
#include <math.h>
void main(){
int n, err;
float a, b, u, x, f, h;
printf(“Введите a, b, u, n\n”);
scanf("%f%f%f%d", &a, &b, &u, &n);
if(n < 2) n = 10;
if(a == b) { a -= 0.5; b += 0.5; }
else
if(a > b) { x = a; a = b; b = x; }
h = (b-a) / (n-1);
for(x = a; x < b+0.5*h; x += h){
err=0;
if (x < 2) {
if (x == 0)
err = 1;
else
f = cos(M_PI*x)+(7-pow(x,2))/fabs(x); // M_PI x*x
}
else {
if (u == 0 || x-u <= 0)
err = 1;
else
f = log(x-u)-pow(x,0.5)/u; // sqrt(x)
}
printf("|%10.4f |", x);
if(err)
printf(" не определена! |\n");
else
printf("%16.4f |\n", f);
}
}