Проверка 5: положительное число



 

 

Конструкция if-else-if

 

В программировании часто применяется многоступенчатая конструкция if-else-if, состоящая из вложенных операторов if. Ниже приведена ее общая форма.

 

if(условие)   

оператор ;  

else if (условие)   

оператор ;  

else if (условие)   

оператор;  

.  

.  

.  

Else

оператор ;

 

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

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

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

 

// Определить наименьший множитель заданного

// целого значения, состоящий из одной цифры.

using System;

class Ladder {

static void Main() {  

int num;

for(num = 2; num < 12; num++) {  

if((num % 2) == 0)

Console.WriteLine("Наименьший множитель числа " + num + " равен 2.");

else if((num % 3) == 0)

Console.WriteLine("Наименьший множитель числа " + num + " равен 3.");

else if((num % 5) == 0)

Console.WriteLine("Наименьший множитель числа " + num + " равен 5.");

else if((num % 7) == 0)

Console.WriteLine("Наименьший множитель числа " + num + " равен 7.");

Else

Console.WriteLine(num + " не делится на 2, 3, 5 или 7.");

}

}

}

 

Вот к какому результату приводит выполнение этой программы.

 

Наименьший множитель числа 2 равен 2.  

Наименьший множитель числа 3 равен 3.

Наименьший множитель числа 4 равен 2.  

Наименьший множитель числа 5 равен 5.

Наименьший множитель числа 6 равен 2.  

Наименьший множитель числа 7 равен 7.

Наименьший множитель числа 8 равен 2.  

Наименьший множитель числа 9 равен 3.

Наименьший множитель числа 10 равен 2.

Не делится на 2, 3, 5 или 7.

 

Как видите, последний оператор else выполняется лишь в том случае, если не удается выполнить ни один из предыдущих операторов.

 

 

Оператор switch

 

Вторым оператором выбора в C# является оператор switch, который обеспечивает многонаправленное ветвление программы. Следовательно, этот оператор позволяет сделать выбор среди нескольких альтернативных вариантов дальнейшего выполнения программы. Несмотря на то что многонаправленная проверка может быть организована с помощью последовательного ряда вложенных операторов if, во многих случаях более эффективным оказывается применение оператора switch. Этот оператор действует следующим образом. Значение выражения последовательно сравнивается с константами выбора из заданного списка. Как только будет обнаружено совпадение с одним из условий выбора, выполняется последовательность операторов, связанных с этим условием. Ниже приведена общая форма оператора switch.

 

switch(выражение) {  

case константа1:  

последовательность операторов  

break;  

case константа2:  

последовательность операторов  

break;  

case константаЗ:

последовательность операторов  

break;

.

.

.

default:

последовательность операторов

break;

}

 

Заданное выражение в операторе switch должно быть целочисленного типа (char, byte, short или int), перечислимого или же строкового. (О перечислениях и символьных строках типа string речь пойдет далее в этой книге.) А выражения других типов, например с плавающей точкой, в операторе switch не допускаются. Зачастую выражение, управляющее оператором switch, просто сводится к одной переменной. Кроме того, константы выбора должны иметь тип, совместимый с типом выражения. В одном операторе switch не допускается наличие двух одинаковых по значению констант выбора.

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

Ниже приведен пример программы, в котором демонстрируется применение оператора switch.

 

// Продемонстрировать применение оператора switch.

using System;

class SwitchDemo {  

static void Main() {  

int i;

for(i=0; i<10; i++)  

switch(i) {

case 0:

Console.WriteLine("i равно нулю");  

break;  

case 1:

Console.WriteLine("i равно единице");  

break;  

case 2:

Console.WriteLine("i равно двум");  

break;  

case 3:

Console.WriteLine("i равно трем");  

break;  

case 4:

Console.WriteLine ("i равно четырем");  

break;

Default:

Console.WriteLine("i равно или больше пяти");  

break;

}

}

}

 

Результат выполнения этой программы выглядит следующим образом.

 

I равно нулю.

I равно единице.

I равно двум.

I равно трем.

I равно четырем.

I равно или больше пяти

I равно или больше пяти

I равно или больше пяти

I равно или больше пяти

I равно или больше пяти

 

Как видите, на каждом шаге цикла выполняются операторы, связанные с совпадающей константой выбора, в обход всех остальных операторов. Когда же значение переменной i становится равным или больше пяти, то оно не совпадает ни с одной из констант выбора, а следовательно, выполняются операторы из ветви default.

В приведенном выше примере оператором switch управляла переменная i типа int. Как пояснялось ранее, для управления оператором switch может быть использовано выражений любого целочисленного типа, включая и char. Ниже приведен пример применения выражения и констант выбора типа char в операторе switch.

 

// Использовать элементы типа char для управления оператором switch.

using System;

class SwitchDemo2 {  

static void Main() {  

char ch;

for(ch='A'; ch<= 'E'; ch++)  

switch (ch) {  

case 'A':

Console.WriteLine("ch содержит A");  

break;  

case 'B':

Console.WriteLine("ch содержит В");  

break;  

case 'C':

Console.WriteLine("ch содержит С");  

break;  

case 'D' :

Console.WriteLine("ch содержит D");  

break;  

case 'E':

Console.WriteLine("ch содержит E");  

break;

}

}

}

 

Вот какой результат дает выполнение этой программы.

 

ch содержит А  

ch содержит В  

ch содержит С  

ch содержит D  

Ch содержит Е

 

Обратите в данном примере внимание на отсутствие ветви default в операторе switch. Напомним, что ветвь default не является обязательной. Когда она не нужна, ее можно просто опустить.

Переход последовательности операторов, связанных с одной ветвью case, в следующую ветвь case считается ошибкой, поскольку в C# должно непременно соблюдаться правило недопущения "провалов" в передаче управления ходом выполнения программы. Именно поэтому последовательность операторов в каждой ветви case оператора switch оканчивается оператором break. (Избежать подобных "провалов", можно также с помощью оператора безусловного перехода goto, рассматриваемого далее в этой главе, но для данной цели чаще применяется оператор break.) Когда в последовательности операторов отдельной ветви case встречается оператор break, происходит выход не только из этой ветви, но из всего оператора switch, а выполнение программы возобновляется со следующего оператора, находящегося за пределами оператора switch. Последовательность операторов в ветви default также должна быть лишена ''провалов", поэтому она завершается, как правило, оператором break.

Правило недопущения "провалов" относится к тем особенностям языка С#, которыми он отличается от С, C++ и Java. В этих языках программирования одна ветвь case может переходить (т.е. "проваливаться") в другую. Данное правило установлено в C# для ветвей case по двум причинам. Во-первых, оно дает компилятору возможность свободно изменять порядок следования последовательностей операторов из ветвей case для целей оптимизации. Такая реорганизация была бы невозможной, если бы одна ветвь case могла переходить в другую. И во-вторых, требование завершать каждую ветвь case явным образом исключает непроизвольные ошибки программирования, допускающие переход одной ветви case в другую.

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

 

// Пример "проваливания" пустых ветвей case.

using System;

class EmptyCasesCanFall {  

static void Main() {  

int i;

for(i=1; i < 5; i++)  

switch(i) {

case 1:  

case 2:

case 3:  

Console.WriteLine("i равно 1, 2 или 3");  

break;

case 4:  

Console.WriteLine("i равно 4");  

break;

}

}

}

 

Ниже приведен результат выполнения этой программы.

 

I равно 1, 2 или 3

I равно 1, 2 или 3

I равно 1, 2 или 3

I равно 4

 

Если значение переменной i в данном примере равно 1, 2 или 3, то выполняется первый оператор, содержащий вызов метода WriteLine(). Такое расположение нескольких меток ветвей case подряд не нарушает правило недопущения "провалов"; поскольку во всех этих ветвях используется одна и та же последовательность операторов.

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

 

 

Вложенные операторы switch

 

Один оператор switch может быть частью последовательности операторов другого, внешнего оператора switch. И такой оператор switch называется вложенным. Константы выбора внутреннего и внешнего операторов switch могут содержать общие значения, не вызывая никаких конфликтов. Например, следующий фрагмент кода является вполне допустимым.

 

switch(ch1) {

case 'A':  

Console.WriteLine("Эта ветвь А — часть " +

"внешнего оператора switch.");

switch(ch2) {

case 'A':

Console.WriteLine("Эта ветвь A — часть " +

"внутреннего оператора switch");

break;  

Case 'В': // ...

} // конец внутреннего оператора switch  

break;  

Case 'В': // ...

 

 

Оператор цикла for

 

Оператор for уже был представлен в главе 2, а здесь он рассматривается более подробно. Вас должны приятно удивить эффективность и гибкость этого оператора. Прежде всего, обратимся к самым основным и традиционным формам оператора for.

Ниже приведена общая форма оператора for для повторного выполнения единственного оператора.

 

for{инициализация; условие ; итерация) оператор;  

 

А вот как выглядит его форма для повторного выполнения кодового блока:

 

for(инициализация; условие; итерация)

{

последовательность операторов;  

}

 

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

Цикл for может продолжаться как в положительном, так и в отрицательном направлении, изменяя значение переменной управления циклом на любую величину. В приведенном ниже примере программы выводятся числа; постепенно уменьшающиеся от 100 до -100 на величину 5.

 

// Выполнение цикла for в отрицательном направлении.

using System;

class DecrFor {

static void Main() {  

int x;

for(x = 100; x > -100; x -= 5)

Console.WriteLine(x);

}

}

 

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

 

for(count=10; count < 5; count++)

x += count; // этот оператор не будет выполняться

 

Данный цикл вообще не будет выполняться, поскольку первоначальное значение переменной count, которая им управляет, сразу же оказывается больше 5. Это означает, что условное выражение count < 5 оказывается ложным с самого начала, т.е. еще до выполнения первого шага цикла.

Оператор цикла for — наиболее полезный для повторного выполнения операций известное число раз. В следующем примере программы используются два цикла for для выявления простых чисел в пределах от 2 до 20. Если число оказывается непростым, то выводится наибольший его множитель.

 

// Выяснить, является ли число простым. Если оно

// непростое, вывести наибольший его множитель.

using System;

class FindPrimes {  

static void Main() {  

int num;  

int i;  

int factor;  

bool isprime;

for(num = 2; num < 20; num++) {  

isprime = true;  

factor = 0;

// Выяснить, делится ли значение переменной num нацело.  

for(i=2; i <= num/2; i++) {

if((num % i) == 0) {


Дата добавления: 2019-02-12; просмотров: 517; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!