
- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
6.2. Операторы цикла
В языке C, как и в других языках программирования, операторы цикла служат для многократного повторения последовательности операторов до тех пор, пока выполняется некоторое условие. Цикл состоит из заголовка и тела цикла. Вход в цикл и выход из цикла осуществляются через заголовок цикла. В C существуют три вида циклов: for, while, do-while.
6.2.1. Оператор while
Ключевое слово while позволяет выполнять оператор или группу операторов до тех пор, пока условие не перестанет быть истинным.
Синтаксис: while(ЛВ) ОP;
где ЛВ – логическое выражение, ОP – тело цикла (простой или составной оператор).
Итак:
если ЛВ – истинно, выполняется ОР, затем снова проверяется ЛВ и так далее;
если ЛВ – ложно, ОР пропускается, и управление передается на оператор, следующий за телом цикла.
Поскольку проверка ЛВ выполняется перед телом цикла, цикл while называют циклом с предусловием.
Если ЛВ изначально ложно, тело цикла while не выполнится ни разу.
Пример программы
Вычислить значение sin(x) для некоторого x с заданной точностью путем разложения в степенной ряд, при условии, что x>:
Программа
#include <stdio.h>
#include <math.h>
#define EPS 0.001
int main(void)
{
float x,S=0,U;
int i=0;
printf("\n Input x→");
scanf("%f",&x);
U=x;
while (fabs (U)>EPS) /*fabs – функция вычисления
абсолютного значения, объявлена в math.h*/
{
S+=U;
++i;
U*=(−x)*x;
U/=2*i*(2*i+1);
}
printf("\n sin(%f)=%7.3f",x,S);
return 0;
}
6.2.2. Оператор for
Оператор цикла for позволяет выполнять оператор или группу операторов заранее заданное количество раз.
Общая форма оператора
for (V1; ЛВ; V2) ОP;
где V1 – выражение, в котором производится присваивание переменной, называемой параметром цикла, начального значения (инициализация); ЛВ – условие, определяющее, следует ли в очередной раз выполнять оператор (тело цикла); V2 – выражение, в котором производится изменение переменной цикла (приращение); ОР – оператор или группа операторов.
Принцип работы:
вычисляется V1;
вычисляется ЛВ;
если ЛВ истинно, выполняется ОР, затем вычисляется V2;
проверка ЛВ → ОP → V2 и т. д.
Когда ЛВ становится ложным, осуществляется переход к оператору, следующему за ОP. Если ОP – составной оператор, то его надо заключить в {}.
Если ЛВ сразу ложно, то ни ОР, ни V2 не выполняются ни разу.
Отметим две дополнительные возможности оператора for по сравнению с оператором while:
o возможность включения инициализирующего выражения V1, используемого один раз перед тем, как будет произведена оценка условия;
o возможность включения выражения V2, которое будет использоваться после каждой итерации оператора ОР.
Пример 1. Вычислить значения функции sin(x) в равноудаленных точках на интервале [0, 4π]. Количество расчетных точек вводится с клавиатуры:
#include <stdio.h>
#include <math.h>
int main(void)
{
int n;
float x, y;
float x1=0, x2=4*M_PI;
printf("Введите количество точек\n");
scanf("%d",&n);
x=x1;
float step=(x2−x1)/(n−1);
for (int i=1; i<=n; i++)
{
y = sin(x);
printf("%3d %8.3f %8.3f\n",i,x,y);
x+=step;
}
return 0;
}
В этом примере количество точек задается в целочисленной переменной n, границы интервала изменения x – в переменных x1 и x2, которые имеют вещественный тип и инициализируются при объявлении. M_PI – макрос, представляющий число π, объявлен в заголовочном файле math.h. Там же объявлена функция sin().
Пример 2. Составим программу вычисления значение sin(x) (п. 6.2.1) с использованием оператора цикла for:
#include <stdio.h>
#include <math.h>
#define EPS 0.001
int main(void)
{
float x,S=0,U;
int i=0;
printf("\n Input x→");
scanf("%f",&x);
for (U=x;fabs (U)>EPS;)
{
S+=U;
i++;
U*=(-x)*x;
U/=(2*i+1)*2*i;
}
printf("\n sin(%6.3f)=%7.3f",x,S);
return 0;
}
Следует иметь в виду, что все три выражения – V1, ЛВ, V2 являются необязательными. В качестве ОP может быть использован пустой оператор.
Возможны конструкции:
for(V1;;V2)ОP (бесконечный цикл); for(;ЛВ;)ОP и даже for(;;).
Заметим, что с помощью операторов for и while можно создавать бесконечные циклы, если опустить все три выражения в операторе for и использовать всегда истинное ЛВ в while. Такие программы нельзя назвать корректными, но существуют способы завершения самых некорректных циклов.
Допускается использование оператора for, когда имеется несколько начальных выражений вида V1, перечисленных через запятую, и несколько выражений вида V2, также перечисленных через запятую. Конструкция такого вида носит название – операция запятая.
Используя операцию запятая, составим программу вычисления все того же sin(x):
#include <stdio.h>
#include<math.h>
#define EPS 0.001
int main(void)
{
float x,S,U;
int i;
printf("\n Input x?");
scanf("%f",&x);
for(S=0,U=x,i=0;fabs(U)>EPS;S+=U,i++, U*=(−x/2*i+1)));
printf("\n sin(%6.3f)=%7.3f",x,S);
return 0;
}
В качестве
еще одного примера рассмотрим программу
вычисления корня уравнения
с
точностью ,
если начальное (нулевое) приближение
x0 –
задано:
#include <stdio.h>
#include <math.h>
#define EPS 0.001
int main(void)
{
float x0,x1;
printf("\n Input x0?");
scanf("%f",&x0);
for(x1=sin(x0)*sin(x0)*0.25+0.3;fabs(x1−x0)>EPS;
x1=pow(sin(x0),2)*0.25+0.3)
/*pow()– возводит число (первый аргумент) в степень (второй аргумент) */
x0=x1;
printf("\n Root is equal %6.3f",x1);
return 0;
}