- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции main().
- •Пример простейшей программы
- •Алфавит, синтаксис и семантика
- •Алфавит языка Си
- •Понятие о типе
- •Система типов языка Си Система типов языка Си
- •Понятие об объекте
- •Лексемы
- •Зарезервированные слова
- •Идентификаторы
- •Литералы
- •Целочисленные литералы
- •Литерал вещественного типа
- •Символьные литералы
- •Строковый литерал
- •Переменные
- •Символические константы в языке Си
- •Операторы, выражения и инструкции. Общие сведения.
- •Классификация операторов
- •Приоритет и ассоциативность операторов.
- •Побочные эффекты и вычисления выражений
- •Порядок вычисления выражений
- •Арифметические операторы и выражения
- •Унарные операторы
- •Бинарные операторы
- •Преобразования типа при выполнении бинарных операторов
- •Автоматическое преобразование типов
- •Явное преобразование типа
- •Математические функции
- •Оператор присваивания и инструкция присваивания
- •Простой оператор присваивания
- •.Множественное присваивание
- •Составной оператор присваивания
- •Преобразование типа при присваивании
- •Начальные сведения об указателях. Выходные параметры функции
- •Принятие решений и логические величины. Операторы отношения и сравнения на равенство
- •Логические операторы
- •Поразрядные операторы
- •Условные выражения (оператор ?:)
- •Оператор запятая
- •Оператор sizeof
- •Составная инструкция
- •Инструкция ifelse
- •Полная и сокращенная формы инструкции if
- •Вложенные инструкции if
- •Инструкция switch
- •Синтаксис инструкции switch
- •1.25.2. Использование инструкции switch
- •Функциональные компоненты цикла
- •Арифметические и итерационные циклы
- •Задачи, приводящие к арифметическим циклам
- •Задачи, приводящие к итерационным циклам
- •Циклические управляющие инструкции
- •Цикл, управляемый инструкцией for
- •Цикл, управляемый инструкцией while
- •Цикл, управляемый инструкцией do … while
- •Цикл с выходом
- •Вложенные циклы
- •Понятие о варианте и инварианте цикла
- •Объявления и определения (расширенное рассмотрение)
- •Спецификаторы объявления
- •Спецификаторы класса памяти.
- •Квалификаторы типа
- •Спецификаторы типа
- •Использование спецификаторов
- •Описатели
- •Использование зарезервированного слова typedefдля объявления синонимов типов
- •Функции
- •Понятие об абстракции и инкапсуляции
- •Функция языка Си и процедурная абстракция
- •Понятие о функции
- •Назначение функций
- •Определение функции
- •Функции, возвращающие и невозвращающие значение
- •Вызов функции. Передача параметров по значению
- •Внешние переменные и процедурная абстракция
- •Понятие о прототипе. Компиляция
- •Старый стиль определения функции
- •Массивы в стиле языка с89
- •Определение и объявление массивов
- •Определение и объявление одномерных массивов. Иницициализация одномерных массивов при их определении. Доступ к элементам массива.
- •Определение и инициализация двумерных массивов
- •Операции с массивами
- •Размещение массивов в оперативной памяти
- •Указатели
- •Операторы разыменования и взятия адреса
- •Области применения указателей
- •Нулевой указатель
- •Определение указателя
- •Недействительный указатель
- •Операции с указателями
- •Дополнительные сведения о разыменовании указателей
- •Присваивание указателей
- •Операция взятия адреса для указателя. Указатели на указатели
- •Указатели и операция индексирования
- •Арифметические операции с указателями
- •Сравнение указателей
- •Указатели и динамическая память
- •Функция malloc
- •Функция calloc
- •Функция realloc
- •Функция free
- •Указатели – параметры функций. Имитация передачи по ссылке
- •Указатели на функцию
- •Инициализация указателя на функцию
- •Операции с указателями на функцию
- •Табулирование произвольной функции одного переменного
- •Использование стандартной функции qsort
- •Указатели и массивы
- •Строковый литерал
- •Символические строковые константы
- •Строковые переменные
- •Инициализация строковых переменных
- •Операции со строковыми переменными
- •Ввод строк
- •Функция scanf()
- •Опасная функция gets()
- •Использование функции fgets()
- •Вывод строк
- •Функция printf()
- •Функция puts()
- •Функция fputs()
- •Библиотечные функции для обработки строк
- •Функция strlen()
- •Функции strcpy()иstrncpy()
- •Функции strcat() иstrncat()
- •Функция strcmp()
- •Массивы строк
- •Структуры
- •Объявление структур
- •Обращение к полям структуры
- •Инициализация структур
- •Операции над структурами
- •Массивы структур
- •Объявление массива структур
- •Идентификация элементов массива структур
- •Работа с внешними устройствами
- •Понятие потока
- •Текстовый поток
- •Двоичный поток
- •Указатель файла
- •Функция fopen()
- •Функция fclose()
- •Построковый ввод – вывод
- •Блоковый ввод – вывод
- •Примеры решенных задач
- •Прямой доступ к файлу
- •Функция fseek()
Арифметические и итерационные циклы
Циклические алгоритмы можно разделить на две категории:
1. Арифметические циклы.
2. Итерационные циклы.
К арифметическим циклам относятся циклы, количество повторений которых заранее известно. Более точно, количество повторений таких циклов либо содержится в условии задачи, либо может быть вычислено до начала выполнения цикла.
Итерационные циклы – это циклы с неизвестным количеством повторений тела цикла. Более точно, количество повторений тела итерационного цикла становится известным только после завершения работы цикла.
Приведем примеры задач, решения которых требует организации соответственно арифметических и итерационных циклов.
Задачи, приводящие к арифметическим циклам
Задача 1. Табулировать функцию y = x2в n равноотстоящих точках, начиная от x = xn вплоть до x = xk.
Количество повторений цикла в этой задаче содержится в условии задачи. Оно должно быть равно значению величины.n. Дело в том, что при решении данной задачи следует n раз выполнить однотипные вычисления, для которых придется организовать цикл. Незнание того, как это выполнить не мешает интуитивно предполагать, что для решения потребуется именно арифметический цикл.
Задача 2. Табулировать функцию y = x2в равноотстоящих точках, начиная от x = xn вплоть до x = xk с шагом dx.
Эту задачу можно рассматривать как разновидность предыдущей задачи. Это обусловлено тем обстоятельством, что количество повторений цикла n может быть определено до начала работы цикла, если округлить значение, полученное в результате вычисления следующего выражения:
(xk – xn) / dx + 1.
Задачи, приводящие к итерационным циклам
Задача 1. Обработка последовательности произвольной длины.
Это значительный класс задач. Примером такой задачи может быть задача о вычислении суммы произвольного количества чисел, вводимых с клавиатуры. Для прекращения обработки могут использоваться следующие способы:
● Ввод так называемого стоп-кода.
● Ввод признака конца файла.
Важным элементом здесь является то обстоятельство, что решение о прекращении обработки (вычисление суммы) оперативно принимает пользователь программы во время ее выполнения.
Задача 2. Вычисление значения корня квадратного по формуле Герона.
Эта задача относится к обширному классу задач вычислительной математики, в котором используются приближенные вычисления.
Циклические управляющие инструкции
В языке Си имеются три циклические управляющие инструкции:
● for
● while
● do while
Остановимся вначале на общих вопросах организации циклов, управляемых рассматриваемыми инструкциями.
В общем случае каждый из таких циклов состоит из трех структурных частей:
● инструкций инициализации,
● собственно управляющей инструкции (for,whileилиdo while),
● тела цикла – единственной инструкции, которая находится под управлением циклической инструкции.
Ограничение на количество управляемых инструкций является несущественным. Дело в том, что при необходимости размещения в теле цикла несколько инструкции, эти инструкции всегда могут быть объединены в составную инструкцию.
Инструкции инициализации, если они необходимы, должны всегда располагаться до циклической инструкции. Инструкция, составляющая тело цикла, при использовании циклических инструкций forиwhileдолжна располагаться непосредственно за циклической инструкцией, а при использовании циклической инструкцииdo while- должна находиться внутри циклической инструкции.
Каждая из циклических инструкций содержит управляющее условие, определяющее момент прекращения управления телом цикла. Прекращение управления при использовании каждой из трех циклических инструкций соответствует получению булевского значения false при оценке управляющего условия.
Циклы, управляемые инструкциями forиwhile, являются циклами с предусловием, а цикл, управляемый инструкциейdo while– циклом с постусловием. В циклах с предусловием управляющее условие оценивается до выполнения тела цикла, а в циклах с постусловием – после выполнения тела цикла. Это означает, что при использовании первых двух разновидностей циклов возможна ситуация, когда тело цикла не выполнится ни разу. При использовании цикла, управляемого инструкциейdo while, тело цикла должно выполниться хотя бы один раз.
Наиболее простую структуру имеют циклические инструкции whileиdo while.Их содержательная часть содержит управляющее условие, которое заключается в круглые скобки. Логика работы таких циклов чрезвычайно проста. Необходимо на каждом шаге цикла оценивать значение управляющего условия, а затем выполнять тело цикла или завершать его выполнение.
Циклическая инструкция for имеет более сложную структуру. Содержательная часть этой инструкции состоит из трёх выражений, заключенных в круглые скобки. Первое из этих выражений предназначено для записи элементов инициализации, второе выражение выполняет те функции, что и управляющее выражение в инструкциях whileиdo while. Последнее выражение предназначено для записи действий по “продвижению” цикла. Указанная особенность циклаforделает целесообразным использование этого вида циклов, когда все элементы управления циклом могут быть реализованы с помощью инструкцииfor. Отметим, что часто такая возможность имеется при организации арифметических циклов. В связи с этим цикл, управляемый инструкциейfor, нашел наибольшее применение при программировании арифметических циклов. Это обусловило то положение, что работа цикла, управляемого инструкциейfor, поясняется на примере программирования арифметического цикла. Здесь же рассматриваются общие принципы организации арифметических циклов. Работа циклов, управляемых циклическими инструкциямиwhileиdo while, поясняется на примерах организации итерационных циклов.
