Т.В. Руденко - Сборник задач и упражнений по языку Си, страница 5
Описание файла
PDF-файл из архива "Т.В. Руденко - Сборник задач и упражнений по языку Си", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 5 страницы из PDF
К любому ли объекту в Си можно применять операцию взятия адреса & ?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;21sum = 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+ma[ i ] /= k+mиa[ i ] = a[ i ]/(k+m)a[ i++]+=3иa[i++] = a[ i++]+3a[ i++]+=3иa[ i ] = a[ i++]+3a[ i++]+=3иa[ i++ ] = a[ i ]+322a[ 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 );23}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.245.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;}255.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.