- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции 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.31. В этой программе имеются вызовы функций printf()иscanf()до входа в цикл, затем такие же вызовы этих функций находятся в конце тела цикла. Такое дублирование кода может привести к ошибкам при модификации текста программы в процессе ее эксплуатации. При модификации текста программист может забыть о необходимости согласованного изменения двух идентичных фрагментов кода, что и может оказаться источником ошибок.
Циклы с выходом реализованы только в VisualBasic. В языке Си такие циклы можно построить, используя циклические инструкцииforиwhileи инструкциюbreak. Для этого достаточно организовать “бесконечный” цикл, В теле этого цикла расположить инструкциюif, которая совместно с инструкциейbreakпозволила бы в требуемый момент завершить выполнение цикла.
Модифицируем программу, приведенной в пункте 1.31, заменив использованный в ней цикл циклом с выходом.
/* Файл summa2_2.c */ /* Модернизированный вариант решения задачи, приведенной в пункте 1.31. В новом варианте используется цикл с выходом
*/ #include<stdio.h> int main(void) { double x, summa = 0; while(1) { printf(“Введите положительное число (для завершения “ “вычислений введите отрицательное число)”); scanf(“%lf”, &x); if(x <= 0) break; summa += x; } printf(“summa=%10.3f\n”, summa); return 0; }
Вложенные циклы
Вложенным циклом называют циклическую конструкцию, состоящую из нескольких циклов, в которой один из циклов в своем теле содержит один или несколько других циклов.
Цикл, в теле которого находится один или несколько других циклов называется внешним. Цикл, находящийся в теле другого цикла, называется внутренним.
Рассмотрим пример, приводящий к необходимости организации вложенных циклов.
Постановка задачи.
Вычислить значение суммы следующего вида
Решение
Для упрощения процесса разработки алгоритма, который необходимо организовать, перепишем исходное выражение для вычисления суммы в следующем виде:
Из соотношений, приведенных выше, следует, что для вычисления искомой суммы sнеобходимо организовать два циклических вычислительных процесса. Первый из них предназначен для накопления суммыs, а второй – для вычисления очередного слагаемого akэтой суммы.
Первый вычислительный процесс является основным. Второй вычислительный процесс должен определять значение очередного слагаемого суммы, которая накапливается с помощью первого вычислительного процесса. Очередное слагаемое должно вычисляется с помощью накопления произведения. Второй циклический процесс должен возобновлять свою работу на каждом шаге первого циклического процесса.
Из соображений, изложенных выше, следует, что для реализации рассматриваемых циклических процессов необходимо организовать вложенные циклы. Программа, предназначенная для решения рассматриваемой задачи, приведена ниже.
#include<stdio.h> #include<conio.h> int main(void) { int k, j, n; long s, p; printf(“n=”); scanf(“%d”,&n); s = 0; /* Инициализация внешнего цикла */ for(k = 1; k <= n; k++) /* Заголовок внешнего цикла */ { /* Начало тела внешнего цикла */ p = 1; /* Инициализация внутреннего цикла*/ for(j = k; j <= k * k; j++)/*Заголовок внутреннего цикла*/ p *= j; /*Тело внутреннего цикла*/ s += p; } /*Конец тела внешнего цикла*/ printf(“Сумма = %d\n”, s)
getch(); return 0; }