- •1.1. Алфавит языка Си
- •1.2. Лексемы
- •1.3. Идентификаторы и ключевые слова
- •1.4. Знаки операций
- •1.5. Литералы (константы)
- •1.6. Комментарии
- •1.7. Общая структура программы на языке Си.
- •1.8. Функциональная и модульная декомпозиции
- •1.9. Этапы обработки программы.
- •1.10. Роль препроцессора.
- •1.11. Ошибки
- •2. Переменные и константы. Типы данных
- •2.1. Основные типы данных
- •2.2. Декларация (объявление) объектов
- •2.3. Константы в программах
- •2.4. Целочисленные константы
- •2.5. Константы вещественного типа
- •2.6. Символьные константы
- •2.7. Строковые константы
- •2.8. Логические константы
- •3. Обзор операций
- •3.1. Операции, выражения
- •3.2. Арифметические операции
- •3.3. Операции сравнения
- •3.4. Логические операции
- •3.5. Операция присваивания
- •Примеры недопустимых выражений:
- •3.6. Сокращенная запись операции присваивания
- •3.7. Операция «,» (запятая)
- •4. Обзор операций (продолжение)
- •4.1. Преобразование типов операндов бинарных операций
- •4.2. Преобразование типов при присваивании.
- •4.3. Операция явного приведения типа
- •4.4. Приоритеты операций
- •5. Стандартная библиотека языка Си
- •5.1. Стандартные математические функции
- •5.2. Потоковый ввод-вывод
- •5.3. Консольные функции вывода данных на экран
- •5.4. Консольные функции ввода информации
- •5.5. Ввод-вывод в оконных приложениях.
- •Советы по программированию
- •6. Операторы языка с.
- •7. Составление разветвляющихся алгоритмов
- •7.1. Условные операторы
- •If (выражение) оператор;
- •If (выражение) оператор 1 ;
- •If (выражение 1) оператор 1;
- •If (выражение 2) оператор 2;
- •If (выражение 3) оператор 3;
- •7.2. Оператор выбора альтернатив (переключатель)
- •Void main(void)
- •7.3. Условная операция «? :»
- •8. Составление циклических алгоритмов
- •8.1. Оператор с предусловием while
- •8.2. Оператор цикла с постусловием do – while
- •Void main(void)
- •8.3. Оператор цикла с предусловием и коррекцией for
- •8.4. Вложенные циклы.
- •Пример 1.
- •Void main(){
- •Пример 2.
- •9. Операторы передачи управления.
- •9.1. Оператор безусловного перехода goto
- •9.2. Операторы continue, break и return
- •10. Массивы
- •10.1. Одномерные массивы
- •10.2. Примеры алгоритмов, использующих одномерные массивы.
- •10.3. Многомерные массивы
- •10.4. Примеры алгоритмов, использующих двумерные массивы.
- •10.5. Компонента StringGrid
- •11. Размещение данных и программ в памяти пэвм
- •11.1. Общие понятия.
- •11.2. Кодирование целых чисел.
- •11.3. Кодирование вещественных чисел.
- •11.4. Кодирование символов.
- •Примеры кодов символов:
- •Стандартная часть таблицы символов (ascii)
- •Дополнительная часть таблицы символов (ascii, кириллица)
- •Дополнительная часть таблицы символов (ansi, кириллица)
- •11.5. Операция sizeof
- •11.6. Кодирование программы.
- •11.8. Регистры
- •12.1. Строки как нуль-терминированные массивы char.
- •Void main(){
- •If (!strcmp(a,b))
- •Itoa(I, s, 10);
- •If (! sscanf(s, "%d", &I))
- •If (!strnicmp(s, "song", 4)) {
- •If (!strnicmp(s, "song", 4)) {
- •12.2. Русификация консольных приложений.
- •Void main(void)
- •12.3. Строки как переменные типа AnsiString.
- •12.4. Преобразования строковых типов.
- •12.5. Тип String в консольных приложениях.
- •Void main(){
- •13. Функции пользователя.
- •13.1. Сущность и предназначение функций.
- •13.2. Определение и вызов функции.
- •Void main(){
- •14. Область видимости и классы памяти
- •14.1. Область видимости.
- •Void fun(void);
- •14.2. Классы памяти объектов в языке Cи.
- •Void f1(int);
- •Void main(void)
- •Void f1(int I)
- •Void st(void){
- •14.3. Разбиение программы на модули.
- •15. Генерация псевдослучайных чисел.
- •16. Отладка и пошаговое выполнение программы
- •17. Указатели
- •17.1. Определение указателей
- •17.2. Связь указателей и массивов.
- •17.3. Операции над указателями (косвенная адресация)
- •17.4. Сравнение указателей
- •17.5. Массивы указателей.
- •17.6. Указатели на указатели.
- •17.7 . Указатели как параметры функций.
- •Void zam(int *X, int *y)
- •Void zam(int &X, int &y)
- •Void zam (int&, int&);
- •Void main (void)
- •17.9. Указатели на функции
- •Void FunOut(double (*p_f )(char, double)){
- •18.2. Создание одномерного динамического массива.
- •18.3. Создание двуxмерного динамического массива.
- •19. Операция typedef
8.1. Оператор с предусловием while
Цикл с предусловием реализует структурную схему, приведенную на рис. 8.1а и имеет вид:
while (выражение)
код цикла;
Выражение определяет условие повторения кода цикла, представленного простым или составным оператором.
Если выражение в скобках – истина (не равно 0), то выполняется код цикла. Это повторяется до тех пор, пока выражение не примет значение 0 (ложь). В этом случае происходит выход из цикла и выполняется оператор, следующий за конструкцией while. Если выражение в скобках изначально ложно (т.е. равно 0), то цикл не выполнится ни разу.
Код цикла может включать любое количество операторов, связанных с конструкцией while, которые нужно заключить в фигурные скобки (организовать блок), если их более одного.
Переменные, изменяющиеся в коде цикла и используемые при проверке условия продолжения, называются параметрами цикла. Целочисленные параметры цикла, изменяющиеся с постоянным шагом на каждой итерации, называются счетчиками цикла.
Н
ачальные
установки могут явно не присутствовать
в программе, их смысл состоит в том,
чтобы до входа в цикл задать значения
переменным, которые в этом цикле
используются.
Рис. 8.1
Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение, как текущей итерации, так и цикла в целом.
Для этого используют оператор continue – переход к следующей итерации цикла и break – выход из цикла.
Передавать управление извне внутрь цикла не рекомендуется, так как получите непредсказуемый результат.
Например, необходимо сосчитать количество символов в строке. Предполагается, что входной поток настроен на начало строки. Тогда подсчет символов выполняется следующим образом:
int count = 0;
char ch;
scanf("%c", &ch);
while ( ch != '\n') {
count++;
scanf("%c", &ch);
}
8.2. Оператор цикла с постусловием do – while
Цикл с постусловием реализует структурную схему, приведенную на рис. 8.1б.
Общий вид записи такой конструкции:
do
код цикла;
while (выражение);
Код цикла будет выполняться до тех пор, пока выражение истинно. Все, что говорилось выше справедливо и здесь, за исключением того, что данный цикл всегда выполняется хотя бы один раз, даже если изначально выражение ложно.
Здесь сначала выполняется код цикла, после чего проверяется, надо ли его выполнять еще раз.
Следующая программа будет вас приветствовать до тех пор, пока будем вводить символ Y или y (Yes). После введения любого другого символа цикл завершит свою работу.
#include <stdio.h>
Void main(void)
{
char answer;
do {
puts(" Hello! => ");
scanf("%c", &answer);
fflush(stdin);
}
while ((answer=='y')||(answer=='Y'));
}
Результат выполнения программы:
Hello! => Y
Hello! => y
Hello! => d
8.3. Оператор цикла с предусловием и коррекцией for
Цикл реализует структурную схему, приведенную на рис. 8.2 (такой цикл еще называют циклом с параметром).

Рис. 8.2
Общий вид оператора:
for (выражение 1; выражение 2; выражение 3)
код цикла;
где выражение 1 – инициализация счетчика (параметра цикла);
выражение 2 – условие продолжения счета;
выражение 3 – коррекция счетчика.
Инициализация используется для присвоения счетчику (параметру цикла) начального значения.
Выражение 2 определяет условие выполнения цикла. Как и в предыдущих случаях, если его результат не нулевой («истина») то цикл выполняется.
Коррекция выполняется после каждой итерации цикла и служит для изменения параметра цикла.
Цикл for эквивалентен последовательности инструкций:
выражение 1;
while (выражение 2) {
...
выражение 3;
}
Пример цикла for, выводящего числа от 0 до 9:
for(i=0; i<10; i++)
cout<<i<<endl;
Пример цикла while, выводящего числа от 0 до 9:
int i=0;
while (i<10) {
cout<<i<<endl;
i++;
}
Для суммирования первых N натуральных чисел можно записать такой код:
sum = 0;
for ( i = 1; i<=N; i++) sum+=i;
Выражения 1,2 и 3 могут отсутствовать (пустые выражения), но символы «;» опускать нельзя.
Таким образом, оператор
for (; выражение 2; )
код цикла;
эквивалентен оператору
while (выражение 2)
код цикла;
Если пропущено выражение 2, то цикл будет выполняться бесконечное количество раз, поскольку пустое условие считается истинным. Оператор «бесконечного цикла»:
for ( ; ; ) код цикла;
эквивалентен оператору
while (1) код цикла;
Заметим, что в выражении 1 переменную-счетчик можно декларировать:
for (int i = 1; i<=N; i++)
Областью действия такой переменной будет код цикла. Но в некоторых версиях компиляторов такие действия могут интерпретироваться иначе.
В циклической структуре for может использоваться операция «запятая». Она позволяет включать в его выражения несколько операторов. Тогда рассмотренный пример суммирования первых N натуральных чисел можно записать в следующем виде:
for (sum = 0, i = 1; i<=N; sum+=i++) ;
Телом этого цикла является пустой оператор ;
Оператор for имеет следующие возможности:
– можно вести подсчет с помощью символов, а не только чисел:
for (ch = 'a'; ch <= 'z'; ch++) ... ;
– можно проверить выполнение некоторого произвольного условия:
for (n = 0; s[i] >= '0' && s[i] < '9'; i++) ... ;
или:
for (n = 1; n*n*n <= 216; n++) ... ;
Первое выражение не обязательно должно инициализировать переменную. Необходимо только помнить, что первое выражение вычисляется только один раз перед тем, как остальные части начнут выполняться.
num=0;
for(printf(" вводить числа по порядку! \n"); num!=6;)
scanf("%d", &num);
printf(" последнее число – это то, что нужно. \n");
В этом фрагменте первое сообщение выводится на печать один раз, а затем осуществляется прием вводимых чисел, пока не поступит число 6.
Переменные, входящие в выражения 2 и 3 можно изменять при выполнении кода цикла, например, значения k и delta:
for (n = 1; n < 10*k; n += delta) k=delta--;
Использование условных выражений позволяет во многих случаях значительно упростить программу, например:
for (i = 0; i<n; i++)
printf("%6d%c",a[i], (i%10==0 || i==n–1) ? '\n' : ' ');
В этом цикле печатаются n элементов массива а по 10 в строке, разделяя каждый столбец одним пробелом и заканчивая каждую строку (включая последнюю) одним символом перевода строки. Символ перевода строки записывается поле каждого десятого и n-го элементов. За всеми остальными – пробел.
Наиболее часто встречающиеся ошибки при создании циклов – это использование в коде цикла неинициализированных переменных и неверная запись условия выхода из цикла. Начинающие также иногда ошибочно ставят знак «;» после заголовка цикла, что истолковывается компилятором как конец тела цикла.
Чтобы избежать ошибок, нужно стараться:
– проверить, всем ли переменным, встречающимся в правой части операторов присваивания в коде цикла, присвоены до этого начальные значения;
– проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;
– предусмотреть аварийный выход из цикла по достижению некоторого количества итераций;
– если в состав цикла входит не один, а несколько операторов, нужно заключать их в фигурные скобки.
