|
Программирование >> Процедурные приложения
cin >> fbalance; cout << \nВведите сумму погашения: ; cin >> fpayment; cout << \n\nВаш баланс: ; cout << ((fpayment > fbalance) ? переплачено на $ : уплачено $ ); cout << ((fpayment > fbalance) ? (fpayment - fbalance) : fpayment); cout << по заему на сумму $ << fbalance << . ; return(0); Первый раз условный оператор используется для того, чтобы выяснить, какой текст выводить на экран: переплачено на $ или уплачено $ . В следующем выражении с условным оператором определяется, какую денежную сумму следует отобразить: cout << ((fpayment > fbalance) ? (fpayment - fbalance) : fpayment); Конструкция switch/case Часто возникает необходимость проверить переменную на равенство целому ряду значений. Это можно выполнить либо с помощью конструкции if/else/if, либо с помощью похожей конструкции switch/case. Обратим ваше внимание на то, что инструкция switch в языке С имеет ряд особенностей. Ее синтаксис таков: switch(целочисленное выражение) { , caseконстанта!: выражение1; break; саsе константа2: выражение2; break; case константа-n: выражение-п; break; default: действие по умолчанию; } Заметьте: инструкция break повторяется во всех ветвях, кроме самой последней. Если, скажем, из первой ветви удалить эту инструкцию, то после выражения1 будет выполняться выражение2, что не всегда желательно. Таким образом, инструкция break отвечает за то, что после выполнения одной из ветвей case все остальные ветви будут пропущены. Рассмотрим несколько примеров. Предположим, имеется такой фрагмент: if(emove == SMALL CHAMGE DP) fycoord = 5; else iftemove == SMALL CHAMGE DOWN) fycoord = -5; else if(emove == LARGE CHANGE DP) fycoord = ,10; else fycoord = -10; Его можно переписать с использованием инструкции switch: switch(emove) { case SMALL CHANGE UP: fycoord = 5; break; case SMALL CHAMGE DOWN: fycoord = -5; break; case LARGE CHAMGE UP: fycoord = 10; break; default: fycoord = -10; Здесь значение переменной emove последовательно сравнивается с рядом констант в ветвях case. Если обнаруживается совпадение, переменной fycoord присваивается нужное приращение. Затем выполняется инструкция break, которая передает управление строке, следующей после закрывающей фигурной скобки. Если же ни одно из сравнений не дало результата, то переменной fycoord присваивается значение по умолчанию (-10). Поскольку это последняя строка всего блока, нет необходимости ставить после нее инструкцию break. Следует также упомянуть о том, что ветвь default является необязательной. Умелое манипулирование инструкциями break позволяет рациональнее строить блоки switch/case, как показано в следующем примере: * switch. с * В этой программе на языке С демонстрируется, как рационально * строить блоки switch/case. int main () { char с = a ; int ivowelct = 0, iconstantct = 0; switch(c)
ivowelct++; break; default : iconstantct++; return(0); Если переменная с содержит ASCII-код любой гласной буквы, увеличивается счетчик гласных ivowelct, в противном случае осуществляется приращение счетчика согласных iconstantct. В других языках высокого уровня допускается объединение в одной проверке всех констант, приводящих к выполнению одного и того же действия. Но в C/C++ требуется, чтобы каждая константа была представлена отдельной ветвью case. Эффект объединения достигается за счет того, что связанные ветви не разделяются инструкциями break. В следующей программе на языке С инструкция switch используется для организации вызова правильной функции: * fnswitch.c * В этой программе на языке С демонстрируются другие возможности * инструкции switch. #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) ; int main() { float fx, fy; char cblank, coperator = BLANK; while(coperator != QUIT) { printf( \nВведите в1ражение вида (а (оператор) b): ); scanf( %f%c%c%f , &fx, &cblank, &coperator, &fy) ; switch (coperator) { case +:printf( ответ= %8.2f\n ,fadd(fx, fy)); break; case -:printf( ответ= %8.2f\n ,fsub(fx, fy)); break; case *:printf( ответ= %8.2f\n ,fmul(fx, fy)); break; case /:printf( ответ= %8.2f\n ,fdiv(fx, fy)); break; case x: coperator = QUIT; break; default : printf( \nОператор не распознан. );} } 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) ; } Хотя синтаксис описания и вызова функций может быть еще непонятен вам (с функциями нам предстоит познакомиться в следующей главе), в целом использование инструкции switch в данном примере позволяет сделать текст программы максимально компактным и наглядным. Если пользователь введет какое-нибудь математическое выражение, скажем 10+10 или 23*15, соответствующий оператор (+ или *) будет сохранен в переменной coperator, значение которой затем сравнивается в блоке switch с набором стандартных арифметических операторов. Если же вместо арифметического оператора введен символ х, то программа присвоит переменной coperator значение quit, что является признаком завершения цикла, а с ним и всей программы. В случае, когда пользователь случайно ввел какой-нибудь не распознаваемый программой символ, например %, управление передается ветви default, в которой на экран выводится предупреждающее сообщение. В языке C++ инструкция switch используется аналогичным образом, в чем можно убедиться на следующем примере: calendar. Срр В этой программе на языке C++ демонстрируется использование инструкции switch для создания ежегодного календаря. #include <fstream.h> int main() { int jan l start day, num days per month, month, date, year; bool leap year flag; ofstream fout( output.dat ); cout << Укажите, на какой день недели приходится 1-е января\n ; cout << \n(0- понедельник, ; cout << \n 1 - вторник и т. д.): ; cin >> jan l start day; cout << \nВведите год, для которого вы хотите построить календарь: ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |