Главная / Программирование /
Программирование на языке C в Microsoft Visual Studio 2010 / Тест 8
Программирование на языке C в Microsoft Visual Studio 2010 - тест 8
Упражнение 1:
Номер 1
Какие преимущества имеет использование указателей для массивов?
Ответ:
 (1) повышение производительности 
 (2) лучшая наглядность и удобство в использовании по сравнению со стандартной записью массивов с индексами 
 (3) использование меньшего количества памяти 
Номер 2
Какой недостаток имеет использование указателей для массивов?
Ответ:
 (1) снижение производительности 
 (2) меньшая наглядность по сравнению со стандартной записью массивов с индексами 
 (3) использование большего количества памяти 
Номер 3
При использовании какого метода обращения к элементам массива производительность будет выше?
Ответ:
 (1) при использовании стандартной записи массивов с индексами 
 (2) при использовании указателей для массивов 
 (3) скорость доступа к элементам массива не зависит от метода доступа и определяется только размером массива 
Упражнение 2:
Номер 1
Приведенная программа копирует строку а
в строку b
и выводит обе строки на экран:
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = a;
char *pb = b;
for (i=0; i<strlen(a); i++)
*pb++ = *pa++;
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
Какая программа аналогична приведенной?
Ответ:
 (1)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = &a[1];
char *pb = &b[1];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = a[0];
char *pb = b[0];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
 (3)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = &a[0];
char *pb = &b[0];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
Номер 2
Необходимо написать программу, которая копирует одну строку в другую. Какая программа выполняет поставленную задачу?
Ответ:
 (1)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = a;
char *pb = b;
for (i=0; i<strlen(a); i++)
*pb++ = *pa++;
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = &a[1];
char *pb = &b[1];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
 (3)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = a[0];
char *pb = b[0];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
Номер 3
Необходимо написать программу, которая копирует одну строку в другую. Какие программы не выполняют поставленную задачу?
Ответ:
 (1)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = a;
char *pb = b;
for (i=0; i<strlen(a); i++)
*pb++ = *pa++;
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = &a[1];
char *pb = &b[1];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
 (3)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = a[0];
char *pb = b[0];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
 (4)
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
char a[10] = "Test", b[10] = "";
char *pa = &a[0];
char *pb = &b[0];
for (i=0; i<strlen(a); i++)
pb[i] = pa[i];
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
 
Упражнение 3:
Номер 1
Какая программа реализует сортировку массива целых чисел по возрастанию методом "пузырька" (методом прямого обмена)?
Ответ:
 (1)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
for (i=0; i<N; i++) {
ptr1 = &arr[i];
for (j=0; j<N-1; j++)
{
if (*ptr1 > *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
};
};
return 0;
}
 
 (2)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
ptr1 = arr;
for (i=0; i<N; i++)
for (j=0; j<N-1; j++)
{
if (*ptr1 > *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
ptr1++;
};
return 0;
}
 
 (3)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
ptr1 = arr;
for (i=0; i<N; i++)
for (j=0; j<N-1; j++)
{
ptr1 = &arr[j];
if (*ptr1 > *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
};
return 0;
}
 
Номер 2
Какая программа реализует сортировку массива целых чисел по убыванию методом "пузырька" (методом прямого обмена)?
Ответ:
 (1)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
for (i=0; i<N; i++) {
ptr1 = &arr[i];
for (j=0; j<N-1; j++)
{
if (*ptr1 < *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
};
};
return 0;
}
 
 (2)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
ptr1 = arr;
for (i=0; i<N; i++)
for (j=0; j<N-1; j++)
{
ptr1 = &arr[j];
if (*ptr1 < *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
};
return 0;
}
 
 (3)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
ptr1 = arr;
for (i=0; i<N; i++)
for (j=0; j<N-1; j++)
{
if (*ptr1 < *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
ptr1++;
};
return 0;
}
 
Номер 3
Какая программа реализует сортировку массива целых чисел по возрастанию методом прямого выбора?
Ответ:
 (1)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
ptr1 = arr;
for (i=0; i<N; i++)
for (j=0; j<N-1; j++)
{
ptr1 = &arr[j];
if (*ptr1 < *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
};
return 0;
}
 
 (2)
#include <stdio.h>
int main()
{
int i, j, N, buf, min;
int arr[] = {3, 2, 4, 5, 1};
int *ptr;
N = sizeof(arr)/sizeof(arr[0]);
ptr = arr;
for (i=0; i<N-1; i++)
{
min = i;
for (j=i+1; j<N; j++)
{
if (*(ptr+j)<*(ptr+min)) min = j;
buf = *(ptr+i);
*(ptr+i) = *(ptr+min);
*(ptr+min) = buf;
}
}
return 0;
}
 
 (3)
#include <stdio.h>
int main()
{
int i, j, N, buf;
int arr[] = {3, 2, 4, 5, 1};
int *ptr1, *ptr2;
N = sizeof(arr)/sizeof(arr[0]);
ptr1 = arr;
for (i=0; i<N; i++)
for (j=0; j<N-1; j++)
{
ptr1 = &arr[j];
if (*ptr1 > *(ptr1+1))
{
buf = *ptr1;
*ptr1 = *(ptr1+1);
*(ptr1+1) = buf;
}
};
return 0;
}
 
Упражнение 4:
Номер 1
Требуется написать программу, которая копирует введенную пользователем строку str1
в строку str2
в обратном порядке. Например, если пользователь ввел строку string
, то str2
в результате выполнения данной программы должна быть равна gnirts
. Какая программа выполняет поставленную задачу?
Ответ:
 (1)
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1, *ptr2;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1 + strlen(str1) - 1;
ptr2 = str2;
while (*ptr1) {
if (!(*ptr1)) *ptr2 = '\0';
*ptr2 = *ptr1;
ptr1--;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1, *ptr2;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1 + strlen(str1) - 1;
ptr2 = str2;
while (ptr1>=str1) {
if (ptr1<str1) *ptr2 = '\0';
*ptr2 = *ptr1;
ptr1--;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
 
 (3)
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1, *ptr2;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1 + strlen(str1);
ptr2 = str2;
while (ptr1>=str1) {
if (ptr1<str1) *ptr2 = '\0';
*ptr2 = *ptr1;
ptr1--;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
 
Номер 2
В результате выполнения какой программы в строку str2
будет скопирована не только инвертированная строка str1
, но и лишний "мусор"?
Ответ:
 (1)
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1, *ptr2;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1 + strlen(str1) - 1;
ptr2 = str2;
while (*ptr1) {
if (!(*ptr1)) *ptr2 = '\0';
*ptr2 = *ptr1;
ptr1--;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1, *ptr2;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1 + strlen(str1) - 1;
ptr2 = str2;
while (ptr1>=str1) {
if (ptr1<str1) *ptr2 = '\0';
*ptr2 = *ptr1;
ptr1--;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
 
 (3)
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1, *ptr2;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1 + strlen(str1);
ptr2 = str2;
while (ptr1>=str1) {
if (ptr1<str1) *ptr2 = '\0';
*ptr2 = *ptr1;
ptr1--;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
 
Номер 3
Чему будет равно значение переменной str2
после выполнения приведенной программы?
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1, *ptr2;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1;
ptr2 = str2;
while (ptr1>=str1) {
if (ptr1<str1) *ptr2 = '\0';
*ptr2 = *ptr1;
ptr1--;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
Ответ:
 (1) в переменную str2
будет скопирована введенная пользователем строка str1
 
 (2) в переменную str2
будет в обратном порядке скопирована введенная пользователем строка str1
 
 (3) в переменную str2
будет скопирован первый символ строки str1
 
Упражнение 5:
Номер 1
Какая схема соответсвует заданному фрагменту кода?
int x = 88, *ptr1, **ptr2;
ptr1 = &x;
ptr2 = &ptr1;
Ответ:
 
(1)  
 
(2)  
 
(3)  
Номер 2
Какой фрагмент кода соответствует заданной схеме?
Ответ:
 (1)
int x = 88, *ptr1, *ptr2;
ptr1 = &x;
ptr2 = &x;
 
 (2)
int x = 88, *ptr1, **ptr2;
ptr1 = &x;
ptr2 = &ptr1;
 
 (3)
int x = 88, *ptr2, **ptr1;
ptr2 = &x;
ptr1 = &ptr2;
 
Номер 3
Какой фрагмент кода соответствует заданной схеме?
Ответ:
 (1)
int x = 88, *ptr1, *ptr2;
ptr1 = &x;
ptr2 = &x;
 
 (2)
int x = 88, *ptr1, **ptr2;
ptr1 = &x;
ptr2 = &ptr1;
 
 (3)
int x = 88, *ptr2, **ptr1;
ptr2 = &x;
ptr1 = &ptr2;
 
Упражнение 6:
Номер 1
Какой фрагмент кода выполняет вычисление суммы всех элементов массива arr
?
Ответ:
 (1)
int i, N, sum = 0;
int arr[] = {3, 2, 4, 5, 1};
int *ptr;
N = sizeof(arr)/sizeof(arr[0]);
ptr = &arr[1];
for (i=0; i<N; i++) {
sum += *ptr;
ptr++;
}
 
 (2)
int i, N, sum = 0;
int arr[] = {3, 2, 4, 5, 1};
int *ptr;
N = sizeof(arr)/sizeof(arr[0]);
ptr = arr;
for (i=0; i<N; i++) {
sum += *ptr;
ptr++;
}
 
 (3)
int i, N, sum = 0;
int arr[] = {3, 2, 4, 5, 1};
int *ptr;
N = sizeof(arr)/sizeof(arr[0]);
ptr = arr;
for (i=0; i<N; i++)
sum += *ptr;
 
Номер 2
В результате выполнения приведенного фрагмента кода на экран выводится значение переменной sum
, равное 15:
int i, N, sum = 0;
int arr[] = {3, 2, 4, 5, 1};
int *ptr;
N = sizeof(arr)/sizeof(arr[0]);
ptr = arr;
for (i=0; i<N; i++)
sum += *ptr;
Какое действие выполняет данный код?
Ответ:
 (1) N
-кратное наращивание значения переменной sum
на величину, равную значению первого элемента массива arr
 
 (2) вычисление суммы всех элементов массива arr
 
 (3) N
-кратное смещение указателя на значение, равное sum
 
Номер 3
Чему будет равно значение переменной sum
после выполнения приведенного фрагмента кода?
int i, N, sum = 0;
int arr[] = {3, 2, 4, 5, 1};
int *ptr;
N = sizeof(arr)/sizeof(arr[0]);
ptr = &arr[1];
for (i=0; i<N-1; i++) {
sum += *ptr;
ptr++;
}
Ответ:
 (1) 11 
 (2) 12 
 (3) 15 
Упражнение 7:
Номер 1
Какая программа правильно определяет и выводит на экран время года по дате рождения, заданной пользователем?
Ответ:
 (1)
int m;
char month[3], s[8] = "";
char *season[] = {
"winter",
"spring",
"summer",
"autumn"
};
printf("Enter day of your birthday (MM.DD): ");
scanf("%[^.]s", month);
m = atoi(month);
if ((m==12) || (m<3)) strcpy(s, &season[0]);
else
if ((m>2) && (m<6)) strcpy(s, &season[1]);
else
if ((m>5) && (m<9)) strcpy(s, &season[2]);
else strcpy(s, &season[3]);
printf("Your birthday is in %s\n", s);
 
 (2)
int m;
char month[3], s[8] = "";
char *season[] = {
"winter",
"spring",
"summer",
"autumn"
};
printf("Enter day of your birthday (MM.DD): ");
scanf("%[^.]s", month);
m = atoi(month);
if ((m==12) || (m<3)) strcpy(s, season[1]);
else
if ((m>2) && (m<6)) strcpy(s, season[2]);
else
if ((m>5) && (m<9)) strcpy(s, season[3]);
else strcpy(s, season[4]);
printf("Your birthday is in %s\n", s);
 
 (3)
int m;
char month[3], s[8] = "";
char *season[] = {
"winter",
"spring",
"summer",
"autumn"
};
printf("Enter day of your birthday (MM.DD): ");
scanf("%[^.]s", month);
m = atoi(month);
if ((m==12) || (m<3)) strcpy(s, season[0]);
else
if ((m>2) && (m<6)) strcpy(s, season[1]);
else
if ((m>5) && (m<9)) strcpy(s, season[2]);
else strcpy(s, season[3]);
printf("Your birthday is in %s\n", s);
 
Номер 2
Необходимо написать программу, которая определяет и выводит на экран время года по дате рождения, заданной пользователем. Какую ошибку содержит приведенный фрагмент кода?
int m;
char month[3], s[8] = "";
char *season[] = {
"winter",
"spring",
"summer",
"autumn"
};
printf("Enter day of your birthday (MM.DD): ");
scanf("%[^.]s", month);
m = atoi(month);
if ((m==12) || (m<3)) strcpy(s, &season[0]);
else
if ((m>2) && (m<6)) strcpy(s, &season[1]);
else
if ((m>6) && (m<9)) strcpy(s, &season[2]);
else strcpy(s, &season[3]);
printf("Your birthday is in %s\n", s);
Ответ:
 (1) неверное объявление массива указателей 
 (2) неверное обращение к элементам массива указателей 
 (3) неверная индексация элементов массива указателей 
 (4) приведенный фрагмент кода не содержит ошибок 
Номер 3
Необходимо написать программу, которая определяет и выводит на экран время года по дате рождения, заданной пользователем. Какую ошибку содержит приведенный фрагмент кода?
int m;
char month[3], s[8] = "";
char *season[] = {
"winter",
"spring",
"summer",
"autumn"
};
printf("Enter day of your birthday (MM.DD): ");
scanf("%[^.]s", month);
m = atoi(month);
if ((m==12) || (m<3)) strcpy(s, season[0]);
else
if ((m>2) && (m<6)) strcpy(s, season[1]);
else
if ((m>6) && (m<9)) strcpy(s, season[2]);
else strcpy(s, season[3]);
printf("Your birthday is in %s\n", s);
Ответ:
 (1) неверное объявление массива указателей 
 (2) неверное обращение к элементам массива указателей 
 (3) неверная индексация элементов массива указателей 
 (4) приведенный фрагмент кода не содержит ошибок 
Упражнение 8:
Номер 1
Указатель p
инициализирован строковой константой: char *p = "тестовая строка"
. Что в данном случае хранится в указателе p
?
Ответ:
 (1) заданная строка 
 (2) адрес заданной строки 
 (3) первый элемент символьного массива 
 (4) указатель p
может хранить только адрес и не может быть инициализирован строковой константой 
Номер 2
Указатель p
инициализирован строковой константой: char *p = "тестовая строка"
. Где в данном случае хранится заданная строка?
Ответ:
 (1) в указателе p
 
 (2) в специальной таблице строк 
 (3) указатель p
может хранить только адрес и не может быть инициализирован строковой константой 
Номер 3
Указатель p
инициализирован строковой константой: char *p = "тестовая строка"
. Какое утверждение является верным в данном случае?
Ответ:
 (1) заданная строка хранится в указателе p
 
 (2) заданная строка хранится в специальной таблице строк 
 (3) указатель p
может хранить только адрес и не может быть инициализирован строковой константой 
Упражнение 9:
Номер 1
Чему будет равно значение переменной sum
после выполнения прииведенного фрагмента кода?
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, sum = 0;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = m;}
sum += *(ptr+i); }
printf("n = %d\n", n);
printf("k = %d\n", k);
for (i=0; i<(n*k); i++) {
if (!(*(ptr+i)%2)) sum += *(ptr+i);
Ответ:
 (1) 120 
 (2) 64 
 (3) 56 
Номер 2
Какая программа вычисляет сумму всех четных элементов за исключением элементов первой строки?
Ответ:
 (1)
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, sum = 0;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[1][0];
printf("n = %d\n", n);
printf("k = %d\n", k);
for (i=0; i<(n*k)-k; i++) {
if (!(*(ptr+i)%2)) sum += *(ptr+i);
 
 (2)
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, sum = 0;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[1][1];
printf("n = %d\n", n);
printf("k = %d\n", k);
for (i=0; i<(n*k)-k; i++) {
if (!(*(ptr+i)%2)) sum += *(ptr+i);
 
 (3)
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, sum = 0;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[1][1];
printf("n = %d\n", n);
printf("k = %d\n", k);
for (i=0; i<(n*k)-k; i++) {
if (*(ptr+i)%2) sum += *(ptr+i);
 
Номер 3
Какая программа вычисляет сумму всех нечетных элементов за исключением элементов первой строки?
Ответ:
 (1)
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, sum = 0;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[1][0];
printf("n = %d\n", n);
printf("k = %d\n", k);
for (i=0; i<(n*k)-k; i++) {
if (!(*(ptr+i)%2)) sum += *(ptr+i);
 
 (2)
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, sum = 0;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[1][1];
printf("n = %d\n", n);
printf("k = %d\n", k);
for (i=0; i<(n*k)-k; i++) {
if (*(ptr+i)%2) sum += *(ptr+i);
 
 (3)
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, sum = 0;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[1][0];
printf("n = %d\n", n);
printf("k = %d\n", k);
for (i=0; i<(n*k)-k; i++) {
if (*(ptr+i)%2) sum += *(ptr+i);
 
Упражнение 10:
Номер 1
В каком случае используется многоуровневая адресация?
Ответ:
 (1)
int x = 100, *ptr1, *ptr2;
ptr1 = &x;
ptr2 = &x;
 
 (2)
int x = 100, *ptr1, **ptr2;
ptr1 = &x;
ptr2 = &ptr1;
 
 (3)
int data[7];
int *pd[] = {&data[0], &data[4], &data[2]};
 
Номер 2
Что такое многоуровневая адресация?
Ответ:
 (1) ситуация, когда два разных указателя хранят адрес одной и той же переменной 
 (2) ситуация, когда один указатель cсылается на другой указатель 
 (3) ситуация, когда указатели хранятся в массиве 
Номер 3
Какие утверждения являются верными для приведенного фрагмента кода?
int x = 100, *ptr1, **ptr2;
ptr1 = &x;
ptr2 = &ptr1;
Ответ:
 (1) указатель ptr1
содержит адрес переменной x
 
 (2) указатель ptr2
содержит адрес переменной x
 
 (3) для получения значения переменной x
необходимо выполнить операцию *ptr1
 
 (4) для получения значения переменной x
необходимо выполнить операцию *ptr2
 
Упражнение 11:
Номер 1
Задан фрагмент кода:
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, el;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[0][0];
На какой элемент массива m
будет указывать указатель ptr+3
?
Ответ:
 (1) m[0][3]
 
 (2) m[1][3]
 
 (3) m[2][0]
 
 (4) m[2][1]
 
Номер 2
Задан фрагмент кода:
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, el;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[1][1];
На какой элемент массива m
будет указывать указатель ptr+3
?
Ответ:
 (1) m[2][1]
 
 (2) m[1][4]
 
 (3) m[2][1]
 
 (4) m[2][4]
 
Номер 3
Задан фрагмент кода:
int m[][5] = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};
int *ptr;
int i, j, n, k, el;
n = sizeof(m)/sizeof(m[0]);
k = sizeof(m[0])/sizeof(m[0][0]);
ptr = &m[0][0];
Чему будет равно значение элемента массива m
, на который будет указывать указатель ptr+3
?
Ответ:
 (1) 3 
 (2) 4 
 (3) 11 
 (4) 12 
Упражнение 12:
Номер 1
Какие утверждения являются верными?
Ответ:
 (1) многоуровневая адресация упрощает программу 
 (2) при использовании многоуровневой адресации уменьшается вероятность возникновения ошибок 
 (3) многоуровневая адресация делает программу плохо читаемой 
Номер 2
Какие утверждения являются неверными?
Ответ:
 (1) многоуровневая адресация упрощает программу 
 (2) при использовании многоуровневой адресации уменьшается вероятность возникновения ошибок 
 (3) многоуровневая адресация делает программу плохо читаемой 
Номер 3
Каковы недостатки многоуровневой адресации?
Ответ:
 (1) усложнение программы 
 (2) плохая читаемость программы 
 (3) увеличение вероятности возникновения ошибок