Вторник, 21.05.2024, 12:04
Приветствую Вас, Гость

БИЛЕТ 17.

1) Операторы return, break, continue: выполнение, примеры использования

Оператор break. Синтаксис:     break;  

Оператор break прекращает выполнение вложенного оператора do, for, switch или while, в котором он появляется. Управление передается тому оператору, который непосредственно следует за прерванным оператором. Оператор break может появиться только в операторах do, for, switch или while.

Для вложенных операторов оператор break прекращает выполнение только оператора do, for, switch или while, в котором он появился. Для передачи управления из вложенной структуры можно использовать оператор return или goto.

Пример

В данном примере обрабатывается массив строк переменной длины, хранимый в lines. Оператор break вызывает выход из внутреннего цикла for после обнаружения ограничительного пустого символа (\0) в каждой строке и его позиция записывается в lengths[i]. Затем управление передается на внешний цикл for. Переменная i увеличивается и процесс продолжается до тех пор, пока i не станет больше или равна LENGTH.

                     for (i=0; i<LENGTH; i++) {  

                          for (j=0; j<WIDTH; j++) {  

                               if (lines[i][j]=='\0') {  

                                    lengths[i]=j;  

                                    break;  

                               }  

                          }   

                     }  

Оператор continue. Синтаксис:  continue;  

Оператор continue передает управление на следующую итерацию оператора do, for или while, в котором он появляется передавая все оставшиеся операторы тела оператора do, for или while. Следующая итерация оператора do, for или while понимается следующим образом:

В операторе do или while следующая итерация начинается вычислением выражения оператора do или while.

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

Пример

В данном примере тело оператора будет выполнено, если i больше 0. Сначала f(i) присваивается x, затем, если x=1, выполняется оператор continue. Остальные операторы тела игнорируются, и выполнение переходит в начало цикла на вычисление i-->0.

                     while (i-->0) {  

                          x=f(i);  

                          if (x==1)  

                               continue;  

                          y+=x*x;  

                     }  

Оператор return. Синтаксис: return [выражение]  

Оператор return прекращает выполнение функции, в которой он появляется и передает управление на вызов функции. Выполнение программы продолжается непосредственно с той точки, откуда был произведен вызов функции. Значение выражения, если оно есть, передается на вызов функции. Если выражение не задано, то возвращаемое функцией значение не определено.

По общему соглашению аргумент "выражение" оператора return заключается в скобки. Однако, для языка С присутствие этих скобок необязательно.

Если в определении функции отсутствует оператор return, то управление автоматически передается на вызов функции после выполнения последнего оператора вызванной функции. При этом не определено возвращаемое вызванной функцией значение. Если от функции не требуется возврат какого-либо значения, то функция объявляется с возвращаемым значением типа void.

Пример

В данном примере функция main вызывает две функции: sq и draw. Функция sq возвращает в функцию main значение x*x, где оно присваивается y. Функция draw не возвращает значение и объявлена типом void. Попытка присвоения возвращаемого функцией draw значения вызовет появление диагностического сообщения.

                 

   main()  

                     {  void draw(int,int);  

                          long sq(int);  

                          

                          y=sq(x);  

                          draw(x, y);  

                          }  

 

                     long sq(x)  

                     int x;  

                     {  return (x*x);  

                     }  

  

                     void draw(x,y)  

                     int x, y;  

                     {    

                          return;  }

 

2) Функции getc(), putc(c)

Самый простой механизм ввода заключается в чтении по одному символу за раз из "стандартного ввода", обычно с терминала пользователя, с помощью функции GETCHAR. Функция GETCHAR() при каждом к ней обращении возвращает следующий вводимый символ.

Функция GETCHAR возвращает значение EOF, когда она попадает на конец файла, какой бы ввод она при этом не считывала. Стандартная библиотека полагает символическую константу EOF равной -1 (посредством #DEFINE в файле STDIO.H), но проверки следует писать в терминах EOF, а не -1, чтобы избежать зависимости от конкретного значения.

Вывод можно осуществлять с помощью функции PUTCHAR(C), помещающей символ 'с' в "стандартный ввод", который по умолчанию является терминалом. Вывод, осуществляемый функцией PRINTF, также поступает в стандартный вывод, и обращения к PUTCHAR и PRINTF могут перемежаться.

Рассмотрим, например, программу LOWER, которая преобразует прописные буквы из своего ввода в строчные:

#INCLUDE <STDIO.H>

MAIN() /* CONVERT INPUT TO LOWER CASE */

\(

 INT C;

 WHILE ((C = GETCHAR()) != EOF)

    PUTCHAR(ISUPPER(C) ? TOLOWER(C) : C);

\)

"Функции" ISUPPER и TOLOWER на самом деле являются макросами, определенными в STDIO.H . Макрос ISUPPER проверяет, является ли его аргумент буквой из верхнего регистра, и возвращает ненулевое значение, если это так, и нуль в противном случае. Макрос TOLOWER преобразует букву из верхнего регистра в ту же букву нижнего регистра. Независимо от того, как эти функции реализованы на конкретной машине, их внешнее поведение совершенно одинаково, так что использующие их программы избавлены от знания символьного набора.

    Кроме того отметим, что в стандартной библиотеке ввода/вывода "функции" GETCHAR и PUTCHAR на самом деле могут быть макросами. Это позволяет избежать накладных расходов на обращение к функции для обработки каждого символа.


*************************************17 - 3

В массиве А содержится информация о принадлежности чисел 1..N (N<=10000) некоторому множеству S. Бит с номером i массива равен 1, если число i принадлежит множеству, и нулю в противном случае. Напишите функцию удаления числа k, введенного с клавиатуры,  из множества S.

 

char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

void del(char*k)

{

 int num;

 scanf("%d",&num);

 k[num/8]=k[num/8]&~mask[k%8];

}

 

*************************************17 - 4

В заданном двумерном массиве найти индекс строки, сумма элементов которой максимальна.

 

#include<conio.h>

#include<stdio.h>

const n=3;

const k=5;

int s[k][n]={{1,1,3},{1,2,1},{1,22,1},{1,1,1},{1,1,1}};

int i,j,m,max;

int sum[k];

int ind[k];

void main()

{

 clrscr();

 for (j=0;j<k;j++)

     {

      for (i=0;i<n;i++)

               sum[m] += s[j][i];

      m++;

     }

 max = 0;

 for (i=0;i<m;i++)

      if(sum[i] < sum[i+1])

             max = i+1;

 printf("%d",max);

 getch();

}