|
Программирование >> Немодифицирующие последовательные алгоритмы
Когда мы запускаем программу тар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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |