Т.В. Руденко - Сборник задач и упражнений по языку Си, страница 4
Описание файла
PDF-файл из архива "Т.В. Руденко - Сборник задач и упражнений по языку Си", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 4 страницы из PDF
Что определяеткласс памяти? В каких случаях и каким образом класс памяти определяется поумолчанию? Привести примеры.4.4. Определен ли в Си класс памяти для функций? Если определен, токаким образом; если нет, то почему.4.5. Допустима ли в Си вложенность функций? Можно ли в Си какимто образом управлять видимостью функций?4.6. Объяснить, чем различаются описание ( объявление, declaration ) иопределение ( definition) – по терминологии Б. Кернигана и Д. Ритчи [1, см.стр.71]. Привести примеры.4.7. Эквивалентны ли следующие объявления функций: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);4.8.
Определить, какие конструкции являются определениями, а какиеописаниями; где они могут располагаться и что обозначают:int i;char c = ‘a’;extern int f ( int, char );static int j;register int b; double g( ) { return 3.141592; };extern long k; int h ( int i );static char q( int, double );auto short n;s();static void p( int i ) { };4.9. Верны ли следующие утверждения:a) «тип выражения в операторе return должен совпадать с типом результата функции»b) «функция, которая не возвращает результата (тип результата void),может не содержать оператор return;»c) «функция, которая возвращает результат, может не содержать оператор return E; но вызывает другую функцию, которая содержит такой оператор»d) «функция, которая возвращает результат, может содержать несколько операторов return E; »e) «в Си аргументы функции всегда передаются по значению»16f) «в теле одной функции могут находиться два разных оператора, помеченных одинаковыми метками, если эти операторы находятся в разных блоках»; например,void f(void){ ...
label: S1; ...{ ... label: S2; ... goto label; ...}... goto label; ...}g) «в Си нельзя использовать две (или более) взаимно рекурсивныхфункций»; например, если есть void f(void){... g();...} и void g(void){...f();...}, топрограмма, использующая такие функции, будет ошибочной.h) «в Си можно войти в блок, минуя его заголовок; при этом память подлокальные переменные, описанные в этом блоке, будет отведена, но инициализация (если она есть) выполняться не будет»i) «любая функция, описанная в каком-либо файле, входящем в составпрограммы, может быть использована в этом и любом другом файле этой программы»j) «в этом фрагменте программы нет ошибок »#include <stdio.h>int f(void) { return 100;}void g(void) { printf("O.K.\n");}main(){ int i, j;i = f();j = g(), f();g(); f();printf("i=%d, j=%d f=%d\n", i, j, f());}4.10.
В каких случаях в Си возможна инициализация переменных? Когда она происходит? Как определяется инициализация по умолчанию?4.11. Допустимо ли в Си? Если "да" - опишите семантику этих действий; если "нет" - объясните почему.a) #include <stdio.h>b) #include <stdio.h>main()main(){ int i; int sum = 0;{ int i; int sum = 0;for ( i = 1; i <= 3; i++)for ( i = 1; i <= 3; i++){ sum += i;{ sum += i;{ int i;{ for ( i = 1; i <= 5; i++)for ( i = 1; i <= 5; i++)sum ∗= i;sum ∗= i;}}}}printf("sum=%d\n", sum);printf("sum=%d\n", sum);}}c) #include <stdio.h>d) #include <stdio.h>main()main(){ double x;{ double x;scanf("%f", &x);scanf("%f", &x);17if ( x >= 0 ) goto ok;{ double y = 5.0;x = x ? x : -x;ok: y+=sqrt(x);printf("y = %f\n",y);}}if ( x >= 0 ) goto ok;{ double y;x = x ? x : -x;ok: y = sqrt(x);printf("y = %f\n",y);}}}4.12.
Допустимо ли в Си? Если "да" - опишите семантику этих действий; если "нет" - объясните почему.a) файл f1:b) файл f1:#include<stdio.h>#include<stdio.h>main()static int f(void){ extern int f(int);{ int k;int i;scanf("%d", &k); return k; }i = f(g(5));extern int g(int);printf("i = %d\n", i);main()}{ int i;int g(int k)i = f(); j = g(i);{ k++;printf("i=%d,j=%d\n", i,j);return f(k);}}файл f2:файл f2:extern int f(void);int f(int i) { return i∗i; }int g(int i){ return f()+i; }c) файл f1:#include<stdio.h>extern int i; extern void f(void);main(){ f();printf("i = %d\n", i);f();printf("i = %d\n", i);}d) файл f1:#include<stdio.h>extern int f(void);int i;main(){ printf("res = %d\n", i+f()+f());}файл f2:int f(void){ static int i = 10;return i--;}файл f2:int i = 1;void f(void) { i++; }4.13. Что напечатает следующая программа?a).
#include <stdio.h>int i = 0; void f(void);main(){ int i =1;printf("i1 = %d\n", i);f();{ int i = 2; printf("i4 = %d\n", i);{ i +=1; printf("i5 = %d\n", i); }printf("i6 = %d\n", i);18b). #include <stdio.h>int f( int ); int b = 10;main(){ int c = 3;b = f(c);printf("c=%d b=%d\n",c,b);}int f( int b ){ int c = 5;}printf("i7 = %d\n", i);c--; b++;printf("c=%d b=%d\n",c,b);return c+b;}void f(void){ printf("i2 = %d\n", i);i = i + 10; printf("i3 = %d\n", i); }}c). #include <stdio.h>char g ( char c);int f ( int i, char c){ int k = i+4; char b = g(c) + i;printf("c1 = %c k0 = %d\n", c, k);{ int i = 3; k += i;printf("i1 = %d k1 = %d\n", i, k);c = g(‘b’); printf("c2 = %c\n", c);}i++; printf("i2 = %d k2 = %d\n", i, k);return i∗(b-c); }char g(char c){ c = c + 1; return c; }main(){ int k =2; char c = ‘a’; k = f (k, c);printf("c3 = %c k3 = %d\n", c, k);}e).
#include <stdio.h>int i = 1;int reset ( void );int next ( int );int last ( int );int new ( int );main(){ int i, j; i = reset();for ( j = 1; j <= 3; j++ ){ printf("i=%d j=%d\n", i, j);printf("%d %d\n", next(i), last(i));printf("%d\n", new(i+j));}}int reset ( void ) { return i; }int next ( int j ) { return j = i++; }int last ( int j ){ static int i = 10; return j = i--; }int new ( int i ){ int j = 10; return i = j += i; }d).
#include <stdio.h>int abc( int ); int x;main(){ int b;b = abc(x);printf("b1=%d x1=%d\n",b,x);x = abc(b);printf("b2=%d x2=%d\n",b,x);}int abc( int b ){ static int x = 5;x += 7; b++;printf("b0=%d x0=%d\n",b,x);return x+b;}f). #include <stdio.h>int i = 1;int reset ( void );int next ( void );int last ( void );int new ( int );main(){ int i, j; i = reset();for ( j = 1; j <= 3; j++ ){ printf("i=%d j=%d\n", i, j);printf("%d\n", next(),);printf("%d\n", last());printf("%d\n", new(i+j)); } }в файле f1:static int i =10;int next ( void ) { return i += 1; }int last ( void ) { return i -= 1; }int new ( int i){ static int j = 5; return i=j+=i; }в файле f2:extern int i;int reset ( void ) { return i; }4.14.
Программа. Описать рекурсивную функцию вычисления n! - факториала числа n, основанную на соотношении n! = n∗(n-1)!. С ее помощью найтифакториалы натуральных чисел от1 до 10.194.15. Программа. Описать рекурсивную функцию вычисления xn длявещественного x (x ≠ 0) и целого n:⎧1при n = 0n|n|x = ⎨ 1/xпри n < 0n-1⎩ x∗ xпри n > 0Протестировать эту функцию на подходящих наборах входных данных.4.16. Программа.
Описать рекурсивную функцию вычисленияНОД(n,m) - наибольшего общего делителя неотрицательных целых чисел n и m,основанную на соотношении НОД(n,m) = НОД(m,r), где r - остаток от деления nна m (см. задачу 3.43). С ее помощью найти наибольший общий делитель натуральных чисел a и b. Сравнить эффективность рекурсивной и нерекурсивнойфункций вычисления НОД.4.17. Программа. Описать рекурсивную функцию вычисленияНОД ( n1, n2, n3, ..., nm), воспользовавшись для этого соотношением:НОД ( n1, n2, n3, ... , nk) = НОД ( НОД ( n1, n2, n3, ... , nk-1 ), nk ), k = 3, 4, ...
, m. Сее помощью найти НОД ( a1, a2, a3, ..., a10).4.18. Программа. Описать рекурсивную функцию вычисления n–огочисла Фибоначчи: f0 = 1; f1 = 1; fj+1 = fj-1+ fj; j = 1, 2, 3,.…С ее помощью вычислить 100-ое число Фибоначчи.4.19. Программа. Описать рекурсивную функцию вычисления значенияA(n,m) - функции Аккермана для неотрицательных целых чисел n и m:⎧m+1если n = 0A(n,m) =⎨A(n-1,1)если n ≠ 0, m = 0⎩A(n-1, A(n, m-1)) если n>0, m>0С помощью этой функции найти значение A(5,8).5. УКАЗАТЕЛИ И МАССИВЫ5.1.
Допустимо ли в Си? Если "да" - опишите семантику каждого правильного действия (не принимая во внимание ошибочные); если "нет" - объясните почему.a)....int i,∗ p, j, ∗q;p = &i;q = &p;j = ∗p = 1;q = p-1;∗p += 1;i = ∗++q + ∗p;q -= 1;i = ∗q ++ + ∗q;printf("i=%d, j=%d, ∗p=%d, ∗q=%d \n", i, j, ∗p, ∗q);b)...int x = 1, y; char c = ‘a’;int ∗pi, ∗qi; char ∗pc;pi = &x;∗pi = 3;y = ∗pi;∗pi = c;qi = pi;pc = qi;∗qi+=1;pi++;∗(- - pi) = 5; y = ∗qi+1;20pc = &c;x = (int)pi;c = ∗pc;y = π++∗pc;pi=(int∗)pc;pc = &y;y = (int)π(∗pc)++;pi=(int∗)x;x = qi – pi;pi = pi +5;∗pc++;x = 1+ ∗pi;qi = 0;∗(pi+1)=0;∗pc+=1;pc=(char∗)pi;qi+=pi;pi=&(x+0);5.2.