1

Тема: клас Телефонний довідник

створити клас Довідник з полями :

  1. Назва фірми

  2. Власник

  3. Телефон

  4. Адреса

  5. Вид діяльності

Реалізувати наступні функції:

  • Пошук по назві фірми

  • Пошук по власнику

  • Пошук по номеру телефону

  • Пошук по виду діяльності

  • Показ всіх записів і додавання

Вся інформацію зберігати у файлі з можливістю дозапису.
Допоможіть будь-ласка переробити програму для масиву фірм. Тобто щоб усі операції виконувались для багатьох фірм. Плюс там ще є помилки...

#include<iostream>
#include<string.h>
#include<fstream>
#include<ostream>
#include<ctime>
#include<vector>
#include<algorithm>
#include<windows.h>
using namespace std;
class Spravochnik
{
protected:
   
    char NameFirm[100];
    char Owner_Name[100];
    char ADRESS[100];
    int Phone;
    char Type_Work[100];
public:
    Spravochnik()
    {
        NameFirm[100] = NULL;
        Owner_Name[100] = NULL;
        ADRESS[100] = NULL;
        Phone = 0;
        Type_Work[100] = NULL;
    }
    Spravochnik(char N, char O, char A, int P, char T)
    {
        NameFirm[100] = N;
        Owner_Name[100] = O;
        ADRESS[100] = A;
        Phone = P;
        Type_Work[100] = T;
    }
    void Show()
    {
        cout << NameFirm << endl;
        cout << Owner_Name << endl;
        cout << ADRESS << endl;
        cout << Phone << endl;
        cout << Type_Work << endl;
    }
    void SetNameFirm(char * key)
    {
        cout << "введіть назву фірми";
        cin >> NameFirm;
    }
    char  GetNameFirm()
    {
        return NameFirm[100];
    }
    void SetNameOwner(char * key)
    {
        cout << "введіть ім'я власника" << endl;
        cin >> Owner_Name;
    }

    char GetNameOwner()
    {
        return Owner_Name[100];
    }
    void SetAdress(char* key)
    {
        cout << "введіть адресу фірми" << endl;
        cin >> ADRESS;
    }
    char GetAdress()
    {
        return ADRESS[100];
    }
    void SetPhone(int const & key)
    {
        cout << "введіть номер телефону " << endl;
        cin >> Phone;
    }
    int GetPhone()
    {
        return Phone;
    }
    void SetTypeWork(char* key)
    {
        cout << "введіть вид діяльності" << endl;
        cin >> Type_Work;
    }
    char GetTypeWork()
    {
        return Type_Work[100];
    }
    vector<Spravochnik>l;
    void AddInfo()
    {
        Spravochnik tmp;
        tmp.Owner_Name;
        tmp.ADRESS;
        tmp.NameFirm;
        tmp.Phone;
        tmp.Type_Work;
        l.push_back(tmp);
    }
   

    //void Show_all()
    //{
    //    /*char* str = new char[100];
    //    cin.getline(str, 100);
    //    for (int i = 0; i <l.size(); i++)
    //    {
    //        if (strcmp(l[i].GetNameFirm(), str) == 0)
    //        {
    //            cout << "Found:" << endl;
    //            l[i].Show();
    //        }
    //    }*/
    //    

    //    for (int i = 0; i < l.size(); i++)
    //    {
    //        cout << "Found:" << endl;
    //        l[i].Show();
    //    }
    //}

    friend std::istream& operator>>(istream& in, Spravochnik& obj)
    { //Перезавантаження оператора вводу в консоль
        cout << "Додавання нових записів:\n\n";
        cout << "Им'я.: "; in >> obj.Owner_Name;
        cout << "Номер телефону: "; in >> obj.Phone;
        cout << "Назва фірми: "; in >> obj.NameFirm;
        cout << "вид діяльності"; in >> obj.Type_Work;
        cout << "Адреса фірми"; in >> obj.ADRESS;
        return in;
    }

   friend std:: ostream & operator<<(ostream& out, Spravochnik& obj)
    { //Перезавантаження оператора виводу в консоль
        out << obj.Owner_Name<< "\n";
        out << obj.ADRESS << "\n";
        out << obj.Phone<< "\n";
        out << obj.Type_Work << "\n";
        out << obj.NameFirm<< "\n";

        return out;
    }

    void clear() { //Функція очистки файла
        ofstream in("input.txt", ios::out | ios::trunc);
        in.close();
    }

    void clear_new() { //Функція очистки нового файла
        ofstream in("input_new.txt", ios::out | ios::trunc);
        in.close();
    }

    bool is_file_empty() { //Функція перевірки файла на пустоту
        ifstream in("input.txt");
        in.seekg(0, ios::end);
        if (in.tellg() == 0) {
            return true;
        }
        in.close();
        return false;
    }
    void save_into_file() { //Функція збереження списка в файл
        clear();
        ofstream out("input.txt");
        for (const Spravochnik& data :l) {
            out << data.NameFirm<< "\n";
            out << data.Owner_Name << "\n";
            out << data.Phone << "\n";
            out << data.Type_Work << "\n";
        }
        out.close();
    }
    void read_from_file(Spravochnik& data) 
    { //Функція додавання записів із файла в список
        ifstream in("input.txt");
        while (in >> data) {
            l.push_back(data);
        }
        in.close();
    }

    void output_from_file() { //Функція виводу записів із файлу в консоль
        if (!is_file_empty()) {
            ifstream in("input.txt");
            if (in) {
                int k = 0;
                while (in >> *this) {
                    k++;
                    cout << "Запис #" << k << ":\n\n";
                    cout << *this;
                    cout << "\n";
                }
                in.close();
            }
            else {
                cout << "Файл input.txt не знайдено!\n\n";
            }
        }
        else {
            cout << "Файл input.txt пуст!\n\n";
        }
    }

    void output_from_new_file(Spravochnik& data) { //Функція виводу записів з нового файлу в консоль
        ifstream in("input_new.txt");
        if (in) {
            int k = 0;
            while (in >> data.NameFirm >> data.Owner_Name>>data.Phone>>data.ADRESS>>data.Type_Work) {
                k++;
                cout << "Запись #" << k << ":\n\n";
                cout << data.NameFirm << "\n";
                cout << data.Owner_Name << "\n\n";
                cout << data.Phone << "\n\n";
                cout << data.ADRESS << "\n\n";
                cout << data.Type_Work << "\n\n";
            }
            in.close();
        }
        else {
            cout << "Файл input_new.txt не знайдено!\n\n";
        }
    }

    void add_client(Spravochnik& data) { //Додавання нового запису в список (записи додаються в кінец списку)
        int k;
        cout << "Введіть число записів, які треба додати: ";
        cin >> k;
        for (int i = 1; i <= k; i++) {
            cout << "\nЗапись #" << i << ":\n";
            cin >> data;
            l.push_back(data);
        }
        cout << "\nЗаписи додані!\n\n";
        save_into_file(); //зберігаємо результат в файл
    }
    void output_client(string *const key) { //Функція виводу списку клієнтів
        ifstream in("input.txt");
        bool flag = false;
        cout << "виведення всіх записів: ";
        for (auto it = l.begin(); it != l.end(); ++it)
        {
            
                cout << it->Owner_Name << "\n";
                cout << it->NameFirm << "\n";
                cout << it->ADRESS << "\n";
                cout << it->Phone << "\n";
                cout << it->Type_Work << "\n";
                flag = true;
          }
        in.close();
        if (!flag) {
            cout << "клиентів не знайдено!\n\n";
        }
    }
};
void Menu_()
{
    cout << "\tДля роботи з довідником додайте дані" << endl;
    cout << "\tдовідник:" << endl;
    cout << "1 - Додавання даних" << endl;
    cout << "2 - пошук по назві фірми" << endl;
    cout << "3 - пошук по імені власника" << endl;
    cout << "4 - пошук по виду діяльності" << endl;
    cout << "5 - пошук по номеру телефону" << endl;
    cout << "6 - Показ всіх записів " << endl;
    cout << "7 -запис інформації в файл " << endl;
    cout << "8 - Exit" << endl;
}

int main()
{
    setlocale(LC_ALL, "ua");
    Spravochnik S;
    int n;
    char* key = new char[100];
    n = 10;
    int Menu = 0;
    do
    {
        system("cls");
        Menu_();
        cin >> Menu;
        cin.ignore();
        switch (Menu)
        {
        case 1:
            cout << "Додавання даних" << endl;
            S.add_client(S);
            break;
        case 2:
            cout << "пошук по назві фірми" << endl;
            cout << "введіть назву фірми" << endl;
            cin.getline(key, 100);
            S.SetNameFirm(key);
            cout << "В довідникунема такої фірми" << endl;
            break;
        case 3:

            cout << "пошук по імені власника" << endl;
            cout << "введіть ім'я власника" << endl;
            cin.getline(key, 100);
            S.SetNameOwner(key);
            cout << "В довіднику нема такого власника" << endl;
            break;
        case 4:

            cout << "пошук по виду діяльгості" << endl;
            cout << "введіть вид діяльності" << endl;
            cin.getline(key, 100);
            S.SetTypeWork(key);

            cout << "нема такого виду діяльності" << endl;
            break;
        case 5:
            int str;
            cout << "пошук по номеру телефона" << endl;
            cout << "введіть номер телефона" << endl;
            cin >> str;
            S.SetPhone(746874186);
            S.GetPhone();
            if (S.GetPhone() == str) 
                cout << "нема такого номера телефона" << endl;
            break;
        case 6:
            cout << "вывод всех записей" << endl;
            S.output_from_file();
        case 7:
            cout << "запис інформації в файл" << endl;
            S.save_into_file();

        default:cout << "No such number menu item" << endl;
        }
        system("pause");
    } while (Menu != 8);
    system("pause");
    return 0;
}

2

Re: клас Телефонний довідник

це якась лапша. не здивуюсь, якщо вона взагалі не збирається.
Альо викладачі, чи як ви там себе називаєте, що протирають штанці по навчальних закладах. Вам не соромно? Невже не можна пояснити сутність контейнерів?

sasha87, тобі треба два класи: контакт та довідник. Довідник є контейнер для об'єктів класу контакт і відповідає за управління контактами. тобі потрібно вигадати формат файла з якого довідник буде считувати контакти. також функції для створення контактів за допомогою консолі.

Подякували: leofun011

3

Re: клас Телефонний довідник

Тобто в одному класі відбувається робота з однією фірмою, а в іншому відбувається реалізація для множини фірм?

4

Re: клас Телефонний довідник

не робота, це термін аферистів.

об'єкт класу зберігає дані, та методи їх обробки.
об'єкт класу контакт може й не мати методів. вони йому не потрібні, окрім конструктора. Об'єкт класу довідник зберігає масив (це може бути статичний масив, або будь який стандартний контейнер: вектор, список т.і.) та методи обробки масиву: додавання елементів, видалення, завантаження з файла, зберігання у файл. Довідник знає кількість контактів, може сортувати, шукати контакт за умовою і т.і.

це твій бекенд

окремо розробляй фронтенд. це меню в консолі. наприклад:
Створити новий довідник
Завантажити довідник
Зберегти довідник
Додати контакт
Видалити контакт
Роздрукувати довідник
Пошук...
...
Вихід

Слід також враховувати стани: файл відкритий. файл змінений т.і.

Подякували: leofun011

5

Re: клас Телефонний довідник

і використовуй std::string тут тобі не С

6 Востаннє редагувалося koala (02.06.2020 10:22:59)

Re: клас Телефонний довідник

Назва класу "довідник" плутає. Це має бути тоді клас "фірма". А довідник - масив таких "фірм". Утім, у вас немає класу з такою назвою. У вас якийсь бородавочник.
Оберіть тип стрічок, з якими будете працювати. Це буде char[]? Добре, але тоді працюйте з відповідними функціями на кшталт strcpy. Це буде std::string? Тоді запис у файл буде дещо складнішим.
Ну і взагалі малося на увазі, що ви спершу вивчите роботу з базовими типами, а потім будете вже зі структурами чи класами працювати. Ви знаєте, скільки символів у char NameFirm[100] і як вони нумеруються? Ось тут
NameFirm[100] = NULL;
ви, гадаю, хотіли очистити вміст NameFirm, але натомість намагаєтеся запхати значення NULL за межі NameFirm. Розумієте, чому?

Подякували: poklvo1

7

Re: клас Телефонний довідник

тепер працює.якщо є зауваження, то будь-ласка коментуйте...

#include<iostream>
#include<string.h>
#include<fstream>
#include<ostream>
#include<ctime>
#include<vector>
#include<algorithm>
#include<windows.h>
using namespace std;
class Spravochnik
{
protected:
    string NameFirm;
    string Owner_Name;
    string ADRESS;
    string Phone;
    string Type_Work;
public:
    Spravochnik()
    {
        NameFirm = "NULL";
        Owner_Name = "NULL";
        ADRESS = "NULL";
        Phone = "NULL";
        Type_Work = "NULL";
    }
    Spravochnik (string N, string O, string A, string P, string T)
    {
        NameFirm = N;
        Owner_Name = O;
        ADRESS = A;
        Phone = P;
        Type_Work = T;
    }
    void Show()
            {
                cout << NameFirm << endl;
                cout << Owner_Name << endl;
                cout << ADRESS << endl;
                cout << Phone << endl;
                cout << Type_Work << endl;
            }
            void SetNameFirm()
            {
                cout << "введите название фирмы";
                cin >> NameFirm;
            }
            string GetNameFirm()
            {
                return NameFirm;
            }
            void SetNameOwner()
            {
                cout << "введите имя владельца" << endl;
                cin >> Owner_Name;
            }
        
            string GetNameOwner()
            {
                return Owner_Name;
            }
            void SetAdress()
            {
                cout << "введите адрес фирмы" << endl;
                cin >> ADRESS;
            }
            string GetAdress()
            {
                return ADRESS;
            }
            void SetPhone()
            {
                cout << "введите номер телефона " << endl;
                cin >> Phone;
            }
            string GetPhone()
            {
                return Phone;
            }
            void SetTypeWork()
            {
                cout << "введите вид деятельности" << endl;
                cin >> Type_Work;
            }
            string GetTypeWork()
            {
                return Type_Work;
            }
            
            void setallINFO()
            {
                SetAdress();
                SetNameFirm();
                SetNameOwner();
                SetPhone();
                SetTypeWork();
            }
            friend ostream& operator<< (ostream & out, Spravochnik & obj);
};
ostream& operator<< (ostream& out, Spravochnik& obj)
{
    out << obj.NameFirm << endl;
    out << obj.Owner_Name << endl;
    out << obj.ADRESS << endl;
    out << obj.Phone << endl;
    out << obj.Type_Work << endl;
    return out;
}
class MassivFirm    
{
private:
vector<Spravochnik>Firms;
public:
    MassivFirm()
    {
        Firms.clear();
    }
    
    void clear(string file_name)
    { //Функция очистки файла
        ofstream in("B:\\Firma.txt", ios::out | ios::trunc);
        in.close();
    }
    void save_into_file(string file_name)
    {
        clear("B:\\Firma.txt");
        ofstream out(file_name, ios::out);
        if (out)
        {
            for (int i = 0; i < this->Firms.size(); i++)
                out << Firms[i];
        }
        else
        {
            cout << "Ошибка открытия файла" << "B:\\Firma.txt" << "\n\n";
        }
    }
    //стоп, це ж опис функції....
    void input_from_file(string file_name)//вывод информации в консоль из файла
    {
        char OwnName[100];
        char NameF[100];
        char Adr[100];
        char Tel[100];
        char TypeWork[100];
        ifstream GET(file_name);
        GET.getline(NameF,100,'\n');
        GET.getline(OwnName, 100, '\n');
        GET.getline(Adr, 100, '\n');
        GET.getline(Tel, 100, '\n');
        GET.getline(TypeWork, 100,'\n');
        Spravochnik FIRMA(NameF,OwnName,Adr,Tel,TypeWork);
        add_client(FIRMA);
        while (GET.getline(NameF, 100, '\n')) 
        {
            GET.getline(OwnName, 100, '\n');
            GET.getline(Adr, 100, '\n');
            GET.getline(Tel, 100, '\n');
            GET.getline(TypeWork, 100, '\n');
            Spravochnik FIRMA(NameF, OwnName, Adr, Tel, TypeWork);
            add_client(FIRMA);
        }
        GET.close();
    }
    void add_client() 
    { 
        //Добавление новой записи
        Spravochnik* tmp = new Spravochnik();
        tmp->setallINFO();
        this->Firms.push_back(*tmp);
        delete tmp;
    }
    void add_client(Spravochnik tmp)//перегрузка метода добавления новой записи
    {
        //Добавление новой записи
        this->Firms.push_back(tmp);
    }
    void output_client() 
    { //Функция вывода списка клиентов
        vector<Spravochnik>::iterator IT = Firms.begin();
        for (true;IT != Firms.end(); IT++)
        {
            cout << *IT << endl;
        }
    }
    void SearchByOwnerName(string ON) 
    {
        bool o;
        vector<Spravochnik>::iterator IT = Firms.begin();
        for (true; IT != Firms.end(); IT++)
        {
            if(ON==(*IT).GetNameOwner())
            cout << *IT << endl;
            o = true;
        }
        if (!o)
            cout << "Ничего не найдено" << endl;
    }
    void SearchByNameFirm(string Nf)
    {
        bool n = false;
        vector<Spravochnik>::iterator IT = Firms.begin();
        for (true; IT != Firms.end(); IT++)
        {
            if (Nf == (*IT).GetNameFirm())
                cout << *IT << endl;
            n = true;
        }
        if (!n)
            cout << "Ничего не найдено" << endl;
    }
    void SearchByPhone(string Ph)
    {
        bool ph = false;
        vector<Spravochnik>::iterator IT = Firms.begin();
        for (true; IT != Firms.end(); IT++)
        {
            if (Ph == (*IT).GetPhone())
            {
                cout << *IT << endl;
                ph = true;
            }
        }
        if (!ph)
            cout << "Ничего не найдено" << endl;
    }
    void SearchByTypeWork(string Tw)
    {
        bool t = false;
        vector<Spravochnik>::iterator IT = Firms.begin();
        for (true; IT != Firms.end(); IT++)
        {
            if (Tw == (*IT).GetTypeWork())
                cout << *IT << endl;
            t = true;
        }
        if(!t)
            cout << "Ничего не найдено" << endl;
    }
    void SearchByAdress(string A)
    {
        bool a = false;
        vector<Spravochnik>::iterator IT = Firms.begin();
        for (true; IT != Firms.end(); IT++)
        {
            if (A == (*IT).GetAdress())
                cout << *IT << endl;
            a = true;
        }
        if (!a)
            cout << "Ничего не найдено" << endl;
    }
};
void Menu_()
{
    cout << "\tДля роботы со справочником добавьте данные" << endl;
    cout << "\tСправочник:" << endl;
    cout << "1 - Добавление данных" << endl;
    cout << "2 - поиск по названию фирмы" << endl;
    cout << "3 - поиск по имени владельца" << endl;
    cout << "4 - поиск по виду деятельности" << endl;
    cout << "5 - поиск по номеру телефона" << endl;
    cout << "6 - Показ всех записей " << endl;
    cout << "7 - Exit" << endl;
}
int main()
{
    setlocale(LC_ALL, "rus");
    MassivFirm M;
    M.input_from_file("B:\\Firma.txt");
    int Menu = 0;
    string TMP;
        do
        {
            system("cls");
            Menu_();
            cin >> Menu;
            switch (Menu)
            {
            case 1:
                cout << "Добавление данных" << endl;
                M.add_client();
                break;
            case 2:
                cout << "поиск по названию фирмы" << endl;
                cout << "введите название фирмы" << endl;
                cin >> TMP;
                M.SearchByNameFirm(TMP);
                cout << "В справочнике нет такой фирмы" << endl;
                break;
            case 3:
                cout << "поиск по имени владельца" << endl;
                cout << "введите имя владельца" << endl;
                cin >> TMP;
                M.SearchByOwnerName(TMP);
                cout << "В справочнике нет такого владельца" << endl;
                break;
            case 4:
                cout << "поиск по виду деятельности" << endl;
                cout << "введите вид деятельности" << endl;
                cin >> TMP;
                M.SearchByTypeWork(TMP);
                cout << "В справочнике нет такого вида деятельности" << endl;
                break;
            case 5:
                cout << "поиск по номеру телефона" << endl;
                cout << "введите номер телефона" << endl;
                cin >> TMP;
                M.SearchByPhone(TMP);
                cout << "В справочнике нет такого номера телефона" << endl;
                break;
            case 6:
                cout << "вывод всех записей" << endl;
                M.output_client();
            default:cout << "No such number menu item" << endl;
            }
            
            system("pause");
        } while (Menu != 7);
        M.save_into_file("B:\\Firma.txt");
        system("pause");
        return 0;
    
}

8

Re: клас Телефонний довідник

  1. Суміш мов у ідентифікаторах, виводі й коментарях, включно з офтопною. Суміш різних регістрів назв без упорядкування.

  2. Більшість заголовкових файлів не потрібна (причому на компіляцію windows.h, підозрюю, йде більше часу, ніж на все інше разом).

  3. Неправильно вирівняний код (порівняйте відступи в Spravochnik(string,string,string,string,string) і Show() ).

  4. Загалом бажано не прив'язувати код класів до конкретних об'єктів - навіть таких, як cin/cout. Тобто краще вводити значення окремо і передавати у відповідні функції класу, або робити operator<<(ostream&) та operator>>(istream&).

Наприклад (дуже кривий приклад, але буде зрозуміло, про що я), можна проголосити функцію

string prompt(string &text="")
{
    string result;
    cout<<text<<endl;
    getline(cin,result);
    return result;
}

і тоді робити

void Dovidnyk::SetTypeWork(string& new_type_work;)
{
    Type_Work = new_type_work;
}

а виклик старого SetTypeWork стає

SetTypeWork(prompt("Введіть вид діяльності:"));

Тоді можна досить просто об'єднати введення з клавіатури й з файлу.

Подякували: poklvo1

9

Re: клас Телефонний довідник

це як окрема функція? ЇЇ треба постійно створювати при роботі із string?

string prompt(string &text="")
{
    string result;
    cout<<text<<endl;
    getline(cin,result);
    return result;
}

10

Re: клас Телефонний довідник

Ну... насправді - не треба так працювати зі string і консоллю.
Але оскільки під час навчання найчастіше доводиться саме так працювати, то що ж робити. Функція корисна. Фактично імітує input() у Python.

Подякували: poklvo1

11 Востаннє редагувалося leofun01 (04.06.2020 02:42:04)

Re: клас Телефонний довідник

нащо ти фірму назвав справочником? це якесь захворювання психічне, чи що? у тебе тема - телефонний довідник. І де довідник? Де контакти довідника? Звідки взялись якісь фірми? Якщо хочеш, щоб твої фоліанти було бажання читати, то треба принаймні привести до ладу логіку назв. Не бійся тих літер. Це складне завдання. Тому треба роздрібнити його на складові. побудувати ієрархію зв'язків.
Твоє серце в якому бажання творити летить поперед твого розуму. Тому Щоб мозок встигав. треба робити кілька підходів. Сходи до дівчини, в спортзал, ще деінде. мозок повинен переварити знання, які на нього раптово впали.
Це стандартна ситуація для усіх початківців. Хіба що koala таким вумним народився.
Давай так:
1) Перекладаєш всі назви на англійську
2) Назви класів починаєш з англійської С. Наприклад CContact, CContactBook
3) Пишеш коментарі над кожним рядком, який ти не розумієш або вважаєш складним до розуміння. бо я наприклад нічого не зрозумів
3) не скорочуєш назви до одної літери, ніколи

Тепер головне: в тебе класс контакта має конструктор. тому не треба для кожного поля писати метод, що лізе в командний рядок. достатньо однієї функції що буде повертати посилання на готовий об'єкт. ця функція може бути методом довідника, а об зовнішньою функцією, що стане містком між бекендом і фронтендом.

Далі Що то за функція меню? нащо вона? ти викликаєш її лише раз.  Вона або зовсім не потрібна, або повинна містити увесь цикл ПІ
Ну і на останок що то за B:\\? Ніколи не використовуй абсолютні шляхи, бо навіть місцеві навіжені будуть з тебе сміятися і тикати пальцями
Зроби хоча б це для початку. Бо це ще квіточки...

Подякували: sasha871

12

Re: клас Телефонний довідник

koala, якщо я правильно вас зрозумів, то мені треба назвати клас Spravochnik - Firma, MassivFirm - Spravochnik? Тобто навпаки?
У мене є подібне завдання, тільки його треба робити з використанням контейнера List (STL)
Описати клас «записна книжка».
/Передбачити можливість роботи з довільним числом записів, реалізувати пошук необхідної інформації за будь - якою ознакою
/(за прізвищем, ім'ям, датою народження, e - mail, номеру телефону), а також за кількома ознаками одночасно, реалізувати додавання і видалення записів,
/сортування за прізвищем, доступ до запису по номеру.
/ Написати програму, яка демонструвала б всі розроблені елементи класу.
Чим вона буде відрізнятись від описаної вище програми? На скільки треба модифікувати код описаної вище програми крім зміни назви параметрів(прізвище, електронна адреса, ім'я, дата народження)? Звичайно що в списків є свої функції, а в вектора - свої.
бажано не прив'язувати код класів до конкретних об'єктів - навіть таких, як cin/cout...Де і як мені це реалізувати?
Це початок. Що можете порекомендувати?

#include<iostream>
#include<fstream>
#include<list>
using namespace std;
class Аbonent
{
protected:
    string fname;
    string lname;
    string e_mail;
    string PhoneNumber;
    string DateofBirth;


public:
    Аbonent(string f, string l, string e, string P, string D) 
    {
        fname = f;
        lname = l;
        e_mail = l;
        PhoneNumber = P;
        DateofBirth = D;
    }
    void ShowByFname(){}
    void ShowByLname(){}
    void ShowByEmail(){}
    void ShowByPhoneNumber(){}
    const char ShowByFewParameters(){}
    void Setlname()
                    {
                        cout << "введите фамилию";
                        cin >> lname;
                    }
                    string Getlname()
                    {
                        return lname;
                    }
    void Setfname()
                    {
                        cout << "введите имя" << endl;
                        cin >> fname;
                    }
                
                    string Getfname()
                    {
                        return fname;
                    }
    void Setemail()
                    {
                        cout << "введите адрес електронной почты" << endl;
                        cin >> e_mail;
                    }
                    string Getemail()
                    {
                        return e_mail;
                    }
     void SetPhone()
                    {
                        cout << "введите номер телефона " << endl;
                        cin >> PhoneNumber;
                    }
                    string GetPhone()
                    {
                        return PhoneNumber;
                    }
    void SetDateofbirth()
                    {
                        cout << "введите дату рождения" << endl;
                        cin >> DateofBirth;
                    }
                    string GetDateofBirth()
                    {
                        return DateofBirth;
                    }
    void setallINFO()
                    {
                        Setlname();
                        Setfname();
                        Setemail();
                        SetPhone();
                        SetDateofbirth();
                    }
};
class Notebook
{
private:
    list<Аbonent>Note;

};
int main()
{

}

13

Re: клас Телефонний довідник

void ShowByFname(){}
А де тут ім'я?

14

Re: клас Телефонний довідник

Питання полягає в тому, чи правильно описані методи пошуку по імені, пошті і тд.?

#include<iostream>
#include<istream>
#include<string>
#include<fstream>
#include<list>
using namespace std;
class Аbonent
{
protected:
    string fname;
    string lname;
    string e_mail;
    string PhoneNumber;
    string DateofBirth;
public:
    Аbonent()
    {
        fname="NULL";
        lname="NULL";
        e_mail="NULL";
        PhoneNumber="NULL";
        DateofBirth="NULL";
        
    }
    Аbonent(string f, string l, string e, string P, string D)
    {
        fname = f;
        lname = l;
        e_mail = l;
        PhoneNumber = P;
        DateofBirth = D;
    }
  
   // void ShowByFewParameters(){}
    void Setlname()
                    {
                        cout << "введіть фамілію";
                        cin >> lname;
                    }
            string Getlname()
                    {
                        return lname;
                    }

    void Setfname()
                    {
                        cout << "введіть ім'я" << endl;
                        cin >> fname;
                    }
            string Getfname()
                    {
                        return fname;
                    }
    void Setemail()
                    {
                        cout << "введіть адресу електронної пошти" << endl;
                        cin >> e_mail;
                    }
            string Getemail()
                    {
                        return e_mail;
                    }
     void SetPhone()
                    {
                        cout << "введіть номер телефону" << endl;
                        cin >> PhoneNumber;
                    }
            string GetPhone()
                    {
                        return PhoneNumber;
                    }
    void SetDateofbirth()
                    {
                        cout << "введіть дату народження" << endl;
                        cin >> DateofBirth;
                    }
                    string GetDateofBirth()
                    {
                        return DateofBirth;
                    }
    void setallINFO()
                    {
                        Setlname();
                        Setfname();
                        Setemail();
                        SetPhone();
                        SetDateofbirth();
                    }

    friend ostream& operator<< (ostream & out,Аbonent& obj);
    friend istream& operator>>(istream &in, Аbonent& obj);
};
ostream& operator<< (ostream& out, Аbonent& obj)
{
    out << obj.lname << endl;
    out << obj.fname << endl;
    out << obj.e_mail << endl;
    out << obj.PhoneNumber << endl;
    out << obj.DateofBirth<< endl;
    return out;
}
class Notebook
{
private:
    list<Аbonent>Note;
public:
        Notebook()
    {
        Note.clear();
    }
    void add_client()
    {
    //створення нового запису
    Аbonent* tmp = new Аbonent();
    tmp->setallINFO();
    this->Note.push_back(*tmp);
    delete tmp;
    }
    void add_client(Аbonent tmp)
    //перегрузка методу створення нового запису
    {
        this->Note.push_back(tmp);
    }
    //вывод всех записей
    void Output()
    {
    list<Аbonent>::iterator IT=Note.begin();
    for (;IT!=Note.end();IT++)
    {
        cout<<*IT<<endl;
    }
    }
    void SearchByFname(string F)
    {
        bool f=false;
        //list<Аbonent>::iterator IT=Note.begin();
        for(std::list<Аbonent>::iterator IT=Note.begin();IT!=Note.end();IT++)
        {
            if(F==(*IT).Getfname())
                cout<<*IT<<endl;
            f=true;
        }
        if(!f)
            cout<<"нема такого імені в записнику"<<endl;
    }
    void SearchByLname(string L)
    {
        bool l=false;
        list<Аbonent>::iterator IT=Note.begin();
        for(;IT!=Note.end();IT++)
        {
          if(L==(*IT).Getlname())
              cout<<*IT<<endl;
            l=true;
        }
        if(!l)
            cout<<"немає такого прізвища в записнику"<<endl;
    }
    void SearchByEmail(string E)
    {
        bool e=false;
        list<Аbonent>::iterator IT=Note.begin();
        for(;IT!=Note.end();IT++)
        {
            if(E==(*IT).Getemail())
                cout<<*IT<<endl;
            e=true;
        }
        if(!e)
            cout<<"немає такої адреси електронної пошти в записнику"<<endl;
    }
    void SearchByPhoneNumber(string P)
    {
        bool p=false;
        list<Аbonent>::iterator IT=Note.begin();
        for(;IT!=Note.end();IT++)
        {
            if(P==(*IT).GetPhone())
                cout<<*IT<<endl;
            p=true;
        }
        if(!p)
            cout<<"нема такого номера телефона в записнику"<<endl;
    }
    void SearchByDateofBirth(string D)
    {
        bool d=false;
    list<Аbonent>::iterator IT=Note.begin();
    for(;IT!=Note.end();IT++)
    {
        if(D==(*IT).Getemail())
            cout<<*IT<<endl;
        d=true;
    }
    if(!d)
        cout<<"немає такого дня народження в записнику"<<endl;
    } 
};
void Menu()
{
    
}
int main()
{

}

15

Re: клас Телефонний довідник

Будь ласка, вирівняйте код. Ви ж передусім собі життя псуєте.

16

Re: клас Телефонний довідник

є якісь помилки в коді? додавання елементів, пошук по критерію і тд.?

17

Re: клас Телефонний довідник

Так, є. Код невирівняний. Це заважає побачити інші помилки. Оскільки вирівняти код - це найпростіша задача, з якою може впоратися навіть людина, що не вміє програмувати, навіть є вбудовані в IDE функції вирівнювання, єдиний можливий висновок з вашого небажання вирівнювати код - це те, що ви не хочете, щоб цей код читали.

Подякували: leofun01, sasha872