Совместное использование операторов break и continue.
Операторы break и continue можно использовать вместе для решения некоторых интересных задач программирования. Посмотрите на следующий пример на C++
using namespace std;
#define NEWLINE '\n'
main ()
{
int c;
while((c=getchar())!= EOF)
{
if (isascii(c) == 0)
{
cout << "Not an ASCII character; "; // He ASCII-символ;
cout << "not going to continue/n"; // продолжения нет
break;
}
if(ispunct(c) || isspace(c)) {
putchar(NEWLINE) ;
continue;
}
if (isprint(c) == 0) {
c = getchar();
continue;
}
putchar(c);
}
printf ("\n\nPress any key to finish\n");
_getch();
return(0);
}
63.Оператор goto. Использование goto.
Оператор goto.
goto - оператор условного перехода.Оператор goto — одно из важнейших средств Бейсика и Фортрана — также реализован и в Си. Однако на этом языке в отличие от двух других можно программировать, совершенно не используя указанное средство. Керниган и Ритчи считают оператор goto «чрезвычайно плохим» средством и предлагают «применять его как можно реже или не применять совсем».
Оператор goto состоит из двух частей — ключевого слова goto и имени метки. Имена меток образуются по тем же правилам, что и имена переменных. Приведем пример записи оператора
goto part2;
Чтобы этот оператор выполнился правильно, необходимо наличие другого оператора, имеющего метку part2; в этом случае запись оператора начинается с метки, за которой следует двоеточие.
part2: printf(" Уточненный анализ:\n");
Использование goto.
В принципе вы никогда не обязаны пользоваться оператором goto при программировании на Си. Но если ваш предыдущий опыт связан с работой на Фортране или Бейсике, в каждом из которых требуется его использовать, то у вас могли выработаться навыки программирования, основанные на применении данного оператора. Чтобы помочь вам преодолеть эту привычку, ниже вкратце приводится несколько знакомых вам ситуаций, реализуемых с помощью goto, а затем показывается, как это можно осуществить другими средствами, в большей степени соответствующими духу языка Си.
1. Работа в ситуации, когда в операторе if требуется выполнить более одного оператора:
if (size > 12)
goto a;
goto b;
a: cost = cost * 1.05;
flag = 2;
b: bill = cost * flag;
Обычный подход, применяемый в языке Си и заключающийся в использовании составного оператора, или блока, упрощает понимание смысла программы:
if (size > 12);
{
cost = cost * 1.05;
flag = 2;
}
bill = cost * flag;
2. Осуществление выбора из двух вариантов:
if(size > 14)
goto a;
sheds = 2;
goto b;
a: sheds = 3;
b: help = 2 * sheds;
Наличие в языке Си структуры if-else позволяет реализовать такой выбор более наглядно:
if(ibex > 14)
sheds = 3;
else
sheds = 2;
help = 2 * sheds;
3. Реализация бесконечного цикла:
readin: scanf(" %d", &score);
if(score < 0)
goto stage2;
большое количество операторов;
goto readin:
stage2: дополнительная чепуха;
Эквивалентный фрагмент, в котором используется цикл while, выглядит так:
scanf("%d", &score);
while(score > = 0)
{
большое количество операторов;
scanf(" %d", &score);
дополнительная чепуха;
64.Оператор exit(). Оператор atexit(). Сравнение циклов.
Оператор exit().
В некоторых случаях программу необходимо закончить до того, как выполнились все ее операторы или условия. Для таких особых случаев в С имеется библиотечная функция exit(). Эта функция может иметь один целочисленный аргумент, называемый статусом. Операционные системы UNIX и MS-DOS интерпретируют значение статуса, равное нулю, как успешное завершение программы, а все ненулевые значения статуса говорят о различного вида ошибках.
В следующей программе на C++ выполняется поиск среднего значения из списка, имеющего до 30 чисел. Выход из программы происходит, если пользователь просит усреднить большее, чем LIMIT, количество цифр.
using namespace std;
#define LIMIT 30
main()
{
int irow,irequested_qty,iscores[LIMIT];
float fsum=0,imax_score=0,imin_score=100, faverage;
// Введите количество усредняемых величин:
cout << "\nEnter the number of scores to be averaged: ";
cin >> irequested_qty;
if(irequested_qty > LIMIT) {
// Вы можете задать только ... чисел для усреднения,
cout << "\nYou can only enter up to " << LIMIT << \
" scores" << " to be averaged.\n";
// Программа окончена.
cout << "\n >>> Program was exited. <<<\n";
exit;
}
for(irow = 0; irow < irequested_qty; irow++) {
// Введите число
cout << "\nPlease enter a grade " << irow+1 << ": ";
cin >> iscores[irow];
}
for(irow = 0; irow < irequested_qty; irow++)
fsum = fsum + iscores[irow];
faverage = fsum/(float)irequested_qty;
for(irow = 0; irow < irequested_qty; irow++) {
if(iscores[irow] > imax_score)
imax_score = iscores[irow];
if(iscores[irow] < imin_score)
imin_score = iscores[irow];
}
cout << "\nThe maximum grade is " << imax_score; // Максимум
cout << "\nThe minimum grade is " << imin_score; // Минимум
cout << "\nThe average grade is " << faverage; // Среднее значение
printf ("\n\nPress any key to finish\n");
_getch();
return(0);
}