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