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

БИЛЕТ 18.

1) Операторы в С++. Блок. Пустой оператор

Оператор- это все, что заканчивается ;

Пустой оператор. Синтаксис:  ;  

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

Пустой оператор используется, когда нужно поместить метку в конце блока или когда тело цикла или ветка условного оператора пустые.

Пример  В данном примере выражение цикла line[i++]=0 в цикле for инициализирует первые 10 элементов line значением 0. Телом оператора является пустой оператор, т.к. не нужно никаких дополнительных операторов.

for (i=0; i<10; line[i++]=0)  

;  

Рекомендации по стилю: помещайте пустой оператор на отдельной строке, иначе при чтении программы и её анализе оператор можно не заметить.

 

2) Составной оператор или блок.

Синтаксис:    

{  

 [объявление]  

оператор  

 [оператор]  

}  

Составной оператор обычно появляется как тело другого оператора, например, оператора if. При выполнении составного оператора его операторы выполняются в том порядке, в котором они появляются, если не встретится оператор, который явно передает управление в другое место программы.

Пример  В данном примере, если i больше 0, то последовательно выполняются все операторы составного оператора.

if (i>0) {  

line[i]=x;  

x++;  

i--;  

}  

 

2) Ссылки. Использование ссылок при передаче параметров функциям

В языке С параметры функций передаются только по значению, если же в вызываемой функции требуется доступ к переменной из вызывающей функции, то в качестве параметра необходимо передавать адрес переменной, а параметр должен быть указателем. В С++ реализованы два метода передачи параметров: и по значению (как в С) и по адресу. В последнем случае соответствующий параметр функции должен быть объявлен как ссылка, для чего используется модификатор & действующий аналогично модификатору * при объявлении указателя. Объявление int & a читается как "a есть ссылка на int".

Пример

void swap ( int & x, int & y)

{ int z=y; y=x; x=z; }

main()

{ int a=3,b=5;

swap(a,b);

…}

Поскольку параметры функции swap объявлены как ссылки, при вызове функции изменятся значения переменных a и b в функции main.

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

float t=3, r=8;

swap(t,r);

не изменит значений переменных t и r, а будет эквивалентна следующему фрагменту

float t=3, r=8;

int temp1=t, temp2=r;

swap(temp1,temp2);

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

Struct s1 { // большая

// структура

};

void f(const s1 &par);

При попытке внутри функции f изменить какое-нибудь поле структуры s1 компилятор выдаст сообщение об ошибке.

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

int & ptintint (int &x)

{ printf ("\n%d",x);

return x;}

viod main()

{ int n=2,m=8;

printint(m)=n;}

Поскольку printint(m) возвращает ссылку на m, а присвоение значения ссылке эквивалентно присвоению значения тому объекту, на который она ссылается, то m будет иметь такое же значение, что и n.

Использование ссылки как возвращаемого значения особенно полезно при "конвейерных" вызовах f1(f2(f3(par))), когда каждая последующая функция должна обрабатывать сам объект, а не его копию.

Ссылочный тип можно использовать и для создания псевдонимов переменных. При объявлении переменной ссылочного типа обязательна инициализация объектом соответствующего типа. Использование переменной ссылочного типа дает такой же эффект, что и прямое использование переименованного объекта. Например int i;

int &i1=i;

i1=5; // то же что и i=5;

Если тип ссылки и тип переменной, на которую она ссылается различен, то создается анонимная переменная с указанным псевдонимом, которой после преобразования присваивается значение существующей переменной. Например

int r = 128;

char &t = r; // создается анонимная переменная типа char

// доступная с помощью ссылки t, значением

// этой переменной будет 128 преобразованное

// к типу char т.е. 0

t=10; // значение r не изменится


*************************************18 - 3

Найти наибольший общий делитель n натуральных чисел.


# include <stdio.h>

const n=5;

void main()

{ int del;

  int mas[n]={4,4,4,12,44};

  for (int i=1,min=mas[0];i<n;i++)

    if (min>mas[i]) { min=mas[i];}

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

    if (min%i==0)

      { int flag=1;

            for (int j=0;j<n;j++)

              if (mas[j]%i!=0) flag=0;

            if (flag) del=i;

      }

}


*************************************18 - 4

Проверить, является ли введенное с клавиатуры скобочное выражение  правильным.


#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

char text[100];

void main()

{

  clrscr();

  long ok, i, size;

  char c;

  char stack[60000];

  ok = 1;

  size=0;

  gets(text);

  int n = sizeof(text)/sizeof(char);

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

      {

                  if (text[i] == '(')

                          stack[size++] = '(';

                  if (text[i] == ')')

                  if (size == 0 || stack[--size] != '(')

                          ok = 0;

      }

  if (size)

      ok = 0;

  if (ok)

      printf("YES\n");

  else

      printf("NO\n");

 

}