Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
хранению в виде семи символов, занимающих 7 байтов. При использовании функции fwrite() число сохраняется в виде двоичного представления 4-байтового целого числового значения.
б. Ни в чем. В обоих случаях символ сохраняется в виде 1-байтового двоичного кода.
8. Первый оператор представляет собой всего лишь сокращенную форму записи второго оператора. Третий оператор выполняет запись в стандартный вывод ошибок. Обычно стандартные сообщения об ошибках направляются туда же, куда и стандартный вывод, но переадресация стандартного вывода не оказывает влияния на стандартный вывод ошибок.
820 Приложение А
9. Режим "г+ " позволяет выполнять чтение и запись в любом месте файла, поэтому он наиболее подходит в данном случае. Режим "а+ " позволяет только дописывать данные в конец файла, а режим "w+" начинает работу с “чистого листа”, удаляя предыдущее содержимое файла.
Ответы на вопросы для самоконтроля из главы 14
1. Правильным ключевым словом является struct, а не structure. Шаблон требует наличия либо дескриптора перед открывающей скобкой, либо имени переменной после закрывающей скобки. Кроме того, символ точки с запятой должен присутствовать после выражения * togs и в конце шаблона.
2. Вывод имеет следующий вид:
6 1
22 Spiffo Road S р
3. struct month {
char name[10]; char abbrev[4]; int days; int monumb;
};
5. extern struct month months 11; int days(int month)
{
int index, total; if (month <111 month > 12)
return(-l); /* сигнал ошибки */ else
{
for (index = 0, total = 0; index < month; index ++) total += months[index].days; return(total);
}
}
Ответы на вопросы для самоконтроля 821
ный файл string.h:
typedef struct lens ( /* дескриптор структуры lens */
float foclen; /* фокусное расстояние в миллиметрах */
float fstop; /* диафрагма */
char brand[30]; /* марка производителя */
} LENS;
LENS bigEye [10];
bigEye[2].foclen = 500;
bigEye[2].fstop = 2.0;
strcpy(bigEye[2].brand, "Remarkatar");
6. LENS bigEye[10] = { [2] = {500, 2, "Remarkatar") };
7. a. 6
Arcturan cturan
б. Для этого можно использовать имя структуры и указатель:
deb.title.last pb->title.last
в. Одна из возможных версий выглядит так:
#include
#include "starfolk.h" /* обеспечение доступности определений структуры*/ void prbem (const struct bem * pbem)
{
printf("%s %s - это %d-конечный %s.\n", pbem->title.hrst,
pbem->title.last, pbem->limbs, pbem->type);
}
8. a. willie.born
б. pt->born
в. scanf("%d", &willie.born); r. scanf ("%d", &pt->born);
д. scanf("%s", willie.name.lname);
е. scanf("%s", pt->name.lname);
ж. willie.name.fname [2]
з. strlen(willie.name.fname) + strlen(willie.name.lname)
9. Один из возможных вариантов имеет вид:
struct car {
char name[20]; float hp; float epampg; float wbase; int year;
};
822 Приложение А
10. Функции можно было бы реализовать следующим образом:
struct gas {
float distance; float gals; float mpg;
};
struct gas mpgs(struct gas trip)
{
if (trip.gals > 0)
trip.mpg = trip.distance / trip.gals; else
trip.mpg = -1.0; return trip;
}
void set_mpgs(struct gas * ptrip)
{
if (ptrip->gals > 0)
ptrip->mpg = ptrip->distance / ptrip->gals; else
ptrip->mpg = -1.0;
}
Обратите внимание, что первая функция не может напрямую изменять значения из вызывающей программы, поэтому для передачи информации необходимо использовать возвращаемое значение:
struct gas idaho = {430.0, 14.8}; // установка значений двух первых членов idaho = mpgs(idaho); // переустановка структуры
Однако вторая функция обращается к исходной структуре непосредственно:
struct gas Ohio = {583, 17.6}; // установка значений двух первых членов
set_mpgs(ohio); // установка значения третьего члена
11. enum choices {no, yes, maybe};
12. char * (*pfun)(char *, char);
13. double sum(double, double); double diff(double, double); double times(double, double); double divide(double, double);
double (*pf1[4]) (double, double) = {sum, diff, times, divide};
Чтобы упростить код, последнюю строку можно заменить следующими двумя строками:
typedef double (*ptype)(double, double); ptype pf[4] = {sum, diff, times, divide};
Функция diff() вызывается следующим образом:
pfl[l](10.0, 2.5); // первая форма записи
(*рf1[1]) (10.0, 2.5); // эквивалентная форма записи
Ответы на вопросы для самоконтроля 823
Ответы на вопросы для самоконтроля из главы 15
1. а. 00000011
б. 00001101
в. 00111011
г. 01110111
2. а. 21,025,0x15
б. 85, 0125, 0x55
в. 76, 0114, 0х4С
г. 157,0235,0x91)
3. а. 252
б. 2
в. 7
г. 7
д. 5
е. 3
ж. 28
4. а. 255
б. 1 (“не ложно” — это “истинно”)
в. 0
г. 1 (“истинно” И “истинно” — это “истинно”)
д. 6
е. 1 (“истинно” ИЛИ “истинно” — это “истинно”)
ж. 40
5. В двоичной форме маска имеет вид 1111111, в десятичной — 12 7, в восьмеричной 0177, а в шестнадцатеричной — 0x7F.
6. Оба выражения bitval *= 2 и bitval << 1 удваивают текущее значение переменной bitval, поэтому они эквивалентны. Однако выражения mask += bitval и mask |= bitval оказывают одинаковое влияние, только если переменные bitval и mask не имеют ни одного общего установленного бита. Например, 2 | 4 равно 6, но этому же значению равен результат выражения 3 | 6.
7. a. struct tb_drives {
nsigned int diskdrives : 2; unsigned int : 1;
unsigned int cdromdrives : 2; unsigned int : 1;
unsigned int harddrives : 2;
6. struct kb_drives {
unsigned int harddrives : 2; unsigned int : 1;
unsigned int cdromdrives : 2; unsigned int : 1;
. unsigned int diskdrives : 2;
824 Приложение А
Ответы на вопросы для самоконтроля из главы 16
1. а. Результирующий код dist = 5280 * miles; является допустимым.
б. Результирующий код plort = 4*4 + 4; является допустимым, но если в действительности пользователю необходимо 4 * (4 + 4), то должно использоваться #define POD (FEET + FEET),
в. Результирующий код пех = = 6;; является недопустимым. (Если между двумя знаками равенства пробелы отсутствуют, код будет допустимым, но бесполезным.) Очевидно, пользователь забыл, что пишет макрос для препроцессора, а не код на С.
г. Результирующий код у = у + 5 является допустимым. Код berg = berg + 5 * lob; также допустим, но, скорее всего, представляет собой не тот результат, который хотел получить пользователь. Код est = berg + 5/у + 5; допустим, но, вероятно, представляет собой не тот результат, который хотел получить пользователь. Код nilp = lob *-berg + 5; является допустимым, но, скорее всего, представляет не тот результат, к которому стремился пользователь.
2. #define NEW (X) ( (X) +5)
3. #define MIN (X,Y) ( (X) < (Y) ? (X) : (Y) )
4. #define EVEN_GT (X, Y) ( (X) > (Y) && (X) % 2 == 0 ? 1 : 0 )
5. #def ine PR(X,Y) printf (#X " = %d и " #Y " = %d\n", X,Y)
Поскольку в этом макросе X и Y не появляются в каких-то других операциях (таких как умножение), круглые скобки можно не применять.
6. a. #define QUARTERCENTURY 2 5
б. #define SPACE ' '
в. #define PS() putchar (' ') или
#define PS() putchar(SPACE) r. #define BIG(X) ( (X) + 3)
д. #define SUMSQ(X,Y) ( (X) * (X) + (Y) * (Y) )
7. Попробуйте воспользоваться следующим определением:
#define Р(X) printf("имя: "#Х"; значение: %d; адрес: %p\n", X, &Х)
Если используемая вами реализация не распознает спецификатор адреса %р, применяйте %u или %lu.
8. Используйте директивы условной компиляции. Один из возможных способов предусматривает применение директивы #ifdef:
#define _SKIP_ /* удалите эту строку, если не хотите пропускать код */ #ifndef _SKIP_
/* код, который нужно пропустить */
#endif
9. #ifdef PR_DATE
printf("Дата = %s\n", ____ DATE );
#endi f
Ответы на вопросы для самоконтроля 825
Читать дальшеИнтервал:
Закладка: