Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Изменение номера ячейки: функция chloc()

Функция, которая используется для изменения номера ячейки в карточке компакт-диска, в сущности, не отличается от функции редактирования записи, за исключением процедуры ввода номера ячейки:

puts("Текущая информация\n");

showdisc();

puts("\nНовый номер\n");

getslot();

Однако в начало функции добавлена инструкция if, чтобы избежать изменения номера ячейки в том случае, если в контейнере нет свободных ячеек.

Вывод записи на экран: функция locate()

Для того чтобы вывести на экран определенную запись, следует ввести название диска, открыть файл для чтения и считывать записи до тех пор, пока не будет найдена нужная:

while (fread(&disc, sizeof(disc), 1, fp) == 1)

{

if (strcmp(disc.name, name) == 0)

{

Функция locate() вызывает функцию showdisc(), выводящую информацию на экран, затем временно останавливает выполнение программы с тем, чтобы дать пользователю время прочитать представленные данные:

fflag = 'y';

showdisc();

printf("Для продолжения работы нажмите Enter");

pause = getchar();

putchar('\n');

}

}

Функция showdisc() читает файл целиком, поэтому на экран будут выведены все записи с одинаковыми наименованиями.

Печать записей: функция plist()

Для того чтобы вывести на печать каталог коллекции компакт-дисков, программа должна открыть два файла: файл данных должен быть открыт для чтения, а файл принтера, для которого используется стандартное имя системы MS-DOS "prn", должен быть открыт для записи:

if ((fp = fopen(filename, "r")) == NULL)

{

printf("Невозможно открыть файл %s\n", filename);

exit();

}

if (printer = fopen("prn", "w")) == NULL)

{

printf("Печатающее устройство не готово к работе\n", filename);

fclose(fp);

exit();

}

Функция plist() читает каждую запись и затем печатает данные с помощью функции fprintf():

while (fread(&disc, sizeof(disc), 1, fp) == 1)

{

fprintf(printer, "Название %s\n", disc.name);

fprintf(printer, "Описание %s\n", disc.description);

fprintf(printer, "Категория %s\n", disc.category);

fprintf(printer, "Цена %6.2f\n", disc.cost);

fprintf(printer, "Номер п/п %d\n", disc.number);

fprintf(printer, "\n\n");

}

По окончании печати функция закрывает оба файла и возвращает управление в main():

fclose(printer);

fclose(fp);

return;

}

Комбинирование функций

В нашем приложении каждая задача представлена в виде отдельной функции. Но так как функции почти идентичны, их можно свести в одну. После того как запись найдена и выведена на экран монитора, в исправленной таким образом программе будет использоваться оператор if для выбора действий, которые необходимо выполнить:

if (select = '3')

{

puts("Новые данные\n");

printf("Введите название диска: ");

gets(disc.name);

printf("Введите описание: ");

gets(disc.description);

printf("Введите категорию: ");

gets(disc.category);

printf("Введите цену: ");

scanf("%f", &disc.cost);

}

getslot();

Если выбран пункт меню под номером 3, на экране появятся запросы для ввода названия диска, его описания, категории и цены. После выполнения инструкции if программа вызывает функцию getslot() для ввода нового номера ячейки. Если выбран пункт 4, изменяющий только номер ячейки, то и введен будет лишь новый номер ячейки.