}
7. Да, ошибки присутствуют. Аргумент num должен быть объявлен в списке аргументов функции salami(), а не после фигурной скобки. Кроме того, вместо num++ должно быть count++.
8. Ниже показано одно возможное решение:
int largest(int а, intb, int с)
{
int max = а; if (b > max) max = b; if (с > max) max = c; return max;
}
9. Минимальная по объему кода программа приведена ниже. Функции showmenu() и getchoice() являются возможными решениями для пунктов а) и б).
#include
void showmenu(void); /* объявление используемых функций */
int getchoice(int, int); int main()
{
int res;
810 Приложение А
showmenu();
while ((res = getchoice(1,4) ) != 4)
{
printf("Меня устраивает вариант %d.\n", res); showmenu();
}
printf("Программа завершена.\n"); return 0;
} void showmenu(void)
{
printf("Выберите один из следующих вариантов:\n"); printf("1) копировать файлы 2) переместить файлы\n"); printf("3) удалить файлы 4) выйти из программы\n");
printf("Введите номер выбранного варианта:\n");
)
int getchoice(int low, int high)
{
int ans; int good;
good = scanf("%d", sans);
while (good == 1 && (ans < low || ans > high))
{
printf("%d является недопустимым вариантом; повторите попытку\n", ans);
showmenu();
scanf("%d", sans);
}
if (good != 1)
{
printf("Нечисловой ввод."); ans = 4;
}
return ans;
}
Ответы на вопросы для самоконтроля из главы 10
1. Вывод выглядит следующим образом:
8 8 4 4
0 0 2 2
2. Массив ref содержит четыре элемента, поскольку таково количество значений в списке инициализации.
3. Имя массива ref указывает на первый элемент массива — целое число 8. Выражение ref + 1 указывает на второй элемент — целое число 4. Конструкция ++ref не является допустимым выражением С; ref представляет собой константу, а не переменную.
Ответы на вопросы для самоконтроля 811
4. ptr указывает на первый элемент, a ptr + 2 — на третий элемент, который будет первым элементом второй строки.
а. 12 и 16.
б. 12 и 14 (согласно скобкам, в первую строку попадает только число 12).
5. ptr указывает на первую строку, a ptr + 1 — на вторую строку; *ptr указывает на первый элемент в первой строке, a*(ptr+ 1) — на первый элемент второй строки.
а. 12 и 16.
б. 12 и 14 (согласно скобкам, в первую строку попадает только число 12).
6. a. &grid [22] [56]
б. &grid[22] [0] или grid[22]
(Второй вариант представляет собой имя одномерного массива, состоящего из 100 элементов, т.е. адрес его первого элемента, которым является
grid [22] [0].)
в. &grid[0] [0] или grid[0] или (int *) grid.
(Здесь grid [0] — это адрес элемента grid[0] [0] типа int, a grid — адрес 100-элементного массива grid [0]. Упомянутые два адреса имеют одно и то же значение, но разные типы; приведение делает типы одинаковыми.)
7. а. int digits(10];
б. float rates [6];
в. int mat [3] [5];
г. char * psa [20];
Обратите внимание, что приоритет[] выше приоритета *, поэтому при отсутствии скобок сначала применяется описатель массива, а затем описатель указателя. Таким образом, это объявление эквивалентно объявлению char * (psa [20]);.
д. char (*pstr) [20];
На заметку!
В пункте д) нельзя использовать объявление char *pstr [20];. Это сделало бы pstr массивом указателей, а не указателем на массив. В частности, pstr указывал бы на одиночное значение char — первый элемент массива, a pstr + 1 указывал бы на следующий байт. При корректном объявлении pstr представляет собой переменную, а не имя массива, и pstr + 1 указывает на позицию, которая на 20 байт отстоит от начального байта.
8. а. int sextet [6] = {1, 2, 4, 8, 16, 32};
б. sextet [2]
в. int lots[100] = { [99] = -1};
г. int pots [100] = { [5] = 101, [10] = 101, 101, 101, 101};
9. От 0 до 9.
10. a. rootbeer [2] = value;
Допустим.
б. scanf("%f", &rootbeer );
Недопустим; &rootbeer не является значением типа float.
812 Приложение А
в. rootbeer = value;
Недопустим; rootbeer не является значением типа float, г printf("%f", rootbeer);
Недопустим; rootbeer не является значением типа float.
д. things[4][4] = rootbeer[3];
Допустим.
е. things[5] = rootbeer;
Недопустим; нельзя присваивать массивы.
ж.pf = value;
Недопустим; value не является адресом,
з. pf = rootbeer;
Допустим.
11. int screen[800] [600];
12. a. void process (double ar[], int n);
void processvla(int n, double ar[n]); process(trots, 20); processvia(20, trots);
б. void process2 (short ar2 [30] , int n);
void process2vla (int n, int m, short ar2[n] [m] ); process2(clops, 10); process2vla(10, 30, clops);
в. void process3 (long ar3 [10] [15] , int n);
void process3vla (int n, int m, int k, long ar3 [n] [m] [k] );
process3(shots, 5);
process3vla (5, 10, 15, shots);
13. a. show ( (int [4]) (8,3,9,2], 4);
б. show2 ( (int[][3]) ((8,3,9), (5,4,1)), 2);
Ответы на вопросы для самоконтроля из главы 11
1. Если вы хотите, чтобы результат был строкой, то инициализация должна включаcть '\0' Разумеется, альтернативный синтаксис добавляет нулевой символ автоматически:
char name[] = " Fess";
2. Увидимся завтра в кафе. видимся завтра в кафе.
Увидимс
идимс
Ответы на вопросы для самоконтроля 813
3. о но сно усно кусно Вкусно
Читать дальше