1 .(Ссылочный тип). Чтобудетвыведено?
void fun1(int a, int&b, int&c)//1
// или void fun1(int a, int b, int&c) //2
// или void fun1(int&a, int&b, int c) //3
// ит.д.
{
int d;
a=…; b=…; c=…; d=…;
cout<<a%c<<" "<<(b / d)<<endl;
}
int main()
{
int u=…, v=…, w=…, z=…;
fun1(u,v,w);
cout<<u<<" "<<v<<" "<<(w + z)<<endl;
getch();
return 0;
}
В присваивании конкретные числа или выражения.
Ответ:
При a=1; b=2; c=3; d=4; u=5, v=6, w=7, z=8;
Объявление 1) 1_0 // символ “_” обозначает пробел
5_2_11
Объявление 2) 1_0
5_6_11
Объявление 3) 1_0
1_2_15
Пояснение: объявление в прототипе функции параметра с & обозначает, что изменяется сама переменная, а не ее копия (т.е. в 1-ая функция изменит переменные b иc). b/d–делятся как целые числа, потому при делении 5/4 получим 1.
2(Параметры по умолчанию). Пусть описана функция
void fun (inti, char c='*', float f=1.2)
{
cout<<endl<<i<<'\t'<<c<<'\t'<<f<<endl;
}
Какие из следующих вызовов допустимы? Что будет выведено для правильных вызовов? 1) fun(10, ‘A’); - верно.
Будет выведено(первая строчка пуста, запись второй строки):10____A____1.2
//“___” - табуляция, отступ
2) fun (10, 65); - верно.
Будет выведено(первая строчка пуста, запись второй строки):10____*____1.2
//“___” - табуляция, отступ, вместо “*” будет выведен символ с номером 65 в символьной таблице
3) if (fun(10, ‘A’, 2.2)) cout<<”+++”; elsecout<<”---“; - недопустимо,т.к. в скобках после ifдолжно стоять логическое выражение или логическая функция (функция, возвращающая trueили false)
3 (Перегрузкафункций). Будет ли компилироваться и выполняться следующая программа?
intSum (int, int); //1
float Sum (float, float); //2
int main() {int i1=…, i2=…; cout<<Sum(i1,i2)<<" "; //3
float f1=…, f2=…; cout<<Sum(f1,f2)<<" "; //4
getch(); return 0; }
int Sum (int x, int y) {return x%10 + y%10; } //5
float Sum (float x, float y) {return x>y?x:y;} //6
Варианты ответов:
1) Да. Будет выведено: с_с1_ (с – сумма остатков от деления x и y (входных параметров) на 10, с1 – большее из двух входных параметров, “_” - пробел)
2) Нет, так как …
3) Нет, так как ….
4) Нет, так как ….
5) Нет (указать другую причину).
4. (Как вызвать функцию типа void и функцию, отличную от типа void). Пусть описаны функции
4.1. void Test (int x, int y, int&r) { r=…; }
int Test2 (int x, int y, int& r) { r=выражение1; return выражение 2; }
Укажите номера строк, в которых правильные вызовы функций. Что будет выведено для правильных вызовов?
int main()
{
int R;
if (Test(12, 12, R)) cout<<" Yes "<<R; elsecout<<" No "<<R; //1 – ошибка
(в скобках после ifдолжно стоять логическое выражение или логическая функция (функция, возвращающая trueили false))
if (Test2(14, 12, R)) cout<<" Yes "<<R; elsecout<<" No "<<R; //2 – в зависимости от возвращаемого функцией значения: Yes – если Test2 вернет значение!=0, затемизмененную переменную R;илиNo–если Test2 вернет значение равное 0, затемизмененную переменную R.
Test2(4, 14, R); cout<<" "<<R<<" "; //3 – будет выведено измененное значение переменной Rв виде “_R_”;
Test(12, 12, R); R? cout<<" Yes ": cout<<" No "; cout<<R; //4 – функция изменит значение R, после сравним его с 0, если!=0то выведет " Yes ", в противном случае " No ".
int RES=0,x=12;RES=Test(x,12,3); RES?cout<<"Yes": cout<<"No"; cout<<R; //5 – ошибка: Test невернетзначениевприсваиванииRES=Test.
intRES=0,x=12; RES=Test2(x,12,3); RES?cout<<"Yes":cout<<"No";cout<<R; //6 –ошибка: ввызовеTest2(x,12,3) третийпараметрнеможетбытьконстантой, попытка вывода неинициализированной переменной R.
Test(12, 12, R); if (R) cout<<" Yes "<<R; elsecout<<" No "<<R; //7 - функцияизменит значение R, после сравним R с 0, если!=0то выведет "__Yes__R", в противном случае “__No__R ".
Test2(12,14,R); if (R) cout<<" Yes "<<R; elsecout<<" No "<<R; //8 - функцияизменит значение R, после сравним R с 0, если!=0то выведет "__Yes__R", в противном случае “__No__R ".
getch();
return 0;
}
4.2.
void Test (float x, float y, float r, int res) // или void Test (float x, float y, float r, int&res)
{
res= x*x+y*y<=r*r && (x<=0 && y<=0 || x>0 && y>0)?1:0;
cout<<res<<endl;
}
Какие из следующих вызовов синтаксически правильные. Что будет выведено? (в качестве параметров конкретные числа)
1) intRES; cout<<Test(…, …, …, RES)<<endl; - ошибка: Test не возвращает значений
2) int RES=0; float x=…; Test(x, …, …., RES); if (RES) cout<<"Yes"; else cout<<"No"; - верно. Сначала будет выведено 1 или 0 в зависимости от входных параметров, затем “No” (дляvoidTest (floatx, floaty, floatr, int&res)RESизмениться внутри функции (либо 0 либо 1) и если Res!=0, то будет выведено "Yes", иначе "No")
3) cout<<endl; if (Test(…, …, …,…)) cout<<"Yes"; elsecout<<"No"; - ошибка: Testневозвращаетзначений (ожидается логическое выражение)
5. (Понятие указателя (см.[3]). Пусть intt=10; int*p=&t;
Какие из следующих операторов допустимы и что они означают:
1) cout<<p; - вывод на экран адреса переменной t
2) p=1000; - ошибка
3) *p=1000; - изменение значения переменной, хранимой по адресу p
4) t=5; t*=*p; - изменение значения переменной t (аналогично t*=t, т.е. t=t*t=25)
5) cout<<(*p); -вывод значения переменной, хранимой по адресу p (т.е. переменной t)
6. (Указатели и массивы(см.[3].).
Пусть const n=10; int a[n]={-1, -2, 33, 44, -5, -6, 77, 8}; int *q;
Какие из следующих присваиваний допустимы и что они означают:
1) q=a; - допустимо, сохранение в qадреса начала массива
2) q=*a[0]; - ошибка
3) q=n; - ошибка
4) q=&a[0]; - допустимо, сохранение в qадреса начала массива
5) inti=5; q=&a[i]; - допустимо, сохранение в qадреса 5-го элемента массива
6) inti=2; q=a[i]; - ошибка
7) q=a[0]; - ошибка
8) inti=9; q=a[i]; - ошибка
7. (Передача массивов в функцию(см. [1],[2],[3]).
7.1. Данкод: void Fun (int *x, int N, int&S)
{ S=0; for (inti=0;;) { S+=x[i++]; if (x[i]==0 || i ==N) return; } }
/* или
void Fun (int *x, int N, int&S)
{ S=0; for (inti=0; i<N-1;) if (x[++i]>0) S+=x[i]; } */
intmain() { constn=10; inta[n]= {…}; // конкретный числовой массив в { }
int&Sum0; Fun (a,n,Sum0); cout<<endl<<Sum0; //1 – &Sum0 – не инициализированная ссылка
intSum; Fun (&a[0],n/2,Sum); cout<<endl<<Sum; //2 – выводсуммыN/2элементов (если раньше не встретиться 0, если 0 до N/2элемента встретился, то выводиться сумма элементов до 0)
intSum; Fun (a,n,Sum); cout<<endl<<Sum; //3 – выводсуммыэлементовNэлементов (если раньше не встретиться 0, если 0 до Nэлемента встретился, то выводиться сумма элементов до 0)
intSum2; Fun (&a[5], 5, Sum2); cout<<endl<<Sum2; //4 - выводсуммыэлементов5элементовначиная с a[5] (если раньше не встретиться 0, если 0 до a[10]элемента встретился, то выводиться сумма элементов до 0)
int *Sum; Fun (a,n,Sum);cout<<endl<<Sum; //5 –ошибка,попыткаприсвоитьуказателю (int*),т.е. адресу, значениечисловойпеременнойтипаint
int *q=a[5], Sum=0; Fun(q, n/2, Sum); cout<<endl<<Sum; //6 - попыткаприсвоитьуказателю (int*),т.е. адресу, значениечисловойпеременнойтипаint
int *q=a[n/2], Sum=0; Fun(q, 5, Sum);cout<<endl<<Sum; //7 - ошибка, попыткаприсвоитьуказателю(int*),т.е. адресу, значениечисловойпеременнойтипаint
int *q=&a[n/2], Sum=0; Fun(q, 5, Sum); cout<<endl<<Sum; //8 - выводсуммы5 элементовначиная с a[n/2] (если раньше не встретиться 0, если 0 до a[10]элемента встретился, то выводиться сумма элементов до 0)
int *q=*a[n/2], Sum=0; Fun(q, 5, Sum); cout<<endl<<Sum; //9–ошибкапри инициализации *q
getch(); return 0; }
В каких строках правильно вызвана функция? Что будет выведено для правильных вариантов?
7.2. Описанафункция:
voidOutChar (int *a, int N, int k)
{ cout<<endl; for (inti=0; i<N; i++) printf("%d %c %c", a[i], a[i], (i+1)%k? '\n': ' '); }
// или { cout<<endl; for (inti=0; i<N; i++) printf("%d %c %c", a[i], a[i], (i+1)%k? ' ': '\n'); }
//Какие из следующих вызовов правильные и что будет выведено?
main(){ const n=10; int k=5; int a[n]= {48, 49,50,51, 52, 53, 54, 55, 56, 57};
OutChar (a,n,k); - вывод nчисел из массива a,где числа и соответствующего ему в таблице символа (все на новых строчках, кроме элементов на позициях i, где (i+1)%k =0
OutChar(a, k, n); - вывод kчисел из массива a,где числа и соответствующего ему в таблице символа (все на новых строчках, кроме элементов на позициях i, где (i+1)%n =0
OutChar(&a[0], k,k/2); -вывод kчисел из массива a,где числа и соответствующего ему в таблице символа (все на новых строчках, кроме элементов на позициях i, где (i+1)%(k/2) =0
OutChar(&a[k], k,k/2); - вывод kчисел из массива aначиная с элемента в kпозиции,где числа и соответствующего ему в таблице символа (все на новых строчках, кроме элементов на позициях i, где (i+1)%(k/2) =0
OutChar(a[0], k, n); - ошибка
OutChar (a,2*k,k); - вывод 2*kчисел из массива a, где числа и соответствующего ему в таблице символа (все на новых строчках, кроме элементов на позициях i, где (i+1)%k =0
OutChar(a[0], n, k); - ошибка
OutChar(*a[0], n, k); - ошибка
getch(); }
8. (Глобальные переменные) Дан код: voidfun1(…);
int a;
void main() { … }
void fun1 (…) { … }
Можно ли переменную a использовать без дополнительного объявления внутри функции main? … внутри функции fun1, если она внешняя? (Ответ: да)
…внутри функции fun1, если она встроенная?(Ответ: да)
Эти же вопросы, если переменная а объявлена внутри main.
внутри функции fun1, если она внешняя? (Ответ: нет)
…внутри функции fun1, если она встроенная? (Ответ: да)
Что получится, если переменная а объявлена дважды: и в main, и в fun1
В fun1 будет использоваться свое значение а (объявленное в функции).
9. (Матрицы, функции и указатели(см. [3]).
9. 1.Что будет выведено в результате выполнения следующей программы?
const size2=6;
void Sort1(int X[],int n);
voidMyOut(int M[][size2],intn,int m)
{ cout<<endl; for(inti=0;i<n;i++){cout<<endl;
for(int j=0;j<m;j++) printf("%4d ",M[i][j]);
} cout<<endl;
}
void Sortmatr1(int M[][size2],intn,int m);
int main() {const n=3,m=6; int A[n][size2]={ …
};
Sortmatr1(A, n, m); cout<<endl; MyOut (A, n, m);
getch(); return 0;
}
void Sort1(int X[], int m)
{ int min, Nmin; for(int k=0;k<m-1;k++)
{ min=X[k]; Nmin=k;
for (int j=k;j<m;j++)
if(X[j]<min) { min=X[j]; Nmin=j; }
X[Nmin]=X[k]; X[k]=min;
}
}
void Sortmatr1(int M[][size2],intn,int m)
{ for(inti=0;i<n;i++) Sort1(M[i],m);
}
Ответ: все строки в массиве будут отсортированы
9.2. В каких строках есть ошибки? Если ошибок нет, что будет выведено?
const size2=6; int Sum(int *X, int); //1
void Sum2(int M[][size2],int,int, int&, int&); //2
voidMyOut(int *x, int n) //3
{cout<<endl; for(inti=0;i<n;i++)
printf("%5d%c", x[i], (i+1)%size2?' ':'\n'); } //4
int main()
{const n=4,m=6; int A[n][size2]={ {4, -3, 2, 0, 5}, {-11, 2, 3},
{5, -6, 4}, {-2, 4, 3, -2,1, 5} }, S1, S2;
MyOut (A[0],n*m); //5
Sum2(A,n,m,S1, S2); cout<<endl<<S1<<" "<< S2; //6
getch(); return 0; }
int Sum(int X[],int m) //7
{ int S=0; for(int j=0; j<m; j++) if (X[j]>0) S+=X[j]; return S; }
void Sum2 (int M[][size2],intn,int m, int&S1, int&S2) //8
{ S1= Sum(M[0],n*m/2); //9
S2=Sum(&M[2][0], n*m/2); } //10
Ответ: ошибок нет. Программы выведет сумму положительных (n*m)/2 элементов массива начиная с первого (M[0][0]) и отдельносумму положительных (n*m)/2 элементов массива начиная с M[2][0])
9.3. Пусть описана функция:
intMyFun (int *x, intn)
{ по некоторому алгоритму для одномерного массива x размерности n получаем и возвращаем одно целое число
}
A).Как её использовать для получения и (или) вывода этого же параметра всей матрицы (одного целого числа), объявленной так:
const n=4,m=6; int A[n][m];? Выбери правильные варианты ответов:
1) cout<<MyFun (&A[0], n*m); - неверно
2) int Res; Res=MyFun (&A[0][0], n); cout<<Res; - верно
3) int Res; Res=MyFun (A[0], m); cout<<Res;- неверно
4) int Res; Res=MyFun (A[0], m*n); cout<<Res; - неверно
5) cout<<MyFun (&A[0][0], n*m); - верно
6) cout<<MyFun (A[0][0], n*m); -не верно
7) intRes=MyMax(&A[0][0], n*m); cout<<Res; - в зависимости от Функции MyMax (возвращает она значение или нет)
B). Как эту же функцию без изменений использовать для получения и (или) вывода этого же параметра в каждой строке матрицы (т.е для получения и (или) вывода n чисел, по одному для каждой строки)? Выбери правильные варианты ответов: …