Проверка остаточных знаний по ППР 1. Выберете правильно записанные константы, представляющие целочисленные значения. a) 123 b) 1E6 c) 0xffffffL d) -‘x’ e) ‘\122’ | f) 0731UL g) 058 h) ‘\122’ i) 0731UL j) 058 | 2. Верно ли записаны выражения? int i, j, k, m; char c, d; i = 1; j = 2; k = -7; m = 0; c = ‘w’ a) d = ’a’+1 < c b) m = - i - 5 * j >= k+1 c) i + j++ + k = = -2*j | d) m = c = ! 87 e) m = c != 87 f) k %= m = 1 + n / 2 | 3. Верно ли решена задача: «значение целочисленной переменной с увеличить на 1; целочисленной переменной а присвоить значение, равное удвоенному значению переменной с ». int a, c; c = 5; a). c ++ ; a = 2 * c; b). a = 2 * c++ ; c). c += 1; a = c + c; d). a = c++ + c; e). ++c; a = c + c; f). a = ++ c + c; g). a = c += 1 + c; h). a = (c+=1)+c; 4. Что будет напечатано в результате работы следующего фрагмента программы? double d; float f; long lng; int i; i = lng = f = d = 1000000/3; printf("i = %d lng = %ld f = %f d = %f\n", i, lng, f, d); a) i=000000 lng=333333 f=333333.000000 d=333333 b) i=333333 lng=333333 f=333333.000000 d=333333.000000 c) i=333333 lng=333333 f=333333 d=333333.000000 d) i=333333 lng=333333.000000 f=333333.000000 d=333333.000000 5. Что будет напечатано в результате выполнения следующего фрагмента программы? double d = 3.2, x; int i = 2, y; y = d*( x = 2.5 / d); printf ("x = %f; y = %d\n", x, y); a) x=0 y=0 b) x=0.781250 y=1 c) x=1 y=1 d) x=0.781250 y=0 e) x=0.781250 y=2 6. Верны ли следующие утверждения: a) «любое выражение в Си может быть преобразовано в оператор добавлением к нему точки с запятой ( ; ) » b) «пустой оператор в Си - это отсутствие каких-либо символов в том месте конструкции, где по синтаксису может находиться оператор» c) «составной оператор ( блок ) в Си - это совокупность операторов, заключенная в фигурные скобки { }» d) «оператор присваивания в Си - это выражение вида переменная = выражение» e) «тип выражения в условии в операторе if , в условии завершения цикла в операторах цикла может быть скалярным (т.е. любым целочисленным, любым вещественным либо указателем )» f) «в блоке описания/объявления и операторы могут располагаться в любом порядке; единственное требование - использование не должно предшествовать описанию/объявлению» 7. Эквивалентны ли следующие фрагменты программы: a) if (e1) if (e2) S1; else S2; b) if (e1) { if (e2) S1; else S2; } c) if (e1) { if (e2) S1; } else S2; d) if (e1) if (e2) S1; else ; else S2; e) if (e1) if (e2) S1; else S2; else ; Замечание: здесь e1 и e2 - выражения допустимого в этом случае типа; S1 и S2 - произвольные операторы. 8. Верно ли утверждение: « действие оператора continue; в приведенных ниже примерах эквивалентно действию оператора go to next; ». a) switch ( E ) { case C1: S; case C2: S; continue; case C3: S; } next:; ... b) switch ( E ) { case C1: S; case C2: S; continue; case C3: next: S; } c) next: switch ( E ) { case C1: S; case C2: S; continue; case C3: S; } Замечание: здесь E, E1, E2, E3 - выражения допустимого в этом случае типа ; S - произвольный оператор; C1, C2 C3 - константы подходящего типа. 9. Верны ли следующие утверждения: a) «цикл for ( ; ; ) является бесконечным циклом, и поэтому его использование в Си запрещено» b) «семантика операторов цикла while и do-while в Си различается только тем, что тело цикла while может не выполниться ни разу, а тело цикла do-while выполнится хотя бы один раз.» c) «каждая ветвь в операторе switch должна быть помечена одной или несколькими различными целочисленными константами или константными выражениями» d) «если в операторе switch нет ветви default, то значение выражения выбора должно совпадать с одной из констант ветвей case» e) «в операторе switch ветви case и ветвь default можно располагать в любом порядке» 10. Верно ли решена задача: «найти сумму первых 100 натуральных чисел»? a) i = 1; sum = 0; for ( ; i <= 100; i++) sum += i; b) sum = 0; for ( i = 1; i <= 100;) sum += i++; c) for ( i = 1, sum = 0; i <= 100; sum += i+, i++); d) for ( i = 1, sum = 0; i <= 100; sum += i++); e) for ( i = 0, sum = 0; i++, i <= 100; sum += i); 11. Верно ли утверждение: « действие оператора break; в приведенных ниже примерах эквивалентно действию оператора go to next; ». a) while ( E ) { S; ... break; ... S; next: ; } b) while ( E ) { S; ... break; ... S; } next: ; ... c) do { S; ... break; ... S; } while ( E ); next: ; ... d) for ( E1; E2; E3) { S; ... break; ... S; next: ; } e) while ( E) { S; ... for ( E1; E2; E3) { S; ... break; ... S; } next: ; ... S; } f) while ( E ) { S; ... for ( E1; E2; E3) { S; ... break; ... S; } ... S; next: ; } g) while ( E) { S; ... for ( E1; E2; E3) { S; ... break; ... S; } ... S; } next: ; 12. Что напечатает следующая программа? # include <stdio.h> main() { int x, y; x = y = 0; while ( y < 10 ) ++y; x += y; printf ("x = %d y = %d\n", x, y);} a) x=9 y=10 b) x=10 y=9 c) x=10 y=10 d) x=11 y=10 13. Эквивалентны ли следующие объявления функций: a) double f ( ); и double f (void); b) char g ( int i, char c); и char g ( int, char); c) h ( double x); и int h ( double x); d) void h ( int ); и h ( int ); e) extern int q ( int ); и int q ( int); f) static void s ( char c); и void s ( char c); 14. Определить, какие конструкции являются определениями, а какие описаниями a) int i; b) char c = ‘a’; c) extern int f ( int, char ); d) static int j; e) register int b; f) double g( ) { return 3.141592; }; g) extern long k; h) int h ( int i ); i) static char q( int, double ); j) auto short n; k) s(); l) static void p( int i ) { }; 15. Определить какие из перечисленных выражений являются верными. a) Функция getchar() считывает один символ из стандартного входного потока. b) При успешном завершении putchar() возвращает 1, а при ошибке - 0. c) Управляющие символы таблицы ASCII выводятся на экран функцией getche() в виде специальных обозначений. d) Функция getch() получает символ непосредственно с клавиатуры с эхо-печатью и буферизацией. e) Функция getchar() осуществляет буферизованный ввод символа с отображением на экране (эхо-печатью). f) При успешном завершении функция getchar() возвращает символ, преобразованный в целочисленный тип int 16. Верны ли следующие утверждения: a) «тип выражения в операторе return должен совпадать с типом результата функции» b) «функция, которая не возвращает результата (тип результата void), может не содержать оператор return;» c) «функция, которая возвращает результат, может не содержать оператор return E; но вызывает другую функцию, которая содержит такой оператор» d) «функция, которая возвращает результат, может содержать несколько операторов return E; » e) «в Си аргументы функции всегда передаются по значению» f) «в теле одной функции могут находиться два разных оператора, помеченных одинаковыми метками, если эти операторы находятся в разных блоках»; например, void f(void) { ... label: S1; ... { ... label: S2; ...goto label; ...} ...goto label;... } g) «в Си нельзя использовать две (или более) взаимно рекурсивных функций»; например, если есть void f(void){... g();...} и void g(void){...f();...}, то программа, использующая такие функции, будет ошибочной. h) «в Си можно войти в блок, минуя его заголовок; при этом память под локальные переменные, описанные в этом блоке, будет отведена, но инициализация (если она есть) выполняться не будет» i) «любая функция, описанная в каком-либо файле, входящем в состав программы, может быть использована в этом и любом другом файле этой программы» 17.Верны ли следующие утверждения: a) Функция gets считывает строку из стандартного входного потока. b) Функция puts копирует в стандартный поток stdout последовательность символов, начиная с адреса s и до конца файла. c) При успешном завершении функция gets возвращает указатель на введенную строку. d) При успешном завершении функция puts возвращает последний выведенный символ строки. e) Нуль-терминатор при выводе функцией puts заменяется на символ ‘\n’ f) Признаком конца ввода для функции gets является нажатие клавиши ENTER. g) Cимвол ‘\n’ функция gets заменяет на нуль-терминатор '\0' и записывает его в конец строки. h) При успешном завершении функция puts возвращает 1. 18. Верно ли решена следующая задача: «читать символы из стандартного входного потока, пока код каждого следующего символа больше кода предыдущего; определить, сколько символов было прочитано» a) ... i = 0; while ( getchar() < getchar() ) i = i + 2; b) … i = 0; c = getchar(); while ( c < ( c = getchar() ) ) i++; c) … i = 0; c = getchar(); while ( c < ( d = getchar()) ) { i++; c = d;} d) … i = 0; c = getchar(); while (d = getchar(), c<d)) { i++; c = d; } e) … i = 0; c = getchar(); while ( c != EOF && ( d = getchar()) != EOF && c<d ) { i++; c=d; } 19. Пусть целочисленный массив a содержит 100 элементов. Верно ли решена задача: "написать фрагмент программы, выполняющий суммирование всех элементов массива a". a) int a[100], sum, i; sum = 0; for ( i = 0; i < 100; ++i ) sum += a[i]; b) int a[100], *p, sum; sum = 0; for ( p = a; p < &a[100]; ++p ) sum = sum + *p; c) int a[100], *p, sum; sum = 0; for ( p = &a[0]; p < &a[100]; p++ ) sum += *p; d) int a[100], sum, i; sum = 0; for ( i = 0; i < 100; ++i ) sum += *(a+i); e) int a[100], sum, i; sum = 0; for ( i = 0; i < 100; ++a, ++i ) sum += *a; f) int a[100], *p, sum, i; sum = 0; for ( i = 0, p = a; i < 100; ++i ) sum += p[i]; g) int a[100], *p, sum, i; sum = 0; for ( i = 0, p = a; i < 100; ++i ) sum += *(p+i); 20. Эквивалентны ли следующие фрагменты программы на Си? a) a[ i ] /= k+m и a[ i ] = a[ i ]/k+m b) a[ i ] /= k+m и a[ i ] = a[ i ]/(k+m) c) a[ i++]+=3 и a[i++] = a[ i++]+3 d) a[ i++]+=3 и a[ i ] = a[ i++]+3 e) a[ i++]+=3 и a[ i++ ] = a[ i ]+3 f) a[ i++]+=3 и a[ i ] = a[ i ]+3; i++; 21. Что напечатает следующая программа? #include <stdio.h> char str[ ] = "SSSWILTECH1\1\11W\1WALLMP1"; main() { int i, c; for ( i = 2; ( c = str [ i ] ) != ‘\0’; i++) { switch (c) { case ‘a’: putchar(‘i’); continue; case ‘1’: break; case 1: while ( ( c = str [++ i ] ) != ‘\1’ && c != ‘\0’); case 9: putchar(‘S’); case ‘E’: case ‘L’: continue; default: putchar(c); continue; } putchar(‘ ’); } putchar(‘\n’); } a) SSSWILTECHWWALLMP b) SWTCH SWAMP c) SSSWILTECH1\1\11W\1WALLMP1 d) 1\1\11\11 22. Что напечатает следующая программа? #include <stdio.h> int a[ ] = { 0, 1, 2, 3, 4 }; main() { int i, *p; for ( p = a, i = 0; p+i <= a+4; i++ ) printf("%d ", * (p+i)); printf("\n"); for ( p = a+4, i=0; i <= 4; i++ ) printf("%d ", p[ -i ]); printf("\n"); for ( p = a+4; p >= a; p -- ) printf("%d ", a[ p - a ]); printf("\n"); } a) 0 1 2 3 4 0 1 2 3 4 4 3 2 1 0 b) 1 2 3 4 5 5 4 3 2 1 5 4 3 2 1 | c) 0 1 2 3 4 4 3 2 1 0 4 3 2 1 0 d) 1 2 3 4 5 5 4 3 2 1 5 4 3 2 1 | e) 0 1 2 3 4 0 1 2 3 4 4 3 2 1 0 f) 4 3 2 1 0 0 1 2 3 4 0 1 2 3 4 | 23. Верны ли следующие утверждения. a) В функцию как аргумент передается весь массив. b) Размер указателя зависит от типа объекта, на который он указывает. c) Операция sizeof возвращает размер своего операнда в байтах. d) В функцию передается адрес первого элемента массива. e) В функцию передается копия массива. f) Операции sizeof может быть применена не только к объектам, но и к типу данных. g) Все указатели имеютодин и тот же размер. 24. Допустимо ли в Си ? int i,* p, j, *q; p = &i; a) q = &p; b) j = *p = 1; c) q = p-1; d) *p += 1; e) i = *++q + *p; f) q -= 1; g) i = *q ++ + *q; 25. Что напечатает следующая программа? #include <stdio.h> int a[ ] = { 8, 7, 6, 5, 4 }; int *p[ ] = { a, a+1, a+2, a+3, a+4 }; int **pp = p; main() { printf("*a=%d **p=%d **pp=%d\n", *a, **p, **pp ); ++*pp; printf("pp-p=%d *pp-a=%d **pp=%d\n", pp-p, *pp-a, **pp ); } a) a=8 p=42474778 pp=8 pp-p=1 pp-a=1 pp=7 b) a=8 p=Null pp=8 pp-p=0 pp-a=2 pp=6 c) a=8 p=42474778 pp=8 pp-p=2 pp-a=2 pp=6 | d) a=8 p=42474778 pp=8 pp-p=1 pp-a=2 pp=7 e) a=Null p=Null pp=Null pp-p=0 pp-a=0 pp=0 f) a=8 p=8 pp=8 pp-p=1 pp-a=1 pp=7 | 26. Что напечатает следующая программа? #include <stdio.h> char *c[ ] = { "ENTER", "NEW", "POINT", "FIRST" }; char ** cp[ ] = { c+3, c+2, c+1, c }; char ***cpp=cp; main() { printf("%s", **++cpp ); printf("%s ", * -- *++cpp+3 ); printf("%s", *cpp[ -2 ]+3 ); printf("%s\n", cpp[ -1 ][ -1 ]+1 ); } a) ENTER NEW POINT FIRST b) ENTER FIRST c) POINTER STEW d) NEW POINT 27. Верно ли решена задача: « Описать функцию, меняющую местами значения двух переменных символьного типа. Использовать эту функцию для изменения значений символьных переменных a и b.» a) void swap ( char x, char y) b) void swap ( char *x, char *y) { char t; t = x; x = y; y = t;} { char *t; t = x; x = y; y = t;} main() main() { char a,b; { char a,b; scanf("%c%c", &a, &b); scanf("%c%c", &a, &b); swap(a,b); swap(&a, &b); printf("a=%c,b=%c\n",a,b); printf("a=%c,b=%c\n",a,b); } } c) void swap ( char *x, char *y) d) void swap ( char *x, char *y) { char t; t = *x; *x = *y; *y = t;} { char t; t = *x; *x = *y; *y = t;} main() main() { char a,b; { char a,b; scanf("%c%c", &a, &b); scanf("%c%c", &a, &b); swap(a,b); swap(&a, &b); printf("a=%c,b=%c\n",a,b); printf("a=%c,b=%c\n",a,b); } } e) void swap ( char x, char y) f) void swap ( char &x, char &y) { char *t; t = &x; &x = &y; &y = t;} { char t; t = x; x = y; y = t;} main() main() { char a,b; { char a,b; scanf("%c%c", &a, &b); scanf("%c%c", &a, &b); swap(&a, &b); swap(a, b); printf("a=%c,b=%c\n",a,b); printf("a=%c,b=%c\n",a,b); } } 28. Что напечатает следующая программа? #include <stdio.h> int a[ 3 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; main() { int i; for ( i = 0; i < 2; i ++ ) printf(" a[ i ][2–i]=%d *(*(a+i)+i)=%d\n", a[ i ][2–i ], *(*(a+i)+i));} a) a[ i ][2–i]=3 *(*(a+i)+i)=1 a[ i ][2–i]=5 *(*(a+i)+i)=5 b) a[ i ][2–i]=2 *(*(a+i)+i)=2 a[ i ][2–i]=5 *(*(a+i)+i)=5 | c) a[ i ][2–i]=5 *(*(a+i)+i)=1 a[ i ][2–i]=3 *(*(a+i)+i)=3 d) a[ i ][2–i]=3 *(*(a+i)+i)=1 a[ i ][2–i]=3 *(*(a+i)+i)=1 | 29. Верны ли следующие утверждения. a) В функцию как аргумент передается весь массив. b) Если двигаться по массиву в порядке расположения элементов в памяти, то правый индекс массива изменяется быстрее левого. c) В функцию передается указатель на первый элемент массива. d) При передаче многомерных массивов функции следует определить все размерности, кроме самой левой. 30. Определить какие из перечисленных утверждений являются верными: a) Строка-это одномерный массив символов, заканчивающийся символом '\0' b) Специальные функции – макросы для проверки типа символьных литер собраны в библиотеке <string.h> c) Программист не имеет возможность контролировать выход за границу строки. d) Функция isprint(c) возвращает ненулевое значение если c-печатаемый символ, включая пробел. e) Функция int toupper (int с) переводит с на нижний регистр f) В Си осуществляется автоматический контроль выхода за границы массива. g) Функция ispunct(c) возвращает символ с преобразованный к верхнему регистру. h) Имя строки является указателем на ее первый символ. i) Аргумент функции isxdigit(c) имеет тип int j) Строка - особый вид массива, который имеет символ конца, что позволяет контролировать выход за границы строки. k) Функция isascii(c) проверяет, соответствует ли ее аргумент набору ASCII-символов (О-127); l) Неинициализированный указатель (char *s;) содержит "мусор", который будет восприниматься как адрес. m) Функция int tolower(int с) переводит с на верхний регистр; n) При создании строки надо следить за тем, чтобы строка заканчивалась нуль-терминатором. o) Функция isalpha(c) проверяет является ли символ с латинской буквой. p) Функция iscntrl(c) возвращает код ошибки если символ с не является управляющим символом. q) Функция isxdigit(c) переводит символ с в шестнадцатеричную систему счисления. r) Функция isspace(c) проверяет знак пробела, но не проверяет переход на новую строку и табуляцию. 31. Верны ли следующие утверждения: a) описание структуры начинается с ключевого слова struct и содержит список объявлений членов структуры, заключенный в фигурные скобки; b) за словом struct должен следовать идентификатор, называемый тегом структуры; c) тег структуры используется в качестве имени типа при описании переменных; d) имена членов структуры могут совпадать с именами переменных в той же области видимости; e) имя тега структуры может совпадать с именами переменных в той же области видимости; f) имя тега структуры может совпадать с именами членов этой структуры; g) имена членов разных структур могут совпадать; h) за описанием структуры (после правой закрывающей фигурной скобки) обязательно должен следовать список переменных; i) для доступа к членам структуры используется операция . (точка); j) структуры не могут быть вложенными; k) структурную переменную при ее описании можно инициализировать списком константных выражений, заключенным в фигурные скобки; 32. Верны ли следующие утверждения: a) к структурам одного типа применима операция присваивания; b) к структурам одного типа, не содержащим вложенных структур, применима операция сравнения ( выполняется почленное сравнение ); c) параметром функции может быть указатель на структуру, но не сама структура; d) параметры функции – структуры передаются по значению; e) результатом работы функции может быть структура; a) результатом работы функции может быть указатель на структуру; b) функция sizeof(struct any) выдает результат, равный сумме длин всех полей этой структуры; h) к структурам применима операция взятия адреса. |