![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Функции и структура программы
4.1. Перечислите все существенные изменения, внесенные стандартом ANSI в правила объявления и описания функций. Какова цель этих изменений?
4.2. Перечислить все случаи, когда в Си используется тип void. Дать определение этого типа.
4.3. Перечислить классы памяти, определенные в Си. Что определяет класс памяти? В каких случаях и каким образом класс памяти определяется по умолчанию? Привести примеры.
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) «в Си аргументы функции всегда передаются по значению» f) «в теле одной функции могут находиться два разных оператора, помеченных одинаковыми метками, если эти операторы находятся в разных блоках»; например, 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); if (x >= 0) goto ok; if (x >= 0) goto ok; { double y = 5.0; { double y; x = x? x: -x; x = x? x: -x; ok: y+=sqrt(x); ok: y = sqrt(x); printf("y = %f\n",y);} 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: d) файл f1: #include<stdio.h> #include<stdio.h> extern int i; extern void f(void); extern int f(void); main() int i; { f(); main() printf("i = %d\n", i); { printf("res = %d\n", i+f()+f()); f(); } printf("i = %d\n", i); } файл f2: int f(void) файл f2: { static int i = 10; int i = 1; return i--; void f(void) { i++; } }
4.13. Что напечатает следующая программа?
a). #include <stdio.h> b). #include <stdio.h> int i = 0; void f(void); int f(int); int b = 10; main() main() { int i =1; { int c = 3; printf("i1 = %d\n", i); b = f(c); f(); printf("c=%d b=%d\n",c,b); { int i = 2; printf("i4 = %d\n", i); } { i +=1; printf("i5 = %d\n", i); } int f(int b) printf("i6 = %d\n", i); { int c = 5; } c--; b++; printf("i7 = %d\n", i); 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> d). #include <stdio.h> char g (char c); int abc(int); int x; int f (int i, char c) main() { int k = i+4; char b = g(c) + i; { int b; printf("c1 = %c k0 = %d\n", c, k); b = abc(x); { int i = 3; k += i; printf("b1=%d x1=%d\n",b,x); printf("i1 = %d k1 = %d\n", i, k); x = abc(b); c = g(‘b’); printf("c2 = %c\n", c); printf("b2=%d x2=%d\n",b,x); } } i++; printf("i2 = %d k2 = %d\n", i, k); int abc(int b) return i*(b-c); } { static int x = 5; char g(char c) x += 7; b++; { c = c + 1; return c; } printf("b0=%d x0=%d\n",b,x); main() return x+b; { int k =2; char c = ‘a’; k = f (k, c); } printf("c3 = %c k3 = %d\n", c, k); } e). #include <stdio.h> f). #include <stdio.h> int i = 1; int i = 1; int reset (void); int reset (void); int next (int); int next (void); int last (int); int last (void); int new (int); int new (int); main() main() { int i, j; i = reset(); { int i, j; i = reset(); for (j = 1; j <= 3; j++) for (j = 1; j <= 3; j++) { printf("i=%d j=%d\n", i, j); { printf("i=%d j=%d\n", i, j); printf("%d %d\n", next(i), last(i)); printf("%d\n", next(),); printf("%d\n", new(i+j)); printf("%d\n", last()); } } printf("%d\n", new(i+j)); } } int reset (void) { return i; } в файле f1: int next (int j) { return j = i++; } static int i =10; int last (int j) int next (void) { return i += 1; } { static int i = 10; return j = i--; } int last (void) { return i -= 1; } int new (int i) int new (int i) { int j = 10; return i = j += 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.
4.15. Программа. Описать рекурсивную функцию вычисления xn для вещественного x (x ¹ 0) и целого n: ì 1 при n = 0 xn = í 1/x|n| при n < 0 î x* xn-1 при n > 0 Протестировать эту функцию на подходящих наборах входных данных.
4.16. Программа. Описать рекурсивную функцию вычисления НОД(n,m) - наибольшего общего делителя неотрицательных целых чисел n и m, основанную на соотношении НОД(n,m) = НОД(m,r), где r - остаток от деления n на m (см. задачу 3.43). С ее помощью найти наибольший общий делитель натуральных чисел a и b. Сравнить эффективность рекурсивной и нерекурсивной функций вычисления НОД.
4.17. Программа. Описать рекурсивную функцию вычисления
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 = 0 A(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.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; pc = &c; ++*pc; (*pc)++; *pc++; *pc+=1; x = (int)pi; pi=(int*)pc; pi=(int*)x; x = 1+ *pi; pc=(char*)pi; c = *pc; pc = &y; x = qi – pi; qi = 0; qi+=pi; y = π y = (int)π pi = pi +5; *(pi+1)=0; pi=&(x+0);
5.2. К любому ли объекту в Си можно применять операцию взятия адреса &? 5. 3. Допустимо ли в Си? Если "да" - опишите семантику этих действий; если "нет" - объясните почему. a) int i = 2; const int j = 5; int *pi; const int *pci; int *const cpi; const int * const cpci; pi = &i; pci = &j; cpi = &i; cpci = &j; pci = &i; pi = (int*)&j; i = *pci + *pi; *pci = 3;
*pi = 3; i=*pci++; *(cpi++)=5; *cpi++; b) int f(const int i, int j) { j++; return i+j; } main() { int a, b; const int c = 5; scanf("%d", &a); b = f(c,a); printf("a=%d, b=%d, c=%d \n", a, b, c); b = f(c,c); printf("a=%d, b=%d, c=%d \n", a, b, c); b = f(a,a); printf("a=%d, b=%d, c=%d \n", a, b, c); b = f(a,c); printf("a=%d, b=%d, c=%d \n", a, b, c); }
5.4. Пусть целочисленный массив 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);
5.5. Допустимо ли в Си? Если "да" - опишите семантику каждого правильного действия (не принимая во внимание ошибочные); если "нет" - объясните почему. a) ... int a[5] = { 1, 2, 3, 4, 5 }; int *p, x, *q, i; p = a + 2; * (p+2) = 7; *a += 3; q=*&p-1; x = ++ p - q ++; x += ++ *p; x=*p-- + *p++; for (i = 0; i < 5; i++) printf("a [%d]=%d", i, a[ i ]); printf("\n"); printf("x=%d, *p=%d, *q=%d \n", x, *p, *q); b) ... char *str = "abcdef"; char *p, *q, *r; int k; p = str; q = 0; p++; k = p - str; r = p+k; if (k && p || q) q = str + 6; p = q? r: q; *(p-1) = ‘a’; *r = ‘x’; printf("str: %s\n", str); c) ... char s[ ] = "0123456"; int *pi; char *pc1, *pc2; pc2 = s; pc1 = s + *(s+strlen(s) - 1) - ‘0’; pi = (int*) pc2; *pc1-- = ‘8’; if (pc1 - pc2 < 3) pc1 = pc2 = pi; else pc1 = (pc1+pc2)/2; if (s == pc2) *pc1 = *pc2 + 1; else *pc1 = ‘9’; printf("s: %s\n", s); d) ... int i; char *c; int *pi; i = ‘a’; pi = &i; c = (char*)pi + 3; printf("c1=%c", *c); i <<= 8; c--; printf("c2=%c\n", *c); e) ... char c1, c2; short i; char *pc; short *ps; c1 = ‘1’; c2 = ‘2’; ps =&i; pc = (char*)ps; *pc = c1; pc++; *pc = c2; printf("i = %hd\n", i);
5.6. Эквивалентны ли следующие фрагменты программы на Си? a[ i ] /= k+m и a[ i ] = a[ i ]/k+m a[ i ] /= k+m и a[ i ] = a[ i ]/(k+m) a[ i++]+=3 и a[i++] = a[ i++]+3 a[ i++]+=3 и a[ i ] = a[ i++]+3 a[ i++]+=3 и a[ i++ ] = a[ i ]+3 a[ i++]+=3 и a[ i ] = a[ i ]+3; i++;
5.7. Что напечатает следующая программа? #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’); } 5.8. Что напечатает следующая программа? #include <stdio.h> int a[ ] = { 0, 1, 2, 3, 4 }; main() { int i, *p; for (i = 0; i <= 4; i++) printf("a[ i ]=%d ", a[ i ]); printf("\n"); for (p = &a[0]; p <= &a[4]; p++) printf("*p=%d ", *p); printf("\n"); for (p = &a[0], i = 0; i <= 4; i++) printf("p[ i ]=%d ", p[ i ]); printf("\n"); for (p = a, i = 0; p+i <= a+4; i++) printf("* (p+i)=%d ", * (p+i)); printf("\n");
for (p = a+4; p >= a; p--) printf("*p=%d ", *p); printf("\n"); for (p = a+4, i=0; i <= 4; i++) printf("p[ -i ]=%d ", p[ -i ]); printf("\n"); for (p = a+4; p >= a; p --) printf("a[ p - a ]=%d ", a[ p - a ]); printf("\n"); }
5.9. Что напечатает следующая программа? #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); ++*pp; printf("pp-p=%d *pp-a=%d **pp=%d\n", pp-p, *pp-a, **pp); pp = p; ++**pp; printf("pp-p=%d *pp-a=%d **pp=%d\n", pp-p, *pp-a, **pp); }
5.10. Что напечатает следующая программа? #include <stdio.h> int a[ 3 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int *pa[ 3 ] = { a[ 0 ], a[ 1 ], a[ 2 ] }; int *p = a[ 0 ]; main() { int i; for (i = 0; i < 3; i ++) printf(" a[ i ][ 2 – i ]=%d *a[ i ]=%d *(*(a+i)+i)=%d\n", a[ i ][ 2 – i ], *a[ i ], *(*(a+i)+i)); for (i = 0; i < 3; i ++) printf("*pa[ i ]=%d p[ i ]=%d \n", *pa[ i ], p[ i ]); }
5.11. Что напечатает следующая программа? #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); }
5.12. Какие соглашения о конце строки существуют в Си и Паскале? Укажите все «за» и «против» явного указания концов строк с помощью null-литеры ‘\0’.
5.13. В чем заключается проблема «висящей» ссылки? Приведите примеры. 5.14. Нужна ли в Си «сборка мусора»? Почему возникает такая проблема и как она решается в Си?
5.15. Прочитайте следующие описания и определения: int *ip, f(), *fip(), (*pfi)(); char *str[10]; char * (*cp)[5]; int (*r) (); double (*k)(double,int*); float * (* (*x) [6])(); double (* (* (y())[ ])(); int * (*const *name[9])(void); char * const p;
5.16. Определите переменную x как массив указателей на функцию, имеющую два параметра типа int и возвращающую результат типа указатель на double. 5.17. Определите переменную y как указатель на массив указателей на функцию без параметров, возвращающую результат типа указатель на функцию с одним параметром типа int и результатом типа float.
5.18. Что будет напечатано? Объяснить, почему результат будет таким. a) #include <stdio.h> b) #include <stdio.h> int try_to_change_it(int); void compare (int, int *); main() main() { int i = 4, j; { int i = 4, j = 5; j = try_to_change_it(i); compare(i, &j); printf("i=%d, j=%d\n", i, j); printf("i=%d, j=%d\n", i, j); } } int try_to_change_it(int k) void compare (int k, int *m) { printf("k1=%d\n", k); { printf("k1=%d,*m1=%d\n",k, *m); k+=33; k++; (*m)++; printf("k2=%d\n", k); printf("k2=%d,*m2=%d\n", k, *m); return k; } } 5.19. Верно ли решена задача: «Описать функцию, меняющую местами значения двух переменных символьного типа. Использовать эту функцию для изменения значений символьных переменных 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); } }
5.20. Допустимо ли в Си? Если "да" - опишите семантику этих действий; если "нет" - объясните почему. int ques (char *s1, char *s2) { while (*s1 && *s2 && *s1++ == *s2++); return *--s1 - *--s2; }
5.21. Допустимо ли в Си? Если "да" - опишите семантику этих действий; если "нет" - объясните почему. void ques (char *s1, char *s2, int n) { while (*s1 && *s2 && n-- && (*s1 ++ = *s2 ++)); }
5.22. Описать функцию, определяющую упорядочены ли строго по возрастанию элементы целочисленного массива из n элементов.
5.23. Описать функцию, определяющую индекс первого элемента целочисленного массива из n элементов, значение которого равно заданному числу x. Если такого элемента в массиве нет, то считать номер равным –1.
5.24. Описать функцию, вычисляющую значение x0 + x0*x1 + x0*x1*x2 + …+ x0*x1*x2 *… *xm, где xi - элементы вещественного массива x из n элементов, m - индекс первого отрицательного элемента этого массива либо число n-1, если такого элемента в массиве нет.
5.25. Описать функцию, вычисляющую значение max(x0 + xn-1, x1 + xn-2, x2 + xn-3,…, x(n-1)/2 + xn/2), где xi - элементы вещественного массива x из n элементов.
5.26. Описать функцию, вычисляющую значение min(x0 * x1, x1 * x2,
5.27. Описать функцию, вычисляющую значение x0*y0+x1*y1+ …+ xk*yk, где xi – отрицательные элементы вещественного массива a из n элементов, взятые в порядке их следования; yi – положительные элементы этого массива, взятые в обратном порядке; k = min(p,q), где p – количество положительных элементов массива a, q – количество отрицательных элементов этого массива.
5.28. Описать функцию, которая упорядочивает элементы целочисленного массива по неубыванию, используя следующий алгоритм сортировки: a) сортировка выбором: находится максимальный элемент массива и переносится в его конец; затем этот метод применяется ко всем элементам массива, кроме последнего (т.к. он уже находится на своем месте), и т.д. b) сортировка обменом (метод пузырька): последовательно сравни-ваются пары соседних элементов xk и x k+1 (k = 0, 1, …,n-2) и, если xk > x k+1, то они переставляются; в результате наибольший элемент окажется на своем месте в конце массива; затем этот метод применяется ко всем элементам, кроме последнего, и т.д. c) сортировка вставками: пусть первые k элементов массива (от 0 до
5.29. Описать функцию, определяющую индекс первого элемента целочисленного массива из n элементов, значение которого равно заданному числу x. Если такого элемента в массиве нет, то считать номер равным –1. Элементы массива упорядочены по возрастанию; использовать метод двоичного (бинарного) поиска.
5.30. Программа. Описать функцию f(a, n, p), определяющую, чередуются ли положительные и отрицательные элементы в целочисленном массиве a из n элементов и вычисляющую целочисленное значение p. Если элементы чередуются, то p - это сумма положительных элементов, иначе p - это произведение отрицательных элементов. С помощью этой функции провести анализ целочисленного массива x [50].
5.31. Программа. Описать функцию f(a, n, p), определяющую, упорядочены ли строго по возрастанию элементы в целочисленном массиве a из n элементов, и вычисляющую целочисленное значение p. Если элементы упорядочены, то p - это произведение разностей рядом стоящих элементов, иначе p - это количество нарушений порядка в массиве a. С помощью этой функции провести анализ целочисленного массива b [60].
5.32. Программа. Описать функцию f (s, n, x), определяющую, какой символ чаще других встречается в строке s и сколько раз он в нее входит. Если таких символов несколько, то взять первый из них по алфавиту. С помощью этой функции провести анализ строки str.
5.33. Программа. Описать функцию f(s, n, x), определяющую, какой символ реже других (но не нуль раз) встречается в строке s и сколько раз он в нее входит. Если таких символов несколько, то взять первый из них по алфавиту. С помощью этой функции провести анализ строки str.
5.34. Программа. Для целочисленного массива а, содержащего n элементов, описать функцию f(a, n, last, k, nlast), определяющую last - значение последнего из элементов массива а, значение которого принадлежит диапазону
5.35. Программа. Для вещественного массива а, содержащего n элементов, описать функцию G, определяющую значения максимального и минимального элементов этого массива. С помощью этой функции для вещественных массивов x[25] и y[40] вычислить соответствующие значения.
5.36. Описать функцию, которая изменяет заданную строку следующим образом: сначала записывает все элементы с четными индексами, а затем все элементы с нечетными индексами (с сохранением их относительного порядка в каждой группе). Например, abcdefgh => acegbdfh, vwxyz => vxzwy.
5.37. Описать функцию, которая в заданной строке меняет местами ее первую и вторую половины. Например, abcdefgh => efghabcd, vwxyz => yzxvw.
5.38. Описать функцию, осуществляющую циклический сдвиг на n позиций вправо элементов целочисленного массива, содержащего m элементов (n<m). 5.39. Описать функцию, осуществляющую циклический сдвиг на n позиций влево элементов целочисленного массива, содержащего m элементов (n<m). 5.40. Написать программу, обнуляющую каждую четную двоичную единицу в коде, размещенном в переменной типа int. Вывести исходные данные и полученный результат в виде, удобном для анализа проведенных преобразований. 5.41. Написать программу, обнуляющую каждую нечетную двоичную единицу в коде, размещенном в переменной типа int. Вывести исходные данные и полученный результат в виде, удобном для анализа проведенных преобразований. 5.42. Описать функцию, которая в каждом элементе беззнакового целочисленного массива заменяет старший байт нулевым кодом, если в этом байте размещен код латинской буквы.
СТРУКТУРЫ, ОБЪЕДИНЕНИЯ
Основные сведения
6.1. Верны ли следующие утверждения: a) описание структуры начинается с ключевого слова struct и содержит список объявлений членов структуры, заключенный в фигурные скобки; b) за словом struct должен следовать идентификатор, называемый тегом структуры; c) тег структуры используется в качестве имени типа при описании переменных; d) имена членов структуры могут совпадать с именами переменных в той же области видимости; e) имя тега структуры может совпадать с именами переменных в той же области видимости; f) имя тега структуры может совпадать с именами членов этой структуры; g) имена членов разных структур могут совпадать; h) за описанием структуры (после правой закрывающей фигурной скобки) обязательно должен следовать список переменных; i) переменные x, y, z разных типов
1) struct s { int a; float f; } x, y; 2) typedef struct { int a; float f;} s; struct s z; s x, y; struct { int a; float f; } z;
3) struct s { int a; float f; }; 4) struct s { int a; float f; }; typedef struct s new_s; typedef struct s s1; struct s x; new_s y, z; typedef struct s s2; s1 x, y; s2 z;
j) переменные x, y, z одного типа
1) struct { int a; float f; } x, y; 2) struct { int a; float f; } x, y; struct { int a; float f; } z; struct { float f; int a; } z;
k) для доступа к членам структуры используется операция. (точка); l) структуры не могут быть вложенными; m) структурную переменную при ее описании можно инициализировать списком константных выражений, заключенным в фигурные скобки;
6.2. Каким образом в Си определяется эквивалентность типов? Какая эквивалентность типов рассматривается: структурная или именная? Чем они отличаются?
6.3. Описать в виде структуры следующие понятия: a) дата (число, месяц, год); b) адрес (страна, город, улица, дом, квартира); c) треугольник (две стороны и угол между ними); d) окружность (радиус и центр); e) расписание занятий студента 209 группы факультета ВМК (день недели, предметы (с указанием – лекции или семинары), часы занятий, аудитория, фамилия преподавателя) f) результаты проверки контрольной работы (номер группы, номер контрольной работы, тема, 25 строчек с полями: фамилия студента, вариант, информация о каждой из пяти задач (ее номер, оценка за ее решение, характеристика ошибок), итоговая оценка студента за эту контрольную работу.
6.4. Используя определенный в задаче 6.3 тип, описать переменную этого типа и присвоить ей значение: a) дата – 16 ноября 1999 года; b) адрес – Россия, Москва, Ильинка, дом 3, кв. 34; c) треугольник – 5, 6.7, 35°; d) окружность – радиус 4.567, центр (1.4, 5.6); e) расписание занятий студента 209 группы факультета ВМК – понедельник, математический анализ (лекция) –1 пара, П-12, Ломов И.С., математический анализ (семинар) – 2 пара, 706, Григорьев Е.А., программирование (семинар) – 3 пара, 713, Пильщиков В.Н.
6.5. Что напечатает программа? #include <stdio.h> main() { struct data1 { char c[4]; char *s; } d1 = { "abc", "def" }; struct data2 { char * cp; struct data1 inf; } d2 = { "ghi", { "jkl", "mno"} }; printf("d1.c[0]=%c *d1.s=%c\n", d1.c[0], *d1.s); printf("d1.c=%s d1.s=%s\n", d1.c, d1.s); printf("d2.cp=%s d2.inf.s=%s\n", d2.cp, d2.inf.s); printf("++d2.cp=%s ++d2.inf.s=%s\n", ++d2.cp, ++d2.inf.s); }
6.6. Верны ли следующие утверждения: a) описание объединения начинается с ключевого слова union и содержит список объявлений членов объединения, заключенный в фигурные скобки; b) каждый член объединения располагается в памяти с одного и того же адреса; объем памяти для каждого члена выделяется в соответствии с его размером; c) для каждого из членов объединения выделяется одна и та же область памяти; d) все проблемы, связанные с выравниванием, решает компилятор; e) в каждый момент времени объединение может содержать значение только одного из его членов; f) все операции, применимые к структурам, применимы и к объединениям; g) «рассогласованность» при работе с активным вариантом объединения контролируется компилятором.
6.7. Можно ли в Си создать аналог вариантных записей Паскаля?
6.8. Описать тип, с помощью которого можно организовать хранение данных о различных видах транспорта: грузовиках, автобусах, легковых автомобилях и мотоциклах. Для каждого вида транспорта имеются как общие характеристики (владелец, год производства и модель), так и индивидуальные (для грузовиков - число осей, грузоподъемность, для автобусов - число мест для пассажиров, для легковых автомобилей - число дверей (2 или 4), для мотоциклов - тип двигателя (двух- или четырехтактный)).
|
|||||||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 422; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.255.254 (0.294 с.) |