Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Указатели и массивы
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,
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. Описать функцию, которая в каждом элементе беззнакового целочисленного массива заменяет старший байт нулевым кодом, если в этом байте размещен код латинской буквы.
|