КАТЕГОРИИ: Архитектура-(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) |
Цикл while
Совместное использование операторов if-else-if и switch. Оператор switch. Операторы if-else-if. Вложенные операторы if-else. Оператор if-else. Оператор if. 10.3.5. Условный оператор?.
6. Выбор вариантов. Хотите научиться создавать мощные, «интеллектуальные», универсальные и полезные программы? Тогда вам потребуется язык, обеспечивающий три основные формы управления процессом выполнения программ. Согласно теории вычислительных систем (которая является наукой о вычислительных машинах, а не наукой, создаваемой такими машинами), хороший язык должен обеспечивать реализацию следующих трех форм управления процессом выполнения программ: · Выполнение последовательности операторов. · Выполнение определенной последовательности операторов до тех пор, пока некоторое условие истинно. · Использование проверки истинности условия для выбора между различными возможными способами действия.
7.4. Операции отношения и выражения. Операции отношения используются для сравнений. Мы уже использовали ранее некоторые из них, а сейчас приведем полный список операций отношения, применяемых при программировании на языке Си.
Операция Смысл < меньше < = меньше или равно = = равно > = больше или равно > больше != не равно
При программировании требуется аккуратность, потому что в ряде случаев компилятор не сможет обнаружить ошибки, связанной с неправильным использованием знаков этих операций, что приведет к результатам, отличным от тех, которые вы должны были получить. Ниже мы кратко остановимся на одном примере.
Операции отношения применяются при формировании условных выражений, используемых в операторах if и while. Указанные операторы проверяют, истинно или ложно данное выражение. Ниже приводятся четыре не связанные между собой оператора, содержащие условные выражения; их смысл, мы надеемся, понятен.
if (number < 6) printf(" Ваше число слишком мало.\n"); while (ch!= '$') count++; if (total = = 100) printf(" Вы набрали максимум очков! \n"); if (ch > ' M') printf(" Отправьте этого человека по другому маршруту.\n");
Операции отношения можно использовать также при работе с числами с плавающей точкой. Однако при сравнениях этих чисел мы рекомендуем вам ограничиться лишь операциями < и >, так как ошибки округления могут привести к тому, что числа окажутся неравными, хотя по логике они должны быть равны.
7.5. Понятие «истина». Мы можем ответить на этот вечный вопрос, по крайней мере, так, как он решен в языке Си. Напомним, во-первых, что выражение в Си всегда имеет значение. Это утверждение остается верным даже для условных выражений, как показывает пример, приведенный ниже. В нем определяются значения двух условных выражений, одно из которых оказывается истинным, а второе — ложным.
/* истина и ложь */ main() { int tr, fa; tr= (10 > 2); /* отношение истинно */ fa=(10 == 2); /* отношение ложно */ printf("true = %d; false = %d\n", tr, fa); }
В данном примере значения двух условных выражений присваиваются двум переменным. Чтобы не запутать читателя, мы присвоили переменной true значение выражения, которое оказывается истинным, а переменной false — значение выражения, которое оказывается ложным. При выполнении программы получим следующий простой результат:
true = 1; false = 0
Вот как! Оказывается, в языке Си значение «истина» — это 1, а «ложь» — 0. Мы можем это легко проверить, выполнив программу, приведенную ниже. 7.6. Условные операторы. В языке С имеется четыре основных условных оператора: if, if-else,? и switch. Перед тем, как обсудить их отдельно, необходимо отметить одно общее правило. Большинство условных операторов можно использовать для выборочного выполнения или одной программной строки, или нескольких логически связанных строк (называемых блоком). Если условный оператор связан только с одной строкой исполняемого кода, эту строку заключать в фигурные скобки ({ }) не нужно. Если же условный оператор относится к блоку выполняемых операторов, то для связи блока с проверяемым условием фигурные скобки необходимы. По этой причине в операторе switch необходимы открывающая и закрывающая фигурные скобки.
7.6.1. Оператор if. Оператор if используется для условного выполнения фрагмента кода. Простейший вид оператора if следующий:
if (выражение) действие_если_истина;
Обратите внимание на то, что выражение должно заключаться в круглые скобки. Для выполнения оператора if необходимо вычислить выражение и определить его значение: истина или ложь. Если выражение истинно, выполняется действие_если_истина и программа продолжается, начиная с оператора, следующего за этим действием. Если выражение ложно, действие_если_истина не выполняется, а выполняется оператор, следующий за невыполненным действием. Например: следующий фрагмент программы напечатает сообщение "Have a great day!" только в случае, если переменная ioutside_temp больше или равна 72:
if(ioutside_temp >= 72) printf("Have a great day!");
Оператор if, связанный с блоком выполняемых операторов, выглядит следующим образом:
if (выражение) { действие_если_истина1; действие_если_истина2; действие_если_истинаЗ; действие_если_истина4; }
Синтаксис требует, чтобы все связанные операторы были заключены в фигурные скобки ({ }), и каждый оператор в блоке заканчивался точкой с запятой (;). /* подсчет строк */ /* X26.C */ #include <stdio.h> void main(void) { int ch; int linecount = 0; printf("Exit <CTRL/Z>\n"); while((ch=getchar())!= EOF) if(ch =='\n') linecount++; printf("Vvedeno %d strok\n",linecount); } «Сердцевиной» программы является оператор
if (ch = = ' \n') linecount++;
Этот «оператор if» служит указанием компьютеру увеличить значение переменной linecount на 1, если только что прочитанный символ (содержимое переменной ch) представляет собой символ «новая строка». Знак == не является опечаткой; его смысл выражается словами «равняется». Не путайте эту операцию с операцией присваивания (=). Что происходит в случае, когда значение переменной ch не является символом «новая строка»? Тогда в цикле while производится чтение следующего символа.
7.6.2. Оператор if-else. Оператор if-else нужен для того, чтобы программа выполнила два разных действия в зависимости от истинности некоторого выражения. В простейшем случае оператор if-else выглядит следующим образом:
if (выражение) действие_если_истина; else действие_если_ложь;
В этом операторе, если выражение истинно, выполняется действие_если_истина; если же выражение ложно, выполняется действие_если_ложъ. Рассмотрим пример:
if(ckeypressed == UP) iy_pixel_coord++; else iy_pixel_coord--;
В этом примере текущая горизонтальная координата увеличивается или уменьшается в зависимости от значения, хранящегося в символьной переменной ckeypressed. Любое из выражений — выражение_если_истина, выражение_если_ложь, или оба вместе — могут быть составным оператором или блоком, заключенным в фигурные скобки. Синтаксис этих трех вариантов очень прост:
if (выражение) { действие_если_истина1; действие_если_истина2; действие_если_истина3; } else действие_если_ложь;
if (выражение) { действие_если_истина; else { действие_если_ложь1; действие_если_ложь2; действие_если_ложь3; }
if (выражение) { действие_если_истина1; действие_если_истина2; действие_если_истина3; } else { действие_если_ложь1; действие_если_ложь2; действие_если_ложь3; }
Необходимо только помнить, что где бы ни стоял блок выполняемых операторов, не нужно ставить точку с запятой после закрывающей фигурной скобки (}). В следующей программе на С используется оператор if-else, в котором часть if является составным блоком: /*07CMPIF.C Программа на С, иллюстрирующая использование составного оператора if-else*/
#include "stdafx.h" #include <stdio.h> #include <conio.h>
main() { char c; int ihow_many, i, imore; imore=1; while(imore == 1) { /* Введите название изделия */ printf("Please enter the product name: "); if(scanf("%c",&c)!= EOF) { while(c!= '\n') { printf("%c",c); scanf("%c",&c); } /* сколько закуплено? */ printf("s purchased? "); scanf("%d",&ihow_many); scanf("%c",&c); for(i = 1;i <= ihow_many; i++) printf ("*"); printf("\n"); } else imore=0; } printf ("\n\nPress any key to finish\n");/* Конец работы */ _getch(); return(0); } Простая конструкция if позволяет нам выбирать: выполнить или нет некоторое действие; конструкция же if-else дает возможность выбрать одно из двух действий. Что делать, если нам требуется осуществить выбор из большого числа вариантов?
7.6.3. Вложенные операторы if-else. Когда используются вложенные операторы if, необходимо следить за тем, какому if соответствует конкретное действие else. Взгляните на следующий пример — сможете ли вы предсказать результат:
if(iout_side_temp < 50) /* Если температура на улице... */ if(iout_side_temp < 30) printf("Wear the down jacket!"); /*Надеть куртку! */ else printf("Parka will do."); /* Достаточно одеть парку. */
Листинг намеренно не выровнен, чтобы не было зрительных подсказок на вопрос: какой оператор к какому if относится. Что получится, если переменная iout_side_temp равна 55? Будет ли напечатано сообщение "Parka will do."? Ответ — нет. В этом примере действие else связано со вторым выражением if. Это вызвано тем, что в С else связывается с ближайшим несвязанным if. Для облегчения отладки подобных фрагментов компилятор С написан так, что каждый else связывается с ближайшим if, еще не имеющим части else.
7.6.4. Операторы if-else-if. Комбинация операторов if-else-if часто используется для выполнения многочисленных последовательных сравнений. В общем виде они выглядят следующим образом:
if(выражение 1) действие_если_условие1_истина; else if(выражение2) действие_если_условие2_истина; else if(выражение3) действие_если_условиеЗ_истина;
Каждое действие может быть составным блоком в фигурных скобках (причем после закрывающей фигурной скобки точка с запятой не ставится). Такая управляющая логическая структура вычисляет каждое выражение до тех пор, пока не найдет истинное. Когда это происходит, все оставшиеся проверочные условия опускаются. В предыдущем примере, если ни одно из выражений не дает значения "истина", никаких действий не выполняется. Когда у вас в программе имеется несколько конструкций if и else, каким образом компилятор решает, какому оператору if соответствует какой оператор else? Рассмотрим, например, фрагмент программы
if (number > 6) { if (number < 12) printf(" Вы закончили!\п"); } else printf(" Простите, вы потеряли ход!\n");
В каком случае фраза «Простите, вы потеряли ход!» будет напечатана? Когда значение переменной number меньше или равно 6, или когда оно больше 12? Другими словами, чему соответствует else: первому if или второму? Ответ выглядит так: else соответствует второму if, т. е. при выполнении программы результаты будут такими:
Существует правило, которое гласит, что else соответствует ближайшему if, кроме тех случаев, когда имеются фигурные скобки. Мы сознательно записали этот фрагмент так, как будто else соответствует первому if, но вспомните, что компилятор не обращает внимания на отступы в строках.
7.6.5. Условный оператор?. Условный оператор? позволяет кратко записать условие проверки. Соответствующие действия выполняются в зависимости от вычисленного значения выражение_условие: истина или ложь. Этот оператор можно использовать вместо эквивалентного оператора if-else. Условный оператор имеет следующий синтаксис: Выражение_условие? действие_если_истина: действие_если_ложь; Оператор? иногда называют троичным оператором, так как он требует трех операндов. Рассмотрим такой оператор:
if(fvalue >= 0.0) fvalue = fvalue; else fvalue = -fvalue;
Этот оператор можно записать при помощи условного оператора?:
fvalue= (fvalue >= 0.0)? fvalue: — fvalue;
Оба оператора определяют абсолютное значение fvalue. Приоритет условного оператора ниже любого другого, используемого в выражении; поэтому в данном примере круглые скобки не нужны. Тем не менее, скобки часто используются для лучшего восприятия программы.
7.6.6. Оператор switch. Часто необходимо сравнить некоторую переменную или выражение с несколькими значениями. Для этого можно использовать либо вложенные операторы if-else-if, либо — оператор switch. Однако, будьте осторожны: в отличие от операторов-переключателей других языков высокого уровня (например, оператора case языка Паскаль), в С оператор switch имеет несколько особенностей. Синтаксис оператора switch следующий:
switch (общее_выражение) { case константа1: операторы1; break; case константа2: операторы2; break; … … … case константа N: операторыN; break; default: операторы; }
Правильно расположить break в операторе switch оказывается очень полезным. Взгляните на следующий пример:
/*07SWITCH.C Программа на С, иллюстрирующая возможность ветвлений и переходов в операторе switch*/
#include "stdafx.h"
main () { char c='a'; int ivowelct=0, iconstantct=0; switch(c) { case 'a': case 'A': case 'e': case 'E': case 'i': case 'I': case 'o': case 'O': case 'u': case 'U': ivowelct++; break; default: iconstantct++; } return(0); } Эта программа на практике иллюстрирует две возможности оператора switch: наличие множества различных условий проверки, для которых выполняется одно и то же действие, и возможность пропуска операторов. Некоторые другие языки высокого уровня имеют собственные операторы множественного выбора (операторы case — в Паскале и select — в PL/1), позволяющие включать в одну строку выбора несколько проверяемых значений и получать один и тот же результат. В следующем примере на С показано, как использовать оператор switch для вызова соответствующей функции:
/*07FNSWTH.C Программа на С, иллюстрирующая действие оператора switch*/ #include "stdafx.h" #include <stdio.h> #define QUIT 0 #define BLANK ' '
double fadd(float fx,float fy); double fsub(float fx,float fy); double fmul(float fx, float fy); double fdiv(float fx,float fy);
main () { float fx,fy; char cblank, coperator = BLANK;
while (coperator!= QUIT){ /* Введите выражение (а (операция) b)*/ printf("\nPlease enter an expression (a (operator) b): "); scanf("%f%c%f", &fx, &coperator, &fy);
switch (coperator) { /* ответ = */ case '+': printf("answer = %8.2f\n", fadd(fx,fy)); break; case '-': printf("answer = %8.2f\n", fsub(fx,fy)); break; case '*': printf("answer = %8.2f\n", fmul(fx,fy)); break; case '/': printf("answer = %8.2f\n", fdiv(fx,fy)); break; case 'x': coperator = QUIT; break; /* Операция не реализована */ default: printf("\nOperator not implemented"); } } return(0); }
double fadd(float fx,float fy) {return(fx + fy);}
double fsub(float fx,float fy) {return(fx - fy);}
double fmul(float fx,float fy) {return(fx * fy);}
double fdiv(float fx,float fy) { return(fx / fy); } Операция условия и конструкция if-else облегчают написание программ, в которых осуществляется выбор между двумя вариантами. Однако иногда в программе необходимо произвести выбор одного из нескольких вариантов. Мы можем сделать это, используя конструкцию if-else if—... —else, но во многих случаях оказывается более удобным применять оператор switch. Что можно сказать по поводу оператора break? Его выполнение приводит к тому, что в программе происходит выход из оператора switch и осуществляется переход к следующему за ним оператору. Метки, имеющиеся в операторе switch, должны быть константами или константными выражениями (выражения, операнды которого константы) целого типа (включая тип char). Запрещается использовать в качестве метки переменную. Значением выражения в скобках должна быть величина целого типа (опять же, включая тип char). Ниже приводится общая структура оператора switch:
switch(цeлoe выражение) { case константа1: операторы; (необязательные) case константа2: операторы; (необязательные) … case default: (необязательные) операторы; (необязательные) }
Когда требуется использовать оператор switch, а когда конструкцию else-if? Часто у нас нет возможности выбора. Вы не можете применить оператор switch, когда выбор вариантов основывается на вычислении значения переменной или выражения типа float. Удобного способа воспользоваться оператором switch в случае, когда возможные значения переменной попадают в некоторый диапазон, также не существует. Проще написать, например, так:
if (integer < 1000 && integer > 2)
в то время как замена этой строки оператором switch приведет к необходимости ввести в программу метки для всех целых чисел от 3 до 999. Тем не менее, если у вас есть возможность применить оператор switch, ваша программа будет выполняться более эффективно.
7.6.7. Совместное использование операторов if-else-if и switch. В следующем программном примере перечисляемый тип (enum) используется для выполнения необходимых преобразований единиц измерения длины:
/*07IFELSW.C Программа на С, иллюстрирующая использование оператора if-else-if в сочетании с различными операторами switch*/
#include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> //#include <iostream.h> using namespace std;
typedef enum conversion_type {YARDS, INCHES, CENTIMETERS, METERS} C_TYPE;
main() { int iuser_response; C_TYPE C_Tconversion; int ilength=30; float fmeasurement; /* Укажите единицы измерения для преобразования: */ printf("\nPlease enter the measurement to be converted: "); scanf("%f",&fmeasurement); /* Введите: 0— ярды 1— дюймы 2— сантиметры 3–метры*/ printf("\nPlease enter: \ \n\t\t 0 for YARDS \ \n\t\t 1 for INCHES \ \n\t\t 2 for CENTIMETERS \ \n\t\t 3 for METERS \ \n\n\t\tYour response -->> "); /* Ваш ответ --> */ scanf("%d",&iuser_response); switch(iuser_response) { case 0: C_Tconversion = YARDS; break; case 1: C_Tconversion = INCHES; break; case 2: C_Tconversion = CENTIMETERS; break; default: C_Tconversion = METERS; } if(C_Tconversion == YARDS) fmeasurement = ilength / 3; else if(C_Tconversion == INCHES) fmeasurement = ilength * 12; else if(C_Tconversion == CENTIMETERS) fmeasurement = ilength * 12 * 2.54; else if(C_Tconversion = METERS) fmeasurement = (ilength * 12 * 2.54)/100; else printf("No conversion required"); /* Преобразование не требуется */ switch(C_Tconversion) { case YARDS: printf("\n\t\t %4.2f yards", fmeasurement); break; case INCHES: printf("\n\t\t %4.2f inches", fmeasurement); break; case CENTIMETERS: printf("\n\t\t %4.2f centimeters", fmeasurement); break; default: printf("\n\t\t %4.2f meters", fmeasurement); } printf ("\n\nPress any key to finish\n");/* Конец работы */ _getch(); return(0); } В этом примере для указанного пересчета единиц длины используется перечисляемый тип данных. В стандартном С перечисляемые типы существуют только внутри самой программы (для обеспечения читабельности программы), и значения входящих в них переменных нельзя задавать или выводить непосредственно. Первый оператор switch в программе предназначен для преобразования введенного кода в соответствующий тип C_Tconversion. Нужное преобразование выполняется при помощи вложенных операторов if-else-if. В последнем операторе switch печатается преобразованное значение и название единицы измерения. Конечно же, вложенные операторы if-else-if можно было бы записать при помощи оператора switch. 11. Циклы и другие управляющие средства. 11.1. Оператор цикла.
Дата добавления: 2015-01-03; Просмотров: 776; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |