- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции 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()
Цикл, управляемый инструкцией while
Вначале рассмотрим организацию цикла, управляемого этой инструкцией, а затем приведем ряд примеров.
В общем случае цикл, управляемый инструкцией while,может состоять из трех частей. К первой части цикла относятся элементы его инициализации. Вторую часть составляет сама инструкцияwhile, а последнюю часть, часто называемую телом, – любая инструкция языка Си. Говорят, что инструкцияwhile управляет работой тела цикла. В случае, когда в теле цикла должны находиться несколько инструкций, их следует объединить в составную инструкцию. Таким образом, в общем случае цикл, построенный на основе инструкцииwhile,имеет следующий формат:
Инструкции_инициализации
while(выражение) /* Инструкцияwhile*/инструкция /* Единственная инструкция */продолжение_программы
Заключенное в круглые скобки выражениеотносится к категории полных выражений (оно не является подвыражением другого выражения). Поэтому к моменту начала выполнения тела цикла все побочные эффекты при его вычислении будут завершены.
Работу цикла удобно пояснить фрагментом схемы алгоритма, приведенным ниже.
Тело цикла выполняется пока остается истинным выражение, проверяемое в инструкцииwhile.Легко убедиться в том, что цикл, управляемый инструкциейwhile, относится к категории циклов с предусловием.
Приведем пример применения цикла, управляемого инструкцией while.
Постановка задачи. Последовательность положительных чисел произвольной длины вводится с клавиатуры. Вычислить сумму вводимых чисел.
Решение. Для решения этой задачи требуется организация цикла, в теле которого следует выполнять два действия:
Вводить очередное число x,
Увеличивать текущее значение суммы summaна величину введенного числа.
Для прекращения циклического процесса можно воспользоваться тем обстоятельством, что по условию задачи вводимые числа должны быть положительными. Можно предложить пользователю для окончания процесса вычислений ввести любое отрицательное число.
Ниже приводится программа, реализующая требуемые вычисления. В программе использованы следующие локальные переменные: summa- искомая сумма,x– очередное введенное число. В комментариях к программе определены функциональные компоненты цикла.
//Файлsumma2.c #include<stdio.h>intmain(void) { doublex, summa = 0;
// Инициализация цикла printf(“Введите положительное число (для завершения “ “вычислений введите отрицательное число)”); scanf(“%lf”, &x);
while(x > 0) //Инструкция while (Заголовок цикла) { // начало тела цикла summa += x; printf(“Введите положительное число(для завершения“ “вычислений введите отрицательное число)”); scanf(“%lf”, &x); } // Конец тела цикла printf(“summa=%10.3g\n”, summa); return 0; }
Цикл, управляемый инструкцией do … while
В отличие от ранее рассмотренных двух циклических управляющих инструкций цикл, управляемый инструкцией do while,относится к категории циклов с постусловием. Это обусловлено тем обстоятельством, что проверяемое условие расположено после тела цикла. В связи с этим тело такого цикла должно выполниться хотя бы один раз. Такой цикл целесообразно использовать в тех случаях, когда критерий продолжения (окончания) работы цикла формируется в теле цикла.
Цикл, управляемый инструкцией dowhile, имеет следующий формат:
Инструкции_инициализации
do/* Начало инструкцииwhile*/ инструкция /* Единственная инструкция (тело цикла)*/while(выражение);/* Конец инструкцииwhile*/ продолжение_программы
Работу цикла удобно пояснить схемой алгоритма, приведенной ниже.
Компонент инструкция, составляющая тело цикла (символ 2 схемы алгоритма), многократно выполняется в процессе работы цикла, пока логическая оценка компонентавыражение (символ 3) дает значение, равноеtrue.
Рассмотрим пример задачи, решение которой приводит к целесообразности применения цикла, управляемого инструкцией do while.
Постановка задачи.
Последовательность целых чисел ai (i = 1,2, …)формируется в соответствии со следующим правилом:
Требуется определить номер и значение первого элемента последовательности, который удовлетворяет условию ai > n, где “n” – произвольное целое число.
Решение
С целью уяснения задачи получим вручную решение для конкретного значения величины “n”. Пусть значение величиныn == 25. Получим следующую последовательность чисел:a1 == 1, a2 == 5, a3 == 14, a4 == 30. На этом ручные вычисления элементов последовательности чисел можно прекратить. Дело в том, что уже получен элемент последовательности, удовлетворяющий заданному условию (ai > n). Таким образом, искомый элемент последовательности имеет номер, равный 4 и значение, равное 30.
Следует отметить, что рассматриваемая задача всегда имеет решение, т.к. элементы ai образуют возрастающую последовательность.
Решение данной задачи требует организации итерационного цикла, т.к. количество повторений цикла заранее неизвестно. Здесь удобно воспользоваться циклом, управляемым инструкцией do while. Дело в том, что разрабатываемый цикл должен выполниться хотя бы один раз.
Обозначим через i– номер очередного вычисляемого элемента последовательности, а черезcurrent_item– значение этого элемента. Для вычисленияcurrent_itemследует использовать принцип накопления суммы. Желательно построить цикл таким образом, чтобы после окончания его работы значение переменной iсовпадало с номером искомого элемента. Это можно обеспечить в том случае, когда продвижение цикла, обеспечиваемое инструкциейi++; будет расположено до рабочей части цикла, представленной инструкциейcurrent_item += i * i;.
Программа, разработанная с учетом изложенных соображений, приведена ниже.
#include<stdio.h> int main(void) { int i, n; long current_item; printf(“n=”); scanf(“%d”, &n); i = 0; current_item = 0; do { i++; current_item += i * i; }while(current_item <= n); printf(“Элемент последовательности с номером = %d” “ и значением, равным %ld является первым” “ элементом, удовлетворяющим заданному” “ условию\n”, i, current_item); getch(); return 0; }