Читать интересную книгу Язык Си - руководство для начинающих - M. УЭИТ

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 43 44 45 46 47 48 49 50 51 ... 98

goto pait2;

Чтобы этот оператор выполнился правильно, необходимо наличие другого оператора, имеющего метку 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-условием, считается относящимся к оператору if. Мы выразим это с помощью эквивалентного фрагмента на Си.)

Обычный подход, применяемый в языке Си и заключающийся в использовании составного оператора, или блока, упрощает понимание смысла программы:

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 stagc2;

большое количество операторов;

goto readin:

stagc2: дополнительная чепуха;

}

Эквивалентный фрагмент, в котором используется цикл while, выглядит так:

scanf(" %d", &score);

whilet(score >= 0)

{

 большое количество операторов;

  scanf("%d", &score);

}

дополнительная чепуха;

4. Пропуск операторов до конца тела цикла: используйте оператор continue.

5. Выход из цикла: используйте оператор break. Фактически break и continue являются специальными формами оператора goto. Преимущество их использования заключается в том, что, во-первых, названия этих операторов говорят об осуществляемых ими функциях, а во-вторых, поскольку они нe используют меток, отсутствует опасность пометить не тот оператор программы.

6. Выполнение переходов к различным частям программы непредсказуемым образом: так программировать нельзя!

Существует один случай, когда использование оператора goto допускается опытными программистами, работающими на языке Си,- это выход из вложенного набора циклов при обнаружении каких-то ошибок. (Применение оператора break даст возможность осуществить выход только из самого внутреннего цикла.)

while(funct > 0)

{

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

        {  for(j = 1; j<= 50; j++)

               { большое число операторов;

                 if(большая ошибка)

            goto help;

          операторы;

  }

          еще некоторое количество операторов;  }

   и еще некоторое количество операторов;  }

и еще операторы;

help: устранение ошибки;

Как вы можете заметить из наших примеров, альтернативные формы представления программ более понятны, чем формы, использующие оператор goto. Эти различия станут еще большими, если вы объедините некоторые из рассмотренных случаев. Какие операторы goto используются при реализации операторов if, какие моделируют конструкции if-else, какие управляют работой циклов, а какие появляются лишь потому, что пользователь написал программу так, что не может без них обойтись? Чрезмерное увеличение оператором goto приводит к созданию лабиринта в логике программы. Дадим вам совет: если вы совсем не знакомы с оператором goto, то не применяйте его вовсе; если вы привыкли пользоваться им, попытайтесь отучить себя от этого. Ирония заключается в том, что в языке Си, который вовсе не нуждается в операторе goto, его структура оказывается лучшей, чем в большинстве других языков программирования поскольку в качестве меток можно использовать смысловые имена, а не числа.

Резюме: переходы в программах

I. Ключевые слова: break, continue, goto

II. Общие замечания

     Выполнение каждого из этих трех операторов языка вызывает скачкообразное изменение процесса выполнения программы, т. е. переход от одной команды программы к другой (не следующий за ней непосредственно).

III. break

     Оператор break можно использовать внутри любой из трех форм цикла и конструкции switch. Его выполнение приводит к тому, что управление программой, минуя оставшуюся часть тела цикла или конструкцию switch, содержащую данный оператор, передается на следующую (за этим циклом или за конструкцией switch) команду.

Пример:

switch(number)

{

 case 4: printf(" Этохорошийвыбор.n");

  break;

  case 5: printf(" Это неплохой выбор.n");

  break;

  default: рrintf(" Это плохой выбор.n");

}

IV. Continue

     Оператор continue может использоваться в любой из трех форм циклов, но нe в операторе switch. Его выполнение приводит к такому изменению логики программы, что остальные операторы тела цикла пропускаются. Для циклов while или for вслед за этим начинается новый шаг, а для цикла do while проверяется условие на выходе, и затем, если оно оказывается истинным, выполняется следующая итерация.

Пример

while((ch = gctchar( ))!= EOF)

{

 if(ch == ' ') continue;

  putchar(ch);

  chcount++;

 }

В этом фрагменте осуществляется эхо-печать читаемых символов и подсчитывается число символов, отличных от пробела.

V. goto

     Выполнение оператора goto вызывает передачу управления в программе оператору, помеченному указанной меткой. Для отделения оператора от соответствующей ему метки используется двоеточие. Имена меток образуются но тем же правилам, что и имена переменных. Помеченный оператор может появиться в программе текстуально до или после goto.

Форма:

goto метка;

...метка: оператор

Пример

toр : ch  = getchar( );

...

if (ch !=  'y')

goto top;

 

МАССИВЫ

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

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

float debts [20];

объявляется, что debts - массив, состоящий из двадцати членов, или "элементов". Первый элемент массива называется debts[0], второй - debts[l], и т. д. вплоть до debts[19]. Заметим, что перечисление элементов массива начинается с 0, а не с 1. Поскольку мы объявили, что массив имеет тип float, каждому его элементу можно присвоить величину типа float. К примеру, можно писать так:

debts[5] = 32.54;

debts[6] = 1.2е+21;

Массивы могут быть образованы из данных любого типа:

int nannies[22];  /* масснв, содержащий 22 целых чнсла */

1 ... 43 44 45 46 47 48 49 50 51 ... 98
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Язык Си - руководство для начинающих - M. УЭИТ.

Оставить комментарий