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

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

Упражнение 1:
Номер 1
Функция swap() имеет два аргумента-указателя и выполняет обмен значений элементов:

void swap(int *pa, int *pb)
{
	int temp;
	temp = *pa;
	*pa = *pb;
	*pb = temp;
}

В каком случае вызов функции swap() осуществляется верно?

Ответ:

 (1) int main (void) { int a = 10, b = 20; int *x, *y; x = &a; y = &b; printf("Initial values: a = %d, b = %d\n", a, b); swap(x, y); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  

 (2) int main (void) { int a = 10, b = 20; printf("Initial values: a = %d, b = %d\n", a, b); swap(a, b); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  

 (3) int main (void) { int a = 10, b = 20; printf("Initial values: a = %d, b = %d\n", a, b); swap(*a, *b); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  

 (4) int main (void) { int a = 10, b = 20; printf("Initial values: a = %d, b = %d\n", a, b); swap(&a, &b); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  


Номер 2
Функция swap() имеет два аргумента-указателя и выполняет обмен значений элементов:

void swap(int *pa, int *pb)
{
	int temp;
	temp = *pa;
	*pa = *pb;
	*pb = temp;
}

В каком случае вызов функции swap() осуществляется неверно?

Ответ:

 (1) int main (void) { int a = 10, b = 20; int *x, *y; x = &a; y = &b; printf("Initial values: a = %d, b = %d\n", a, b); swap(x, y); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  

 (2) int main (void) { int a = 10, b = 20; printf("Initial values: a = %d, b = %d\n", a, b); swap(a, b); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  

 (3) int main (void) { int a = 10, b = 20; printf("Initial values: a = %d, b = %d\n", a, b); swap(*a, *b); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  

 (4) int main (void) { int a = 10, b = 20; printf("Initial values: a = %d, b = %d\n", a, b); swap(&a, &b); printf("New values: a = %d, b = %d\n", a, b); printf("... Press any key: \n"); _getch(); return 0; }  


Номер 3
В результате выполнения какой программы изначальные значения переменных a и b изменятся?

Ответ:

 (1) void swap(int*, int*); int main (void) { int a = 10, b = 20; swap(a, b); return 0; } void swap(int pa, int pb) { int temp; temp = pa; pa = pb; pb = temp; }  

 (2) void swap(int*, int*); int main (void) { int a = 10, b = 20; swap(&a, &b); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; }  

 (3) void swap(int*, int*); int main (void) { int a = 10, b = 20; int *x, *y; x = &a; y = &b; swap(x, y); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; }  


Упражнение 2:
Номер 1
Что произойдет после выполнения приведенной программы?

#include <stdio.h>
#define n 10

void fun(int *mas, int k);

int main( void )
{
	int arr[n] = {3,4,5,4,4};
	int i;
	fun(arr, n);
	return 0;
}

void fun(int *mas, int k)
{
   int i, s = 0;
   for (i=0; i<k; i++) ++mas[i];
}

		

Ответ:

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

 (2) значения всех элементов массива arr будут увеличены на 1 

 (3) ничего не произойдет, так как функция fun(int *mas, int k) не возвращает значения 


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

#include <stdio.h>
#define n 10

void fun(int *mas, int k);

int main( void )
{
	int arr[n] = {3,4,5,4,4};
	int i;
	fun(arr, n);
	for (i=0; i<n; i++) 
		printf("arr[%d] = %d\n", i, arr[i]);
	return 0;
}

void fun(int *mas, int k)
{
   int i, s = 0;
   for (i=0; i<k; i++) mas[i] *= 2;
}

		

Ответ:

 (1) ничего не произойдет, так как функция fun(int *mas, int k) не возвращает значения 

 (2) значения всех элементов массива arr будут увеличены в два раза 

 (3) размер памяти для хранения массива arr будет увеличен в два раза 


Номер 3
Чему будет равно значение переменной s в результате выполнения приведенной программы?

#include <stdio.h>
#define n 5

void fun(int *mas, int k);
int sum(int *mas, int k);

int main( void )
{
	int arr[n] = {3,4,1,2};
	int i, s;
	fun(arr, n);
	s = sum(arr, n);
	return 0;
}

void fun(int *mas, int k)
{
   int i, s = 0;
   for (i=0; i<k; i++) ++mas[i];
}

int sum(int *mas, int k)
{
   int i, s = 0;
   for (i=0; i<k; i++) s += mas[i];
   return s;
}

		

Ответ:

 (1) 10 

 (2) 14 

 (3) 15 


Упражнение 3:
Номер 1
Чему будет равно значение переменной s в результате выполнения приведенной программы?

#include <stdio.h>
#include <stdlib.h>
#define n 2
#define m 3

int sum(int *a, int x, int y);

int main( void )
{
	int i, s;
	int a[n][m] = {{1,2,3}, {4,5,6}};
	
	s = sum(a, n, m);
	printf("Сумма элементов а: %d\n", s);
	
	return 0;
}

int sum(int *a, int x, int y)
{
   int i, j, s = 0;
   for (i=0; i<x; i++) 
	   for (j=0; j<y; j++) s += a[i*y+j];
   return s;
}
		
		

Ответ:

 (1)

 (2) 15 

 (3) 21 


Номер 2
Необходимо написать функцию, которая будет вычислять сумму всех элементов двухмерного массива. В какой программе вызов функции sum выполняется верно?

Ответ:

 (1) #include <stdio.h> #include <stdlib.h> #define n 2 #define m 3 int sum(int *a, int x, int y); int main( void ) { int i, s; int a[n][m] = {{1,2,3}, {4,5,6}}; s = sum(a, n, m); printf("Сумма элементов а: %d\n", s); return 0; } int sum(int *a, int x, int y) { int i, j, s = 0; for (i=0; i<x; i++) for (j=0; j<y; j++) s += a[i*y+j]; return s; }  

 (2) #include <stdio.h> #include <stdlib.h> #define n 2 #define m 3 int sum(int *a, int x, int y); int main( void ) { int i, s; int a[n][m] = {{1,2,3}, {4,5,6}}; s = sum(a[0][0], n, m); printf("Сумма элементов а: %d\n", s); return 0; } int sum(int *a, int x, int y) { int i, j, s = 0; for (i=0; i<x; i++) for (j=0; j<y; j++) s += a[i*y+j]; return s; }  

 (3) #include <stdio.h> #include <stdlib.h> #define n 2 #define m 3 int sum(int *a, int x, int y); int main( void ) { int i, s; int a[n][m] = {{1,2,3}, {4,5,6}}; s = sum(&a[0][0], n, m); printf("Сумма элементов а: %d\n", s); return 0; } int sum(int *a, int x, int y) { int i, j, s = 0; for (i=0; i<x; i++) for (j=0; j<y; j++) s += a[i*y+j]; return s; }  


Номер 3
Необходимо написать функцию, которая будет вычислять сумму всех элементов двухмерного массива. В какой программе вызов функции sum выполняется неверно?

Ответ:

 (1) #include <stdio.h> #include <stdlib.h> #define n 2 #define m 3 int sum(int *a, int x, int y); int main( void ) { int i, s; int a[n][m] = {{1,2,3}, {4,5,6}}; s = sum(a, n, m); printf("Сумма элементов а: %d\n", s); return 0; } int sum(int *a, int x, int y) { int i, j, s = 0; for (i=0; i<x; i++) for (j=0; j<y; j++) s += a[i*y+j]; return s; }  

 (2) #include <stdio.h> #include <stdlib.h> #define n 2 #define m 3 int sum(int *a, int x, int y); int main( void ) { int i, s; int a[n][m] = {{1,2,3}, {4,5,6}}; s = sum(a[0][0], n, m); printf("Сумма элементов а: %d\n", s); return 0; } int sum(int *a, int x, int y) { int i, j, s = 0; for (i=0; i<x; i++) for (j=0; j<y; j++) s += a[i*y+j]; return s; }  

 (3) #include <stdio.h> #include <stdlib.h> #define n 2 #define m 3 int sum(int *a, int x, int y); int main( void ) { int i, s; int a[n][m] = {{1,2,3}, {4,5,6}}; s = sum(&a[0][0], n, m); printf("Сумма элементов а: %d\n", s); return 0; } int sum(int *a, int x, int y) { int i, j, s = 0; for (i=0; i<x; i++) for (j=0; j<y; j++) s += a[i*y+j]; return s; }  


Упражнение 4:
Номер 1
Какая функция возвращает указатель?

Ответ:

 (1) void fun(int *mas, int k) { int i, s = 0; for (i=0; i<k; i++) ++mas[i]; }  

 (2) int *out2(int A[], int B[], int n) { int i; int *ptr = (int *)calloc(n, sizeof(int)); for (i = 0; i < n; i++) ptr[i] = A[i] + B[i]; return ptr; }  

 (3) int sum(int* mas, int k) { int i, s = 0; for (i=0; i<k; i++) s += mas[i]; return s; }  

 (4) char *xgets(char *s) { char ch, *p; int t; p = s; for(t=0; t<80; ++t){ ch = getchar(); switch(ch) { case '\n': s[t] = '\0'; /* завершает строку */ return p; case '\b': if(t>0) t--; break; default: s[t] = ch; } } s[79] = '\0'; return p; }  


Номер 2
Какая функция не возвращает указатель?

Ответ:

 (1) void fun(int *mas, int k) { int i, s = 0; for (i=0; i<k; i++) ++mas[i]; }  

 (2) int *out2(int A[], int B[], int n) { int i; int *ptr = (int *)calloc(n, sizeof(int)); for (i = 0; i < n; i++) ptr[i] = A[i] + B[i]; return ptr; }  

 (3) int sum(int* mas, int k) { int i, s = 0; for (i=0; i<k; i++) s += mas[i]; return s; }  

 (4) char *xgets(char *s) { char ch, *p; int t; p = s; for(t=0; t<80; ++t){ ch = getchar(); switch(ch) { case '\n': s[t] = '\0'; return p; case '\b': if(t>0) t--; break; default: s[t] = ch; } } s[79] = '\0'; return p; }  


Номер 3
Задана функция xgets():	

char *xgets(char *s)
{
  char ch, *p;
  int t;
  p = s; 

  for(t=0; t<80; ++t){
    ch = getchar();

    switch(ch) {
      case '\n':
        s[t] = '\0'; 
        return p;
      case '\b':
        if(t>0) t--;
        break;
      default:
        s[t] = ch;
    }
  }
  s[79] = '\0';
  return p;
}

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

Ответ:

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

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

 (3) объявление функции содержит ошибку 


Упражнение 5:
Номер 1
В результате выполнения какой программы значением переменной s будет строка в верхнем регистре?

Ответ:

 (1) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); printf("\s = %s\n", s); return 0; } void print_upper(char *string) { int t; for(t=0; string[t]; ++t) putchar(string[t]); putchar('\n'); }  

 (2) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); return 0; } void print_upper(char *string) { int t; for(t=0; string[t]; ++t) string[t] = toupper(string[t]); }  

 (3) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); printf("\s = %s\n", s); return 0; } void print_upper(char *string) { int t; char str[80] = ""; strcpy(str, string); for(t=0; string[t]; ++t) str[t] = toupper(str[t]); }  


Номер 2
В результате выполнения какой программы изначальное значение переменной s не будет изменено?

Ответ:

 (1) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); printf("\s = %s\n", s); return 0; } void print_upper(char *string) { int t; for(t=0; string[t]; ++t) putchar(string[t]); putchar('\n'); }  

 (2) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); return 0; } void print_upper(char *string) { int t; for(t=0; string[t]; ++t) string[t] = toupper(string[t]); }  

 (3) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); printf("\s = %s\n", s); return 0; } void print_upper(char *string) { int t; char str[80] = ""; strcpy(str, string); for(t=0; string[t]; ++t) str[t] = toupper(str[t]); }  


Номер 3
В результате выполнения какой программы изначальное значение переменной s будет изменено?

Ответ:

 (1) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); printf("\s = %s\n", s); return 0; } void print_upper(char *string) { int t; for(t=0; string[t]; ++t) putchar(string[t]); putchar('\n'); }  

 (2) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); printf("\s = %s\n", s); return 0; } void print_upper(char *string) { int t; char str[80] = ""; strcpy(str, string); for(t=0; string[t]; ++t) str[t] = toupper(str[t]); }  

 (3) void print_upper(char *string); int main(void) { char s[80] = "Question for the lection"; print_upper(s); return 0; } void print_upper(char *string) { int t; for(t=0; string[t]; ++t) string[t] = toupper(string[t]); }  


Упражнение 6:
Номер 1
Функция sum выполняет сложение двух одномерных массивов и возвращает результат через указатель:

int *sum(int A[], int B[], int n)
{
    int i;
	int *ptr = (int *)calloc(n, sizeof(int)); 
    for (i = 0; i < n; i++) ptr[i] = A[i] + B[i];
    return ptr;
}
	
В какой программе вызов функции sum выполняется верно?	
		

Ответ:

 (1) int main (void) { int i, n; int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int ptrAB; n = (sizeof(A)/sizeof(A[0])); ptrAB = sum(A, B, n); printf("Result from function: "); for (i = 0; i < n; i++) printf(" %d", ptrAB[i]); free(ptrAB); return 0; }  

 (2) int main (void) { int i, n; int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int *ptrAB = NULL; n = (sizeof(A)/sizeof(A[0])); *ptrAB = sum(A, B, n); printf("Result from function: "); for (i = 0; i < n; i++) printf(" %d", ptrAB[i]); free(ptrAB); return 0; }  

 (3) int main (void) { int i, n; int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int *ptrAB = NULL; n = (sizeof(A)/sizeof(A[0])); ptrAB = sum(A, B, n); printf("Result from function: "); for (i = 0; i < n; i++) printf(" %d", ptrAB[i]); free(ptrAB); return 0; }  


Номер 2
Функция sum выполняет сложение двух одномерных массивов и возвращает результат через указатель:

int *sum(int A[], int B[], int n)
{
    int i;
	int *ptr = (int *)calloc(n, sizeof(int)); 
    for (i = 0; i < n; i++) ptr[i] = A[i] + B[i];
    return ptr;
}
	
В какой программе вызов функции sum выполняется неверно?	
		

Ответ:

 (1) int main (void) { int i, n; int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int ptrAB; n = (sizeof(A)/sizeof(A[0])); ptrAB = sum(A, B, n); printf("Result from function: "); for (i = 0; i < n; i++) printf(" %d", ptrAB[i]); free(ptrAB); return 0; }  

 (2) int main (void) { int i, n; int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int *ptrAB = NULL; n = (sizeof(A)/sizeof(A[0])); *ptrAB = sum(A, B, n); printf("Result from function: "); for (i = 0; i < n; i++) printf(" %d", ptrAB[i]); free(ptrAB); return 0; }  

 (3) int main (void) { int i, n; int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int *ptrAB = NULL; n = (sizeof(A)/sizeof(A[0])); ptrAB = sum(A, B, n); printf("Result from function: "); for (i = 0; i < n; i++) printf(" %d", ptrAB[i]); free(ptrAB); return 0; }  


Номер 3
Функция sum выполняет сложение двух одномерных массивов и возвращает результат через указатель:

int *sum(int A[], int B[], int n)
{
    int i;
	int *ptr = (int *)calloc(n, sizeof(int)); 
    for (i = 0; i < n; i++) ptr[i] = A[i] + B[i];
    return ptr;
}
	
Как вызвать функцию sum?	
		

Ответ:

 (1) int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int ptrAB = NULL; n = (sizeof(A)/sizeof(A[0])); ptrAB = sum(A, B, n);  

 (2) int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int *ptrAB = NULL; n = (sizeof(A)/sizeof(A[0])); *ptrAB = sum(A, B, n);  

 (3) int A[] = {1,2,3,4,5}, B[] = {2,2,2,2,2}; int *ptrAB = NULL; n = (sizeof(A)/sizeof(A[0])); ptrAB = sum(A, B, n);  


Упражнение 7:
Номер 1
Какая программа реализует сортировку "методом пузырька" по возрастанию с помощью функции, использующей вызов по ссылке?

Ответ:

 (1) void bsort (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void bsort (int *arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] < arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } }  

 (2) void swap (int*, int*); void bsort (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void bsort (int *arr, int size) { int i, j; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] > arr[j + 1]) swap(&arr[j], &arr[j+1]); } } }  

 (3) void swap (int*, int*); void bsort (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void bsort (int *arr, int size) { int i, j, min; for (i=0; i < size - 1; i++) { min = i; for (j = i+1; j < size; j++) { if (arr[j] < arr[min]) { min = j; swap(&arr[i], &arr[min]); } } } }  


Номер 2
Какая программа реализует сортировку "методом пузырька" по убыванию с помощью функции, использующей вызов по ссылке?

Ответ:

 (1) void bsort (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void bsort (int *arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] > arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } }  

 (2) void swap (int*, int*); void bsort (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void bsort (int *arr, int size) { int i, j; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] < arr[j + 1]) swap(&arr[j], &arr[j+1]); } } }  

 (3) void swap (int*, int*); void bsort (int* , int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void bsort (int *arr, int size) { int i, j, min; for (i=0; i < size - 1; i++) { min = i; for (j = i+1; j < size; j++) { if (arr[j] > arr[min]) { min = j; swap(&arr[i], &arr[min]); } } } }  


Номер 3
Какая программа реализует сортировку методом прямого выбора по убыванию с помощью функции, использующей вызов по ссылке?

Ответ:

 (1) void bsort (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void bsort (int *arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] < arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } }  

 (2) void swap (int*, int*); void bsort (int* , int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void bsort (int *arr, int size) { int i, j; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] > arr[j + 1]) swap(&arr[j], &arr[j+1]); } } }  

 (3) void swap (int*, int*); void bsort (int* , int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n; n = sizeof(A)/sizeof(A[0]); printf("Original array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); bsort (A, n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void swap(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } void bsort (int *arr, int size) { int i, j, min; for (i=0; i < size - 1; i++) { min = i; for (j = i+1; j < size; j++) { if (arr[j] < arr[min]) { min = j; swap(&arr[i], &arr[min]); } } } }  


Упражнение 8:
Номер 1
В приведенной программе используются указатели на функции, которые выполняют сортировку целочисленного массива "методом пузырька":

void PuzSortInc (int*, int );
void PuzSortDec (int*, int);

int main (void) 
{
	int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7};
	int i, n, alg;
	<Объявление указателя pFun на функции>

	n = sizeof(A)/sizeof(A[0]);
	printf("Исходный массив: ");
	for (i = 0; i < n; i++) printf(" %3d", A[i]);

	printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\
		   2 - \"методом пузырька\" по убыванию: ");
	scanf("%d", &alg);

	switch (alg) {
		case 1: (*pFun[0])(A, n); break;
		case 2: (*pFun[1])(A, n); break;
		default: printf("ERROR! Такого алгоритма не определено!");
	}

    printf("\nSorted array: ");
	for (i = 0; i < n; i++) printf(" %3d", A[i]);
		
	return 0;
}

void PuzSortInc (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}

void PuzSortDec (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] < arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}
	
Функция PuzSortInc() выполняет сортировку по возрастанию, функция PuzSortDec() - по убыванию. Каким образом должен быть объявлен указатель на функции для его использования в приведенной программе?
		

Ответ:

 (1) void (*pFun) (int*, int); 

 (2) void (*pFun[2]) (int*, int) 

 (3) void (*pFun[2]) (int*, int) = {PuzSortInc, PuzSortDec}; 

 (4) void *pFun[2] (int*, int) = {PuzSortInc, PuzSortDec}; 


Номер 2
В приведенной программе используется указатель на функции, которые выполняют сортировку целочисленного массива "методом пузырька":

void PuzSortInc (int*, int );
void PuzSortDec (int*, int);

int main (void) 
{
	int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7};
	int i, n, alg;
	<Объявление указателя pFun на функции>

	n = sizeof(A)/sizeof(A[0]);
	printf("Исходный массив: ");
	for (i = 0; i < n; i++) printf(" %3d", A[i]);

	printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\
		   2 - \"методом пузырька\" по убыванию: ");
	scanf("%d", &alg);

	switch (alg) {
		case 1: pFun = PuzSortInc; break;
		case 2: pFun = PuzSortDec; break;
		default: printf("ERROR! Такого алгоритма не определено!");
	}

	if (pFun) {
		pFun(A,n);
		printf("\nSorted array: ");
		for (i = 0; i < n; i++) printf(" %3d", A[i]);
	};
		
	return 0;
}

void PuzSortInc (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}

void PuzSortDec (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] < arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}
	
Функция PuzSortInc() выполняет сортировку по возрастанию, функция PuzSortDec() - по убыванию. Каким образом должен быть объявлен указатель на функции для его использования в приведенной программе?
		

Ответ:

 (1) void (*pFun) (int*, int); 

 (2) void *pFun (int*, int) 

 (3) void (*pFun) (int*, int) = {PuzSortInc, PuzSortDec}; 


Номер 3
В приведенной программе используется указатель на функции, которые выполняют сортировку целочисленного массива "методом пузырька":

void PuzSortInc (int*, int );
void PuzSortDec (int*, int);

int main (void) 
{
	int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7};
	int i, n, alg;
	<Объявление указателя pFun на функции>

	n = sizeof(A)/sizeof(A[0]);
	printf("Исходный массив: ");
	for (i = 0; i < n; i++) printf(" %3d", A[i]);

	printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\
		   2 - \"методом пузырька\" по убыванию: ");
	scanf("%d", &alg);

	switch (alg) {
		case 1: pFun = PuzSortInc; break;
		case 2: pFun = PuzSortDec; break;
		default: printf("ERROR! Такого алгоритма не определено!");
	}

	if (pFun) {
		pFun(A,n);
		printf("\nSorted array: ");
		for (i = 0; i < n; i++) printf(" %3d", A[i]);
	};
		
	return 0;
}

void PuzSortInc (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}

void PuzSortDec (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] < arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}
		
Функция PuzSortInc() выполняет сортировку по возрастанию, функция PuzSortDec() - по убыванию. Какой способ объявления указателя pFun является неверным для приведенной программы?
		

Ответ:

 (1) void (*pFun) (int*, int); 

 (2) void (*pFun) (int*, int) = NULL; 

 (3) void *pFun (int*, int) 

 (4) void (*pFun) (int*, int) = {PuzSortInc, PuzSortDec}; 


Упражнение 9:
Номер 1
Приведенная программа использует указатель на функции, которые выполняют различные действия: вычисление квадратного корня, вычисление синуса, вычисление тангенса:

int main (void) 
{
	double (*pFunc) (double);
	int c = 1;
	double y;

	while(1) {
		printf("Выберите функцию (0-выход): 1-sqrt, 2-sin, 3-tan\n");
		scanf("%d", &c);
		switch(c) {
			case 1: pFunc = sqrt; break;
			case 2: pFunc = sin; break;
			case 3: pFunc = tan; break;
			case 0: return;
			default: continue;
		}
	
		y = pFunc(1.1);
		printf("f(1.1) = %.2f\n", y);
	}
		
	return 0;
}
	
Какое вычисление будет выполнено в том случае, если пользователь в запросе выбора функции задаст число 3?		
		

Ответ:

 (1) sqrt(1.1) 

 (2) sin(1.1) 

 (3) tan(1.1) 


Номер 2
Приведенная программа использует указатель на функции, которые выполняют различные действия: вычисление квадратного корня, вычисление синуса, вычисление тангенса:

int main (void) 
{
	double (*pFunc) (double);
	int c = 1;
	double y;

	while(1) {
		printf("Выберите функцию (0-выход): 1-sqrt, 2-sin, 3-tan\n");
		scanf("%d", &c);
		switch(c) {
			case 1: pFunc = sin; break;
			case 2: pFunc = sqrt; break;
			case 3: pFunc = tan; break;
			case 0: return;
			default: continue;
		}
	
		y = pFunc(1.1);
		printf("f(1.1) = %.2f\n", y);
	}
		
	return 0;
}
	
Какое вычисление будет выполнено в том случае, если пользователь в запросе выбора функции задаст число 2?		
		

Ответ:

 (1) sqrt(1.1) 

 (2) sin(1.1) 

 (3) tan(1.1) 


Номер 3
Приведенная программа использует указатель на функции, которые выполняют различные действия: вычисление квадратного корня, вычисление синуса, вычисление тангенса:

int main (void) 
{
	double (*pFunc) (double);
	int c = 1;
	double y;

	while(1) {
		printf("Выберите функцию (0-выход): 1-sqrt, 2-sin, 3-tan\n");
		scanf("%d", &c);
		switch(c) {
			case 1: pFunc = sin; break;
			case 2: pFunc = sqrt; break;
			case 3: pFunc = tan; break;
			case 0: return;
			default: continue;
		}
	
		y = pFunc(1.1);
		printf("f(1.1) = %.2f\n", y);
	}
		
	return 0;
}
	
Какое вычисление будет выполнено в том случае, если пользователь в запросе выбора функции задаст число 1?		
		

Ответ:

 (1) sqrt(1.1) 

 (2) sin(1.1) 

 (3) tan(1.1) 


Упражнение 10:
Номер 1
Требуется написать программу, в которой будет использоваться указатель на функции, которые выполняют сортировку целочисленного массива "методом пузырька": функция PuzSortInc() выполняет сортировку по возрастанию, функция PuzSortDec() - по убыванию. В какой программе предусмотрено корректное завершение работы программы, независимо от номера алгоритма, который задаст пользователь?

Ответ:

 (1) void PuzSortInc (int*, int ); void PuzSortDec (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n, alg; void (*pFun) (int*, int) = NULL; n = sizeof(A)/sizeof(A[0]); printf("Исходный массив: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\ 2 - \"методом пузырька\" по убыванию: "); scanf("%d", &alg); switch (alg) { case 1: pFun = PuzSortInc; break; case 2: pFun = PuzSortDec; break; default: printf("ERROR! Такого алгоритма не определено!"); exit(1); } pFun(A,n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void PuzSortInc (int* arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] > arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } } void PuzSortDec (int* arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] < arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } }  

 (2) void PuzSortInc (int*, int ); void PuzSortDec (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n, alg; void (*pFun) (int*, int) = NULL; n = sizeof(A)/sizeof(A[0]); printf("Исходный массив: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\ 2 - \"методом пузырька\" по убыванию: "); scanf("%d", &alg); switch (alg) { case 1: pFun = PuzSortInc; break; case 2: pFun = PuzSortDec; break; default: printf("ERROR! Такого алгоритма не определено!"); } pFun(A,n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); return 0; } void PuzSortInc (int* arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] > arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } } void PuzSortDec (int* arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] < arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } }  

 (3) void PuzSortInc (int*, int ); void PuzSortDec (int*, int); int main (void) { int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7}; int i, n, alg; void (*pFun) (int*, int) = NULL; n = sizeof(A)/sizeof(A[0]); printf("Исходный массив: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\ 2 - \"методом пузырька\" по убыванию: "); scanf("%d", &alg); switch (alg) { case 1: pFun = PuzSortInc; break; case 2: pFun = PuzSortDec; break; default: printf("ERROR! Такого алгоритма не определено!"); } if (pFun) { pFun(A,n); printf("\nSorted array: "); for (i = 0; i < n; i++) printf(" %3d", A[i]); }; return 0; } void PuzSortInc (int* arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] > arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } } void PuzSortDec (int* arr, int size) { int i, j, buf; for (i = 0; i < size - 1; i++ ) { for (j = 0; j < size - 1; j++) { if (arr[j] < arr[j + 1]) { buf = arr[j]; arr[j] = arr[j+1]; arr[j+1] = buf; } } } }  


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

void PuzSortInc (int*, int );
void PuzSortDec (int*, int);

int main (void) 
{
	int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7};
	int i, n, alg;
	void (*pFun) (int*, int) = NULL;

	n = sizeof(A)/sizeof(A[0]);
	printf("Исходный массив: ");
	for (i = 0; i < n; i++) printf(" %3d", A[i]);

	printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\
		   2 - \"методом пузырька\" по убыванию: ");
	scanf("%d", &alg);

	switch (alg) {
		case 1: pFun = PuzSortInc; break;
		case 2: pFun = PuzSortDec; break;
		default: printf("ERROR! Такого алгоритма не определено!"); 
	}

	pFun(A,n);
	printf("\nОтсортированный массив: ");
	for (i = 0; i < n; i++) printf(" %3d", A[i]);
		
	return 0;
}

void PuzSortInc (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}

void PuzSortDec (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] < arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}
			
		

Ответ:

 (1) будет выведено сообщение об ошибке ERROR! Такого алгоритма не определено!, и программа корректно завершит свою работу 

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

 (3) произойдет сбой выполнения программы 


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

void PuzSortInc (int*, int );
void PuzSortDec (int*, int);

int main (void) 
{
	int A[] = {56, 34, 2, 0, 1, -21, 6, 8, 7};
	int i, n, alg;
	void (*pFun) (int*, int) = NULL;

	n = sizeof(A)/sizeof(A[0]);
	printf("Исходный массив: ");
	for (i = 0; i < n; i++) printf(" %3d", A[i]);

	printf("\nВыберите алгоритм сортировки (1 - \"методом пузырька\" по возрастанию,\
		   2 - \"методом пузырька\" по убыванию: ");
	scanf("%d", &alg);

	switch (alg) {
		case 1: pFun = PuzSortInc; break;
		case 2: pFun = PuzSortDec; break;
		default: printf("ERROR! Такого алгоритма не определено!"); 
	}
	
	if (pFun) {
		pFun(A,n);
		printf("\nSorted array: ");
		for (i = 0; i < n; i++) printf(" %3d", A[i]);
	};
		
	return 0;
}

void PuzSortInc (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}

void PuzSortDec (int* arr, int size)
{
	int i, j, buf; 

	for (i = 0; i < size - 1; i++ ) {
		for (j = 0; j < size - 1; j++) {
			if (arr[j] < arr[j + 1]) {
				buf = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = buf;
			}				
		}
	}
}
			
		

Ответ:

 (1) будет выведено сообщение об ошибке ERROR! Такого алгоритма не определено!, и программа корректно завершит свою работу 

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

 (3) произойдет сбой выполнения программы 


Упражнение 11:
Номер 1
Задан указатель на функции int (*pFun) (int, int). Какие утверждения являются верными?

Ответ:

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

 (2) переменная pFun способна указывать только на функцию, которая возвращает число типа int 

 (3) переменная pFun способна указывать только на функцию, которая возвращает число типа int и требует два числа этого типа в качестве параметра 


Номер 2
Какая переменная pFun способна указывать только на функцию, которая возвращает целое число и требует два целых числа в качестве параметра?

Ответ:

 (1) int (*pFun) (int, int) 

 (2) int (*pFun) (int) 

 (3) void (*pFun) (int, int) 

 (4) double (*pFun) (double, double) 


Номер 3
Какая переменная pFun способна указывать только на функцию, которая возвращает целое число и требует целое число в качестве параметра?

Ответ:

 (1) int (*pFun) (int, int) 

 (2) int (*pFun) (int) 

 (3) void (*pFun) (int, int) 

 (4) double (*pFun) (double, double) 


Упражнение 12:
Номер 1
Функция xgets() в упрощенном виде демонстрирует работу стандартной функции gets():

char *xgets(char *s)
{
  char ch, *p;
  int t;

  p = s; 

  for(t=0; t<80; ++t){
    ch = getchar();

    switch(ch) {
      case '\n':
        s[t] = '\0'; 
        return p;
      case '\b':
        if(t>0) t--;
        break;
      default:
        s[t] = ch;
    }
  }
  s[79] = '\0';
  return p;
}

Каким образом можно вызвать эту функцию?			
		

Ответ:

 (1) char str[10]=""; str = xgets(str); printf("str = %s", str);  

 (2) char str[10]=""; xgets(str); printf("str = %s", str);  

 (3) char str[10]=""; char *p; p = xgets(str); printf("str = %s", str);  


Номер 2
Функция xgets() в упрощенном виде демонстрирует работу стандартной функции gets():

char *xgets(char *s)
{
  char ch, *p;
  int t;

  p = s; 

  for(t=0; t<80; ++t){
    ch = getchar();

    switch(ch) {
      case '\n':
        s[t] = '\0'; 
        return p;
      case '\b':
        if(t>0) t--;
        break;
      default:
        s[t] = ch;
    }
  }
  s[79] = '\0';
  return p;
}

Какие вызовы функции являются неверными?			
		

Ответ:

 (1) char str[10]=""; str = xgets(str); printf("str = %s", str);  

 (2) char str[10]=""; xgets(str); printf("str = %s", str);  

 (3) char str[10]=""; char *p; p = xgets(str); printf("str = %s", str);  


Номер 3
Функция xgets() в упрощенном виде демонстрирует работу стандартной функции gets():

char *xgets(char *s)
{
  char ch, *p;
  int t;

  p = s; 

  for(t=0; t<80; ++t){
    ch = getchar();

    switch(ch) {
      case '\n':
        s[t] = '\0';
        return p;
      case '\b':
        if(t>0) t--;
        break;
      default:
        s[t] = ch;
    }
  }
  s[79] = '\0';
  return p;
}

Каким образом можно вызвать эту функцию?			
		

Ответ:

 (1) char str[10]=""; printf("str = %s", xgets(str));  

 (2) char str[10]=""; str = xgets(str); printf("str = %s", str);  

 (3) char str[10]=""; char *p; p = xgets(str); printf("str = %s", str);  

 (4) char str[10]=""; xgets(str); printf("str = %s", str);  




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