
- •Отображает данные, вводимые в ручную, во время обработки с устройств любого типа (клавиатура, переключатели, кнопки, световое перо, полоски со штрих кодом и т.д.).
- •Символ отображает хранимые данные в виде, пригодном для обработки. Носитель данных не определен. В схемах алгоритмов он предназначен для обозначения ввода-вывода данных в случае использования запоминающего устройства, управляемого процесса.
- •Тема 1. Основные этапы решения задач на ЭВМ
- •Постановка задачи разработки программного обеспечения
- •Анализ формальной постановки задачи
- •Выбор или разработка математической модели и метода решения
- •Разработка алгоритма
- •Базовые структуры алгоритма
- •Тема 2. Жизненный цикл программы. Критерии качества программы.
- •Техническое задание и спецификация программы
- •Разработка проекта программной системы
- •Программирование (кодирование) или программная реализация алгоритмов
- •Тестирование и отладка
- •Эксплуатация и сопровождение
- •Критерии качества программного обеспечения
- •Тема 3. Схемы алгоритмов, данных, программ
- •Символы данных
- •Символы процесса
- •Символы линий
- •Специальные символы
- •Правила применения символов в схемах
- •Правила выполнения соединений
- •Специальные условные обозначения
- •Тема 4. Язык программирования высокого уровня Си
- •Общие сведения о языке Си
- •Алфавит языка Си
- •Грамматика для описания языка, синтаксические диаграммы
- •Структура программы на языке Си
- •Имена объектов в программе
- •Выражения, операции и приоритеты
- •Тема 5. Стандартные типы данных
- •Тема 6. Составные типы данных
- •Данные регулярного типа (массивы)
- •Строки
- •Данные комбинированного типа (структуры)
- •Перечисления
- •Объединения
- •Указатели
- •Тема 7. Представление основных управляющих структур программирования
- •Оператор присваивания
- •Составной оператор
- •Оператор перехода Goto
- •Условный оператор If
- •Оператор выбора switch
- •Операторы цикла while, do – while, for
- •Операторы прерывания циклов
- •Форматированный ввод данных
- •Форматированный вывод данных
- •Преобразование типов
- •Инициализация данных
- •Тема 8. Функции
- •Определение функций в языке Си
- •Вызов функций в языке Си
- •Рекурсивные функции
- •Тема 9. Файлы
- •Тема 10. Приемы программирования. Примеры алгоритмов
- •Алгоритмы сортировки
- •Алгоритмы поиска
- •Динамические структуры данных
- •Линейные списки
- •Стек, очередь, дек
- •Деревья
- •Приложение 1. Стандартные библиотеки языка Си
- •Приложение 2. Примеры реализации алгоритмов
- •Не рекурсивный алгоритм решения задачи Ханойская башня.
- •Рекурсивный алгоритм решения задачи Ханойская башня.
- •Приложение 3. Лабораторные работы
- •Лабораторная работа №1
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
- •Лабораторная работа №11
- •Лабораторная работа №12
- •Список литературы
Оператор выбора switch
Оператор swith (переключатель), вызывает передачу управления к одному из нескольких операторов, в зависимости от значения выражения. Оператор имеет форму
switch (селектор)
{case констанстное выражение_1: оператор_1; [break;] case констанстное выражение_2: оператор_2; [break;]
. . .
case констанстное выражение_n: оператор_n; [break;]
} [default: оператор; [break;]]
Селектор и константное выражение должны иметь тип int. Оператор помечается префиксом case и обычно является составным. Никакие две вариантные константы в одном и том же переключателе не могут иметь одинаковое значение.
При выполнении оператора swith вычисляется входящий в него селектор и сравнивается с каждой вариантной константой. Если одна из вариантных констант оказывается равной значению этого выражения, то управление передается оператору, который следует за совпадающим вариантным префиксом. Если ни одна из вариантных констант не совпадает со значением выражения и если при этом присутствует префикс default, то управление передается оператору, помеченному этим префиксом. Если ни один из вариантов не подходит и префикс default отсутствует, то ни один из операторов в переключателе не выполняется.
Сами по себе префиксы case и default не изменяют поток управления, которое беспрепятсвенно проходит через такие префиксы. Для выхода из переключателя используется оператор break.
Пример 16. Напишем два эквивалентных оператора: на основе swith и на основе последовательности условных операторов для выбора времени года в зависимости от целочисленного значения переменной months, в которой хранится номер текущего месяца.
// выбор на основе оператора switch switch (months)
{
91

}
case 1 : season = “Зима”; break; case 2 : season = “Зима”; break; case 12: season = “Зима”; break; case 3 : season = “Весна”; break; case 4 : season = “Весна”; break; case 5 : season = “Весна”; break; case 6 : season = “Лето”; break; case 7 : season = “Лето”; break; case 8 : season = “Лето”; break; default: season = “Осень”; break;
// теперь тоже самое на основе операторов if
if (months==1 || months==2 || months==12) season = "Зима";
elseif (months==3 || months==4 || months==5) season = "Весна"; else
if (months==6 || months==7 || months==8) season = "Лето"; else season = "Осень";
На блок-схемах алгоритмов оператор выбора изображается следующим образом (рис.32):
months
1,2,12
3,4,5
6,7,8
иначе
|
|
|
|
|
|
D=0 |
|
D |
D>1, D<0 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D=1 |
|
|
|
|
|
season |
= “Зима” |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
A |
|
|
|
B |
|
|
С |
||||||
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
season |
= “Весна” |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
season = “Лето”
season = “Осень”
Рис.32. Примеры отображения оператора выбора на блок-схемах
Операторы цикла while, do – while, for
Операторы цикла позволяют реализовать в языке Си, рассмотренные ранее алгоритмические конструкции цикла с предусловием, цикла с постусловием и цикла с заданным количеством итераций.
Цикл с предусловием while
Синтаксис
while <условие> do <оператор>
Сначала вычисляется «условие», если оно истинно, то выполняется «оператор», потом повторяется проверка «условия», и если оно истинно опять
92
выполняется «оператор» и так далее. Если условие ложно, то управление передается на оператор, расположенный после цикла. Вход в тело цикла возможен только через его заголовок, т.е. нельзя войти во внутрь цикла, используя оператор goto. Однако с помощью этого оператора можно досрочно выйти из цикла, что делать не рекомендуется, для этого используется оператор break.
Пример 17. Необходимо ввести вектор вещественных чисел с помощью цикла с предусловием.
int n=10; float a[10]; int i;
printf("Введите вектор\n"); i=0;
while (i<n)
{ scanf ("%d", &a[i]);
} i++;
Цикл с постусловием do – while
Синтаксис
do <операторы> while <условие>
Сначала выполняются «операторы», затем вычисляется «условие», если оно ложно, то опять выполняются «операторы» и т.д. Если «условие» истинно, то управление передается на оператор, расположенный после цикла. Вход в тело цикла возможен только через его заголовок, т.е. нельзя войти во внутрь цикла, используя оператор goto. Однако с помощью этого оператора можно досрочно выйти из цикла, что делать не рекомендуется, для этого используется оператор break.
Отметим два ключевых отличия циклов с предусловием и постусловием:
1.Оператор внутри цикла с предусловием может не выполниться ни разу, если при входе в цикл условие сразу будет ложным. Операторы внутри цикла с
постусловием выполнятся как минимум 1 раз вне зависимости от истинности условия в конце цикла.
2.Выход из цикла с предусловием происходит, когда условие ложно, а выход из цикла с постусловием – когда условие истинно, поэтому если нужно поменять
93
циклы (цикл с постусловием поменять на цикл с предусловием или наоборот), условие нужно поменять на противоположное.
Эти особенности нужно учитывать при разработке и отладке программ. Пример 18. Пусть имеется матрица вещественных чисел A[10,10].
Используя цикл с постусловием, написать программу, которая находит в нечетных строках матрицы минимальный элемент, а в четных строках – максимальный.
int n=3; int a[3][3]; int min,max;
int i,j,imax,jmax,imin,jmin;
// ввод матрицы пока пропускаем max=a[2][1]; imax=2; jmax=1; min=a[1][1]; imin=1; jmin=1; i=1; do
{
j=1; do
{//если нечетная строка и элемент меньше минимального if ((i%2)!=0 && a[i][j]<min)
{min=a[i][j]; imin=i; jmin=j;
}
else
if (((i%2)==0) && (a[i][j]>max))
{ max=a[i][j];
} imax=i; jmax=j; } j++;
while (j>n); i++;
}
Цикл с заданным количеством итераций (цикл с параметром) for
Цикл for лучше всего использовать, когда известно количество повторений в цикле. Программа при этом становится короче и понятнее.
Синтаксис
FOR (выражение 1; выражение 2; выражение 3) <оператор>
Здесь «выражение 1» задает начальное значение переменной цикла, «выражение 2» – это выражение, определяющее условие, при котором тело цикла будет выполняться, «Выражение 3» определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла. Значения
94
«выражения 1» и «выражения 2» должны быть типа, совместимого по присваиванию с типом переменной цикла. Таким образом, цикл for может быть реализован на основе цикла с предусловием:
<переменная>=<выражение 1>;
while <переменная> <= <выражение 2>
{
<оператор>;
}
<переменная>++;
Вход в цикл возможен только через его заголовок, т.е. нельзя войти во внутрь цикла, используя оператор goto. Однако с помощью этого оператора можно досрочно выйти из цикла, что делать не рекомендуется, для этого используется оператор break. При нормальном завершении цикла значение переменной цикла неопределенно, если цикл завершился преждевременно по оператору break или goto, то переменная цикла сохраняет свое последнее значение. В теле цикла for запрещается изменять переменную цикла.
Пример 19. Необходимо ввести и вывести матрицу вещественных чисел с помощью цикла с параметром, по пути подсчитав сумму всех ее элементов.
int n=10;
int a[10][10]; int sum=0; int i,j;
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ printf("Введите элемент матрицы [%d %d]: ",i,j); } scanf("%d",&a[i][j]);
}
printf("Введенная матрица:"); for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ printf("%d\t",a[i][j]);
} sum = sum + a[i][j]; // считаем сумму
}
printf("\n");
printf("Сумма элементов = %d", sum);
95