Контрольная 2 (с элементами тестирования).




 

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 чисел, по одному для каждой строки)? Выбери правильные варианты ответов: …

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: