БИЛЕТ 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");
}