сортировка по алфавиту — как расположить алфавитный список в переполнении стека

У меня были некоторые проблемы с моим кодом для моего финального проекта. Я искал везде, и мне трудно, поэтому я решил спросить здесь. Мне нужно убедиться, что, когда все имена будут перечислены в этой телефонной книге, они появятся в алфавитном порядке, но пока я не уверен, как это сделать. Вот программа, которая у меня сейчас есть! Спасибо!

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>

using namespace std;

struct Contact {
string name, number, notes;
};

Contact contactList[100];
int rec_num = 0;
int num_entries;

string toUpper (string S) {
for (int i= 0; i < S.length(); i++)
S[i] = toupper(S[i]);
return S;
}

void ReadFile () {
string S;
fstream input("PhoneData.txt");
while (!input.eof() && !input.fail()){
input >> contactList[rec_num].name >> contactList[rec_num].number;
getline(input, S);
contactList[rec_num].notes = S;
rec_num++;
}
cout << "Book read." << endl;
num_entries = rec_num;
input.close();
return;
}

// stores phonebook for future runs of the program
void StoreFile () {
fstream F ("PhoneData.txt");
rec_num = 0;

while (rec_num < num_entries){
F << contactList[rec_num].name << " " << contactList[rec_num].number << " " << contactList[rec_num].notes  <<  " " << endl;
rec_num++;
}
cout << "Phonebook stored." << endl;
return;
}

// adds contact
void add_name(string name, string number, string notes){
contactList[num_entries].name = name;
contactList[num_entries].number = number;
contactList[num_entries].notes = notes;
num_entries++;
return;
}

// finds contact
void retrieve_name(string name){
for (int i = 0; i < num_entries; i++){
if (toUpper(contactList[i].name) == toUpper(name)) {
cout << "Phone Number: " << contactList[i].number << endl << "Notes: " << contactList[i].notes << endl;
return;
}
}
cout << "Name not found" << endl;
return;
}

// updates contact info
void update_name(string name){
string new_number;
string new_notes;
cout<<"New Phone Number"<<endl;
cin>> new_number;
cout<<"New Notes"<<endl;
cin>> new_notes;
for (int i = 0; i < num_entries; i++){
if (toUpper(contactList[i].name) == toUpper(name)) {
contactList[i].number = new_number;
contactList[i].notes = new_notes;
return;
}
}
}

// deletes contact
void delete_name(string name){
int INDEX=0;
for (int i = 0; i < num_entries; i++){
if (toUpper(contactList[i].name) == toUpper(name)) {
INDEX=i;
for ( int j=INDEX; j < num_entries; j++ ){
contactList[j].name = contactList[j+1].name;
contactList[j].number = contactList[j+1].number;
contactList[j].notes = contactList[j+1].notes;
}
}
}
return;
}

void listAllContacts() {
int i = 0;
while (i < num_entries) {
cout << "-- " << contactList[i].name << " " << contactList[i].number << endl << "-- " << contactList[i].notes << endl << endl;
i++;
}
}

int main(){
string name, number, notes;
string FileName;
char command;
FileName = "PhoneData.txt";
ReadFile ();
cout << "Use \"e\" for enter, \"f\" for find, \"l\" for list, \"d\" for delete, \"u\" for update, \"s\" for send message, \"q\" to quit." << endl << "Command: ";
cin >> command;
while (command != 'q'){
switch (command){
case 'e': cin >> name; cout << "Enter Number: ";
cin >> number; cout << "Enter Notes: ";
cin.ignore(); getline(cin, notes);
add_name(name, number, notes); break;
case 'f': cin >> name; retrieve_name(name); break;
case 'l':
listAllContacts(); break;
case 'u': cin>> name; update_name (name);break;
case 'd' : cin>> name; delete_name (name); break;
}
cout << "\nCommand: "; cin >> command;
}
StoreFile();
cout << "All set !";
return 0;
}

-6

Решение

Дано

Contact contactList[100];
int num_entries;

ты можешь использовать std::sort отсортировать список контактов. std::sort имеет две формы. В первой форме вы можете использовать:

std::sort(contanctList, contactList+num_entries);

если вы определите operator< за Contact объекты.

Во второй форме вы можете использовать:

std::sort(contanctList, contactList+num_entries, myCompare);

если вы определите myCompare быть вызываемым объектом, который может сравнивать два Contact объекты.

Чтобы использовать первую форму, измените Contact чтобы:

struct Contact {
string name, number, notes;
bool operator<(Contact const& rhs) const
{
return (this->name < rhs.name);
}
};

Если вы хотите, чтобы при сравнении имен не учитывался регистр, преобразуйте оба имени в верхний или нижний регистр, и они сравнивают их.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector