⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soln10_7.cpp

📁 Wrox.Ivor.Hortons.Beginning.Visual.C.Plus.Plus.2008 With sourcecode
💻 CPP
字号:
// Soln10_7.cpp
// Storing phone numbers in a multimap - in fact two multimaps as in the previous exercise solution.
#include "Person.h"
#include <cliext/map>
using namespace cliext;

typedef  multimap<Person^, String^>^ ByName;         
typedef  multimap<String^, Person^>^ ByNumber;         

// Read a person from standard input
Person^ getPerson()
{
  String^ first;
  String^ second;
  Console::Write(L"Enter a first name: ") ;
  first = Console::ReadLine();
  Console::Write(L"Enter a second name: ") ;
  second = Console::ReadLine();
  return gcnew Person(first->Trim(), second->Trim());
}

void addEntry(ByName namebook, ByNumber numberbook)
{
  multimap<Person^, String^>::value_type nameEntry;              // Stores a namebook entry
  multimap<String^, Person^>::value_type numberEntry;            // Stores a numberbook entry
  String^ number;
  Person^ person = getPerson();
  Console::Write(L"Enter the phone number for {0}: ", person);
  number = Console::ReadLine()->Trim();

  // Add an entry to namebook
  nameEntry = namebook->make_value(person, number);
  multimap<Person^,String^>::iterator nameIter = namebook->lower_bound(person);
  if(nameIter == namebook->end())
    namebook->insert(nameEntry);
  else
    namebook->insert(nameIter, nameEntry);

  // Add an entry to numberbook
  numberEntry = numberbook->make_value(number, person);
  multimap<String^, Person^>::iterator numberIter = numberbook->lower_bound(number);
  if(numberIter == numberbook->end())
    numberbook->insert(numberEntry);
  else
    numberbook->insert(numberIter, numberEntry);

  Console::WriteLine(L"Entry successful.");
}

// Retrieves all persons for a given number
void getName(ByNumber numberbook)
{
  Console::Write(L"Enter the phone number: ");
  String^ number = Console::ReadLine()->Trim();

  multimap<String^, Person^>::iterator numberIter = numberbook->lower_bound(number);
  if(numberIter == numberbook->end())
    Console::WriteLine(L"No entry found for {0}.", number);
  else
  {
    Console::WriteLine(L"The following names are listed for {0}:", number);
    for(  ;  numberIter != numberbook->upper_bound(number) ; numberIter++)
      Console::WriteLine(numberIter->second);
  }
}

// Retrieves all the numbers for a given person
void getNumber(ByName namebook)
{
  Person^ person = getPerson();
  multimap<Person^, String^>::iterator nameIter = namebook->lower_bound(person);
  if(nameIter == namebook->end())
    Console::WriteLine(L"No entry found for {0}.", person);
  else
  {
    Console::WriteLine(L"The following numbers are listed for {0}:", person);
    for(  ;  nameIter != namebook->upper_bound(person) ; nameIter++)
      Console::WriteLine(nameIter->second);
  }
}

// List all the entries
void listEntries(ByName namebook)
{
  if(namebook->empty())
  {
    Console::WriteLine(L"The phone book is empty.");
    return;
  }
  multimap<Person^, String^>::iterator iter;
  for(iter = namebook->begin() ; iter != namebook->end() ; iter++)
    Console::WriteLine(L"{0, -30}{1,-12}", iter->first, iter->second); 
}

// Allows the deletion of a number for a given person
void deleteNameEntry(ByName namebook, ByNumber numberbook)
{
  Person^ person = getPerson();
  multimap<Person^, String^>::iterator nameIter = namebook->lower_bound(person);
  multimap<String^, Person^>::iterator numberIter;
  String^ number;
  String^ answer;

  if(nameIter == namebook->end())
    Console::WriteLine(L"No entry found in name book for {0}.", person);
  else
    for(  ;  nameIter != namebook->upper_bound(person) ; nameIter++)
    {
      Console::WriteLine(L"Do you want to erase {0} for {1}? (y or n): ",
                         nameIter->second, person);
      answer = Console::ReadLine()->Trim();
      if(Char::ToUpper(answer[0]) == L'Y')
      {
        // Find the corresponding entry in the numberbook before erasing namebook entry
        number = nameIter->second;
        numberIter = numberbook->lower_bound(number);
        if(numberIter == numberbook->end())
          Console::WriteLine(L"No entry found in number book for {0}.", number);
        else
        {
          for(  ;  numberIter != numberbook->upper_bound(number) ; numberIter++)
            if(numberIter->second == person)
            {
              numberbook->erase(numberIter);
              Console::WriteLine(L"Deleted number entry for {0}.", person);
              break;
            }

          namebook->erase(nameIter);        
          Console::WriteLine(L"{0} erased.", person);
          break;                                 // Exit the loop
        }
      }
      else
        continue;
  }
}

// Allows the deletion of a person for a given number
void deleteNumberEntry(ByName namebook, ByNumber numberbook)
{
  Console::WriteLine(L"Enter the phone number you want to delete: ");
  String^ number = Console::ReadLine()->Trim();

  multimap<String^, Person^>::iterator numberIter = numberbook->lower_bound(number);
  multimap<Person^, String^>::iterator nameIter;
  Person^ person;
  String^ answer;

  if(numberIter == numberbook->end())
    Console::WriteLine(L"No entry found for {0}.", number);
  else
    for(  ;  numberIter != numberbook->upper_bound(number) ; numberIter++)
    {
      person = numberIter->second;
      Console::WriteLine(L"Do you want to erase {0} for {1}? (y or n): ", person, number);
      answer = Console::ReadLine()->Trim();
      if(Char::ToUpper(answer[0]) == L'Y')
      {
        // Find the corresponding entry in the namebook before erasing numberbook entry
        nameIter = namebook->lower_bound(person);
        if(nameIter == namebook->end())
          Console::WriteLine(L"No entry found in namebook for {0}.", person);
        else
          for(  ;  nameIter != namebook->upper_bound(person) ; nameIter++)
            if(String::Compare(number, nameIter->second) == 0)
            {
              namebook->erase(nameIter);
              Console::WriteLine(L"Deleted {0} name entry for {1}.", person, number);
              break;
            }
        numberbook->erase(numberIter);
        Console::WriteLine(L"{0} for {1} erased.", number, person);
        break;                                       // Exit the loop
      }
      else
        continue;
  }
}

int main(array<System::String ^> ^args)
{
  ByName namebook = gcnew multimap<Person^, String^>();          // Stores numbers with Person references as keys
  ByNumber numberbook = gcnew multimap<String^, Person^>();        // Stores Person object references with number keys
  String^ answer;

  while(true)
  {
    Console::Write(L"Do you want to enter a phone book entry(Y or N): ") ;
    answer = Console::ReadLine()->Trim();
    if(Char::ToUpper(answer[0]) == L'N')
      break;
    addEntry(namebook, numberbook);
  }

  // Query the phonebook
  while(true)
  {
    Console::WriteLine(L"\nChoose from the following options:");
    Console::WriteLine(L"A  Add an entry   D Delete an entry for a name   G  Get entries for a name");
    Console::WriteLine(L"L  List entries   d Delete an entry for a number g  Get entries for a number"); 
    Console::WriteLine(L"Q  Quit");
    answer = Console::ReadLine()->Trim();
    
    switch(answer[0])
    {
    case 'A': case 'a':
        addEntry(namebook, numberbook);
        break;
      case 'G':
        getNumber(namebook);
        break;
      case 'g':
        getName(numberbook);
        break;
      case 'D':
        deleteNameEntry(namebook, numberbook);
        break;
      case 'd':
        deleteNumberEntry(namebook, numberbook);
        break;
      case 'L': case 'l':
        listEntries(namebook);
        break;
      case 'Q': case 'q':
        return 0;
      default:
        Console::WriteLine(L"Invalid selection. Try again.");
        break;
    }
  }
  
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -