Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Указатели и массивы






 

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 = & pi; y = (int)& pi; 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,
x2 * x3, …, xn-3 * xn-2, xn-2 * xn-1), где xi - элементы вещественного массива x из n элементов.

 

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 до
k-1) уже упорядочены по неубыванию; тогда берется xk и рaзмещается среди первых k элементов так, чтобы упорядоченными оказались уже k+1 первых элементов; этот метод повторяется при k от 1 до n-1.

 

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 - значение последнего из элементов массива а, значение которого принадлежит диапазону
[-k, k], и nlast - индекс этого элемента. С помощью этой функции вычислить соответствующие значения last и nlast для целочисленных массивов x[20] и y[30].

 

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. Описать функцию, которая в каждом элементе беззнакового целочисленного массива заменяет старший байт нулевым кодом, если в этом байте размещен код латинской буквы.

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.