Главная / Программирование /
Программирование на языке C в Microsoft Visual Studio 2010 / Тест 7
Программирование на языке C в Microsoft Visual Studio 2010 - тест 7
Упражнение 1:
Номер 1
Какие элементы могут быть операндами оператора адресации &
?
Ответ:
 (1) переменная 
 (2) выражение 
 (3) константа 
 (4) элемент массива 
Номер 2
Какие элементы не могут быть операндами оператора адресации &
?
Ответ:
 (1) переменная 
 (2) выражение 
 (3) константа 
 (4) элемент массива 
Номер 3
Что такое указатель?
Ответ:
 (1) переменная, инициализированная каким-либо значением 
 (2) переменная, содержащая адрес другой переменной 
 (3) самостоятельный тип данных в языке С 
Упражнение 2:
Номер 1
Какие утверждения будут верными после выполнения приведенного фрагмента кода?
int x = 99;
int *p1, *p2;
p1 = &x;
p2 = p1;
Ответ:
 (1) указатель p2
содержит адрес указателя p1
 
 (2) p2
разыменовывает указатель p1
 
 (3) оба указателя (p1
и р2
) ссылаются на х
 
Номер 2
Чему будет равно значение переменной z
после выполнения приведенного фрагмента кода?
int x = 99, y = 100, z;
int *p1, *p2, *p3;
p1 = &x;
p2 = &y;
p3 = p2;
x = y;
z = *p1 + *p2 + *p3;
Ответ:
 (1) 299 
 (2) 300 
 (3) сумме адресов, хранящихся в указателях p1
, p2
и p3
 
 (4) при вычислении значения переменной z
возникнет ошибка 
Номер 3
В каком случае значение переменной z
будет равно изначальному значению переменной x
?
Ответ:
 (1)
int x = 99, y = 100, z;
int *p1, *p2;
p1 = &x;
p2 = p1;
z = *p2;
 
 (2)
int x = 99, y = 100, z;
int *p1, *p2;
p1 = &x;
p2 = &y;
x = y;
z = *p1;
 
 (3)
int x = 99, y = 100, z;
int *p1, *p2;
p1 = &y;
p2 = p1;
y = x;
z = *p2;
 
Упражнение 3:
Номер 1
Чему будут равны значения переменных a
, b
и c
после выполнения приведенного фрагмента кода?
char a='A', b='B', c='C';
char *pc;
pc = &a;
c = *pc;
*pc = 'C';
b = a;
Ответ:
 (1) a = 'A'
, b = 'A'
, c = 'A'
 
 (2) a = 'C'
, b = 'A'
, c = 'A'
 
 (3) a = 'C'
, b = 'C'
, c = 'A'
 
Номер 2
Чему будут равны значения переменных a
, b
и c
после выполнения приведенного фрагмента кода?
int a=10, b=20, c=30;
int *ptr;
ptr = &a;
c = *ptr;
*ptr = 30;
b = a;
Ответ:
 (1) a = 10
, b = 10
, c = 10
 
 (2) a = 30
, b = 30
, c = 10
 
 (3) a = 30
, b = 10
, c = 10
 
Номер 3
Чему будут равны значения переменных a
, b
и c
после выполнения приведенного фрагмента кода?
char a='A', b='B', c='C';
char *pc1, *pc2;
pc1 = &c;
pc2 = pc1;
c = b;
*pc2 = a;
Ответ:
 (1) a = 'A'
, b = 'B'
, c = 'C'
 
 (2) a = 'A'
, b = 'B'
, c = 'B'
 
 (3) a = 'A'
, b = 'B'
, c = 'A'
 
Упражнение 4:
Номер 1
Что делает приведенная программа?
#include <stdio.h>
#include <conio.h>
int main()
{
int n=0, i=0, j=0;
char ch, str[30]="";
char *ptr1, *ptr2;
printf("Введите строку: ");
scanf("%s", str);
printf("Введите символ: ");
ch = _getche();
ptr1 = str;
while(*ptr1!='\0')
{
ptr2 = str;
while (*ptr2!='\0') {
if(*ptr1==*ptr2) n++;
++ptr2;
}
printf("\n%c - %d", *ptr1, n);
n = 0;
++ptr1;
}
printf("\n");
return 0;
}
Ответ:
 (1) определяет количество символов в строке 
 (2) определяет количество вхождений заданного символа в строку 
 (3) определяет количество вхождений каждого символа в строку 
Номер 2
Какая программа определяет количество вхождений каждого символа в строку?
Ответ:
 (1)
#include <stdio.h>
#include <conio.h>
int main()
{
int n=0, i=0;
char ch, str[30] = "";
char *ptr;
printf("Введите строку: ");
scanf("%s", str);
printf("Введите символ: ");
ch = _getche();
ptr = str;
while(*ptr!='\0')
{
if(*ptr==ch) n++;
ptr++;
}
printf("\n%c - %d", ch, n);
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
int n=0, i=0, j=0;
char ch, str[30]="";
char *ptr1, *ptr2;
printf("Введите строку: ");
scanf("%s", str);
printf("Введите символ: ");
ch = _getche();
ptr1 = str;
while(*ptr1!='\0')
{
ptr2 = str;
while (*ptr2!='\0') {
if(*ptr1==*ptr2) n++;
++ptr2;
}
printf("\n%c - %d", *ptr1, n);
n = 0;
++ptr1;
}
printf("\n");
return 0;
}
 
 (3)
#include <stdio.h>
#include <conio.h>
int main()
{
int n=0, i=0, j=0;
char ch, str[30]="";
char *ptr1, *ptr2;
printf("Введите строку: ");
scanf("%s", str);
printf("Введите символ: ");
ch = _getche();
ptr1 = str;
ptr2 = str;
while(*ptr1!='\0')
{
while (*ptr2!='\0') {
if(*ptr1==*ptr2) n++;
++ptr2;
}
printf("\n%c - %d", *ptr1, n);
n = 0;
++ptr1;
}
printf("\n");
return 0;
}
 
Номер 3
Какая программа определяет количество вхождений каждого символа в строку?
Ответ:
 (1)
#include <stdio.h>
#include <conio.h>
int main()
{
int n=0, i=0, j=0;
char ch, str[30]="";
char *ptr1, *ptr2;
printf("Введите строку: ");
scanf("%s", str);
printf("Введите символ: ");
ch = _getche();
ptr1 = str;
while(*ptr1!='\0')
{
ptr2 = str;
while (*ptr2!='\0') {
if(*ptr1==*ptr2) n++;
}
printf("\n%c - %d", *ptr1, n);
n = 0;
}
printf("\n");
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
int n=0, i=0, j=0;
char ch, str[30]="";
char *ptr1, *ptr2;
printf("Введите строку: ");
scanf("%s", str);
printf("Введите символ: ");
ch = _getche();
ptr1 = str;
ptr2 = str;
while(*ptr1!='\0')
{
while (*ptr2!='\0') {
if(*ptr1==*ptr2) n++;
++ptr2;
}
printf("\n%c - %d", *ptr1, n);
n = 0;
++ptr1;
}
printf("\n");
return 0;
}
 
 (3)
#include <stdio.h>
#include <conio.h>
int main()
{
int n=0, i=0, j=0;
char ch, str[30]="";
char *ptr1, *ptr2;
printf("Введите строку: ");
scanf("%s", str);
printf("Введите символ: ");
ch = _getche();
ptr1 = str;
while(*ptr1!='\0')
{
ptr2 = str;
while (*ptr2!='\0') {
if(*ptr1==*ptr2) n++;
++ptr2;
}
printf("\n%c - %d", *ptr1, n);
n = 0;
++ptr1;
}
printf("\n");
return 0;
}
 
Упражнение 5:
Номер 1
В результате выполнения какого фрагмента кода значение разности p1 - p2
будет не больше 2?
Ответ:
 (1)
char str[10] = "Test", *p1, *p2;
p1 = str;
p2 = p1;
p2--;
p1++;
 
 (2)
long num=3, *p1, *p2;
p2 = #
p1 = p2;
p1++;
 
 (3)
char str[10] = "Test", *p1, *p2;
p1 = str;
p2 = p1;
p1++;
 
 (4)
short num=10, *p1, *p2;
p1 = #
p2 = p1;
p1++;
 
Номер 2
В результате выполнения какого фрагмента кода значение разности p1 - p2
будет больше 2?
Ответ:
 (1)
char str[10] = "Test", *p1, *p2;
p1 = str;
p2 = p1;
p2--;
p1++;
 
 (2)
long num=3, *p1, *p2;
p2 = #
p1 = p2;
p1++;
 
 (3)
char str[10] = "Test", *p1, *p2;
p1 = str;
p2 = p1;
p1++;
 
 (4)
short num=10, *p1, *p2;
p1 = #
p2 = p1;
p1++;
 
Номер 3
Чему будет равно значение переменной i
после выполнения приведенного фрагмента кода?
int i;
char str[10] = "Test", *p1, *p2;
p1 = str;
p2 = p1;
p2--;
p1++;
i = 2 * (p1 - p2);
Ответ:
 (1) 1 
 (2) 2 
 (3) 4 
Упражнение 6:
Номер 1
Какая запись с использованием указателя эквивалента заданной записи инкремента?
int x = 20;
x++;
Ответ:
 (1)
int x = 20, *p;
p = &x;
*p = x;
p++;
 
 (2)
int x = 20, *p;
p = &x;
*p++;
 
 (3)
int x = 20, *p;
p = &x;
(*p)++;
 
Номер 2
Какое выражение выполняет операцию инкремента значения, на которое ссылается указатель?
Ответ:
 (1) (*p)++
 
 (2) *p++
 
 (3)
*p = 10;
p++;
 
Номер 3
Какое действие будет выполнено первым при выполнении оператора *p++ = 10
?
Ответ:
 (1) указатель будет увеличен на количество байт, соответсвующее его типу 
 (2) по адресу, записанному в указателе p
, будет записано значение 10 
 (3) значение, на которое ссылается указатель p
, будет увеличено на 10 
Упражнение 7:
Номер 1
Какие операции допустимы для заданных переменных?
int n = 123, t;
void *p;
int *pn;
pn = &n;
Ответ:
 (1) p = pn
 
 (2) pn = p
 
 (3) t = *pn
 
 (4) t = *p
 
Номер 2
Какие операции недопустимы для заданных переменных?
int n = 123, t;
void *p;
int *pn;
pn = &n;
Ответ:
 (1) p = pn
 
 (2) pn = p
 
 (3) t = *pn
 
 (4) t = *p
 
Номер 3
При компиляции какого фрагмента кода возникнет ошибка?
Ответ:
 (1)
int n = 123, t, *pn;
void *p;
pn = &n;
p = pn;
t = *pn;
 
 (2)
int n = 123, t, *pn;
void *p;
pn = &n;
p = pn;
t = *p;
 
 (3)
int n = 123, t, *pn;
void *p;
pn = &n;
p = &n;
t = *pn;
 
Упражнение 8:
Номер 1
Требуется написать программу, которая будет копировать одну строку в другую с помощью указателей. Какая программа выполняет поставленную задачу?
Ответ:
 (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;
ptr2 = str2;
while (*ptr1!='\0') {
*ptr2 = *ptr1;
ptr1++;
}
printf("str2 = %s\n", str2);
return 0;
}
 
 (2)
#include <stdio.h>
#include <conio.h>
int main()
{
char str1[10] = "", str2[10] = "";
char *ptr1;
printf("Введите строку: %s", str1);
scanf("%s", str1);
ptr1 = str1;
while (*ptr1!='\0') {
if (*ptr1=='\0') {
*str2 = '\0';
break;
}
*str2 = *ptr1;
ptr1++;
str2++;
}
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;
ptr2 = str2;
while (*ptr1!='\0') {
if (*ptr1=='\0') {
*ptr2 = '\0';
break;
}
*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;
ptr2 = str2;
while (*ptr1!='\0') {
if (*ptr1=='\0') {
*ptr2 = '\0';
break;
}
*ptr2 = *ptr1;
ptr1++;
}
printf("str2 = %s\n", str2);
return 0;
}
Ответ:
 (1) программа выполняет поставленную задачу 
 (2) программа не выполняет поставленную задачу, так как в цикле не происходит изменение указателя ptr2
 
 (3) программа не выполяет поставленную задачу, так как неверно задано условие цикла 
Номер 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;
ptr2 = str2;
while (*ptr1!='\0') {
if (*ptr1=='\0') {
*ptr2 = '\0';
break;
}
*ptr2 = *ptr1;
ptr1++;
ptr2++;
}
printf("str2 = %s\n", str2);
return 0;
}
Ответ:
 (1) копирует строку str1
в строку str2
 
 (2) копирует строку str2
в строку str1
 
 (3) просматривает все символы строки str1
 
 (4) просматривает все символы строки str2
 
Упражнение 9:
Номер 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
 
Упражнение 10:
Номер 1
В программе объявлен указатель void *p
. Какое утверждение является верным?
Ответ:
 (1) указатель p
может содержать адрес только объекта типа void
 
 (2) к указателю p
неприменима операция разыменования 
 (3) указатель p
может быть автоматически преобразован к любому типу 
Номер 2
В программе объявлен указатель void *p
. Какие утверждения являются неверными?
Ответ:
 (1) указатель p
может содержать адрес только объекта типа void
 
 (2) к указателю p
неприменима операция разыменования 
 (3) указатель p
может быть автоматически преобразован к любому типу 
Номер 3
Почему к указателю типа void*
неприменима операция разыменования?
Ответ:
 (1) потому что не существует автоматического преобразования от void*
к указателю на другой тип 
 (2) потому что неизвестен тип, на который он ссылается 
 (3) потому что указатель void*
может указывать только на функцию 
Упражнение 11:
Номер 1
В приведенном фрагменте кода используется константный указатель:
int lec = 7, qst = 11;
int *const plec = &lec;
int *pqst;
pqst = &qst;
(*plec)++;
printf("Number of the next lection is %d\n", lec );
Какая ошибка содержится в данном коде?
Ответ:
 (1) константный указатель plec
должен адресовать константу, а переменная lec
не является константой 
 (2) константный указатель plec
не может быть изменен 
 (3) приведенный фрагмент не содержит ошибок 
Номер 2
В каком фрагменте кода при использовании константного указателя допущена ошибка?
Ответ:
 (1)
int lec = 7, qst = 11;
int *const plec = &lec;
int *pqst;
pqst = &qst;
plec++;
 
 (2)
int lec = 7, qst = 11;
int *const plec = &lec;
int *pqst;
pqst = &qst;
(*plec)++;
printf("Number of the next lection is %d\n", lec );
 
 (3)
int lec = 7, qst = 11;
int *const plec;
int *pqst;
pqst = &qst;
plec = &lec;
 
Номер 3
Какой фрагмент кода не содержит ошибок в использовании константного указателя?
Ответ:
 (1)
int lec = 7, qst = 11;
int *const plec = &lec;
int *pqst;
pqst = &qst;
plec++;
 
 (2)
int lec = 7, qst = 11;
int *const plec = &lec;
int *pqst;
pqst = &qst;
(*plec)++;
printf("Number of the next lection is %d\n", lec );
 
 (3)
int lec = 7, qst = 11;
int *const plec;
int *pqst;
pqst = &qst;
plec = &lec;
 
Упражнение 12:
Номер 1
Какое выражение нужно вставить в обозначенное место приведенного кода для того, чтобы значение переменной z
было равно 40?
int x = 10, y = 20, z;
int *p1, *p2;
p1 = &x;
p2 = p1;
<Выражение>
z = (x==y) ? (x+y) : (y-x);
Ответ:
 (1) x = y;
 
 (2) p1 = &y;
 
 (3) *p2 = y;
 
Номер 2
Какое выражение нужно вставить в обозначенное место приведенного кода для того, чтобы значение переменной z
было равно 10?
int x = 10, y = 20, z;
int *p1, *p2;
p1 = &x;
p2 = p1;
<Выражение>
z = (x==y) ? (x+y) : (y-x);
Ответ:
 (1) x = y;
 
 (2) p1 = &y;
 
 (3) *p2 = y;
 
Номер 3
Какое выражение нужно вставить в обозначенное место приведенного кода для того, чтобы значение переменной z
было равно 0?
int x = 10, y = 20, z;
int *p1, *p2;
p1 = &x;
p2 = p1;
<Выражение>
z = (x==y) ? (x+y) : (y-x);
Ответ:
 (1) x = y;
 
 (2) p1 = &y;
 
 (3) *p2 = y;
 
 (4) переменная z
никогда не примет значение 0