Совместное использование операторов 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);

}