1

Тема: Обчисленя сумарних чисел заявок по районах

Доброго вечора, шановні панове. Потрібна ваша допомога, майже до кінця доробив програму але не можу зрозуміти як зробити вичисленя всіх заявок по районах. Тобто якщо район зустрічається треба підрахувати кількість заявок, (Для прикладу Район : Київський зустрічається один раз значить і заявок лише одна)

Ось саме мій код програми :

#include <iostream>
#include <cstring>
#include <Windows.h>
#include <string>
#include <ctime>
#include <iomanip>
#include <fstream>
using namespace std;

struct Client {

    char name[25]; char surname[25]; char nickname[25]; char number[25]; char addresses[45]; char date[15]; int type; int isd;
    char district[35]; char area[25]; int rooms; int floor; double price;
    string  type1;
    enum TupeBid {Exchange = 1, Purchase = 2, Sale = 3};

    void FillClient () {
        type = 0;
        cout<<"Введiть ПIБ : "; cin>>surname; cin>>name; cin>>nickname;
        cout<<"Введiть номер : "; cin>>number;
        cout<<"Введiть адрес : "; cin>>addresses;
        cout<<"Введіть дату заявки : "; cin>>date;
        cout<<"Виберiть тип заявки (1 - Обмiн | 2 - Покупка | 3 - Продажа) : "; cin>>type;
        if (type == Exchange ) {
            type1 = "Обмiн";
            cout<<"Введiть район : "; cin>>district;
            cout<<"Введiть площу квартири : "; cin>>area;
            cout<<"Введiть кiлькiсть кiмнат : "; cin>>rooms;
            cout<<"Введiть поверх : "; cin>>floor;
            cout<<"Введiть цiну : "; cin>>price;
        } else if (type == Purchase ) {
            type1 = "Покупка";
        } else if (type == Sale ) {
            type1 = "Продажа";
            cout<<"Введiть район : "; cin>>district;
            cout<<"Введiть площу квартири : "; cin>>area;
            cout<<"Введiть кiлькiсть кiмнат : "; cin>>rooms;
            cout<<"Введiть поверх : "; cin>>floor;
            cout<<"Введiть цiну : "; cin>>price;
        }
    }

    void EditPrice () {
        cout<<"Стара ціна : "<<price<<"\n";
        cout<<"Введiть цiну : "; cin>>price;
    }

    void PrintClient () {
        cout<<"---------------------------------------"<<endl;
        cout<<"ПIБ : "<<surname<<" "<<name<<" "<<nickname<<"\n"<<"Номер : "<<number<<"\n"<<"Адреса : "<<addresses<<"\n"<<"Тип заявки : ";
        if (type == Exchange ) { 
            cout<<type1<<"\n";
            cout<<"Район : "<<district<<"\n"<<"Площа квартири : "<<area<<"\n"<<"Кiлькiсть кiмнат : "<<rooms<<"\n"<<"Поверх : "<<floor<<"\n"<<"Цiна квартири : "<<price<<"\n";
        } else if (type == Purchase ) {
            cout<<type1<<"\n";
        } else if (type == Sale ) {
            cout<<type1<<"\n";
            cout<<"Район : "<<district<<"\n"<<"Площа квартири : "<<area<<"\n"<<"Кiлькiсть кiмнат : "<<rooms<<"\n"<<"Поверх : "<<floor<<"\n"<<"Цiна квартири : "<<price<<"\n";
        }
        cout<<"---------------------------------------"<<endl;
    }
};

struct BaseClient {
    Client* clients; 
    int sizecl;

    BaseClient(int N) {
        sizecl = N;
        clients = new Client [sizecl];

    }

    void FillCl() {
        for(int i = 0; i < sizecl; i++) {
            clients[i].FillClient();
        }
    }

    void PrintCl()    {
        for(int i = 0; i < sizecl; i++) {
            clients[i].PrintClient();
        }
    }

    void SortCl() {
        for (int i=0; i<sizecl-1; i++)
            for(int j=i+1; j<sizecl; j++) {
                if (strcmp(clients[i].surname,clients[j].surname)>0) {
                    Client tmp=clients[i];
                    clients[i]=clients[j];
                    clients[j]=tmp;
                }
            }
    }

    void EditorCl () {
        int id;
        cout<<"Введiть id клієнта : "; cin >> id;
        clients[id].FillClient();
    }

    void AddNewCl() {
        Client* t = new Client[sizecl+1];
        for (int i = 0; i < sizecl; i++ )    {
            t[i]=clients[i];
        }
        delete[] clients;
        clients=t;
        clients[sizecl].FillClient();
        sizecl++;
    }

    void SearchAdr () {
        char familiya[25]; char nomer[25];
        cout<<"Введіть прізвище клієнта : ";
        cin>>familiya;
        cout<<"Введіть номер клієнта : ";
        cin>>nomer;
        for(int i = 0; i < sizecl; i++) {
            if ((strcmp( clients[i].surname, familiya ) == 0) && (strcmp( clients[i].number, nomer ) == 0)) {
                cout<<"Адреса : "<<clients[i].addresses;
            }
        }
    }

    void Searchs () {
        int kolvokimnat;
        cout<<"Введіть кількість кімнат : ";
        cin>>kolvokimnat;
        for(int i = 0; i < sizecl; i++) {
            if (clients[i].floor > 1 && clients[i].rooms ==kolvokimnat) {
                clients[i].PrintClient();
            }
        }
    }

    void Searchss () {
        char plowa[25]; char plowa2[25]; char rayon[35];
        cout<<"Введіть площу 'від' : ";
        cin>>plowa;
        cout<<"Введіть площу 'до' : ";
        cin>>plowa2;
        cout<<"Введіть район : ";
        cin>>rayon;
        for(int i = 0; i < sizecl; i++) {
            if ((strcmp( clients[i].area, plowa ) > 0) && (strcmp( clients[i].area, plowa2 ) < 0) && (strcmp( clients[i].district, rayon ) == 0) ) {
                clients[i].PrintClient();
            }
        }
    }


    void Pricecenter () {
        double res=0; double isw=0;
        for(int i = 0; i < sizecl; i++) {
            if (clients[i].rooms == 3) {
                isw++;
                res += clients[i].price ;
            }
        }
        cout<< res / isw <<endl;
    }


    void DelClient () {
        int idd;
        cout<<"Введiть id клієнта : ";
        cin>>idd;
        cout << "sizecl = " << sizecl << endl;
        Client* t = new Client[sizecl-1];
        for (int i = 0; i < sizecl; i++ )    {
            if (i != idd ) {
                t[i]=clients[i];
            } else {
                clients[idd];
            }
        }
        cout << "\n-------------\n";

        delete[] clients;
        clients = NULL;
        clients=t;
        sizecl--;
    }
};


int MenuCl () {
    int choice;
    cout <<"\t......::Виберiть операцiю:......\n";
    cout <<"\t| ____________________________ |\n";
    cout <<"\t| [1] - Заповнити клієнтів     |\n";
    cout <<"\t| [2] - Вивести список клієнтів|\n";
    cout <<"\t| [3] - Вiдредагувати клієнта  |\n";
    cout <<"\t| [4] - Добавити клієнта       |\n";
    cout <<"\t| [5] - Сортувати клієнтів     |\n";
    cout <<"\t| [6] - Пошук проживаня клієнта|\n";
    cout <<"\t| [7] - Вибірка квартир не на першому поверсі з N-кімнат |\n";
    cout <<"\t| [8] - Вибірка квартир площею від АА до ББ в районі СС |\n";
    cout <<"\t| [9] - Три кімнатна       |\n";
    cout <<"\t| [10] - Видалити клієнта       |\n";
    cout <<"\t| ____________________________ |\n";
    cout <<"\t| [0] - Вихiд                  |\n";
    cout <<"\t| ____________________________ |\n";
    cout<<endl;
    cout<<"Введiть номер операцiї : ";

    cin >> choice;
    return choice;
}


int main () {

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_CTYPE, "Ukrainian");

    enum Operation {FillArraya = 1, PrintArraya = 2, EditArraya = 3, Addabonent = 4, Sort = 5, SearchAdres = 6, SearchRoom = 7, SearchPlowa = 8, DeleteArraya = 10, Exit = 0};
    int N; int choice = -1; int choices = -1;

    cout<<"Введiть кiлькiсть клієнтів : "; cin>>N;
    BaseClient basecl(N);
    while (choice!=0) {

        choice = MenuCl();

        switch (choice) {

        case FillArraya :
            basecl.FillCl();
            break;

        case PrintArraya :
            basecl.PrintCl();
            break;

        case EditArraya :
            basecl.EditorCl();
            break;

        case Addabonent :
            basecl.AddNewCl();
            break;

        case Sort:
            basecl.SortCl();
            break;

        case SearchAdres :
            basecl.SearchAdr();
            break;

        case SearchRoom :
            basecl.Searchs();
            break;

        case SearchPlowa :
            basecl.Searchss();
            break;

        case 9 :
            basecl.Pricecenter();
            break;

        case DeleteArraya:
            basecl.DelClient();
            break;

        }
    }

}
Подякували: koala, Arete2

2 Востаннє редагувалося koala (02.11.2014 22:48:45)

Re: Обчисленя сумарних чисел заявок по районах

Варіант 1: подивитися шаблон std::map - він робить саме те, що вам треба (асоціативний масив, якщо бути точним, тобто щось типу rayons["Київський"] = 3;).
Варіант 2: реалізувати свій аналог std::map для рядків і цілих - не обов'язково з таким синтаксисом.
Варіант 3: впорядкувати базу за районами і потім лічити, скільки яких.

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

3

Re: Обчисленя сумарних чисел заявок по районах

koala написав:

Варіант 1: подивитися шаблон std::map - він робить саме те, що вам треба (асоціативний масив, якщо бути точним, тобто щось типу rayons["Київський"] = 3;).
Варіант 2: реалізувати свій аналог std::map для рядків і цілих - не обов'язково з таким синтаксисом.
Варіант 3: впорядкувати базу за районами і потім лічити, скільки яких.

1) Проблема в тому що ми не вчили std::map.
2) Друге реалізувати, хіба що я думаю використовувати чар масив і туди записувати потім цикл і в цикцлі іфи і підраховка.
3) А можна більш детальніше про це ?

4

Re: Обчисленя сумарних чисел заявок по районах

Я не зрозумів де їх потрібно підрахувати тому створив 11 пункт, подивіться можливо це те що ви хотіли   

#include <iostream>
#include <cstring>
#include <Windows.h>
#include <string>
#include <ctime>
#include <iomanip>
#include <fstream>
using namespace std;

struct Client {

    char name[25]; char surname[25]; char nickname[25]; char number[25]; char addresses[45]; char date[15]; int type; int isd;
    char district[35]; char area[25]; int rooms; int floor; double price;
    string  type1;
    enum TupeBid { Exchange = 1, Purchase = 2, Sale = 3 };

    void FillClient() {
        type = 0;
        cout << "Введiть ПIБ : "; cin >> surname; cin >> name; cin >> nickname;
        cout << "Введiть номер : "; cin >> number;
        cout << "Введiть адрес : "; cin >> addresses;
        cout << "Введіть дату заявки : "; cin >> date;
        cout << "Виберiть тип заявки (1 - Обмiн | 2 - Покупка | 3 - Продажа) : "; cin >> type;
        if (type == Exchange) {
            type1 = "Обмiн";
            cout << "Введiть район : "; cin >> district;
            cout << "Введiть площу квартири : "; cin >> area;
            cout << "Введiть кiлькiсть кiмнат : "; cin >> rooms;
            cout << "Введiть поверх : "; cin >> floor;
            cout << "Введiть цiну : "; cin >> price;
        }
        else if (type == Purchase) {
            type1 = "Покупка";
        }
        else if (type == Sale) {
            type1 = "Продажа";
            cout << "Введiть район : "; cin >> district;
            cout << "Введiть площу квартири : "; cin >> area;
            cout << "Введiть кiлькiсть кiмнат : "; cin >> rooms;
            cout << "Введiть поверх : "; cin >> floor;
            cout << "Введiть цiну : "; cin >> price;
        }
    }

    void EditPrice() {
        cout << "Стара ціна : " << price << "\n";
        cout << "Введiть цiну : "; cin >> price;
    }

    void PrintClient() {
        cout << "---------------------------------------" << endl;
        cout << "ПIБ : " << surname << " " << name << " " << nickname << "\n" << "Номер : " << number << "\n" << "Адреса : " << addresses << "\n" << "Тип заявки : ";
        if (type == Exchange) {
            cout << type1 << "\n";
            cout << "Район : " << district << "\n" << "Площа квартири : " << area << "\n" << "Кiлькiсть кiмнат : " << rooms << "\n" << "Поверх : " << floor << "\n" << "Цiна квартири : " << price << "\n";
        }
        else if (type == Purchase) {
            cout << type1 << "\n";
        }
        else if (type == Sale) {
            cout << type1 << "\n";
            cout << "Район : " << district << "\n" << "Площа квартири : " << area << "\n" << "Кiлькiсть кiмнат : " << rooms << "\n" << "Поверх : " << floor << "\n" << "Цiна квартири : " << price << "\n";
        }
        cout << "---------------------------------------" << endl;
    }
};

struct BaseClient {
    Client* clients;
    int sizecl;

    BaseClient(int N) {
        sizecl = N;
        clients = new Client[sizecl];

    }

    void FillCl() {
        for (int i = 0; i < sizecl; i++) {
            clients[i].FillClient();
        }
    }

    void PrintCl()    {
        for (int i = 0; i < sizecl; i++) {
            clients[i].PrintClient();
        }
    }

    void SortCl() {
        for (int i = 0; i<sizecl - 1; i++)
            for (int j = i + 1; j<sizecl; j++) {
            if (strcmp(clients[i].surname, clients[j].surname)>0) {
                Client tmp = clients[i];
                clients[i] = clients[j];
                clients[j] = tmp;
            }
            }
    }

    void EditorCl() {
        int id;
        cout << "Введiть id клієнта : "; cin >> id;
        clients[id].FillClient();
    }

    void AddNewCl() {
        Client* t = new Client[sizecl + 1];
        for (int i = 0; i < sizecl; i++)    {
            t[i] = clients[i];
        }
        delete[] clients;
        clients = t;
        clients[sizecl].FillClient();
        sizecl++;
    }

    void SearchAdr() {
        char familiya[25]; char nomer[25];
        cout << "Введіть прізвище клієнта : ";
        cin >> familiya;
        cout << "Введіть номер клієнта : ";
        cin >> nomer;
        for (int i = 0; i < sizecl; i++) {
            if ((strcmp(clients[i].surname, familiya) == 0) && (strcmp(clients[i].number, nomer) == 0)) {
                cout << "Адреса : " << clients[i].addresses;
            }
        }
    }

    void Searchs() {
        int kolvokimnat;
        cout << "Введіть кількість кімнат : ";
        cin >> kolvokimnat;
        for (int i = 0; i < sizecl; i++) {
            if (clients[i].floor > 1 && clients[i].rooms == kolvokimnat) {
                clients[i].PrintClient();
            }
        }
    }

    void Searchss() {
        char plowa[25]; char plowa2[25]; char rayon[35];
        cout << "Введіть площу 'від' : ";
        cin >> plowa;
        cout << "Введіть площу 'до' : ";
        cin >> plowa2;
        cout << "Введіть район : ";
        cin >> rayon;
        for (int i = 0; i < sizecl; i++) {
            if ((strcmp(clients[i].area, plowa) > 0) && (strcmp(clients[i].area, plowa2) < 0) && (strcmp(clients[i].district, rayon) == 0)) {
                clients[i].PrintClient();
            }
        }
    }


    void Pricecenter() {
        double res = 0; double isw = 0;
        for (int i = 0; i < sizecl; i++) {
            if (clients[i].rooms == 3) {
                isw++;
                res += clients[i].price;
            }
        }
        cout << res / isw << endl;
    }


    void DelClient() {
        int idd;
        cout << "Введiть id клієнта : ";
        cin >> idd;
        cout << "sizecl = " << sizecl << endl;
        Client* t = new Client[sizecl - 1];
        for (int i = 0; i < sizecl; i++)    {
            if (i != idd) {
                t[i] = clients[i];
            }
            else {
                clients[idd];
            }
        }
        cout << "\n-------------\n";

        delete[] clients;
        clients = NULL;
        clients = t;
        sizecl--;
    }

    void СountingpAplications()
    {
        char region[250];
        cout << "Введіть назву району ->";
        cin >> region;
        int count = 0;
        for (int i = 0; i < sizecl; i++)
            if (stricmp(clients[i].district, region) == 0)
                count++;
        cout << "Район зустрічається " << count << " разів\n";
    }
};


int MenuCl() {
    int choice;
    cout << "\t......::Виберiть операцiю:......\n";
    cout << "\t| ____________________________ |\n";
    cout << "\t| [1] - Заповнити клієнтів     |\n";
    cout << "\t| [2] - Вивести список клієнтів|\n";
    cout << "\t| [3] - Вiдредагувати клієнта  |\n";
    cout << "\t| [4] - Добавити клієнта       |\n";
    cout << "\t| [5] - Сортувати клієнтів     |\n";
    cout << "\t| [6] - Пошук проживаня клієнта|\n";
    cout << "\t| [7] - Вибірка квартир не на першому поверсі з N-кімнат |\n";
    cout << "\t| [8] - Вибірка квартир площею від АА до ББ в районі СС |\n";
    cout << "\t| [9] - Три кімнатна       |\n";
    cout << "\t| [10] - Видалити клієнта       |\n";
    cout << "\t| [11] - Підрахунок заявок по районам       |\n";
    cout << "\t| ____________________________ |\n";
    cout << "\t| [0] - Вихiд                  |\n";
    cout << "\t| ____________________________ |\n";
    cout << endl;
    cout << "Введiть номер операцiї : ";

    cin >> choice;
    return choice;
}


int main() {

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_CTYPE, "Ukrainian");

    enum Operation { FillArraya = 1, PrintArraya = 2, EditArraya = 3, Addabonent = 4, Sort = 5, SearchAdres = 6, SearchRoom = 7, SearchPlowa = 8, DeleteArraya = 10, Exit = 0 };
    int N; int choice = -1; int choices = -1;

    cout << "Введiть кiлькiсть клієнтів : "; cin >> N;
    BaseClient basecl(N);
    while (choice != 0) {

        choice = MenuCl();

        switch (choice) {

        case FillArraya:
            basecl.FillCl();
            break;

        case PrintArraya:
            basecl.PrintCl();
            break;

        case EditArraya:
            basecl.EditorCl();
            break;

        case Addabonent:
            basecl.AddNewCl();
            break;

        case Sort:
            basecl.SortCl();
            break;

        case SearchAdres:
            basecl.SearchAdr();
            break;

        case SearchRoom:
            basecl.Searchs();
            break;

        case SearchPlowa:
            basecl.Searchss();
            break;

        case 9:
            basecl.Pricecenter();
            break;

        case DeleteArraya:
            basecl.DelClient();
            break;

        case 11:
            basecl.СountingpAplications();
            break;

        }
    }

}
Подякували: Gameer1

5

Re: Обчисленя сумарних чисел заявок по районах

1. Ви не вчили - гаразд, але хіба вам забороняли самостійно вчитися?
2. Десь так, але опис надто загальний.
Можна представити це як створення індексного масива - додаткового масива з рядків {"Київський", "Донецький",...}; якщо назва району є в цьому масиві - збільшуємо відповідний лічильник в масиві лічильників; якщо нема - додаємо по одному елементу в обидва масиви. map для цього використовує складніші, але ефективніші алгоритми, от і все. Як варіант - створюємо нову структуру Index{char name[30];int count;} і працюємо з нею, а не з двома масивами.
3. А що там детальніше? У нас був масив {"A","B","A","C","A","B"}. Ми його відсортували: {"A","A","A","B","B","C"}. Тепер полічити, скільки там яких елементів - дитяча задача: просто в циклі по всьому масиву лічимо елементи, доки не зміняться, а тоді виводимо, скільки налічили, і занулюємо лічильник.

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

6

Re: Обчисленя сумарних чисел заявок по районах

Betterthanyou написав:

Я не зрозумів де їх потрібно підрахувати тому створив 11 пункт, подивіться можливо це те що ви хотіли

Дякую, не поганий варіант. Я жещо ще придумав і буду пробувати зробити. Відпишусь сьогодні, про результат ;)

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

7

Re: Обчисленя сумарних чисел заявок по районах

Ну я буду використовувати цей код :

    void СountingpAplications()
    {
        char region[250];
        cout << "Введіть назву району ->";
        cin >> region;
        int count = 0;
        for (int i = 0; i < sizecl; i++)
            if (stricmp(clients[i].district, region) == 0)
                count++;
        cout << "Район зустрічається " << count << " разів\n";
    }

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

Можете допомогти ще з видаленям ? Проблема в тому що, видаляє всі елемнти крім нульового :с

    void DelClient () {
        int idd;
        cout<<"Введiть id клієнта : ";
        cin>>idd;
        cout << "sizecl = " << sizecl << endl;
        Client* t = new Client[sizecl-1];
        for (int i = 0; i < sizecl; i++ )    {
            if (i != idd ) {
                t[i]=clients[i];
            } else {
               
            }
        }
        cout << "\n-------------\n";
 
        delete[] clients;
        clients = NULL;
        clients=t;
        sizecl--;
    }

8

Re: Обчисленя сумарних чисел заявок по районах

Gameer написав:

Можете допомогти ще з видаленям ? Проблема в тому що, видаляє всі елемнти крім нульового :с

    void DelClient () {
        int idd;
        cout<<"Введiть id клієнта : ";
        cin>>idd;
        cout << "sizecl = " << sizecl << endl;
        Client* t = new Client[sizecl-1];
        for (int i = 0; i < sizecl; i++ )    {
            if (i != idd ) {
                t[i]=clients[i];
            } else {
               
            }
        }
        cout << "\n-------------\n";
 
        delete[] clients;
        clients = NULL;
        clients=t;
        sizecl--;
    }

Наведіть приклад як 10 пунктом користуватись, бо в мене він взагалі не працює

9

Re: Обчисленя сумарних чисел заявок по районах

Заповнюєте масив, потім вводите 10 пункт і вводите id клієнта якого тре видалити. Відлік починається з 0.

10

Re: Обчисленя сумарних чисел заявок по районах

Попробуй так

    void DelClient() {
        int idd,ind=0;
        cout << "Введiть id клієнта : ";
        cin >> idd;
        cout << "sizecl = " << sizecl << endl;
        Client* t = new Client[sizecl - 1];
        for (int i = 0; i < sizecl; i++)    {
            if (i != idd) {
                t[ind++] = clients[i];
            }
            else {
                clients[idd];
            }
        }
        cout << "\n-------------\n";
        delete[] clients;
        clients = NULL;
        clients = t;
        sizecl--;
    }
Подякували: Gameer1

11

Re: Обчисленя сумарних чисел заявок по районах

Все дякую, працює добре. Буду далі сам дороблювати.