- •Кетков ю.Л.
- •Раздел 5. Системные данные текстового типа 33
- •Раздел 6. Основные синтаксические конструкции языка c 46
- •Раздел 7. Указатели и ссылки 59
- •Раздел 8. Функции и их аргументы 62
- •Раздел 9. Работа с массивами. 74
- •Раздел 10. Пользовательские типы данных. 95
- •Раздел 11. Работа с файлами 104
- •Раздел 12. Библиотеки стандартных и нестандартных функций 118
- •Раздел 15. Классы. Создание новых типов данных 131
- •Раздел 16. Классы как средство создания больших программных комплексов 150
- •Раздел 17. Прерывания, события, обработка исключений 167
- •Введение
- •Раздел 1. Немного истории
- •Раздел 2. Структура программы на языке c
- •Раздел 3. Среда программирования
- •Раздел 4. Системные данные числового типа
- •4.1. Типы числовых данных и их представление в памяти эвм
- •4.1.1. Внутреннее представление целочисленных данных
- •4.1.2. Однобайтовые целочисленные данные
- •4.1.3. Двухбайтовые целочисленные данные
- •4.1.4. Четырехбайтовые целочисленные данные
- •4.1.5. Восьмибайтовые целочисленные данные
- •4.2. Внутреннее представление данных вещественного типа
- •4.3. Внешнее представление числовых констант
- •4.4. Объявление и инициализация числовых переменных
- •4.5. Ввод числовых данных по запросу программы
- •4.5.1. Потоковый ввод данных числового типа
- •4.5.2. Форматный ввод
- •4.6. Вывод числовых результатов
- •4.6.1. Форматный вывод
- •4.6.2. Потоковый вывод
- •4.7. Примеры программ вывода числовых данных
- •4.8. Операции над числовыми данными целого типа
- •4.9. Операции над числовыми данными вещественного типа
- •Раздел 5. Системные данные текстового типа
- •5.1. Символьные данные и их представление в памяти эвм
- •5.2. Строковые данные и их представление в памяти эвм
- •5.3. Ввод текстовых данных во время работы программы
- •5.3.1. Форматный ввод
- •5.3.3. Потоковый ввод
- •5.3.4. Специальные функции ввода текстовых данных
- •5.4. Вывод текстовых данных
- •5.4.1. Форматный вывод
- •5.5.2. Операции над строковыми данными
- •5.6. Управление дисплеем в текстовом режиме
- •Раздел 6. Основные синтаксические конструкции языка c
- •6.1. Заголовок функции и прототип функции
- •6.2. Объявление локальных и внешних данных
- •6.3. Оператор присваивания
- •6.4. Специальные формы оператора присваивания
- •6.5. Условный оператор
- •6.6. Оператор безусловного перехода
- •6.7. Операторы цикла
- •6.8. Дополнительные операторы управления циклом
- •6.9. Оператор выбора (переключатель)
- •6.10. Обращения к функциям
- •6.11. Комментарии в программах
- •Раздел 7. Указатели и ссылки
- •7.1. Объявление указателей
- •7.2. Операции над указателями
- •7.3. Ссылки
- •Раздел 8. Функции и их аргументы
- •8.1. Параметры-значения
- •8.2. Параметры-указатели
- •8.3. Параметры-ссылки
- •8.4. Параметры-константы
- •8.5. Параметры по умолчанию
- •8.6. Функции с переменным количеством аргументов
- •8.7. Локальные, глобальные и статические переменные
- •8.8. Возврат значения функции
- •8.9. Рекурсивные функции
- •8.10. Указатели на функцию и передача их в качестве параметров
- •8.11. "Левые" функции
- •Раздел 9. Работа с массивами.
- •9.1. Объявление и инициализация массивов.
- •9.2. Некоторые приемы обработки числовых массивов
- •9.2. Программирование задач линейной алгебры
- •9.2.1. Работа с векторами
- •9.2.2.Работа с матрицами
- •9.3. Поиск
- •9.3.1. Последовательный поиск
- •9.3.2. Двоичный поиск
- •9.4. Сортировка массивов.
- •9.4.1. Сортировка методом пузырька
- •9.4.2. Сортировка методом отбора
- •9.4.3. Сортировка методом вставки
- •9.4.4. Сортировка методом Шелла
- •9.4.5.Быстрая сортировка
- •9.5. Слияние отсортированных массивов
- •9.6. Динамические массивы.
- •Раздел 10. Пользовательские типы данных.
- •10.1. Структуры
- •10.1.1. Объявление и инициализация структур
- •10.1.2. Структуры – параметры функций
- •10.1.3.Функции, возвращающие структуры
- •10.2. Перечисления
- •10.3. Объединения
- •Раздел 11. Работа с файлами
- •11.1.Файлы в операционной системе
- •11.1. Текстовые (строковые) файлы
- •11.2. Двоичные файлы
- •11.3. Структурированные файлы
- •11.4. Форматные преобразования в оперативной памяти
- •11.5. Файловые процедуры в системе bcb
- •11.5.1. Проверка существования файла
- •11.5.2. Создание нового файла
- •11.5.3. Открытие существующего файла
- •11.5.4. Чтение из открытого файла
- •11.5.5. Запись в открытый файл
- •11.5.6. Перемещение указателя файла
- •11.5.7. Закрытие файла
- •11.5.8. Расчленение полной спецификации файла
- •11.5.9. Удаление файлов и пустых каталогов
- •11.5.10. Создание каталога
- •11.5.11. Переименование файла
- •11.5.12. Изменение расширения
- •11.5.13. Опрос атрибутов файла
- •11.5.14. Установка атрибутов файла
- •11.5.15. Опрос и изменение текущего каталога
- •11.6. Поиск файлов в каталогах
- •Раздел 12. Библиотеки стандартных и нестандартных функций
- •12.2. Организация пользовательских библиотек
- •12.3. Динамически загружаемые библиотеки
- •13.1. Препроцессор и условная компиляция
- •13.2. Компилятор bcc.Exe
- •13.3. Утилита grep.Com поиска в текстовых файлах
- •14.1. Переопределение (перегрузка) функций
- •14.2. Шаблоны функций
- •Раздел 15. Классы. Создание новых типов данных
- •15.1. Школьные дроби на базе структур
- •15.2. Школьные дроби на базе классов
- •15.3. Класс на базе объединения
- •15.4. Новые типы данных на базе перечисления
- •15.5. Встраиваемые функции
- •15.6. Переопределение операций (резюме)
- •15.8. Конструкторы и деструкторы (резюме)
- •Раздел 16. Классы как средство создания больших программных комплексов
- •16.1. Базовый и производный классы
- •16.1.1.Простое наследование
- •16.1.2. Вызов конструкторов и деструкторов при наследовании
- •16.1.3. Динамическое создание и удаление объектов
- •16.1.4. Виртуальные функции
- •16.1.5. Виртуальные деструкторы
- •16.1.6. Чистые виртуальные функции и абстрактные классы
- •16.2. Множественное наследование и виртуальные классы
- •16.3. Объектно-ориентированный подход к созданию графической системы
- •Раздел 17. Прерывания, события, обработка исключений
- •17.1. Аппаратные и программные прерывания
- •17.2. Исключения
6.7. Операторы цикла
Операторы цикла позволяют организовать повторное выполнение фрагмента программы до тех пор, пока не выполнится некоторое условие. Конечно, аналогичные действия могут быть оформлены с использованием условных операторов (if…) и безусловных переходов (goto) в начало повторяющегося фрагмента. Однако использование операторов цикла позволяет сделать логику работы программы более прозрачной и немного более эффективной за счет применения специальных машинных команд, которые вставляет компилятор.
Наиболее часто применяемая конструкция цикла использует оператор for:
for(S1; C; S2) { Q1; Q2;...}
Здесь S1 – действие, которое выполняется перед повторением группы операторов Q1, Q2, … , образующих тело цикла;
C – условие, при выполнении которого тело цикла повторяется. Если условие C не выполнено, то тело цикла обходится и цикл завершается;
S2 – действие, которое выполняется вслед за последним оператором тела цикла. После этого управление передается на проверку условия завершения цикла.
Одна из форм оператора for позволяет организовать повторение тела цикла заданное число раз, изменяя при каждом повторении значение некоторой управляющей переменной (иногда такую переменную называют счетчиком цикла или индексом цикла):
s=0;
for(j=0; j<10; j++)
s=s+a[j];
В приведенном примере тело цикла состоит из единственного оператора, который можно не заключать в фигурные скобки. Перед началом цикла в переменную j заносится 0 и поскольку это значение меньше 10, то к содержимому переменной s прибавляется значение первого элемента массива a[0]. После первого завершения тела цикла к счетчику j добавляется 1 и тело цикла повторяется. Так продолжается до тех пор, пока значение счетчика не увеличится до 10, при котором условие повторения цикла уже не выполняется.
Если счетчик цикла используется только в теле цикла и значение этой переменной за пределами цикла сохранять не нужно, то стандарт C++ позволяет определить такую суперлокальную переменную непосредственно в операторе for:
for(int j=0; j<10; j++)
Значение счетчика (индекса) может не только увеличиваться при каждом повторении цикла, но и уменьшаться:
s=0;
for(j=9; j>=0; j--)
s=s+a[j];
В этом примере массив a суммируется, начиная с последнего элемента.
Иногда цикл по счетчику в обратном порядке организуют следующим образом:
count=20;
for(s=0; count; count--)
s += a[count];
В этом примере условием повторения цикла является положительное значение счетчика count, которое воспринимается как "истина". Как только содержимое счетчика станет равным нулю (т.е. "лжи"), цикл завершит свою работу.
В отличие от языка Паскаль, где оператор for допускает только увеличение или уменьшение счетчика цикла только на 1, оператор for в языках C, C++ позволяет изменять значение управляющей переменной произвольным образом. Эта переменная может быть вещественного типа, и ее значение может меняться не только по закону арифметической прогрессии, но и любым сколь угодно сложным способом. Например, можно просуммировать только элементы массива с четными индексами:
s=0;
for(j=0; j<10; j+=2)
s=s+a[j];
Действие S1, выполняемое при входе в цикл, может состоят не только из единственного оператора, засылающего в счетчик цикла начальное значение. Если нужно выполнить несколько операторов, то их разделяют запятыми (список действий, аналогичный экзотической форме оператора присваивания). В приведенных выше примерах очистку переменной s тоже можно было внести в оператор заголовка цикла:
for(s=0,j=0; j<10; ++j)
s=s+a[j];
Аналогичный список из нескольких операторов можно использовать и в качестве действия S2, выполняемого вслед за последним оператором тела цикла. В приведенном ниже примере оператор цикла вычисляет n-й член последовательности чисел Фибоначчи:
for(x=1,y=1,i=2; i<n; z=x+y, x=y, y=z, i++);
Иногда в программах можно встретить на первый взгляд бессмысленный оператор for:
for(;;){Q1;Q2;...;}
Судя по описанию оператора for, тело такого цикла должно выполняться бесконечное число раз. Однако такие циклы могут оказаться полезными в DOS-приложениях для организации ожидания какого-либо события, появление которого проверяется в теле цикла. Если событие произошло (например, ввод информации со стороны пользователя состоялся, или по каналу связи поступило долгожданное сообщение), то из тела цикла можно выйти с помощью оператора break или goto. В среде Windows существуют и более эффективные (с точки зрения загрузки процессора) средства, контролирующие появление того или иного события.
Вторая конструкция оператора цикла начинается со служебного слова while (от англ. – пока):
while(условие) {Q1; Q2;...}
Вход в такой цикл начинается с проверки условия, заданного в круглых скобках. Если это условие истинно, то тело цикла (операторы Q1, Q2,…) выполняется. В случае невыполнения условия тело цикла обходится. С помощью оператора while тоже можно организовать суммирование элементов массива:
s=0; i=0;
while(i<10)
{ s=s+a[i]; i++; }
Согласитесь, что этот вариант выглядит менее изящно, чем его аналог с оператором for, хотя здесь присутствуют те же элементы, которые раньше фигурировали в заголовке цикла for. Однако в других итерационных процессах использование цикла while может оказаться более уместным. Например, итерационная схема вычисления корня квадратного из x (аналогичные схемы можно написать и для корней других степеней) имеет следующий вид:
yn+1=0.5*(yn +x/yn)
Для ее реализации можно воспользоваться следующим циклом:
y=x; //начальное приближение
while(fabs(y-x*x)>1e-6)
y=0.5*(y+x/y);
Третья конструкция цикла начинается с оператора do (от англ. – выполнить) и завершается проверкой условия продолжения цикла while:
y=x; //начальное приближение
do
y=0.5*(y+x/y);
while(fabs(y-x*x)>1e-6)
Отличие конструкции do – while от двух предыдущих операторов цикла заключается в том, что здесь тело цикла выполняется, по крайней мере, один раз. Этот цикл иногда сопровождают термином с постусловием – т.е. проверка условия продолжения цикла производится после выполнения его тела. В отличие от этого два предыдущих цикла начинаются с проверки заданного условия (циклы с предусловием) и в некоторых случаях тело таких циклов может ни разу не выполниться.
Обратите внимание на разницу между организацией цикла с постусловием в Паскале и языках C,C++. В программе на языке Паскаль
Все конструкции операторов цикла допускают вложение других циклов в свои тела. Например, для умножения квадратных матриц можно воспользоваться следующим фрагментом программы:
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{for(d=0,k=0; k<n; k++)
d += a[i][k]*b[k][j];
c[i][j]=d;
}