- •И.А. Васюткина основы алгоритмизации и программирования.
- •Содержание
- •1.Обзор языКа программирования с
- •2.Этапы создания программы
- •3.Структура программы на языке си
- •3.1. Внутренняя структура программы
- •3.2. Пример программы на си
- •4.Базовые элементы языка си
- •5.Данные в программе на си
- •5.1. Константы
- •5.2. Базовые стандартные типы переменных
- •6.2. Операции отношения
- •6.3. Логические операции
- •6.4. Операции с разрядами
- •6.5. Операции сдвига
- •6.6. Операция условия ?:
- •6.7. Преобразование типов
- •6.8. Операции приведения
- •6.9. Дополнительные операции присваивания
- •7.Операторы языка си
- •Оператор может быть простым и составным. Позволяет пропустить оператор или блок операторов, если условие ложно.
- •1.Схема выполнения оператора
- •8. Оператор множественного выбора
- •9. Операторы цикла while
- •8. Операторы безусловных переходов
- •8.Стандартные функции ввода и вывода
- •8.1. Функция вывода данных на экран printf ()
- •8.2. Модификаторы спецификаций преобразования
- •8.3. Функция ввода данных с клавиатуры sсanf()
- •8.4. Функции ввода/вывода одного символа getchar(), putchar()
- •8.5. Функции небуфиризированного ввода с клавиатуры
- •8.7. Форматирование вывода
- •Заключительная программа
- •9. Массивы
- •9.1. Одномерные массивы
- •Стандартные алгоритмы работы с одномерными массивами
- •Инициализация одномерных массивов
- •9.2. Многомерные массивы
- •Инициализация многомерных массивов
- •9.2.2 Стандартные алгоритмы работы с двумерными массивами
- •10. Функции
- •10.1.Cоздание и использование пользовательских функций
- •10.2.Параметры функции
- •10.3.Возвращение значения функцией
- •10.4.Inline-функции
- •10.5.Значение формальных параметров функции по умолчанию
- •10.6.Перегрузка функций
- •11. Классы памяти и область действия
- •11.1.Глобальные переменные
- •Extern - внешние переменные
- •Статистические внешние переменные - static
- •11.2.Локальные переменные
- •Внутренняя статическая переменная
- •Регистровая переменная
- •Автоматические переменные
- •11.3.Доступ к функциям в многомодульной программе
- •12. Препроцессор языка си
- •12.1. Подстановка имен
- •12.2.Включение файлов
- •12.3.Условная компиляция
- •13. Указатели
- •13.1.Операция косвенной адресации *
- •13.2. Описание указателей
- •13.3.Использование указателей для связи функций
- •13.4.Указатели на одномерные массивы
- •13.5.Указатели на многомерные массивы
- •13.6.Операции над указателями
- •13.7.Передача массива в качестве параметра в функцию
- •13.8.Указатель на void *
- •14. Символьные строки и функции над строками
- •14.1.Массивы символьных строк
- •14.2.Массивы указателей
- •14.3.Указатель как возвращаемое значение функции Передача указателя как параметра функции
- •14.4.Функции, работающие со строками Функции, определеные в заголовочном файле stdio.H
- •14.5. Стандартные библиотечные функции Функции, определеные в заголовочном файле string.H
- •14.6. Преобразование символьных строк
- •Функции, определеные в заголовочном файле ctype.H.
- •15. Ссылки
- •16. Параметры командной строки
- •17. Производные типы данных
- •17.1.Структуры
- •Массивы структур
- •Вложенные структуры
- •17.1.3 Указатели на структуры
- •Операции над структурами
- •Передача структуры в функцию
- •17.2.Объединения
- •17.3. Синоним имени типа
- •17.4.Определение именнованных констант
- •17.5.Перечисления
- •17.6.Битовые поля
- •18. Динамическое выделение памяти
- •2. Функция void* calloc(n,size type);
- •18.2.Операция new с массивами
- •18.3.Инициализаторы с операцией new
- •18.4.Ошибки при использовании динамичской памяти
- •19. Файл
- •19.1.Открытие файла fopen()
- •19.2.Закрытие файла fclose()
- •19.3.Функции ввода/вывода одного символа fgetc(), fputc()
- •19.4.Функции форматированного ввода/вывода в файл
- •Int fprintf(file *stream,”управл.Cтрока”,arg1,…)
- •Int fscanf(file *stream,”управл.Cтрока”,&arg1,…)
- •19.5. Функции ввода/вывода строки символов в файл
- •19.6.Функции управления указателем в файле
- •Int fseek(file *stream, смещение, start)
- •19.7.Ввод/вывод записей фиксированной длины
- •20. Динамические структуры данных
- •20.1.Однонаправленные связные списки
- •Вставка узла
- •Удаление узла из списка
- •20.2.Бинарные деревья
- •21. Размещение данных в памяти
- •22.Модели памяти
- •Список литературы
9. Операторы цикла while
Цикл – это многократно повторяющиеся действия или группа действий.
Операторы цикла могут быть трех видов: с предусловием, с постусловием, со счетчиком.
а) с предусловием:
Оператор while состоит из трех частей: это ключевое слово while, затем в круглых скобках указывается проверяемое условие, и тело цикла - оператор, который выполняется, если условие истинно (таких операторов может быть несколько, тогда они заключаются в {} и получается составной оператор). Если оператор один, то действие оператора while распространяется от ключевого слова while до ‘;’.
while (условное выражение) или while (условное выражение){
оператор; операторы;
}
Схема выполнения цикла
while Истина
Ложь (переход к следующей операции)
Тело цикла может состоять из нескольких операторов. В этом случае оно заключается
в фигурные скобки.
Пример 1: Пример 2:
index = 0; index = 0;
while (index++ < 10) while (index++ < 10) {
sum = 10*index + 2; sum = 10*index + 2;
printf ("sum = % d \n", sum); printf ("sum = % d \n", sum);
}
В примере 1 в цикл включен только один оператор присваивания. Печать данных будет производиться только 1 раз – после завершения цикла (будет выведено – sum=102). В примере 2 в цикл включено два оператора, поэтому печать результатов будет выводиться на каждом шаге работы цикла.
В операторе цикла с предусловием, решение о прохождении цикла принимается до прохождения цикла. Поэтому возможно, что цикл никогда не будет пройден.
Последовательность действий, состоящая из проверки выражения и выполнения оператора, периодически повторяется до тех пор, пока выражение не станет ложным. Каждый такой шаг называется «итерацией».
//Пример программы с циклом while
#include <stdio.h>
void main(void)
{
int guess=1;
char res;
printf("Задумайте число от 1 до 100. Я попробую его угадать");
printf("\n Отвечайте д, если моя догадка верна и”);
printf( «\n н, если я ошибаюсь.\n»);
printf("Итак ваше число %d?\n", guess);
while((res=getchar()) != 'д')
if(res!='\n')
printf("Тогда оно равно %d?\n", ++guess);
printf("Ура, я угадала!!!");
}
б) Оператор цикла с постусловием (истинность условия проверяется после выполнения каждой итерации цикла. Решение, выполнять или нет очередной раз тело цикла, принимается после выполнения всех итераций). Этот цикл всегда выполняется хотя бы 1 раз.
do или do {
оператор; операторы;
while (условное выражение); } while (условное выражение);
Проверка истинности осуществляется после выполнения оператора или блока операторов. Хотя бы один раз этот цикл будет выполнен.
Схема выполнения цикла
Do while Истина
Ложь
Рассмотрим два примера:
Пример 1 Пример 2
do { while((ch = getchar()) ! = '\n')
ch = getchar(); putchar (ch);
putchar (ch);
} while(ch ! = '\n')
Функция getchar() получает один символ, поступающий с клавиатуры и передает его программе, аргументов она не имеет. Функция putchar получает один символ, поступающий из программы, и пересылает его для вывода на экран, эта функция имеет один аргумент, т.е. в скобках необходимо указывать символ, который будет выведен на печать. Можно использовать эту функцию в следующем виде: putchar(getchar()) – эта запись компактна и не требует введения вспомогательных переменных.)
Во втором примере на экран будут выводиться все символы до появления символа «новая строка». А в первом примере будут выводиться все символы, включительно и символ «новая строка» (только после печати этого символа, если он введен, в цикле производится проверка символа «новая строка» и действие цикла завершается).
Цикл выполняется хотя бы один раз, так как проверка осуществляется только после его завершения.
в) Оператор цикла со счетчиком
for (выр1; выр2; выр3) или for (выр1; выр2; выр3) {
оператор; операторы;
}
Выр1 – инициализация, проводится только 1 раз в начале цикла.
Выр2 - проверка условия окончания цикла (производится перед каждым возможным выполнением тела цикла. Когда выражение становится ложным, цикл завершается).
Выр3 – наращивание счетчика цикла (выражение вычисляется в конце каждого выполнения тела цикла).
Схема выполнения цикла
for Истина
Ложь
Если какое-либо из выражений отсутствует, то ‘;’ все равно ставится. Могут отсутствовать все выражения, и тогда цикл бесконечен. Цикл for очень многообразен.
Примеры:
1). for (n = 1; n < 1000; n++) ; счет в порядке возрастания
2). for ( i = 10; i > 0; i--) ; счет в порядке убывания
3). for (n = 2; n < 60; n = n + 12) ; значение переменной n будет увеличиваться на 12 при каждом выполнении тела цикла (после этой команды можно ввести printf(“%d\n”,n) и тогда на экран будут выводиться числа 2,14,26,38,50,62)
4). Можно вести подсчет с помощью символов:
for (ch = 'a'; ch <= 'z'; ch++) ;
printf(«Величина кода ASCII для %c равна %d.\n», ch, ch);
на печать будут выведены все буквы от a до z вместе с их кодами ASCII.
5). Наращивание может происходить и после выполнения действий в выражениях (значение переменных будет меняться при каждой итерации):
for (x = 1; y <= 75; y = 5*(x++)+10) ;
for (i = 1, cost = 20; i <= 16; i++, cost+= 17) ;
6). Можно опустить одно или более выражений (но нельзя опустить символы ;). Необходимо только включить в тело цикла несколько операторов, которые приведут к завершению его работы.
ans = 2;
for (n = 3; ans <=25;)
ans=*n;
Значение переменной asn сначала будет равно2, затем на первой итерации цикла примет значение 6, затем 18 и 54.
7). Бесконечный цикл
for (;;) ;
пустое условие всегда считается истинным.
8). Первое выражение не обязательно должно инициализировать переменную. Там может стоять оператор некоторого специального вида, например printf. Необходимо только помнить, что первое выражение выполняется только один раз, до начала выполнения остальных частей цикла.
for (printf ("Запомните введение числа!\n"); num = =6;)
scanf (" % d, &num);
г) Вложенные циклы
Если внутри одного цикла находится другой цикл, то эта конструкция называется вложенный цикл. Внутренний цикл выполняется столько раз, сколько задано во внешнем цикле.
// Пример программы на вложенные циклы
// Вывести на экран числа от 0 до 99 по 10 в каждой строке
#include <stdio.h>
void main(void)
{
int num=0;
int i, j;
for(i=0; i<10; i++) {
for(j=0; j<10; j++)
printf("%4d",num++);
printf("\n");
}
}