Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Условный оператор if

Операторы ветвления

Операторы ветвления if и switch применяются для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных после­довательностей операторов. Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор switch — на одну из произвольного числа ветвей.


Условный оператор if используется для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рис. 4.1.

 

Формат оператора:

if (логическое_выражение)оператор_1; [else оператор_2;]

 

Сначала вычисляется логическое выражение. Если оно имеет значение true, выполняется первый оператор, иначе — второй. После этого управление передается на оператор, следующий за условным. Ветвь else может отсутствовать.

ЗАМЕЧАНИЕ

Операторы, входящие в условный, не должны иметь метку и не могут быть описа­ниями.

Если в какой-либо ветви требуется выполнить несколько операторов, их необхо­димо заключить в блок, иначе компилятор не сможет понять, где заканчивается ветвление. Блок может содержать любые операторы, в том числе описания и другие условные операторы (но не может состоять из одних описаний). Необходимо учи­тывать, что переменная, описанная в блоке, вне блока не существует.

Примеры условных операторов:

if (а<0) b = 1; //1

if (а<b && (а>d|| a==0)) b++; else {b*=a; a=0;} //2

if (a<b) if(a<c) m=a; else m=c;

else if (b<с) m=b; else m=c; //3

if (b>a) max=b; else max=a; //4

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

Если требуется проверить несколько условий, их объединяют знаками логиче­ских условных операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие а < b и одно из условий в скоб­ках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом — ИЛИ.

Оператор в примере 3 вычисляет наибольшее значение из трех переменных. Об­ратите внимание на то, что компилятор относит часть else к ближайшему ключе­вому слову if.

Конструкции, подобные оператору в примере 4 (вычисляется наибольшее значе­ние из двух переменных), проще и нагляднее записывать в виде условной опера­ции, в данном случае следующей:

max = b > а? b: a:

ЗАМЕЧАНИЕ

Распространенная ошибка начинающих — неверная запись проверки на принадлеж­ность диапазону. Например, чтобы проверить условие 0 < х < 1, нельзя записать его в условном операторе непосредственно, так как каждая операция отношения долж­на иметь два операнда. Правильный способ записи: if(0<X && х<1)....

В качестве примера подсчитаем количество очков после выстрела по мишени, изображенной на рис. 4.2.

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

Листинг 4.1. Выстрел по мишени

 

using System;

namespace ConsoleAppl i cati onl

{ class Classl

{ static void Main()

{

Console.WriteLine("Введите координату х");

string buf = Console.ReadLine();

double x = Convert.ToDouble(buf);

 

Console.WriteLine("Введите координату у");

buf = Console.ReadLine();

double у=double.Parse(buf);

 

int kol = 0:

if (x*x + у*у < 1) kol=2;

else if (x*x +у*у < 4) kol=1;

Console.WriteLine("Результат = {0} очков", kol);

}

}

}

Даже такую простую программу можно еще упростить с помощью промежуточ­ной переменной и записи условия в виде двух последовательных, а не вложен­ных, операторов if:

 

double temp = x*x + y*y;

int kol = 0;

if (temp < 4) kol = 1;

if (temp < 1) kol = 2;

Console.WriteLine("Результат = {0} очков", kol):


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

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

 

float а, b; …

if (а == b)... //не рекомендуется!

if (Math.Abs(a - b) < 1e-6)... // надежно!

Значение величины, с которой сравнивается модуль разности, следует выбирать в зависимости от решаемой задачи и точности участвующих в выражении переменных. Снизу эта величина ограничена определенной в классах Single и Doubl константой Epsilon (это минимально возможное значение переменной такое, что 1.0 + Epsilon!= 1.0).

Оператор выбора switch

Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Структурная схема оператора приведен на рис. 4.3.

 

 

Выполнение оператора начинается с вычисления выражения. Тип выражения чаще всего целочисленный (включая char) или строковый (В общем случае выражение может быть любого типа, для которого существует неявное преобразование к указанным, а также перечисляемого типа.). Затем управление передается первому оператору из списка, помеченному константным выражени­ем, значение которого совпало с вычисленным.

Все константные выражения должны быть неявно приводимы к типу выражения в скобках. Если совпадения не произошло, выполняются операторы, расположен­ные после слова default (а при его отсутствии управление передается следующему за switch оператору).

Каждая ветвь переключателя должна заканчиваться явным оператором перехода, а именно оператором break, goto или return:

· оператор break выполняет выход из самого внутреннего из объемлющих его операторов switch, for, while и do;

· оператор goto выполняет переход на указанную после него метку, обычно это метка case одной из нижележащих ветвей оператора switch;

· оператор return выполняет выход из функции, в теле которой он записан.

Оператор goto обычно используют для последовательного выполнения несколь­ких ветвей переключателя, однако поскольку это нарушает читабельность про­граммы, такого решения следует избегать.

В листинге 4,2 приведен пример программы, реализующей простейший кальку­лятор на четыре действия.

Листинг 4.2. Калькулятор на четыре действия

 

using System;

namespace ConsoleApplicationl

{class Classl

{static void Main()

{

string buf;

double a, b, res;

Console.WriteLine("Введите первый операнд:");

buf = Console.ReadLine();

a = double.Parse(buf);

 

Console.WriteLine("Введите знак операции");

char op = (char)Console.Read();

Console. ReadLine();

 

Console.WriteLine("Введите второй операнд:");

buf = Console.ReadLine();

b = double.Parse(buf);

 

bool ok = true;

switch (op)

{

case '+': res = a + b; break;

case '-': res = a - b; break;

case '*': res = a * b; break:

case '/'.: res = a / b; break;

default: res = double.NaN; ok = false; break;

}

if (ok) Console.WriteLine("Результат: " + res);

else Console.WriteLine("Недопустимая операция");

}

}

}

<== предыдущая лекция | следующая лекция ==>
Выражения, блоки и пустые операторы | VII. Гербарт
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 652; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.027 сек.