Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Пример 1. Это сигнатура, функция знака y = sign(x)






 

Это сигнатура, функция знака y = sign(x). График функции:

 

y

 

 

 

0 x

 

-1

 

 

Блок-схема вычисления функции знака:

 

Здесь производятся две проверки. В первой из них () определяется первая ветвь вычислений, но остаются неопределенными вторая и третья ветви в формуле вычисления функции знака. Разделение этих ветвей выполняет вторая проверка ().

 

 

 
 

 

 


да нет

 

да нет

 

Си-программа вычисления функции знака:

 

int main()

{

int x;

char y;

//Ввод значения аргумента x

if (x > 0)

y = 1;

else if (x < 0)

y = -1;

else

y = 0;

//Печать результата

getch();

return 0;

}

Замечание 1.

Конструкция

if (выражение)

инструкция

else if (выражение)

инструкция

else if (выражение)

инструкция

else if (выражение)

инструкция

else

инструкция

встречается так часто, что о ней стоит поговорить особо. Приведенная последовательность инструкций if - самый общий способ описания многоступенчатого принятия решения. Выражения вычисляются по порядку; как только встречается выражение со значением " истина", выполняется соответствующая ему инструкция, на этом последовательность проверок завершается. Здесь под словом инструкция имеется в виду либо одна инструкция, либо группа инструкций в фигурных скобках.

Последняя else -часть срабатывает, если не выполняются все предыдущие условия. Иногда в последней части не требуется производить никаких действий, в этом случае фрагмент

else

инструкция

можно опустить или использовать для фиксации ошибочной (" невозможной") ситуации.

Замечание 2.

При проверке условия if (x < 0) уже точно установлено, что перемененная x не может быть положительной. Она может быть нулевой или отрицательной (отличной от нуля). Это выражение может быть заменено на следующее if (x! = 0).

if (x > 0)

y = 1;

else if (x! = 0)

y = -1;

else

y = 0;

Так как if просто проверяет числовое значение выражения, условие можно записать в сокращенном виде if (x).

if (x > 0)

y = 1;

else if (x)

y = -1;

else

y = 0;

Таким образом, запись

if (выражение)

получается короче, чем

if (выражение! = 0)

Иногда такие сокращения естественны и ясны, в других случаях, наоборот, затрудняют понимание программы.

 

Замечание 3

Если x - вещественная переменная, то сравнение в большинстве случаев нужно выполнять по e, где e - достаточно малое число (погрешность задания исходных данных). Как уже ранее указывалось, вещественные числа, как правило, определяют результаты измерений, производимых с определенной точностью. В этом случае значение с точки зрения математики является положительным числом. Если же переменная означает вес груза, то значение кг должно считаться эквивалентным нулю, если точность измерения веса кг.

 

На числовой оси вещественный нуль - это e-окрестность точки 0. Другими словами, если ½ x½ < e, то x считается равным нулю.

 

x < 0 x = 0 x > 0

 

-e 0 e x

 

Следовательно, для вещественных переменных

 

 

Аналогично, и т.п.

Исходя из этих рассуждений, замена выражения if (x! = 0) на if (x) является ошибкой, так как при вычислении выражений вещественного типа получение результата точно равного 0 маловероятно. Однако, компилятор не определяет такую конструкцию, как ошибочную.

 

Реализация функции знака для вещественного аргумента:

int main()

{

const float eps = 0.00001;

float x;

char y;

//Ввод значения аргумента

if (x > eps)

y=1;

else if (x < -eps)

y=-1;

else

y=0;

//Печать результата

getch();

return 0;

}


 

Пример 2. Определить .

Ниже приведена блок-схема для определения максимальной из 3-х переменных.

 

 
 

 

 


да нет

 

 

да нет

 

 

В алгоритме переменной y присваивается значениепеременнойa. Затем y последовательно сравнивается с значениями b и c. В случае, когда значение b или c больше y, запоминается новый максимум.

Си-программа определения максимальной из 3-х переменных:

int main()

{

double a, b, c, y;

//Ввод значения a, b, c

y=a;

if (b> y)

y=b;

if (c> y)

y=c;

//Печать y

getch();

return 0;

}

Примечание. Здесь, в отличие от предыдущих примеров, нет необходимости проверять отношения между значениями переменных с учетом погрешности .

 

Пример 3. Расположить значения в переменных a, b, c в порядке возрастания.

Для решения задачи упорядочивания значений (сортировки) в порядке возрастания необходимо в переменную a занести минимальной значение, а в переменную c - максимальное. Решение разбивается на 3 шага.

Шаг 1. Сравниваются значения a, b. Если a> b, то значения в переменных a, b обменять местами.

Шаг 2. Сравниваются значения a, c. Если a> c, то значения в переменных a, c обменять местами. (После этих шагов в переменной a будет минимальное значение.)

Шаг 3. Сравниваются значения b, c. Если b> c, то значения в переменных b, c обменять местами.

Пусть введены значения a, b, c равные 5, 9, 2. В таблице показано, как будут изменяться значения в переменных при выполнении 3-х шагов.

 

  До обмена После обмена
a b c a b c
Шаг 1 5 9   5 9  
Шаг 2 5   2 2   5
Шаг 3   9 5   5 9

 

Блок-схема алгоритма:

 

 
 

 

 


да нет

 

да нет

 

да нет

 

 

Си – программа сортировки значений в 3-х переменных.

int main()

{

double a, b, c, buf;

//Ввод значений a, b, c

if (a> b)

{ buf=a; a=b; b=buf; }

if (a> c)

{ buf=a; a=c; c=buf; }

if (b> c)

{ buf=b; b=c; c=buf; }

//Печать a, b, c

getch();

return 0;

}

Операторы { buf=a; a=b; b=buf; } являются составным оператором, расстановка скобок {} – обязательна.

Для сортировки значений в порядке убывания при сравнении значений переменных знак “> ” изменяется на знак “< ”, а схема алгоритма остается неизменной.

При сортировке значений в 4-х переменных a, b, c, d алгоритм можно разбить на 3 прохода:

 

В общем случае для n переменных количество проходов будет равно (n-1). Количество шагов на каждом i-м проходе будет (n-i). Для оценки производительности общее количество шагов K определяется по формуле:

 

 

Пример 3. Определить, является ли треугольник a, b, c равносторонним, равнобедренным или разносторонним.

При решении задач, которые имеют геометрический, физический или любой другой смысл, необходимо проверять на корректность введенные данные. Если данные введены не корректно, решение не будет иметь смысла. Например, треугольник не будет существовать, если любая из сторон будет меньше или равно нулю. Также, любая сторона должна быть меньше суммы двух других сторон. Любая формула, известная в геометрии, справедлива только в том случае, когда треугольник существует. Проверять каждое из 6-и условий в отдельной условной вершине не имеет смысла, блок-схема и программа будет пересыщена проверками. Поэтому условия проверяются в одной вершине и объединяются в логическое выражение операциями И, ИЛИ, НЕ (отрицание). Если треугольник не существует, то выводится соответствующее сообщение. Это сообщение является обязательным, исходя из свойства алгоритма – результативность.

После проверки существования треугольника определяется, является ли он равносторонним. Если выполняются условия a==b и b==c, то будет выполняться и a==c. Поэтому в условной вершине проверяются только 2 условия.

Если треугольник не равносторонний и в нем имеется пара равных сторон, то он будет равнобедренным. Должно выполняться одно из условий a==b, b==c или a==c. Это достаточное условие равнобедренности треугольника. Условие равнобедренности должно проверяться обязательно вторым в очереди, после условия равносторонности. Порядок проверки важен. Если эти две проверки переставить местами по очередности, то в алгоритме никогда не будет определено, что треугольник равносторонний. Если все 3 стороны равны, то будет равна любая пара сторон, и треугольник определится, как равнобедренный.

Если не выполняется ни одно из 2-х условий, то треугольник будет разносторонним.

В решении предполагается, что переменные целочисленные. Если переменные будут вещественные, что в большей степени соответствует реальности, то все сравнения надо производить с учетом погрешности e..

 

Блок-схема решения:

 

 
 

 


нет да

 

 

да нет

 

 

да нет

 

 

Си-программа:

int main()

{

int a, b, c;

//Ввод значений a, b, c

if (a> 0 & & b> 0 & & c> 0 & & a+b> c & & a+c> b & & c+b> a)

if (a==b & & b==c)

printf(" \n Треугольник равносторонний\n");

else if (a==b || b==c || a==c)

printf(" \n Треугольник равнобедренный\n");

else

printf(" \n Треугольник разносторонний\n");

else

printf(" \n Треугольник не существует\n");

getch();

return 0;

}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.