игра брюс 2048
Главная / Программирование / Программирование на языке C в Microsoft Visual Studio 2010 / Тест 18

Программирование на языке C в Microsoft Visual Studio 2010 - тест 18

Упражнение 1:
Номер 1
Какая рекурсия называется прямой?

Ответ:

 (1) рекурсия, при которой две функции вызывают друг друга 

 (2) рекурсия, при которой более двух функций вызывают друг друга 

 (3) рекурсия, при которой функция вызывает сама себя 


Номер 2
Какие утверждения являются верными?

Ответ:

 (1) при прямой рекурсии функция вызывает сама себя 

 (2) при прямой рекурсии две и более функций вызывают друг друга 

 (3) при косвенной рекурсии функция вызывает сама себя 

 (4) при косвенной рекурсии две и более функций вызывают друг друга 


Номер 3
Какие утверждения являются неверными?

Ответ:

 (1) при прямой рекурсии функция вызывает сама себя 

 (2) при прямой рекурсии две и более функций вызывают друг друга 

 (3) при косвенной рекурсии функция вызывает сама себя 

 (4) при косвенной рекурсии две и более функций вызывают друг друга 


Упражнение 2:
Номер 1
Какое достоинство имеет использование рекурсии?

Ответ:

 (1) компактность записи функции 

 (2) отсутствие возможности переполнения стека 

 (3) уменьшение использумой памяти 


Номер 2
Какие достоинства имеет использование рекурсии?

Ответ:

 (1) слишком объемная запись функции 

 (2) возможность переполнения стека 

 (3) увеличение использумой памяти 


Номер 3
Какие утверждения являются верными?

Ответ:

 (1) при использовании рекурсии увеличивается расход памяти на повторные вызовы функции и передачу ей копий параметров 

 (2) при использовании рекурсии полностью отсутствует вероятность переполнения стека 

 (3) при использовании рекурсии функция записывается более компактно 


Упражнение 3:
Номер 1
В каком случае вычисление факториала выполняется с помощью рекурсивной функции?

Ответ:

 (1) long fact(long n) { if (n==0 || n==1) return 1; return (n * fact(n-1)); }  

 (2) long fact(long n) { int i; long m = 1; if (n==0 || n==1) m = 1; else for (i=1; i<=n; i++) m *= i; return m; }  

 (3) long fact(long n) { if (n==0 || n==1) return 1; return (n>1) ? n * fact(n-1) : 1; }  


Номер 2
В каком случае для вычисления факториала не используется рекурсия?

Ответ:

 (1) long fact(long n) { if (n==0 || n==1) return 1; return (n * fact(n-1)); }  

 (2) long fact(long n) { int i; long m = 1; if (n==0 || n==1) m = 1; else for (i=1; i<=n; i++) m *= i; return m; }  

 (3) long fact(long n) { return (n>1) ? n * fact(n-1) : 1; }  


Номер 3
Задана функция вычисления факториала:
		
long fact(long n) 
{
	if (n==0 || n==1) return 1;
	return (n * fact(n-1));
}

Какое утверждение является верным?
		

Ответ:

 (1) в функции используется прямая рекурсия 

 (2) в функции используется косвенная рекурсия 

 (3) в функции не используется рекурсия 


Упражнение 4:
Номер 1
Задана функция вычисления факториала:
		
long fact(long n) 
{
	return (n>1) ? n * fact(n-1) : 1;
}

Когда завершится рекурсивный процесс?
		

Ответ:

 (1) когда значение переменной n будет равно 0 

 (2) когда значение переменной n будет равно 1 

 (3) когда значение переменной n будет больше 1 


Номер 2
Задана функция вычисления факториала:
		
long fact(long n) 
{
	return (n>1) ? n * fact(n-1) : 1;
}

При каком значении завершится рекурсивный процесс?
		

Ответ:

 (1)

 (2)

 (3)


Номер 3
Задана функция вычисления факториала:
		
long fact(long n) 
{
	return (n>1) ? n * fact(n-1) : 1;
}

Какое утверждение является неверным?

Ответ:

 (1) рекурсия завершится при любом значении n больше 1 

 (2) рекурсия завершится при любом значении n, равном 1 

 (3) рекурсия завершится при любом значении n, равном 0 


Упражнение 5:
Номер 1
Что такое глубина рекурсии?

Ответ:

 (1) условие, которое будет удовлетворено и при котором функция выполняет свою задачу без рекурсивных вызовов 

 (2) число рекурсивных вызовов в каждый конкретный момент времени 

 (3) максимальное число рекурсивных вызовов без возвратов, которое происходит во время выполнения программы 


Номер 2
Что такое текущий уровень рекурсии?

Ответ:

 (1) условие, которое будет удовлетворено и при котором функция выполняет свою задачу без рекурсивных вызовов 

 (2) число рекурсивных вызовов в каждый конкретный момент времени 

 (3) максимальное число рекурсивных вызовов без возвратов, которое происходит во время выполнения программы 


Номер 3
Что такое базовый уровень рекурсии?

Ответ:

 (1) условие, которое будет удовлетворено и при котором функция выполняет свою задачу без рекурсивных вызовов 

 (2) число рекурсивных вызовов в каждый конкретный момент времени 

 (3) максимальное число рекурсивных вызовов без возвратов, которое происходит во время выполнения программы 


Упражнение 6:
Номер 1
В какой программе используется косвенная рекурсия?

Ответ:

 (1) void dec2bin(unsigned long int); int main (void) { unsigned long int n; setlocale(LC_ALL, "Russian"); printf("\n\t Введите целое десятичное число\n (или не числовой символ для завершения программы): "); while (scanf_s("%ul", &n) == 1) { printf("\n Двоичный эквивалент: "); dec2bin(n); printf("\n\n\t Введите целое десятичное число\n (или не числовой символ для завершения программы): "); } return 0; } void dec2bin(unsigned long int n) { int r; r = n % 2; if (n >= 2 ) dec2bin(n/2); printf("%d", r); return; }  

 (2) int gcd(int a, int b); int main (void) { int a = 0, b = 0; int in; do { printf("\n Enter the two different natural numbers, through the gap: "); in = scanf_s("%d%d", &a, &b); if (in != 2) exit(1); if ( (a != b) && (b != 0) ) break; if (b == 0) a = b; } while ( (a == b) ); printf("\n a = %d, b = %d, GCD = %d; \n", a, b, gcd(a,b)); return 0; } int gcd(int a, int b) { if ( (a % b) == 0) return b; else return gcd(b, a % b); }  

 (3) void fillOnly(int); void free_n(int); void fill_n(int); int main (void) { int n = 1; int in = 1; printf("\n Enter a length of string (naturel number): "); in = scanf_s("%i", &n); if (in != 1 || n < 1 || n > 15) { printf("\n Error input. Press any key to exit: "); _getch(); exit(0); } puts("\n\tResult:"); fill_n(n); printf("\n\n Press any key to exit: "); _getch(); return 0; } void fillOnly(int n) { if (n == 1) printf("\t%+3d\n", 1); else { fillOnly(n-1); printf("\t%+3d\n", n); free_n(n-1); } } void free_n(int n) { if (n == 1) printf("\t%+3d\n", -1); else { fillOnly(n-1); printf("\t%+3d\n", -n); free_n(n-1); } } void fill_n(int n) { if (n == 1) printf("\t%+3d\n", 1); else { if (n == 2) printf("\t%+3d\n\t%+3d\n", 1, 2); else { fillOnly(n-1); printf("\t%+3d\n", n); fill_n(n-2); } } }  


Номер 2
В какой программе используется прямая рекурсия?

Ответ:

 (1) void dec2bin(unsigned long int); int main (void) { unsigned long int n; setlocale(LC_ALL, "Russian"); printf("\n\t Введите целое десятичное число\n (или не числовой символ для завершения программы): "); while (scanf_s("%ul", &n) == 1) { printf("\n Двоичный эквивалент: "); dec2bin(n); printf("\n\n\t Введите целое десятичное число\n (или не числовой символ для завершения программы): "); } return 0; } void dec2bin(unsigned long int n) { int r; r = n % 2; if (n >= 2 ) dec2bin(n/2); printf("%d", r); return; }  

 (2) int gcd(int a, int b); int main (void) { int a = 0, b = 0; int in; do { printf("\n Enter the two different natural numbers, through the gap: "); in = scanf_s("%d%d", &a, &b); if (in != 2) exit(1); if ( (a != b) && (b != 0) ) break; if (b == 0) a = b; } while ( (a == b) ); printf("\n a = %d, b = %d, GCD = %d; \n", a, b, gcd(a,b)); return 0; } int gcd(int a, int b) { if ( (a % b) == 0) return b; else return gcd(b, a % b); }  

 (3) void fillOnly(int); void free_n(int); void fill_n(int); int main (void) { int n = 1; int in = 1; printf("\n Enter a length of string (naturel number): "); in = scanf_s("%i", &n); if (in != 1 || n < 1 || n > 15) { printf("\n Error input. Press any key to exit: "); _getch(); exit(0); } puts("\n\tResult:"); fill_n(n); printf("\n\n Press any key to exit: "); _getch(); return 0; } void fillOnly(int n) { if (n == 1) printf("\t%+3d\n", 1); else { fillOnly(n-1); printf("\t%+3d\n", n); free_n(n-1); } } void free_n(int n) { if (n == 1) printf("\t%+3d\n", -1); else { fillOnly(n-1); printf("\t%+3d\n", -n); free_n(n-1); } } void fill_n(int n) { if (n == 1) printf("\t%+3d\n", 1); else { if (n == 2) printf("\t%+3d\n\t%+3d\n", 1, 2); else { fillOnly(n-1); printf("\t%+3d\n", n); fill_n(n-2); } } }  


Номер 3
Какие утверждения являются верными для приведенной программы?

void fillOnly(int);
void free_n(int);
void fill_n(int);

int main (void)
 {
	int n = 1; 
	int in = 1; 

	printf("\n Enter a length of string (naturel number): ");
	in = scanf_s("%i", &n);

	if (in != 1 || n < 1 || n > 15)
     {
		printf("\n Error input. Press any key to exit: ");
		_getch();
		exit(0);
	}
	puts("\n\tResult:");

	fill_n(n);

	printf("\n\n Press any key to exit: ");
	_getch();
	return 0;
}

void fillOnly(int n) {
	if (n == 1)
		printf("\t%+3d\n", 1);
	else {
		fillOnly(n-1);
		printf("\t%+3d\n", n);
		free_n(n-1);
	}
}

void free_n(int n)
 {
	if (n == 1)
		printf("\t%+3d\n", -1);
	else {
		fillOnly(n-1);
		printf("\t%+3d\n", -n);
		free_n(n-1);
	}
}

void fill_n(int n)
 {
	if (n == 1)
		printf("\t%+3d\n", 1);
	else {
		if (n == 2)
			printf("\t%+3d\n\t%+3d\n", 1, 2);
		else {
			fillOnly(n-1);
			printf("\t%+3d\n", n);
			fill_n(n-2);
		}
	}
}
		
		

Ответ:

 (1) в программе определено 3 рекурсивных функции 

 (2) в программе определено 4 рекурсивных функции 

 (3) в каждой пользовательской функции используются прямая и косвенная рекурсия 


Упражнение 7:
Номер 1
Необходимо решить задачу поиска пути между двумя городами. Карта дорог представлена в виде графа: filesПроцесс поиска представлен как последовательность шагов. На каждом шаге с использованием некоторого критерия выбирается точка, в котороую можно попасть из текущей. Если очередная выбранная точка совпала с заданной конечной точкой, то маршрут найден. Если не совпала - выполняется еще один шаг. Поскольку текущая точка может быть соединена с несколькими другими, то сначала выбирается точка с наименьшим номером. Для решения задачи задана программа (для появснения в программе приведены комментарии):

#define N 8

void step(int, int, int);

	int map[N][N];	// карта: map[i,j]!=0, если точки i и j соединены
	int road[N];	// маршрут - номера точек карты
	int incl[N];	// incl[i]==1, если точка с номером i включена в road
	int start;	// начальная точка маршрута 
	int finish;	// конечная точка маршрута
	int i, j;

int main (void) {

	// инициализация массивов
	for (i=1; i<=N; i++) road[i] = 0;
	for (i=1; i<=N; i++) incl[i] = 0;
	for (i=1; i<=N; i++) 
		for (j=1; j<=N; j++) map[i][j] = 0;

	// ввод значений элементов карты
	map[1][2] = 1; map[2][1] = 1; 
	map[1][3] = 1; map[3][1] = 1;
	map[1][4] = 1; map[4][1] = 1;
	map[3][4] = 1; map[4][3] = 1;
	map[3][7] = 1; map[7][3] = 1;
	map[4][6] = 1; map[6][4] = 1;
	map[5][6] = 1; map[6][5] = 1;
	map[5][7] = 1; map[7][5] = 1;
	map[6][7] = 1; map[7][6] = 1;

	printf("Введите через пробел номер начальной и конечной точек: ");
	scanf("%d %d", &start, &finish);
	road[1] = start;	// внести точку в маршрут
	incl[1] = 1;		// пометить точку как включенную

	step(start, finish, 2);
	return 0;
}

void step(int s, int f, int p) {
	int c;				// номер точки, в которую делается очередной шаг
	int i;
	
	if (s==f) {
		printf("Путь: ");
		for (i=1; i<=p-1; i++) printf("%d ", road[i]);
		printf("\n");
	}
	else {
		// выбор очередной точки
		for (c=1; c<=N; c++)
			// проверка всех вершин
			if (map[s][c]!=0 && incl[c]==0) {
				// точка соединена с текущей и не включена в маршрут
				<Рекурсивный вызов - вариант 1>
				road[p] = c;		// добавление вершины в путь
				incl[c] = 1;		// пометка вершины как включенной
				<Рекурсивный вызов - вариант 2>
				incl[c] = 0;
				road[p] = 0;
				<Рекурсивный вызов - вариант 3>
			}
	}
}

В каком из отмеченных мест программы необходимо выполнить рекурсивный вызов функции step(c, f, p+1);?
		

Ответ:

 (1) в строке Рекурсивный вызов - вариант 1 

 (2) в строке Рекурсивный вызов - вариант 2 

 (3) в строке Рекурсивный вызов - вариант 3 


Номер 2
Необходимо решить задачу поиска пути между двумя городами. Карта дорог представлена в виде графа: filesПроцесс поиска представлен как последовательность шагов. На каждом шаге с использованием некоторого критерия выбирается точка, в котороую можно попасть из текущей. Если очередная выбранная точка совпала с заданной конечной точкой, то маршрут найден. Если не совпала - выполняется еще один шаг. Поскольку текущая точка может быть соединена с несколькими другими, то сначала выбирается точка с наименьшим номером. Определите, выполняет ли приведенная программа поставленную задачу (для появснения в программе приведены комментарии):

#define N 7

void step(int, int, int);

	int map[N][N];	// карта: map[i,j]!=0, если точки i и j соединены
	int road[N];	// маршрут - номера точек карты
	int incl[N];	// incl[i]==1, если точка с номером i включена в road
	int start;	// начальная точка маршрута 
	int finish;	// конечная точка маршрута
	int i, j;

int main (void) {
	// инициализация массивов
	for (i=0; i<N; i++) road[i] = 0;
	for (i=0; i<N; i++) incl[i] = 0;
	for (i=0; i<N; i++) 
		for (j=0; j<N; j++) map[i][j] = 0;

	// ввод значений элементов карты
	map[0][1] = 1; map[1][0] = 1; 
	map[0][2] = 1; map[2][0] = 1;
	map[0][3] = 1; map[3][0] = 1;
	map[2][3] = 1; map[3][2] = 1;
	map[2][6] = 1; map[6][2] = 1;
	map[3][5] = 1; map[5][3] = 1;
	map[4][5] = 1; map[5][4] = 1;
	map[4][6] = 1; map[6][4] = 1;
	map[5][6] = 1; map[6][5] = 1;

	printf("Введите через пробел номер начальной и конечной точек: ");
	scanf("%d %d", &start, &finish);
	road[0] = start;	// внести точку в маршрут
	incl[0] = 1;		// пометить точку как включенную

	step(start, finish, 2);
	return 0;
}

void step(int s, int f, int p) {
	int c;				// номер точки, в которую делается очередной шаг
	int i;
	
	if (s==f) {
		printf("Путь: ");
		for (i=0; i<p-1; i++) printf("%d ", road[i]);
		printf("\n");
	}
	else {
		// выбор очередной точки
		for (c=0; c<N; c++)
			// проверка всех вершин
			if (map[s][c]!=0 && incl[c]==0) {
				// точка соединена с текущей и не включена в маршрут
				road[p] = c;		// добавление вершины в путь
				incl[c] = 1;		// пометка вершины как включенной
				step(c, f, p+1);
				incl[c] = 0;
				road[p] = 0;
			}
	}
}


Ответ:

 (1) программа не выполняет поставленную задачу, так как в ней используется неверная индексация массива 

 (2) программа не выполняет поставленную задачу, так как неверно задана рекурсивная функция 

 (3) программа выполняет поставленную задачу 


Номер 3
Необходимо решить задачу поиска пути между двумя городами. Карта дорог представлена в виде графа: filesПроцесс поиска представлен как последовательность шагов. На каждом шаге с использованием некоторого критерия выбирается точка, в котороую можно попасть из текущей. Если очередная выбранная точка совпала с заданной конечной точкой, то маршрут найден. Если не совпала - выполняется еще один шаг. Поскольку текущая точка может быть соединена с несколькими другими, то сначала выбирается точка с наименьшим номером. Для решения данной задачи задана программа (для появснения в программе приведены комментарии):

#define N 8

void step(int, int, int);

	int map[N][N];	// карта: map[i,j]!=0, если точки i и j соединены
	int road[N];	// маршрут - номера точек карты
	int incl[N];	// incl[i]==1, если точка с номером i включена в road
	int start;	// начальная точка маршрута 
	int finish;	// конечная точка маршрута
	int i, j;

int main (void) {
	// инициализация массивов
	for (i=0; i<N; i++) road[i] = 0;
	for (i=0; i<N; i++) incl[i] = 0;
	for (i=0; i<N; i++) 
		for (j=0; j<N; j++) map[i][j] = 0;

	// ввод значений элементов карты
	map[1][2] = 1; map[2][1] = 1; 
	map[1][3] = 1; map[3][1] = 1;
	map[1][4] = 1; map[4][1] = 1;
	map[3][4] = 1; map[4][3] = 1;
	map[3][7] = 1; map[7][3] = 1;
	map[4][6] = 1; map[6][4] = 1;
	map[5][6] = 1; map[6][5] = 1;
	map[5][7] = 1; map[7][5] = 1;
	map[6][7] = 1; map[7][6] = 1;

	printf("Введите через пробел номер начальной и конечной точек: ");
	scanf("%d %d", &start, &finish);
	road[1] = start;	// внести точку в маршрут
	incl[1] = 1;		// пометить точку как включенную

	step(start, finish, 2);
	return 0;
}

void step(int s, int f, int p) {
	int c;				// номер точки, в которую делается очередной шаг
	int i;
	
	if (s==f) {
		printf("Путь: ");
		for (i=1; i<=p-1; i++) printf("%d ", road[i]);
		printf("\n");
	}
	else {
		// выбор очередной точки
		for (c=1; c<=N; c++)
			// проверка всех вершин
			if (map[s][c]!=0 && incl[c]==0) {
				// точка соединена с текущей и не включена в маршрут
				road[p] = c;		// добавление вершины в путь
				incl[c] = 1;		// пометка вершины как включенной
				step(c, f, p+1);
				incl[c] = 0;
				road[p] = 0;
			}
	}
}

Какие утверждения являются неверными для приведенной программы?

Ответ:

 (1) программа не выполняет поставленную задачу, так как в ней используется неверная индексация массива 

 (2) программа не выполняет поставленную задачу, так как неверно задана рекурсивная функция 

 (3) программа выполняет поставленную задачу 


Упражнение 8:
Номер 1
Необходимо написать программу, которая будет определять, является ли заданная строка палиндромом (палиндром - это слово, которое читается одинаково слева направо и справа налево). Решение данной задачи основывается на просмотре строки одновременно слева направо и справа налево и сравнении соответствующих символов. Если в какой-то момент символы не совпадают, делается вывод о том, что строка не является палиндромом, если же удается достичь середины строки и при этом все соответствующие символы совпали, то строка является палиндромом. Какая программа выполняет поставленную задачу?

Ответ:

 (1) char s[100]; int pal(char s[100]); int main() { printf("\nВведите строку: "); gets(s); if (pal(s)) printf("Строка является палиндромом"); else printf("Строка не является палиндромом"); return 0; } int pal(char s[100]) { int l; char s1[100]; l=s[0]==s[strlen(s)-1]; strncpy(s1, s+1, strlen(s)-2); s1[strlen(s)-2]='\0'; return l&&pal(s1); }  

 (2) char s[100]; int pal(char s[100]); int main() { printf("\nВведите строку: "); gets(s); if (pal(s)) printf("Строка является палиндромом"); else printf("Строка не является палиндромом"); return 0; } int pal(char s[100]) { int l; char s1[100]; if (strlen(s)<1) return 1; else { l=s[0]==s[strlen(s)-1]; strncpy(s1, s+1, strlen(s)-2); s1[strlen(s)-2]='\0'; return l&&pal(s1); } }  

 (3) char s[100]; int pal(char s[100]); int main() { printf("\nВведите строку: "); gets(s); if (pal(s)) printf("Строка является палиндромом"); else printf("Строка не является палиндромом"); return 0; } int pal(char s[100]) { int l; char s1[100]; if (strlen(s)"=1) return 1; else { l=s[0]==s[strlen(s)-1]; strncpy(s1, s+1, strlen(s)-2); s1[strlen(s)-2]='\0'; return l&&pal(s1); } }  


Номер 2
Приведенная программа должна определять, является ли заданная строка палиндромом (палиндром - это слово, которое читается одинаково слева направо и справа налево). В программе выполняется просмотр строки одновременно слева направо и справа налево и сравнение соответствующих символов. Если в какой-то момент символы не совпадают, делается вывод о том, что строка не является палиндромом, если же удается достичь середины строки и при этом все соответствующие символы совпали, то строка является палиндромом:

char s[100];
int pal(char s[100]);

int main()
{ 
	printf("\nВведите строку: "); 
	gets(s);
	if (pal(s)) printf("Строка является палиндромом");
	else  printf("Строка не является палиндромом");
	return 0;
}

int pal(char s[100])
{ 
	int l; char s1[100];
	
	if (strlen(s) = 1) return 1;
	else {
		l=s[0]==s[strlen(s)-1];
		strncpy(s1, s+1, strlen(s)-2);
		s1[strlen(s)-2]='\0';
		return l&&pal(s1);
	}
}
	
Выполняет ли программа поставленную задачу?		
		

Ответ:

 (1) не выполняет, так как неверно задано условие окончания рекурсии 

 (2) не выполняет, так как содержит ошибку в операторе l=s[0]==s[strlen(s)-1]; 

 (3) выполняет 


Номер 3
Приведенная программа должна определять, является ли заданная строка палиндромом (палиндром - это слово, которое читается одинаково слева направо и справа налево). В программе выполняется просмотр строки одновременно слева направо и справа налево и сравнение соответствующих символов. Если в какой-то момент символы не совпадают, делается вывод о том, что строка не является палиндромом, если же удается достичь середины строки и при этом все соответствующие символы совпали, то строка является палиндромом:

char s[100];
int pal(char s[100]);

int main()
{ 
	printf("\nВведите строку: "); 
	gets(s);
	if (pal(s)) printf("Строка является палиндромом");
	else  printf("Строка не является палиндромом");
	return 0;
}

int pal(char s[100])
{ 
	int l; char s1[100];
	
	if (strlen(s)<1) return 1;
	else {
		l=s[0]==s[strlen(s)-1];
		strncpy(s1, s+1, strlen(s)-2);
		s1[strlen(s)-2]='\0';
		return l&&pal(s1);
	}
}
	
Какое граничное условие имеет реализованная в программе рекурсия?		
		

Ответ:

 (1) строка пустая 

 (2) строка состоит из одного символа 

 (3) граничное условие отсутствует 


Упражнение 9:
Номер 1
Какая программа верно вычисляет сумму элементов массива с помощью рекурсии?

Ответ:

 (1) int summa(int N, int a[6]); int main() { int i,n; int a[6] = {8, 65, 10, 2, 4, 1}; n = sizeof(a)/sizeof(a[0]); printf("Сумма: %d", summa(n-1, a)); } int summa(int N, int a[6]) { return a[N]+summa(N-1, a); }  

 (2) int summa(int N, int a[6]); int main() { int i,n; int a[6] = {8, 65, 10, 2, 4, 1}; n = sizeof(a)/sizeof(a[0]); printf("Сумма: %d", summa(n-1, a)); } int summa(int N, int a[6]) { if (N==0) return a[0]; else return a[N]+summa(N-1, a); }  

 (3) int summa(int N, int a[6]); int main() { int i,n; int a[6] = {8, 65, 10, 2, 4, 1}; n = sizeof(a)/sizeof(a[0]); printf("Сумма: %d", summa(n-1, a)); } int summa(int N, int a[6]) { int i, s = 0; for (i=0; i<N; i++) s += a[i]; return s; }  


Номер 2
Что произойдет при выполнении программы?

int summa(int N, int a[6]);

int main()
{
	int i,n;
	int a[6] = {8, 65, 10, 2, 4, 1};
	n = sizeof(a)/sizeof(a[0]);
	printf("Сумма: %d", summa(n-1, a));
}

int summa(int N, int a[6])
{
	return a[N]+summa(N-1, a);
}
			
		

Ответ:

 (1) вычисление суммы элементов массива 

 (2) ошибка при вычислении значения переменной n 

 (3) аварийное завершение работы программы 


Номер 3
Что произойдет при выполнении программы?

int summa(int N, int a[6]);

int main()
{
	int i,n;
	int a[6] = {8, 65, 10, 2, 4, 1};
	n = sizeof(a)/sizeof(a[0]);
	printf("Сумма: %d", summa(n-1, a));
}

int summa(int N, int a[6])
{
	if (N==0) return a[0]; 
	else return a[N]+summa(N-1, a);
}
			
		

Ответ:

 (1) вычисление суммы элементов массива 

 (2) ошибка при вычислении значения переменной n 

 (3) аварийное завершение работы программы 


Упражнение 10:
Номер 1
Какие новые объекты создаются при рекурсивном вызове функции?

Ответ:

 (1) копия кода функции 

 (2) копия значений параметров функции 

 (3) копии всех объектов, связанных с функцией 


Номер 2
Какое утверждение являотся верным?

Ответ:

 (1) при рекурсивном вызове функции все объекты, связанные с функцией, создаются заново 

 (2) при рекурсивном вызове функции создается новая копия ее кода 

 (3) при рекурсивном вызове функции создается новая копия значений ее параметров 


Номер 3
Какие утверждения являются неверными?

Ответ:

 (1) при рекурсивном вызове функции все объекты, связанные с функцией, создаются заново 

 (2) при рекурсивном вызове функции создается новая копия ее кода 

 (3) при рекурсивном вызове функции создается новая копия значений ее параметров 


Упражнение 11:
Номер 1
Задана функция вычисления факториала:

long fact (int n){
    if ( n<1 ) return 1;
    else return n*fact(n-1);
} 
	
Какой будет последовательность вызов, если в функции main задать long result=fact(3)?
		

Ответ:

 (1) files 

 (2) files 

 (3) files 


Номер 2
Задана функция вычисления факториала:

long fact (int n){
    if ( n<1 ) return 1;
    else return n*fact(n-1);
} 
	
Какая последовательность вызовов будет неверной, если в функции main задать long result=fact(3)?
		

Ответ:

 (1) files 

 (2) files 

 (3) files 


Номер 3
В функции main выполняется вызов рекурсивной функции fact(): long result=fact(3). Вызовы функции выполняются в приведенной последовательности: filesКаким образом должна выглядеть функция fact()?
		

Ответ:

 (1) long fact (int n) { if ( n<1 ) return 1; else return n*fact(n-1); }  

 (2) long fact(long n) { int i; long m = 1; if (n==0 || n==1) m = 1; else for (i=1; i<=n; i++) m *= i; return m; }  

 (3) long fact (int n) { return n*fact(n-1); }  


Упражнение 12:
Номер 1
Какие из перечисленных задач могут быть решены с помощью рекурсии?

Ответ:

 (1) поиск пути между двумя городами 

 (2) вычисление суммы элементов одномерного массива 

 (3) вычисление арифметической прогрессии 


Номер 2
В арифметической прогрессии каждый следующий член равен предыдущему, увеличенному на разность прогрессии: a{i} = a{i-1} + d. Приведенная программа содержит рекурсивную функцию для вычисления заданного члена арифметической прогрессии:

int Sum(int x, int step, int n)
{ 
        if (n==1) return(x);
        else return(Sum(x, step, n-1)+step);
}

int main()
{ 
        int x, s, n;
		int pr;
		printf("Введите первый член, число элементов и разность прогрессии:");
		scanf("%d %d %d", &x, &n, &s);
        <Вызов функции sum()>
		printf("pr = %d", pr);
		return 0;
} 

Пользователь вводит данные для вычисления через пробел в следующей последовательности: первый член арифметической прогрессии, разность прогрессии, количестов элементов. В какой последовательности эти параметры должны быть заданы при вызове рекурсивной функии sum()?		

Ответ:

 (1) pr = Sum(x, s, n); 

 (2) pr = Sum(s, x, n); 

 (3) pr = Sum(n, s, x); 


Номер 3
В арифметической прогрессии каждый следующий член равен предыдущему, увеличенному на разность прогрессии: a{i} = a{i-1} + d. Приведенная программа содержит рекурсивную функцию для вычисления заданного члена арифметической прогрессии:

int Sum(int x, int step, int n)
{ 
        if (n==1) return(x);
        else return(Sum(x, step, n-1)+step);
}

int main()
{ 
        int x, s, n;
		int pr;
		printf("Введите первый член, число элементов и разность прогрессии:");
		scanf("%d %d %d", &x, &n, &s);
        <Вызов функции sum()>
		printf("pr = %d", pr);
		return 0;
} 

Пользователь вводит данные для вычисления через пробел в следующей последовательности: первый член арифметической прогрессии, разность прогрессии, количестов элементов. Какая последовательность задания этих параметров является неверной для вызова рекурсивной функии sum()?		

Ответ:

 (1) pr = Sum(x, s, n); 

 (2) pr = Sum(s, x, n); 

 (3) pr = Sum(n, s, x); 




Главная / Программирование / Программирование на языке C в Microsoft Visual Studio 2010 / Тест 18