Урок 5. Задачи с простым условием

Алгоритм разветвляющийся

В линейных алгоритмах все команды выполняются одна за другой последовательно. Однако часто приходится выбирать тот или иной вариант действий в зависимости от некоторого условия, то есть, если условие выполняется, поступать одним способом, а если не выполняется - другим.
Рассмотрим следующую задачу. Пусть в ячейках x и y находятся числа. Следует составить алгоритм, который сможет найти большее их этих двух чисел и вывести его на экран.
Каждый раз при решении подобного рода задач на поиск некоторого элемента следует помнить, что все числа, с которыми компьютер манипулирует, должны находитьcя в ячейках памяти, в том числе и наше искомое число. Поэтому отведем под него ячейку с именем z. Тогда алгоритм следующий.

1. Поместить в ячейки x и y числа.
2. Если x>y то поместить в ячейку z число x иначе поместить в ячейку z число y.
3. Вывести z.

В этом алгоритме в шаге 2 записано разветвление. Разветвление всегда начинается со слова ЕСЛИ, после которого обязательно записывается УСЛОВИЕ. Дальнейшая работа алгоритма определяется тем, выполняется или нет УСЛОВИЕ. У нас в качестве условия выступает сравнение содержимого ячеек x и y.
Для организации условных переходов в программе на языке Си используются условный оператор. Существуют две формы условного оператора – полная и сокращенная. Полная форма записывается следующим образом:

if (условие) оператор_1; else оператор_2;

где
оператор_1, оператор_2– любой оператор языка Си (например, присваивание).
Если условие в скобках выполняется (говорят, принимает истинное значение), то выполняется оператор_1, если не выполняется (т.е. условие ложно) - оператор_2.
В операторе if ключевое слово else может отсутствовать. В этом случае говорят о сокращенной форме условного оператора. Сокращенная форма имеет вид:

if (условие) оператор;

Вариант программы с полным условным оператором приведен ниже:

#include<stdio.h>
int main()
{
float x,y,z; // Выделены ячейки памяти
printf("Введите два числа\n"); //вывод подсказки
scanf("%f%f", &x,&y); //ввод значений
if(x>y) z=x; //
else z=y; //
printf("Большее из двух чисел=%f\n", z); //вывод результат на экран
}

Запишем вариант программы с использованием сокращенной формы условного оператора:

#include<stdio.h>
int main()
{
float x,y,z; // Выделены ячейки памяти
printf("Введите два числа\n"); //вывод подсказки
scanf("%f%f", &x,&y); //ввод значений
z=x; //в ячейку z занесем первое из двух чисел
if(y>z) z=y; /*если второе число оказалось больше первого,
то его занесем в ячейку z */
printf("Большее из двух чисел=%f\n", z); //вывод результат на экран
}

По возможности следует избегать программирования условного оператора с else, поскольку это усложняет логику программы и может привести к неверной реализации алгоритма.

Как еще можно записать условие

Условие представляет из себя логическое выражение. Слово "логическое" означает, что такое выражение может принимать одно из двух значений: истина или ложь (1 или 0 соответственно). Если условие выполняется, то логическое выражение принимает значение "истина", если не выполняется - то "ложь".
Простое логическое выражение состоит из двух операндов и знака операции отношения между ними. Одну такую операцию отношения "больше" мы уже использовали. Кроме этой операции, в языке Си есть целый набор таких операций отношения:



> больше
< меньше
<= меньше или равно
>= больше или равно
== равно
!= не равно

Однако в языке Си условие может быть записано не обязательно в виде логического выражения. Это настолько гибкий язык, что любое выражение, принимающее некоторое числовое значение, может выступать в качестве условия. При этом действует правило: любое ненулевое значение является истинным, а если значение выражения равно 0, условие является ложным.
Рассмотрим фрагмент программного кода:

int a;
a=5;
if(a) printf("Значение условия истинно\n");

В этом примере значение условия больше нуля, следовательно истинно, поэтому сообщение будет выведено на экран. Можно записать даже еще проще:

int a;
if(a=5) printf("Значение условия истинно\n");

В скобках записан оператор присваивания, значением которого является значение выражения. Оно, естественно, в нашем примере тоже истинно.
Однако последнюю запись надо использовать с осторожностью. Часто начинающие программисты путают оператор присваивания, обозначаемый одним знаком "равно", с операцией отношения "равно", записываемой с помощью двух знаков равенства. Компилятор все принимает, но смысл программы получается совершенно разный. Рассмотрим два примера.

int a;
a=5;
if(a==2) printf("Значение условия истинно\n");

Здесь в качестве условия стоит операция проверки на равенство, и условие это ложно, поскольку a не равно 2. Следовательно, соответствующий текст не будет выведен на экран.
Другой пример:

int a;
a=5;
if(a=2) printf("Значение условия истинно\n");

А вот здесь условием является присваивание, переменная a получает значение 2, и условие получается истинным.

Понятие блока операторов

Если в случае выполнения условия вместо одного необходимо выполнить сразу несколько операторов, то они заключаются в фигурные скобки. Несколько операторов, заключенных в фигурные скобки, называются блоком операторов. Условный оператор с блоком оператороввыглядит следующим образом:

if(условие)
{
оператор_1;
оператор_2;
оператор_3;
. . .
}

Рассмотрим пример. Пусть требуется написать программу, решающую линейное уравнение:

k*x+b=0 (k не равно 0)

Эта задача реализуется с помощью простого линейного алгоритма, решение находится по формуле x=-b/k, для работы алгоритма вводятся значения b и k. Однако есть одна тонкость: в условии говорится, что k не должно быть равно нулю. Поскольку заранее неизвестно, какие числа будут введены, надо в программе уметь отделить этот случай. Здесь как раз можно использовать условный оператор, проверяющий значение k, и в случае если k равно 0, остановить выполнение программы с помощью блока операторов. Фрагмент программного кода:

if(k==0)
{
printf("Нет решения\n");
return 0;
}

Здесь использован еще один оператор языка Си - return. Он позволяет немедленно выйти из программы из любой ее точки. Если выход выполняется из функции main(), как в наших программах, управление передается среде Linux. Значение 0 не используется.

Вложенный условный оператор

В операторе if - else непосредственно после ключевых слов if и else должны следовать другие операторы. Если хотя бы один из них является оператором if, его называют вложенным. Согласно принятому в языке Си соглашению, слово else всегда относится к ближайшему предшествующему ему if.
Рассмотрим задачу.
Найти максимальное из трех веденных с клавиатуры чисел. Сразу скажем, эта задача может быть реализована несколькими алгоритмами. Один из них - с использованием вложенного условного оператора. Приведем фрагмент кода:

float x,y,z,max; // Выделены ячейки памяти
printf("Введите числа\n");
scanf("%f%f%f", &x,&y,&z); //ввод значений
if(x>y) // сравниваем первые два числа
if(x>z) max=x;
else max=z; // это else относится к предыдущему if
else // это else относится к самому первому if
if(y>z) max=y;
else max=z; // это else относится к предыдущему if
printf("Большее из трех чисел=%f\n", max); //вывод результат на экран

На примере этой программы видно, как важно записывать строки кода с отступами. При этом видна вся структура программы, понятен программный код, легче обнаруживать ошибки.

Какие ошибки встречаются в программах с условным оператором Начало формы Конец формы

 

Начало формы Конец формы

Резюме

В этом уроке вы познакомились со вторым типом алгоритмов - разветвляющимися алгоритмами. Они реализуются с помощью условного оператора. Условный оператор можно использовать в полной или сокращенной форме.

Вопросы для самопроверки

1. Какие виды условных операторов вы знаете?
2. В каких случаях в программе используется полный условный оператор? Как он работает?
3. В каких случаях в программе используется сокращенный условный оператор? Как он работает?
4. Какие операции отношения имеются в языке Си?
5. Когда следует использовать блок операторов?
6. В каких случаях в программе используется вложенный условный оператор?

2. адания для самостоятельной работы к уроку 5

3. Во всех заданиях следует составить программу на языке Си. Задания приведены по возрастающей сложности

1. Определить максимальное и минимальное значения из двух различных вещественных чисел.
2. Найти минимальное из трех веденных с клавиатуры чисел.
3. Даны действительные числа x, y, z. Вычислить:

4. Даны действительные числа x, y, z. Вычислить:

5. Написать программу проверки знания даты начала второй мировой войны. В случае неверного ответа программа должна выводить правильный ответ. Рекомендуемый вид экрана во время работы программы:

4. В каком году началась вторая мировая война?
Введите число и нажмите <Enter>
==> 1939
Правильно

 

5. 6. Написать программу, которая вычисляет оптимальный вес человека, сравнивает его с реальным и выдает рекомендацию о необходимости поправиться или похудеть. Оптимальный вес вычисляется по формуле: рост (в сантиметрах) - 100. Рекомендуемый вид экрана во время работы программы:

6. Введите в одной строке рост (в см.) и вес и нажмите <Enter>
==> 170 68
Вам надо поправиться на 2 кг.

 

7. 7. Даны радиус круга и сторона квадрата. У какой фигуры площадь больше?
8. Известны площади круга и квадрата. Определить, уместится ли круг в квадрате.
9. Написать пограмму вычисления площади кольца. Программа должна проверять правильность исходных данных. В случае, если радиус отверстия больше радиуса кольца, программа должна вывести сообщение: "Ошибка! Радиус отверстия не может быть больше радиуса кольца", и закончить свою работу.
10. Составить программу нахождения суммы двух наибольших из трех различных чисел. (Для этой задачи возможны несколько алгоритмов)
11. Даны вещественные числа a, b, c (a не равно 0). Выяснить, имеет ли уравнение

вещественные корни (вывести соответствующее сообщение).
12. Даны вещественные числа a, b, c (a не равно 0). Решить уравнение

В числе возможных вариантов учесть вариант равенства корней уравнения. Если уравнение корней не имеет, вывести сообщение и закончить программу. Имена переменных для корней можно выбрать x1, x2.









Последнее изменение этой страницы: 2016-04-07; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь