Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C C++ в задачах и примерах. 2-е издание

.pdf
Скачиваний:
8739
Добавлен:
20.02.2016
Размер:
17.53 Mб
Скачать

266

Часть I

Задача 248

// Дописывает в файл contacts.txt фамилию, имя и номер телефона

#include "stdio.h" #include "conio.h"

#define FNAME "contacts.txt\0" // имя файла void main()

{

char fname[20] = FNAME; FILE *f; // файл

char fam[15];

// фамилия

char name[15];

// имя

char tel[9];

// номер телефона

puts("\nДобавление информации в телефонный справочник\n");

//Открыть файл в режиме добавления (а) текста (t)

//Если файла с таким именем нет, то он будет создан if ((out = fopen(fname, "at")) == NULL)

{

printf("Ошибка открытия файла для добавления"); getch();

return;

}

//получим данные от пользователя

printf("Фамилия ->"); scanf("%s", &fam); printf("Имя ->"); scanf("%s", &name); printf("Телефон ->"); scanf("%s", &tel);

// и запишем их в файл

fprintf(f,"%s %s %s", fam, name, tel);

Примеры и задачи

267

puts("\nИнформация добавлена");

fclose(f);

// закрыть файл

printf("\n\nДля завершения нажмите <Enter>\n"); getch();

}

249. Усовершенствуйте программу работы с телефонным справочником (см. задачу 247) так, чтобы за один сеанс работы в файл contacts.txt можно было добавить информацию о нескольких людях. Рекомендуемый вид экрана во время работы программы приведен ниже.

Добавление информации в телефонный справочник

Для завершения вместо ввода фамилии нажмите <Enter>

Фамилия -> Иванов

Имя -> Иван

Телефон -> 234-84-37

Информация добавлена

Фамилия -> Орлов

Имя -> Андрей

Телефон -> 552-18-40

Информация добавлена

Фамилия -> Ввод завершен

Для завершения нажмите <Enter>

250. Написать программу, которая позволяет найти в телефонном справочнике (в файле contacts.txt) нужную информацию. Программа должна запрашивать у пользователя фамилию человека и выводить информацию о нем. Если в справочнике есть люди с одинаковыми фамилиями, то программа должна вывести список всех этих людей. Рекомендуемый вид экрана во время работы программы приведен ниже.

Телефонный справочник

Введите фамилию и нажмите <Enter>. Для завершения работы с программой сразу после приглашения нажмите <Enter>

-> Петров

В справочнике данных о Петров нет.

268

Часть I

-> Иванов

Иванов Вася 578-12-45 Иванов Сергей 244-34-02 ->

Задача 250

// Поиск в телефонном справочнике

#include "stdio.h" #include "conio.h"

#define FNAME "contacts.txt\0" // имя файла void main()

{

char fname[20] = FNAME;

FILE *f; // файл - телефонный справочник

char obr[15]; // фамилия - образец для поиска в БД

// найденная информация

char fam[15];

// фамилия

char name[15];

// имя

char tel[9];

// номер телефона

int n = 0; // количество записей, удовлетворяющих запросу

puts("\nПоиск в телефонном справочнике");

//Открыть файл в режиме чтения (r) текста (t) if ((f = fopen(fname, "rt")) == NULL)

{

printf("Ошибка открытия файла %s", fname); getch();

return;

}

//получим данные от пользователя

printf("Фамилия ->");

Примеры и задачи

269

scanf("%s", &obr);

// образец для поиска в БД

while (!feof(f))

 

{

 

fscanf(f,"%s %s %s", &fam, &name, &tel); if (fam == obr)

{

printf("%s %s %s",fam, name, tel); n++;

}

}

if (n )

printf("Найдено записей: %i", n); else

printf("Данных об абоненте %s в БД нет", obr);

fclose(f);

// закрыть файл

puts("\nДля завершения работы нажмите <Enter>"); getch();

}

251. Написать программу, которая объединяет возможности программ "Добавление в телефонный справочник" и "Поиск в телефонном справочнике". При запуске программы на экране должно отображаться меню, вид которого приведен ниже.

*** Телефонный справочник ***

1 - Добавление

2 - Поиск

0 - Завершение работы

Ваш выбор ->

Факультатив

252. Написать программу, при помощи которой можно автоматизировать процесс проверки знаний. Тест, последовательность вопросов и вариантов ответа, должен находиться в текстовом файле. Имя файла теста программа должна получать из команд-

270

Часть I

ной строки ее запуска. Количество вопросов теста не ограничено. Вместе с тем предлагается ввести следующее ограничение: текст вопроса и альтернативных ответов не должен занимать более одной строки экрана.

Программа должна выставлять оценку по следующему правилу: отлично — за правильные ответы на все вопросы, хорошо — если испытуемый правильно ответил не мене чем на 80% вопросов, удовлетворительно — если правильных ответов более 60%, и неудовлетворительно — если правильных ответов меньше 60%.

Ниже приведена рекомендуемая структура файла теста (Ni — количество вариантов ответа к i-му вопросу, Ki — номер правильного ответа), пример файла теста и вид экрана во время работы программы (номера ответов, введенные пользователем, выделены полужирным).

Структура файла теста

Вопрос1

N1 K1

Ответ1

...

Ответk

Вопрос2

N2 K2

Ответ1

...

Ответk

Вопросm Nm Km

Ответ1

...

Ответk

Пример файла теста

В инструкции do wile после while записывают

2 2

условие завершения цикла условие повторения инструкций цикла

Переменная unsigned int может принимать значение

2 1

0 … 65535

0 … 32767

Примеры и задачи

271

Какая из приведенных ниже инструкций содержит ошибку

2 2

scanf ("%f", &kurs); scanf("%f", kurs);

Сейчас Вам будет предложен тест.

К каждому вопросу дается несколько вариантов ответа.

Вы должны ввести номер правильного ответа и нажать <Enter>

В инструкции do wile после while записывают 1 – условие завершения цикла 2 – условие повторения инструкций цикла Ваш выбор-> 2

Переменная unsigned int может принимать значение

1 – 0 … 65535

2 – 0 … 32767

Ваш выбор-> 1

Какая из приведенных ниже инструкций содержит ошибку

1 – scanf ("%f", &kurs);

2 – scanf("%f", kurs);

Ваш выбор-> 2

Ваша оценка ОТЛИЧНО!

Для завершения нажмите <Enter>

Задача 252

//Универсальная программа проверки знаний

//имя файла теста задается в инструкции запуска программы

#include "stdio.h" #include "conio.h" #include "string.h"

void main(int argc, char* argv[])

{

char fname[40]; //

имя файла теста

FILE* f;

//

файл теста

int VsegoVopr = 0;

// количество вопросов теста

int PravOtv = 0;

// количество правильных ответов

// для текущего вопроса

272

Часть I

int nOtv;

// количество альтернативных ответов

int Prav;

// номер правильного ответа

int Otv;

// номер ответа, выбранного пользователем

int p;

// процент правильных ответов

char st[80];

// строка файла теста

int i; // счетчик циклов

if ( !argc )

{

puts("\nНе задан файл вопросов теста!"); puts("Командная строка: test ИмяФайлаТеста\n"); return;

}

strcpy(fname,argv[1]); // имя файла из командной строки // Открыть файл в режиме чтения (r) текста (t)

if ((f = fopen(fname, "rt")) == NULL)

{

printf("Ошибка открытия файла %s", fname); getch();

return;

}

clrscr();

puts("\nСейчас Вам будет предложен тест.");

puts("К каждому вопросу дается несколько вариантов ответа."); puts("Вы должны ввести номер правильного ответа"); puts("и нажать клавишу <Enter>\n");

printf

("Для начала тестирования нажмите <Enter>"); getch();

textbackground(BLUE);

Примеры и задачи

273

clrscr();

while (!feof(f))

 

{

 

VsegoVopr++;

 

fgets(st, 80, f);

// читаем из файла вопрос

printf("\n%s\n", st);

// вопрос на экран

fscanf(f,"%i %i", &nOtv, &Prav);// кол-во вариантов

// ответа // и номер прав. ответа

fgets(st,80,f); // дочитать конец предыдущей строки

//читаем и выводим альтернативные ответы for (i = 1; i <= nOtv; i++)

{

fgets(st, 80, f); printf("%i. %s", i, st);

}

printf("\nВаш выбор ->"); scanf("%i", &Otv);

if (Otv == Prav) PravOtv++;

}

//обработка результата тестирования

//вычислим процет правильных ответов p = 100 * PravOtv / VsegoVopr; printf("\nВаша оценка - ");

if (p == 100) puts("ОТЛИЧНО!");

if (p >= 99 && p <= 80) puts("ХОРОШО.");

if (p >= 60 && p <= 79) puts("УДОВЛЕТВОРИТЕЛЬНО."); if (p < 60) puts("ПЛОХО!\n");

puts("\nДля завершения нажмите <Enter>"); getch();

}

274

Часть I

253. Написать программу, которая выводит на экран список Сипрограмм, находящихся в указанном пользователем каталоге. Предполагается, что первая строка программы является комментарием и содержит информацию о программе.

Задача 253

//Выводит имена всех файлов программ

//предполагается, что первая строка

//файла - комментарий

#include <stdio.h> #include <dir.h> #include <string.h> #include <conio.h>

//#define DEBUG // режим отладки

//в качестве параметра программе передается

//имя каталога, список файлов которого надо вывести void main(int argc, char *argv[])

{

struct ffblk ffblk; // информация о файле

int done;

 

FILE *in;

// файл программы

int n;

// обработано файлов

char mask[MAXPATH]; char infile[MAXPATH]; char outfile[MAXPATH];

if (argc < 2)

{

puts("В командной строке не задан путь"); puts("к обрабатываемым файлам"); printf("Командная строка: %s path\\\n", argv[0]); return;

Примеры и задачи

275

}

printf("\nПостроение списка файлов\n");

//маска обрабатываемых файлов strcpy(mask, argv[1]); strcat(mask,"*.cpp");

//файл-список обработанных файлов strcpy(outfile, argv[1]); strcat(outfile,"filelist.txt");

printf("Обработка: %s", mask); n = 0;

done = findfirst(mask, &ffblk,0); while (!done)

{n++;

#ifdef DEBUG

printf("%s ", ffblk.ff_name); #endif

strcpy(infile, argv[1]); strcat(infile,ffblk.ff_name);

if ((in = fopen(infile, "rt")) != NULL)

{

//читаем из файла первую строку char st[80];

fgets(st, 80, in); printf("%s %s", infile, st);

fclose(in);

}

done = findnext(&ffblk); // выбрать следующий файл

}

printf("\nОбработано файлов: %d\n", n); printf("Для завершения нажмите <Enter>"); getch();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]