Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 18 19 20 [ 21 ] 22 23 24 ... 78


Когда мы запускаем программу тар2.срр, она делает попытку прочитать данные из файла phone.txt; такой файл, если он существует, должен содержать строчки текста, включающие номер телефона, один пробел и имя, в перечисленном порядке. В именах могут быть пробелы (см. таблицу выше). Пользователь должен вводить имена в той же форме, как они заданы, вместе с пробелами.

Программа тар2.срр основана на обработке строк в стиле языка С. Ключами выступают не сами строки, а указатели на последовательности символов, хранящихся в памяти. Такой подход может удовлетворить опытных программистов на С, но он является не слишком элегантным и требует с нашей стороны внимания, чтобы не допустить ошибочного выделения либо освобождения памяти. В разделе 2.12 мы рассмотрим более простую, хотя, возможно, не столь переносимую версию этой программы, основанную на библиотечном классе string.

II map2.срр: Второе приложение, использующее класс

тар (словарь): телефонный справочник.

#include <iostream>

#include <fstream>

#include <iomanip>

#include <stdlib.h>

#include <string>

#include <map>

using namespace std;

const int maxlen = 200;

class compare { public:

bool operator0 (const char *s, const char *t)const

{ return strcmp(s, t) < 0;

typedef map<char*, long, compare> directype;

void Readlnput(directype &D) { ifstream ifstr( phone.txt ); long nr;

char buf[maxlen], *p; if (ifstr)

{ cout Entries read from file phone.txt:\n ; for (;;) { ifstr nr;

ifstr.get(); пропустить пробел

ifstr.getline(buf, maxlen);

if (!ifstr) break;



cout setw{9) nr buf endl; p = new char[strlen{buf) + 1]; strcpy(p, buf); D[p] = nr;

ifstr.closeO ;

void ShowCommands{) { cout

Commands: ?name : find phone number,\n

/name : delete\n

Inumber name: insert (or update)\n list whole phonebook\n save in file\n exit endl; }

void ProcessCommands(directype &D) { ofstream ofstr; long nr;

char ch, buf[maxlen], *p; directype::iterator i; for (;;)

{ cin ch; Пропустить любой непечатаемый символ

и прочесть ch.

switch (ch){

case ?: case /: найти или удалить: cin.getline(buf, maxlen); i = D.find{buf);

if (i == D.endO) cout Not found.\n ; else Ключ найден,

if (ch ==?) Команда Найти

cout Number: (*i).second endl; else Команда Удалить

{ delete[] (*i).first; D.erase(i); }

break;

case !: добавить (или обновить)

cin nr; if (cin.failO)

{ cout Usage: Inumber name\n ;

cin.clearO; cin.getline(buf, maxlen); break;

cin.get 0; пропустить пробел;

cin.getline(buf, maxlen);



int mainO

{ directype D;

Readlnput(D);

ShowCommands{);

ProcessCommands(D);

for (directype: : iterator i = D.beginO; i != D.endO;

++i) delete[] {*i).first; return 0;

Чтобы запустить программу на выполнение, нам не требуется наличие входного файлаphone.txt. Для нижеследующего примера работы этой программы предположим, что такой файл существует и содержит две записи для абонентов Smith, Р. и Johnson, J. Данные, которые вводит пользователь, подчеркнуты. Заметьте: в полном списке телефонной книги, который

i = D.find(buf);

if (i == D.endO )

{ p = new char[strlen(buf) + 1];

strcpy(p, buf);

D[p] = nr; } else {*i).second = nr; break; case *:

for (i = D.beginO; i != D.end{); i + + ) cout setw{9) {*i).second {*i).first endl;

break; case = :

ofstr.open{ phone.txt ); if (ofstr)

{ for (i = D.beginO; i != D.endO; i + + ) ofstr setw{9) {*i).second

{*i).first endl; ofstr.closeO ; } else cout Cannot open output file.\n ; break; case #: break; default:

cout Use: * (list), ? (find), = (save),

/ (delete), ! (insert), or # {exit).\n ; cin.getline{buf, maxlen); break;

if (ch == #) break;



1 ... 18 19 20 [ 21 ] 22 23 24 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика