Методология структурного программирования основана на предположении, что логичность и понятность программы обеспечивает надежность, облегчает модификацию и ускоряет разработку программы.
Характерными чертами структурного программирования являются:
Существует три вида циклов: for и do.
while (e) s;
Оператор s выполняется до тех пор, пока значение выражения e равно "истина". Значение e вычисляется перед каждым выполнением оператора s.
В предшествующих лекциях мы пользовались этой формой цикла. Рассмотрим еще один пример его работы:
/* угадывание числа */
#include <stdio.h>
main( )
{
int i = 1;
char res;
printf("Задумайте целое число от 1 до 100.
Компьютер попытается угадать его. \n");
printf ("Отвечайте y, если догадка правильна и");
printf("\n n, если программа ошибается \n");
printf("Итак, ваше число %d?\n",i);
/*получение ответа */
while((res = getchar( )) !='y')
if(res !='\n')
/* пропуск символа новая строка */
printf("Ну тогда оно равно %d\n" ,++i);
printf("Число угадано!\n");
}
| ! | Это довольно простая программа. Она написана правильно и решает поставленную задачу, но делает это крайне неэффективно. Данный пример показывает, что правильность написания - не единственный критерий, по которому необходимо оценивать программу. При этом очень важна ее эффективность! |
В наших примерах до сих пор использовались условные выражения, но вообще говоря, это могут быть выражения произвольного типа. В качестве оператора можно использовать простой оператор с символом "точка с запятой" в конце или составной оператор, заключенный в фигурные скобки. Если выражение истинно (или в общем случае равно единице), то оператор, входящий в if. Основное отличие заключается в том, что в операторе if проверка условия и (возможное) выполнение оператора осуществляется только один раз, а в
| ! | При построении |
| ! |
Подведем итоги.
Оператор while определяет операции, которые циклически выполняются до тех пор, пока проверяемое выражение не станет ложным, или равным нулю. Оператор while - это цикл с предусловием. Решение, выполнить ли в очередной раз тело цикла, принимается перед началом его прохождения. Поэтому вполне возможно, что тело цикла не будет выполнено ни разу. Оператор, образующий тело цикла, может быть либо простым, либо составным. Форма записи:
while (выражение) оператор
Выполнение оператора циклически повторяется до тех пор, пока выражение не станет ложным, или равным нулю.
Оператор цикла for
for(e1; e2; e3) s
является удобной сокращенной записью для
e1;
while(e2) {
s;
e3;
}
Выражение e1 служит для задания начальных условий выполнения цикла, выражение e2 обеспечивает проверку условия выхода из цикла, а выражение e3 модифицирует условия, заданные выражением e1. Любое из выражений e1, e2, e3 может быть опущено. Если опущено e2, то по умолчанию вместо него подставляется значение TRUE. Например, цикл for
for(;e2;) s;
с опущенными e1, e3 эквивалентен циклу
while(e2) s;
Цикл
for(;;) s;
со всеми опущенными выражениями эквивалентен циклу
while(TRUE) s;
т.е. эквивалентен бесконечному циклу. Такой цикл может быть прерван только явным выходом из него с помощью операторов break, goto, return, содержащихся в теле цикла s.
Несмотря на внешнее сходство с итеративными циклами for языков Паскаль и Ада или итеративными циклами do языков Фортран или ПЛ/1, цикл for языка Си не является их семантической копией. Цикл for языка Си обладает большей общностью, чем циклы for и do других языков. В отличии от этих циклов, в общем случае число for языка Си не может быть определено до выполнения этого цикла.
Цикл for и его альтернатива s является оператором continue или составным оператором, содержащим оператор continue. Действие оператора continue состоит в переходе к концу цикла, что имеет различные последствия для цикла for и его эквивалента в форме for выражение e3 выполняется до вычисления значения выражения e2, в то время как в эквивалентном e3 пропускается.
Гибкость конструкции for - следствие способа использования выражений в спецификации цикла. До сих пор первое выражение применялось для инициализации счетчика, второе - для задания его граничного значения, а третье - для увеличения его текущего значения на 1. Но кроме этой возможности существует еще и много других возможностей его применения, девять из которых мы приведем ниже.
for(n=10; n>0; n--)
printf("%d секунд!\n",n);
printf("Пуск! \n");
for (n=2; n<60;n=n+13);
printf("%d\n",n);
for(ch = 'a';ch<='z';ch++)
printf("Величина кода ASCII для %с равна %d.\n",ch,ch);
При выполнении этого оператора будут выведены на печать все буквы от а до z вместе с их кодами ASCII. Этот оператор работает, поскольку символы в памяти машины размещаются в виде чисел, и потому в данном фрагменте ведется счет с использованием целых чисел.
/* таблица кубов */
main( )
{
int num;
for(num=1; num<=6; num++)
printf("%5d %5d\n", num,num*num*num);
}
А теперь заменим спецификацию
for(num=1; num<=6; num++)
на
for(num=1; num<6; num++)
Это было бы целесообразно в случае, если бы нас больше занимало ограничение максимального значения диапазона кубов чисел, а не количество
for(x=100.0; x<150.0; x=x*1.1)
printf("Ваш долг теперь %3.2f.\n",x);
В этом фрагменте программы значение переменной x умножается на 1.1 на каждом шаге цикла, что увеличивает ее на 10%. Результат выглядит следующим образом:
Ваш долг теперь 100.00. Ваш долг теперь 110.00. Ваш долг теперь 121.00. Ваш долг теперь 133.10. Ваш долг теперь 146.41.
for (x=y=1; y<=75; y=5*x++)
printf("%10d %10d\n",x,y);
Обратите внимание, что в спецификации цикла проверяется значение y, а не x. В каждом из трех выражений, управляющих работой цикла for, могут использоваться любые переменные.
| ! | Хотя этот пример и правильный, он не может служить иллюстрацией хорошего стиля программирования. Программа выглядела бы гораздо понятнее, если бы мы не смешали процесс изменения переменной цикла с алгебраическими вычислениями. |
for(;;) {
...
}
будет выполняться бесконечное число раз, поскольку пустое условие всегда считается истинным.
printf( ). Необходимо помнить только, что первое выражение вычисляется только один раз перед тем, как остальные части цикла начнут выполняться.for(printf("Запоминайте числа! \n"); num != 6;)
scanf("%d",num);
printf("Это как раз то, что я хочу!\n");
В этом фрагменте первое сообщение оказывается выведенным на печать один раз, а затем осуществляется прием вводимых чисел до тех пор, пока не поступит число 6.
for(n=1; n<1000; n+t)
И если после нескольких t слишком мала или велика, то оператор if внутри цикла может изменить значение параметра. В диалоговой программе пользователь может изменить этот параметр в процессе выполнения цикла.
Подведем итоги. В операторе for используются три выражения, управляющие работой цикла. Они разделены символом "точка с запятой". Инициализирующее выражение вычисляется только один раз до начала выполнения какого-нибудь из операторов цикла. Если проверяемое выражение оказывается истинным, или не равным нулю, тело цикла выполняется один раз. Затем вычисляется величина корректируемого выражения, и значение for - это цикл с предусловием. Решение о том, выполнить ли в очередной раз тело цикла или нет, принимается до начала его прохождения. Поэтому может случиться так, что тело цикла не будет выполнено ни разу. Оператор, образующий тело цикла, может быть как простым, так и составным.
Операция "запятая" увеличивает гибкость использования цикла for, позволяя включить в его спецификацию несколько инициализирующих или корректирующих выражений.
Цикл
do оператор while(e);
выполняется до тех пор, пока выражение e имеет значение "истина". В отличие от do такая проверка имеет место после выполнения тела цикла. Следовательно, тело цикла do будет выполнено хотя бы один раз, даже если выражение e имеет значение "ложь" c самого начала. Цикл do аналогичен циклу repeat в языке Паскаль, отличаясь от него лишь тем, что цикл repeat выполняется до тех пор, пока некоторое условие выходa из цикла не становится истинным, а цикл do выполняется все время, пока некоторое условие остается истинным!
| ! | Цикл Использовать цикл do {
выдвиньте предположение
получите ответ вида y,n
} while(ответ не совпадает с y);
|
| ! | Вы должны избегать использование цикла do оператор while (ответ будет да) В данном случае, после того как пользователь ответит "нет", "оператор" будет выполнен, поскольку проверка осуществляется слишком поздно. |
Пример:
do
scanf("%d", number);
while(number!=50);
Подведем итоги.
Оператор do while определяет действия, которые циклически выполняются до тех пор, пока проверяемое выражение не станет ложным, или равным нулю. Оператор do while - это цикл с постусловием. Решение о том выполнять или нет в очередной раз тело цикла, принимается после его прохождения. Поэтому тело цикла будет выполнено по крайней мере один раз. Оператор, образующий тело цикла, может быть как простым, так и составным.
Особенности работы с языком Си. Циклом какого вида лучше всего воспользоваться? Во-первых, решите, нужен ли вам цикл с предусловием или же с постусловием. Чаще вам нужен будет цикл с предусловием. По оценкам Кернигана и Ритчи, в среднем циклы с постусловием составляют только 5% общего числа используемых циклов. Существует несколько причин, по которым программисты предпочитают пользоваться циклами с предусловием. В их числе один общий принцип, согласно которому лучше посмотреть, куда вы прыгаете, до прыжка, а не после. Вторым моментом является то, что программу легче читать, если проверяемое условие находится в начале цикла. И наконец, во многих случаях важно, чтобы тело цикла игнорировалось полностью, если условие вначале не выполняется.
Пример:
/* Простое число - это такое число, которое
делится нацело только на 1 и само на себя.
Первыми простыми числами будут 2, 3, 5, 7 и 11. */
/*простые числа*/
main()
{
int number, divisor, limit;
int count=0;
printf("Укажите, пожалуйста, верхний предел
для поиска простых чисел. \n");
printf("Bерхний предел должен быть 2
или больше.\n");
scanf("%d",limit);
while (limit<2) {
/* вторая попытка, если ошибка при вводе */
printf("Bы были невнимательны!
Попробуйте еще раз\n");
scanf("%d",limit);
}
printf("Ceйчac напечатаем простые числа!\n");
for (number=2;number<=limit; number++)
/*внешний цикл*/
{
for(divisor=2; number%divisor!=0; divisor++)
;
if(divisor==number)
{
printf("%5d",number);
if(++count%10==0)
printf("\n");/* новая строка начинается
через каждые 10 простых чисел */
}
}
printf("Pa6oта завершена!\n");
}
Во внешнем цикле каждое число, начиная с 2 и кончая величиной limit, последовательно берется для проверки. Указанная проверка осуществляется во внутреннем цикле. В count хранится счетчик получаемых простых чисел. При печати каждое одиннадцатое простое число печатается с новой строки.
Операторы, определяющие циклические вычисления, которые мы рассмотрели, и условные операторы if, if-else и switch, являются важнейшими средствами управления выполнением программы на языке Си. Они должны использоваться для реализации общей структуры программы. Три оператора, рассматриваемые ниже, обычно рассматриваются реже, поскольку слишком частое их использование ухудшает читаемость программы, увеличивает вероятность ошибок и затрудняет ее модификацию. Никлаус Вирт дал определение структурного программирования, как программирования без goto.
Оператор break используется для выхода из оператора while, do, for, switch, непосредственно его содержащего. Управление передается на оператор, следующий за оператором, из которого осуществлен выход. Оператор break имеет форму
break;
Пример:
while((ch=getchar()) != EOF)
/* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */
{
if(ch=='\n')
break;
putchar(ch);
}
Работа цикла полностью прекращается, как только при вводе встречается символ "новая строка".
Оператор continue служит для пропуска оставшейся части выполняемой continue имеет следующую форму:
continue;
Пример:
while((ch=getchar()) != EOF)
/* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */
{
if(ch=='\n')
continue;
putchar(ch);
}
В версии с оператором continue просто пропускаются символы "новая строка", а выход из цикла происходит, только когда читается признак EOF.
Оператор goto предназначен для безусловной передачи управления к оператору с указанной меткой. Он имеет следующую форму:
goto метка;
Керниган и Ритчи считают оператор goto "чрезвычайно плохим" средством и предлагают применять его как можно реже или не применять совсем. Приведем пример записи оператора:
goto part1;
Чтобы этот оператор выполнялся правильно, необходимо наличие другого оператора, имеющего метку part1. В этом случае запись оператора начинается с метки, за которой следует двоеточие:
part1: printf("точка перехода\n");
| ! | Избегайте использовать goto! С тех пор как Дейкстра опубликовал свой знаменитый труд "Вредность оператора GOTO", специалисты бились над методами структурного программирования. Полное описание структурного программирования выходит за рамки этого курса лекций, однако отметим, что нужно очень осторожно использовать операторы: goto, break, continue, return. |
Если без операторов goto, break, continue, return никак не обойтись, то при использовании goto переходите вперед по коду, а не назад.
Оператор break лучше не использовать для преждевременного выхода из цикла, его полезно использовать внутри оператора switch.
Оператор continue нежелательно использовать для модификации логики циклов.
Почему нежелательно использовать функции со многими операторами return. Один из принципов структурного программирования состоит в том, что программа должна иметь одну точку входа и одну точку выхода. Функции со многими операторами return более сложны для чтения, чем те, которые имеют лишь один оператор return в конце тела функции.
Методология структурного программирования основана на предположении, что логичность и понятность программы обеспечивает надежность, облегчает модификацию и ускоряет разработку программы.
Характерными чертами структурного программирования являются:
Существует три вида циклов: for и do.
while (e) s;
Оператор s выполняется до тех пор, пока значение выражения e равно "истина". Значение e вычисляется перед каждым выполнением оператора s.
В предшествующих лекциях мы пользовались этой формой цикла. Рассмотрим еще один пример его работы:
/* угадывание числа */
#include <stdio.h>
main( )
{
int i = 1;
char res;
printf("Задумайте целое число от 1 до 100.
Компьютер попытается угадать его. \n");
printf ("Отвечайте y, если догадка правильна и");
printf("\n n, если программа ошибается \n");
printf("Итак, ваше число %d?\n",i);
/*получение ответа */
while((res = getchar( )) !='y')
if(res !='\n')
/* пропуск символа новая строка */
printf("Ну тогда оно равно %d\n" ,++i);
printf("Число угадано!\n");
}
| ! | Это довольно простая программа. Она написана правильно и решает поставленную задачу, но делает это крайне неэффективно. Данный пример показывает, что правильность написания - не единственный критерий, по которому необходимо оценивать программу. При этом очень важна ее эффективность! |
В наших примерах до сих пор использовались условные выражения, но вообще говоря, это могут быть выражения произвольного типа. В качестве оператора можно использовать простой оператор с символом "точка с запятой" в конце или составной оператор, заключенный в фигурные скобки. Если выражение истинно (или в общем случае равно единице), то оператор, входящий в if. Основное отличие заключается в том, что в операторе if проверка условия и (возможное) выполнение оператора осуществляется только один раз, а в
| ! | При построении |
| ! |
Подведем итоги.
Оператор while определяет операции, которые циклически выполняются до тех пор, пока проверяемое выражение не станет ложным, или равным нулю. Оператор while - это цикл с предусловием. Решение, выполнить ли в очередной раз тело цикла, принимается перед началом его прохождения. Поэтому вполне возможно, что тело цикла не будет выполнено ни разу. Оператор, образующий тело цикла, может быть либо простым, либо составным. Форма записи:
while (выражение) оператор
Выполнение оператора циклически повторяется до тех пор, пока выражение не станет ложным, или равным нулю.
Оператор цикла for
for(e1; e2; e3) s
является удобной сокращенной записью для
e1;
while(e2) {
s;
e3;
}
Выражение e1 служит для задания начальных условий выполнения цикла, выражение e2 обеспечивает проверку условия выхода из цикла, а выражение e3 модифицирует условия, заданные выражением e1. Любое из выражений e1, e2, e3 может быть опущено. Если опущено e2, то по умолчанию вместо него подставляется значение TRUE. Например, цикл for
for(;e2;) s;
с опущенными e1, e3 эквивалентен циклу
while(e2) s;
Цикл
for(;;) s;
со всеми опущенными выражениями эквивалентен циклу
while(TRUE) s;
т.е. эквивалентен бесконечному циклу. Такой цикл может быть прерван только явным выходом из него с помощью операторов break, goto, return, содержащихся в теле цикла s.
Несмотря на внешнее сходство с итеративными циклами for языков Паскаль и Ада или итеративными циклами do языков Фортран или ПЛ/1, цикл for языка Си не является их семантической копией. Цикл for языка Си обладает большей общностью, чем циклы for и do других языков. В отличии от этих циклов, в общем случае число for языка Си не может быть определено до выполнения этого цикла.
Цикл for и его альтернатива s является оператором continue или составным оператором, содержащим оператор continue. Действие оператора continue состоит в переходе к концу цикла, что имеет различные последствия для цикла for и его эквивалента в форме for выражение e3 выполняется до вычисления значения выражения e2, в то время как в эквивалентном e3 пропускается.
Гибкость конструкции for - следствие способа использования выражений в спецификации цикла. До сих пор первое выражение применялось для инициализации счетчика, второе - для задания его граничного значения, а третье - для увеличения его текущего значения на 1. Но кроме этой возможности существует еще и много других возможностей его применения, девять из которых мы приведем ниже.
for(n=10; n>0; n--)
printf("%d секунд!\n",n);
printf("Пуск! \n");
for (n=2; n<60;n=n+13);
printf("%d\n",n);
for(ch = 'a';ch<='z';ch++)
printf("Величина кода ASCII для %с равна %d.\n",ch,ch);
При выполнении этого оператора будут выведены на печать все буквы от а до z вместе с их кодами ASCII. Этот оператор работает, поскольку символы в памяти машины размещаются в виде чисел, и потому в данном фрагменте ведется счет с использованием целых чисел.
/* таблица кубов */
main( )
{
int num;
for(num=1; num<=6; num++)
printf("%5d %5d\n", num,num*num*num);
}
А теперь заменим спецификацию
for(num=1; num<=6; num++)
на
for(num=1; num<6; num++)
Это было бы целесообразно в случае, если бы нас больше занимало ограничение максимального значения диапазона кубов чисел, а не количество
for(x=100.0; x<150.0; x=x*1.1)
printf("Ваш долг теперь %3.2f.\n",x);
В этом фрагменте программы значение переменной x умножается на 1.1 на каждом шаге цикла, что увеличивает ее на 10%. Результат выглядит следующим образом:
Ваш долг теперь 100.00. Ваш долг теперь 110.00. Ваш долг теперь 121.00. Ваш долг теперь 133.10. Ваш долг теперь 146.41.
for (x=y=1; y<=75; y=5*x++)
printf("%10d %10d\n",x,y);
Обратите внимание, что в спецификации цикла проверяется значение y, а не x. В каждом из трех выражений, управляющих работой цикла for, могут использоваться любые переменные.
| ! | Хотя этот пример и правильный, он не может служить иллюстрацией хорошего стиля программирования. Программа выглядела бы гораздо понятнее, если бы мы не смешали процесс изменения переменной цикла с алгебраическими вычислениями. |
for(;;) {
...
}
будет выполняться бесконечное число раз, поскольку пустое условие всегда считается истинным.
printf( ). Необходимо помнить только, что первое выражение вычисляется только один раз перед тем, как остальные части цикла начнут выполняться.for(printf("Запоминайте числа! \n"); num != 6;)
scanf("%d",num);
printf("Это как раз то, что я хочу!\n");
В этом фрагменте первое сообщение оказывается выведенным на печать один раз, а затем осуществляется прием вводимых чисел до тех пор, пока не поступит число 6.
for(n=1; n<1000; n+t)
И если после нескольких t слишком мала или велика, то оператор if внутри цикла может изменить значение параметра. В диалоговой программе пользователь может изменить этот параметр в процессе выполнения цикла.
Подведем итоги. В операторе for используются три выражения, управляющие работой цикла. Они разделены символом "точка с запятой". Инициализирующее выражение вычисляется только один раз до начала выполнения какого-нибудь из операторов цикла. Если проверяемое выражение оказывается истинным, или не равным нулю, тело цикла выполняется один раз. Затем вычисляется величина корректируемого выражения, и значение for - это цикл с предусловием. Решение о том, выполнить ли в очередной раз тело цикла или нет, принимается до начала его прохождения. Поэтому может случиться так, что тело цикла не будет выполнено ни разу. Оператор, образующий тело цикла, может быть как простым, так и составным.
Операция "запятая" увеличивает гибкость использования цикла for, позволяя включить в его спецификацию несколько инициализирующих или корректирующих выражений.
Цикл
do оператор while(e);
выполняется до тех пор, пока выражение e имеет значение "истина". В отличие от do такая проверка имеет место после выполнения тела цикла. Следовательно, тело цикла do будет выполнено хотя бы один раз, даже если выражение e имеет значение "ложь" c самого начала. Цикл do аналогичен циклу repeat в языке Паскаль, отличаясь от него лишь тем, что цикл repeat выполняется до тех пор, пока некоторое условие выходa из цикла не становится истинным, а цикл do выполняется все время, пока некоторое условие остается истинным!
| ! | Цикл Использовать цикл do {
выдвиньте предположение
получите ответ вида y,n
} while(ответ не совпадает с y);
|
| ! | Вы должны избегать использование цикла do оператор while (ответ будет да) В данном случае, после того как пользователь ответит "нет", "оператор" будет выполнен, поскольку проверка осуществляется слишком поздно. |
Пример:
do
scanf("%d", number);
while(number!=50);
Подведем итоги.
Оператор do while определяет действия, которые циклически выполняются до тех пор, пока проверяемое выражение не станет ложным, или равным нулю. Оператор do while - это цикл с постусловием. Решение о том выполнять или нет в очередной раз тело цикла, принимается после его прохождения. Поэтому тело цикла будет выполнено по крайней мере один раз. Оператор, образующий тело цикла, может быть как простым, так и составным.
Особенности работы с языком Си. Циклом какого вида лучше всего воспользоваться? Во-первых, решите, нужен ли вам цикл с предусловием или же с постусловием. Чаще вам нужен будет цикл с предусловием. По оценкам Кернигана и Ритчи, в среднем циклы с постусловием составляют только 5% общего числа используемых циклов. Существует несколько причин, по которым программисты предпочитают пользоваться циклами с предусловием. В их числе один общий принцип, согласно которому лучше посмотреть, куда вы прыгаете, до прыжка, а не после. Вторым моментом является то, что программу легче читать, если проверяемое условие находится в начале цикла. И наконец, во многих случаях важно, чтобы тело цикла игнорировалось полностью, если условие вначале не выполняется.
Пример:
/* Простое число - это такое число, которое
делится нацело только на 1 и само на себя.
Первыми простыми числами будут 2, 3, 5, 7 и 11. */
/*простые числа*/
main()
{
int number, divisor, limit;
int count=0;
printf("Укажите, пожалуйста, верхний предел
для поиска простых чисел. \n");
printf("Bерхний предел должен быть 2
или больше.\n");
scanf("%d",limit);
while (limit<2) {
/* вторая попытка, если ошибка при вводе */
printf("Bы были невнимательны!
Попробуйте еще раз\n");
scanf("%d",limit);
}
printf("Ceйчac напечатаем простые числа!\n");
for (number=2;number<=limit; number++)
/*внешний цикл*/
{
for(divisor=2; number%divisor!=0; divisor++)
;
if(divisor==number)
{
printf("%5d",number);
if(++count%10==0)
printf("\n");/* новая строка начинается
через каждые 10 простых чисел */
}
}
printf("Pa6oта завершена!\n");
}
Во внешнем цикле каждое число, начиная с 2 и кончая величиной limit, последовательно берется для проверки. Указанная проверка осуществляется во внутреннем цикле. В count хранится счетчик получаемых простых чисел. При печати каждое одиннадцатое простое число печатается с новой строки.
Операторы, определяющие циклические вычисления, которые мы рассмотрели, и условные операторы if, if-else и switch, являются важнейшими средствами управления выполнением программы на языке Си. Они должны использоваться для реализации общей структуры программы. Три оператора, рассматриваемые ниже, обычно рассматриваются реже, поскольку слишком частое их использование ухудшает читаемость программы, увеличивает вероятность ошибок и затрудняет ее модификацию. Никлаус Вирт дал определение структурного программирования, как программирования без goto.
Оператор break используется для выхода из оператора while, do, for, switch, непосредственно его содержащего. Управление передается на оператор, следующий за оператором, из которого осуществлен выход. Оператор break имеет форму
break;
Пример:
while((ch=getchar()) != EOF)
/* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */
{
if(ch=='\n')
break;
putchar(ch);
}
Работа цикла полностью прекращается, как только при вводе встречается символ "новая строка".
Оператор continue служит для пропуска оставшейся части выполняемой continue имеет следующую форму:
continue;
Пример:
while((ch=getchar()) != EOF)
/* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */
{
if(ch=='\n')
continue;
putchar(ch);
}
В версии с оператором continue просто пропускаются символы "новая строка", а выход из цикла происходит, только когда читается признак EOF.
Оператор goto предназначен для безусловной передачи управления к оператору с указанной меткой. Он имеет следующую форму:
goto метка;
Керниган и Ритчи считают оператор goto "чрезвычайно плохим" средством и предлагают применять его как можно реже или не применять совсем. Приведем пример записи оператора:
goto part1;
Чтобы этот оператор выполнялся правильно, необходимо наличие другого оператора, имеющего метку part1. В этом случае запись оператора начинается с метки, за которой следует двоеточие:
part1: printf("точка перехода\n");
| ! | Избегайте использовать goto! С тех пор как Дейкстра опубликовал свой знаменитый труд "Вредность оператора GOTO", специалисты бились над методами структурного программирования. Полное описание структурного программирования выходит за рамки этого курса лекций, однако отметим, что нужно очень осторожно использовать операторы: goto, break, continue, return. |
Если без операторов goto, break, continue, return никак не обойтись, то при использовании goto переходите вперед по коду, а не назад.
Оператор break лучше не использовать для преждевременного выхода из цикла, его полезно использовать внутри оператора switch.
Оператор continue нежелательно использовать для модификации логики циклов.
Почему нежелательно использовать функции со многими операторами return. Один из принципов структурного программирования состоит в том, что программа должна иметь одну точку входа и одну точку выхода. Функции со многими операторами return более сложны для чтения, чем те, которые имеют лишь один оператор return в конце тела функции.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.