пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Операторы break и continue. Оператор goto и метки.

Часто при вознекновении некоторого события удобно иметь возможность досрочно завершить цикл. Используемый для этой цели оператор break (разрыв) вызывает немедленный выход из циклов, организуемых с помощью операторов for, while, do-while, а также прекращение оператора switch. Приведенная ниже программа обеспечивает поиск в заданном иассиве элемента, равного (пример 4.9). В случае обнаружения такого элемента оператор break прекращает дальнейшее выполнение цикла. Так как параметр сохраняет значение после выхода из цикла, то дальнейший анализ его значения (if(i==n)) позволяет судить об удачном (i<=n)  илинеудачном (i==n) поиске. В случае вложенных циклов оператор break немедленно прекращает выполнение самого внутреннего из объемлющих его циклов.

  Пример 4.9

/*линейный поиск*/
#include <stdio.h>
int a[]={1,2,3,33,5,6,0,8};
int n=8;
main()
{
int i,g=33;
for(i=0;i<n;i++)
if(a[i]==g)
break;
if(i==n)
printf("%d
не найден\n",g);
else
printf("%d
на %d месте \n"g,i);
}

 

  На примере 5.0 приведена программа, которая ведет подсчет числа различных элементов в массиве. Каждый очередной элемент a[i] сравнивается с последующими элементами массива. Если он не совпадает ни с одним из этих элементов, в счетчик k добавляется еденица. В противном случае внутренний цикл прерывается оператором break и начинается новая итерация внешнего цикла.

         Пример 5.0

/*число разных элементов*/
#include <stdio.h>
main()
{
static a[]={7,3,7,4,3,6};
int i,j,m,k=1;m=6;
for(i=0;i<m-1;i++)
{
  for(j=i+1;j<m;j++)
if(a[i]==a[j])
break;
if(j==m)
k++;
}
printf("%d
разных элем. \n", k);
}

 

  Оператор continue тоже предназначен для прерывания циклического процесса, организуемого операторами for, while, do-while. Но в отличае от оператора break, он не прекращает дальнейшее выполнение цикла, а только немедленно переходит к следующей интерации того цикла, в теле которого он оказался. Он как бы имитирует безусловный переход на конечный оператор цикла, но не за ее пределы самого цикла. Программа на примере 5.1 использует оператор continue для пропуска отрицательных элементов массива, суммируя только положительные.

            Пример 5.1

#include <stdio.h>
main()
{
static int a[]={1,2,-3,4,-5,6};
int i,n,s;
n=6; s=0;
for(i=0; i<n; i++)
{
if(a[i]<=0)
continue; /*
пропуск 0*/
      s+=a[i];
     }
printf("
сумма = %d \n",s);
}

 
 

 

3.9. Оператор GOTO и метки

      В языке "C" предусмотрен и оператор GOTO, которым бесконечно злоупотребляют, и метки для ветвления. С формальной точки зрения оператор GOTO никогда не является необходимым, и на практике почти всегда можно обойтись без него. Мы не использовали GOTO в этой книге. 
      Тем не менее, мы укажем несколько ситуаций, где оператор GOTO может найти свое место. Наиболее характерным является его использование тогда, когда нужно прервать выполнение в некоторой глубоко вложенной структуре, например, выйти сразу из двух циклов. Здесь нельзя непосредственно использовать оператор BREAK, так как он прерывает только самый внутренний цикл. Поэтому: 

   FOR ( ... )

      FOR ( ... )    {

              ...

              IF (DISASTER)

       GOTO ERROR;

      }

   ...

 

 ERROR:

    CLEAN UP THE MESS

Если программа обработки ошибок нетривиальна и ошибки могут возникать в нескольких местах, то такая организация оказывается удобной. Метка имеет такую же форму, что и имя переменной, и за ней всегда следует двоеточие. Метка может быть приписана к любому оператору той же функции, в которой находится оператор GOTO
      В качестве другого примера рассмотрим задачу нахождения первого отрицательного элемента в двумерном массиве. (Многомерные массивы рассматриваются в главе 5). Вот одна из возможностей: 

   FOR (I = 0; I < N; I++)

      FOR (J = 0; J < M; J++)

              IF (V[I][J] < 0)

       GOTO FOUND;

      /* DIDN'T FIND */

   ...

 FOUND:

   /* FOUND ONE AT POSITION I, J */

   ...

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

 FOUND = 0;

 FOR (I = 0; I < N && !FOUND; I++)

    FOR (J = 0; J < M && !FOUND; J++)

            FOUND = V[I][J] < 0;

 IF (FOUND)

    /* IT WAS AT I-1, J-1 */

    ...

 ELSE

    /* NOT FOUND */

    ...

      Хотя мы не являемся в этом вопросе догматиками, нам все же кажется, что если и нужно использовать оператор GOTO, то весьма умеренно. 


27.12.2014; 11:21
хиты: 108
рейтинг:0
Точные науки
информатика
Языки программирования
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь