4.
14.5.
15.6.
16.7.
17.8.
18.9.
19.10.
20.Лабораторная работа № 2
Тема: Программы разветвляющихся структур.
1. Изучить возможности языка программирования для реализации:
─ условной и безусловной передачи управления;
─ вычислительного процесса разветвляющейся структуры
Рассмотрим организацию ввода- вывода и реализацию основных управляющих структур. Любой конкретный алгоритм может быть записан на языке программирования, использующем только три управляющий структуры: последовательное выполнение, ветвление и повторение.
Последовательность операторов выполняется в порядке их естественного расположения в программе, с возможным отклонением для вызова внешнего фрагмента (функции), но с обязательным возвратом в точку вызова.
Ветвление в простейшем случае описывается в языке Си с помощью условного оператора. имеющего вид:
if ( выражение ) оператор_1; else оператор_2; |
где часть else может и отсутствовать. Сначала вычисляется "выражение" в скобках; если оно истинно то выполняется оператор_1. Если "выражение" ложно (равно нулю - NULL), то оператор_1 пропускается, а выполняется оператор_2. Если на месте условно выполняемых операторов должна располагаться группа из нескольких операторов языка, то они заключаются в фигурные скобки - { }. Часто "выражение" в скобках представляет условие, заданное с помощью операций отношений и логических операций. Операции отношения обозначаются в Си следующим образом:
= = равно; ! = не равно; < меньше; > больше;
< = меньше или равно; > = больше или равно.
Символ ! в языке Си обозначает логическое отрицание. Есть еще две логические операции: || означает или, а && - логическое И. Операции отношения имеют приоритет ниже арифметических операций, так что выражение вида k > n%i вычисляется как k > (n%i). Приоритет && выше, чем у ||, но обе логические операции выполняются после операций отношения и арифметических. В сомнительных случаях лучше расставлять скобки.
Для иллюстрации применения условного оператора рассмотрим программу определения большего из трех чисел.
Пример.
#include <stdio.h> main() /* главная функция*/ { int x, y, z, max ; /* описание переменных*/ printf(" Введите три числа :\n "); scanf(" %d %d %d ", &x, &y, &z); /*ввод трех чисел*/ if( x > y) /*операции сравнивания*/ max=x; else max=y; if ( z>max) max=z; printf(" Максимальное из (%d, %d, %d)= %d \n",x, y, z, max); } |
Рассмотрим пример программы, в которой применяются несколько вложенных друг в друга условных операторов. В этой программе строка float A, B, X объявляет эти три переменные как величины вещественного типа. Форматная строка функции scanf предписывает ввести два вещественные числа, которые станут значениями переменных A и B соответственно.
Пример 1.4
/*РЕШЕНИЕ УРАВНЕНИЯ AX=B*/ #include <stdio.h> main() { float A,B,X; printf("ВВЕДИ А, В\n"); scanf("%f %f",&A, &B); if(A!=0) printf("РЕШЕНИЕ:%f\n", B/A); else if(B==0) printf("X-ЛЮБОЕ ЧИСЛО\n"); else printf("РЕШЕНИЙ НЕТ\n"); } |
Посмотрите, как выглядит ветвление, когда глубина вложенности условных операторов равна трем (пример 1.5). Если хоть одно условие истинно, то все оставшиеся, разумеется, пропускаются. При глубине вложенности условных операторов свыше трех ветвление теряет наглядность и понятность.
Для реализации многозадачного ветвления обычно прибегают к управляющей структуре выбор (переключатель) (см. п.9.4). Когда управляющая структура ветвления становится особенно запутанной, определенную ясность могут внести фигурные скобки. Они обязательны, когда в условном операторе содержится более одного оператора или функции, например
if(a_0) { printf("..."); scanf("...") другие операторы ... } |
Пример 1.5
/* Программа определяет поведение ракеты, стартующей на экваторе, в зависимости от ее начальной скорости*/ #include <stdio.h> main() { float V; printf("ВВЕДИ V\n"); scanf("%f",&V); if(V<7.9) printf("РАКЕТА УПАДЕТ НА ЗЕМЛЮ\n"); if(V<11.2) printf("РАКЕТА СТАНЕТ СПУТНИКОМ ЗЕМЛИ\n "); if(V<16.4) printf("РАКЕТА СТАНЕТ СПУТНИКОМ СОЛНЦА\n"); else printf("РАКЕТА ПОКИНЕТ СОЛНЕЧНУЮ СИСТЕМУ\n"); } |
Варианты задач.
Вычислить значение функции при заданных значениях параметров. Значения параметров задаются пользователем с клавиатуры.
1.M=max {a,b,c} 11.
2.
12.3.
13.4.
14.5.
15. U=min {x,y,z}6.
16.7.
17.8.
18.9.
19.10.
20.Лабораторная работа № 3
Тема: Программы циклической структуры.
1. Изучить:
─ организацию алгоритмов циклической структуры с заданным числом повторений;
─ возможности языка программирования для построения таких циклов;
В языке Си основной структурой, управляющей повторением, служит цикл с предусловием while (пока). Он имеет следующий формат
while (условие) оператор;
Условие всегда заключено в скобки, оно может быть произвольным выражением. Оператор while повторяет выполнение оператора следующего условия, до тех пор, пока это условие истинно. Если это условие не истинно с самого начала или становится не истинным в процессе выполнения данного оператора, то управление передается оператору, следующему за оператором цикла. Если повторяемая часть оператора содержит более одного оператора, то повторяемая группа операторов должна быть заключена в фигурные скобки, например:
while(условие) { оператор_1; оператор_2; .... оператор } |
Для описания условий в операторе while используются операции условия такие же, как и в операторе if . Приведенная ниже программа подсчитывает сумму цифр введенного числа N. Цикл while последовательно выделяет и суммирует цифру исходного числа, начиная с последней; для выделения применяется операция взятия остатка от деления - %. При делении целых чисел любая дробная часть отбрасывается, поэтому после операции N=N/10; исходное число уменьшается в 10 раз при каждом "обороте" цикла, пока, наконец, не станет равным нулю, после чего цикл завершается и на экран дисплея выдается значение переменной S, в котором содержится сумма цифр числа N.
Пример 1.6
#include <stdio.h> main() { int N,S,Z; S=0; printf("ВВЕДИ N\n"); scanf("%d",&N) while(N!=0) { Z=N%10 N=N/10 S=S+Z; } printf("СУММА ЦИФР=%d\n",S); } |
Рассмотрим еще один пример. Здесь приведена программа, которая реализует алгоритм разложения числа на простые множители. Для сокращения времени счета отдельно рассматривается случай множителя, равного двум, чтобы в последующем рассматривать только нечетные множители.