- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции 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.25.2. Использование инструкции switch
Как правило, тело инструкции switch– составная инструкция, внутренние инструкции которой помечены меткамиcaseиdefault. После перехода на выбранную инструкцию остальные метки не влияют на выполнение тела переключателя. Для прекращения выполнения тела переключателя следует использовать инструкции перехода (обычно инструкциюbreak). Посмотрим, к чему может привести их отсутствие. Обратимся к программному коду, приведенному ниже, предполагая, что используемая в нем переменная n имеет типint.
/* Использование инструкции switch, в теле которой отсутствуют инструкции перехода */
switch(n)
{
case 1 : printf(“.”); case 2 : printf(“..”); case 3 : printf(“...”); case 4 : printf(“....”);
}
Если перед выполнением приведенного выше фрагмента программы значение переменной n было равно 3, то при выполнении инструкции switchбудет выведено семь точек, т.к. будут выполнены два последних вызова функции printf().
Чтобы в приведенном фрагменте программы выполнялся только тот вызов функции printf(), которому передано управление, необходимо все помеченные инструкции разделить инструкциями break. В результате получим следующий программный код:
/* Инструкция switch, в теле которой используются инструкцииbreak*/switch(n) {case1 :printf(“.”);break;case2 :printf(“..”);break;case3 :printf(“...”);break;case4 :printf(“....”);break; }
Теперь для любого значения величины n из отрезка [1, 4] будет выполняться только один вызов функции printf().
Заметим, что в ветви, соответствующей значению n == 4, использование инструкции breakнеобязательно, но считается элементом хорошего стиля программирования.
Функциональные компоненты цикла
Алгоритм называется циклическим в том случае, когда некоторые его части могут выполняться неоднократно. В общем случае в циклическом алгоритме могут присутствовать следующие функциональные компоненты:
● Инициализация (подготовка к первому выполнению цикла, возобновление цикла).
● Проверка условия нахождения в цикле.
● Рабочая часть цикла.
● Подготовка к очередному выполнению рабочей части цикла (продвижение цикла).
Основу цикла составляют действия, многократное выполнение которых должно привести к решению поставленной задачи. Функциональный компонент цикла, реализующий такие действия, будем называть рабочей частью цикла. Например, рабочая часть цикла может содержать инструкции, обеспечивающие обработку текущей порции данных. Рабочая часть цикла является его первым функциональным компонентом.
Проверка условия нахождения в цикле предназначена для определения момента, когда работа цикла должна быть закончена. Это второй функциональный компонент, который должен присутствовать в любом цикле.
Назначением инициализации является создание корректных начальных условий для работы цикла. Например, здесь может выполняться инициализация счетчика – переменной целого типа, которая используется для управления работой цикла. Это третий обязательный функциональный компонент цикла.
Наконец, последний из функциональных компонентов цикла предназначен для продвижения цикла. Здесь, например, могут располагаться инструкции, обеспечивающие получение новой порции обрабатываемых данных. Кроме того, здесь может изменяться значение счетчика, управляющего работой цикла.
Все компоненты, кроме инициализации могут выполняться неоднократно, образуя так называемый контур цикла. Однократный “проход” цикла будем называть шагом. В качестве синонимов используются следующий понятия: итерация и виток цикла.
Разработку цикла следует начинать с его рабочей части. Необходимо выяснить, что же должен делать цикл? Ответ на этот вопрос должен носить общий характер. Он должен быть пригоден для произвольного шага цикла.
Остальные компоненты цикла выполняют служебные функции. К их разработке следует переходить только после того, как станет ясным, какие действия необходимо выполнять в рабочей части цикла.
В конкретной реализации цикла взаимное расположение частей цикла, составляющих его контур, может быть различным. Для иллюстрации назначения отдельных функциональных частей цикла рассмотрим один из вариантов организации циклического алгоритма, который приведен на рисунке, представленном ниже. Особенностью этого варианта организации цикла является то обстоятельство, что выполнение первого шага цикла начинается с проверки нахождения в цикле. Такие циклы называются циклами с предусловием.

Рассмотрим пример организации циклического алгоритма. Пусть необходимо вычислить сумму квадратов первых “n” натуральных чисел. Введем следующие обозначения: i – очередное натуральное число, s – искомая сумма. Для нахождения суммы s необходимо выполнить “n” сложений. Действительно, s = 12+ 22+ .. + i2+.. + n2. Указанные действия можно осуществить за “n” шагов цикла, используя принцип накопления суммы. Для этого под s следует понимать текущее значение суммы, которое только после завершения работы цикла оказывается равным искомому значению суммы квадратов. Используя такой подход, в рабочей части цикла (символ 3) следует поместить инструкцию – присваивание языка Си следующего вида:
s += i * i; /* s = s + i * i ; */
Для правильной работы цикла переменные i и s необходимо инициализировать следующим образом (символ 1):
i = 1; s = 0;
В символе 4 для правильного продвижения цикла следует поместить инструкцию инкремента переменной i:
i++;
Для обеспечения n кратного выполнения цикла в символе 2 следует проверять отношение: i <= n .

