Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Задание 1

.2.pdf
Скачиваний:
11
Добавлен:
09.05.2015
Размер:
699.3 Кб
Скачать

УЧЕБНАЯ ПРАКТИКА

ЗАДАНИЕ 1.2

Разветвляющиеся алгоритмические структуры

ТЕОРИЯ

Линейные алгоритмы встречаются крайне редко. Чаще всего необходима определенная логика, с помощью которой можно повлиять на процесс выполнения программы. Под логикой мы понимаем выполнение определенных операций в зависимости от каких-либо условий.

Логические операции строятся вокруг типа данных bool. Этот тип может принимать всего два значения: true и false, то есть истина или ложь.

Для создания логики в C# существует оператор if, который в общем виде выглядит следующим образом:

if (условие) Действие 1; else

Действие 2;

После оператора if в скобках пишется условие. Если оно верно (истинно), то выполнится действие 1, иначе будет выполнено действие 2.

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

if (условие) Действие 1;

Обращаю ваше внимание, что в одном операторе if будет выполняться только одно действие. Если необходимо выполнить несколько операторов, то их нужно заключить в фигурные скобки (составной оператор):

if (условие)

{

Действие 1; Действие 2;

}

Если в данном примере забыть указать скобки, то при верности условия будет выполнено только действие 1, а остальные действия будут выполнены в любом случае, даже при ложном значении условия.

В качестве условия необходимо указать один из операторов сравнения. В C# поддерживаются следующие операторы:

больше (>);

меньше (<);

больше либо равно (>=);

меньше либо равно (<=); равно (==); не равно (!=).

Допустим, что необходимо уменьшить значение переменной на единицу только в том случае, если она больше 10. Такой код будет выглядеть следующим образом:

int i = 15; if (i > 10)

i--; //Оператор декремента - уменьшение переменной на единицу

Сначала мы заводим переменную i и присваиваем ей значение 15. Затем проверяем, если переменная больше 10, то уменьшаем ее значение на единицу с помощью оператора i--.

Усложним задачу — если переменна больше 10, то уменьшаем ее значение на 1, иначе увеличиваем значение на 1:

int i = 15; if (i > 10) i--;

else i++;

В обоих случаях выполняется только одно действие. Если действий должно быть несколько, то объединяем их составным оператором (фигурными скобками):

int i = 15; if (i > 10)

{i--;

Console.WriteLine(i);

}

else i++;

Если переменная больше 10, то выполняются два действия – значение переменной уменьшается и тут же выводится на экран вывода. Иначе значение переменной только уменьшается.

Для лучшего понимания, как работает логика if, необходимо знать, что такое истинное значение, а что ложное. Истина – это все, что не равно нулю, а ложь – это ноль. Логические операторы возвращают 1, если условие корректно, а в противном случае – 0.

А что, если нужно выполнить действие, когда условие, наоборот, не выполнено? Допустим, что у нас есть проверка (i > 0), но мы хотим выполнить действие, когда это условия ложно. В этом случае можно развернуть условие следующим образом (i <= 0) или инвертировать его с помощью символа восклицательного знака: !(i > 0). Этот символ меняет булево значение на противоположное, то есть true на false и наоборот.

int i = 0;

if (!(i > 0)) Console.WriteLine(i);

Когда нужно выполнить несколько сравнений подряд, мы можем написать чтото в стиле:

if (i == 1)

Действие 1; else if (i == 2)

Действие 2; else if (i == 3)

Действие 3;

Получилась довольно нескладная и сложная конструкция. В таких случаях лучше использовать другой условный оператор – switch, который в общем виде выглядит так:

switch(переменная)

{

case 1:

Действие 1 (или несколько);

break; // указывает на конец ветки логики case 2:

Действие 2 (или несколько); break;

default:

Действие по умолчанию; break;

}

Такой код выглядит немного приятнее. Программа последовательно сравнивает значение переменной со значениями и, если находит совпадение, выполняет соответствующие действия. Если ничего не найдено, то будет выполнен код, который идет после ключевого слова default. Действие по умолчанию не является обязательным. Этот отрывок кода можно опустить.

Следующий пример показывает, как можно проверить числовую переменную на возможные значения от 1 до 3. Если ничего не найдено, то будет выведено текстовое сообщение:

switch(i) { case 1:

Console.WriteLine("i = 1");

break; // указывает на конец ветки логики case 2:

Console.WriteLine("i = 2"); break;

case 3:

Console.WriteLine("i = 3");

break; default:

Console.WriteLine("Переменная не принимает ни одно из значений!");

break;

}

Оператор case очень удобен, когда нужно сравнивать переменную на несколько возможных значений.

Язык C# взял из C++ метод короткой проверки логической операции:

Условие ? Действие 1 : Действие 2;

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

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

int i = 10;

Console.WriteLine(i == 10 ? "i = 10" : "i != 10"); Console.WriteLine(i == 10 ? "i = 10" : "i != 10");

В обоих случаях переменная i проверяется на разные значения, и в зависимости от результата проверки будет выведено в консоль или сообщение после символа вопроса (в случае удачной проверки), или после символа двоеточия (если неудачная проверка).

ПРИМЕР ПРОГРАММЫ

Даны действительные числа x, y. Определить, принадлежит ли точка с координатами (x, y) заштрихованной плоскости (рис. 6).

Решение:

using System; namespace Task16

{

class Program

{

static void Main(string[] args)

{

//Определим переменные x, y - координаты точки. //Переменные имеют тип float.

float x, y;

//Определим строковые переменные сообщений. string inside = "Точка внутри контура!";

string outside = "Точка вне контура!";

//Попросим пользователя ввести координаты точки.

Console.WriteLine("Введите абсциссу точки: "); x = float.Parse(Console.ReadLine());

Console.WriteLine("Введите ординату точки: "); y = float.Parse(Console.ReadLine());

//Зададим условие непопадания точки за внешную границу контура if (Math.Abs(x) <= 1 && Math.Abs(y) <= 1)

{

//Если условие выполняется, то мы внутри внешней границы контура

//Зададим условие непопадания точки за внутренню границу контура if (Math.Abs(x) >= 0.5 && Math.Abs(y) >= 0.5) Console.WriteLine(inside);

else

Console.WriteLine(outside);

}

else

Console.WriteLine(outside); //Условие не выполнилось

Console.ReadKey();

}

}

}

ЗАДАНИЕ 1.2

Разветвляющиеся алгоритмические структуры Цель работы

Закрепить умение строить разветвляющиеся алгоритмы и научиться реализации этих алгоритмов на языке C#.

Задание к лабораторной работе

По результатам работы необходимо в отчёте привести алгоритм в виде блоксхемы, а также привести контрольный пример, демонстрирующий выполнение алгоритма.

1)Треугольник задан длинами своих сторон – a, b, c. Определить является ли он тупоугольным, прямоугольным или остроугольным.

2)Если сумма трех попарно различных действительных чисел – x, y, z, меньше единицы, то наименьшее из этих трех чисел заменить полусуммой двух других; в противном случае заменить меньшее из (x, y) полусуммой двух оставшихся значений.

3)Даны три различных действительных числа. Найти среди них два числа, модуль разности которых имеет: наибольшее значение, наименьшее значение.

4)Может ли шар радиуса R пройти через ромбообразное отверстие с диагоналями

P и Q?

5)Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки. Необходимо рассмотреть различные случаи взаимной ориентации отрезков: на одной прямой, на параллельных прямых, на пересекающихся прямых.

6)Лежит ли точка M(xm, ym) внутри треугольника, заданного координатами своих вершин А(xа, yа), В(xв, yв), С(xс, yс) на плоскости?

7)Как успеть подешевле? Можно ехать на такси со скоростью v1 км/ч и оплатой p1 руб/км либо идти пешком со скоростью v2 км/ч бесплатно. Как с наименьшими затратами преодолеть путь S км за время t ч, если это возможно? Каковы эти затраты?

8)Даны натуральные числа a, b, c, которые обозначают число, месяц, год, например 1, 4, 1901 - 1 апреля 1901 года. Проверить корректность этой даты (например, 30 февраля 1900 года - некорректная дата); найти номер этого дня с начала года; определить, сколько полных дней осталось до конца года.

9)Даны натуральные числа a, b, которые обозначают число и месяц, например 1, 4

– 1 апреля. На какой день недели приходится эта дата, если год – не високосный, а 1 января этого года – среда.

10)Даны действительные числа a, b, c (a не равно 0). Выяснить, имеет ли уравнение ax2+bx+c=0,

действительные корни. Если действительные корни имеются, то найти их.

11)Даны действительные числа x, y. Определить, принадлежит ли точка с координатами (x, y) заштрихованной плоскости (рис. 1).

12)Даны действительные числа x, y. Определить, принадлежит ли точка с координатами (x, y) заштрихованной плоскости (рис. 2).

13)Даны действительные числа x, y. Определить, принадлежит ли точка с координатами (x, y) заштрихованной плоскости (рис. 3).

14)Даны действительные числа x, y. Определить, принадлежит ли точка с координатами (x, y) заштрихованной плоскости (рис. 4).

15)Даны действительные числа x, y. Определить, принадлежит ли точка с координатами (x, y) заштрихованной плоскости (рис. 5).

16)Даны действительные числа x, y. Определить, принадлежит ли точка с координатами (x, y) заштрихованной плоскости (рис. 6).

Рис.1

Рис.2

Рис.3

Рис.4

Рис.5

Рис.6