Untitled

 avatar
unknown
plain_text
a month ago
13 kB
21
Indexable
#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;

const int MAX_UCHASTNICI = 30;

struct Uchastnici {
    int nomer;
    char ime[50];
    int godini;
    char pol;
    double obikolkaBedro;
    double obikolkaRamo;
    double obikolkaVrat;
    double obikolkaPrasets;
};


void Menu();
void DobaviUchasnici(Uchastnici uchastnici[], int& count);
void PokazhiUchasnici(const Uchastnici uchastnici[], int count);
void NameriNaiMalkiq(const Uchastnici uchastnici[], int count);
void TursiPoIme(const Uchastnici uchastnici[], int count);
void PodrediPoGodini(Uchastnici uchastnici[], int count);
void ZapaziVuvFaila(const Uchastnici uchastnici[], int count, const char* filename);
void VzemiOtFaila(Uchastnici uchastnici[], int& count, const char* filename);
void PodMenu(const Uchastnici uchastnici[], int count);
void TursiPoGodiniIPol(const Uchastnici uchastnici[], int count);
void RazdeliNaKategorii(const Uchastnici uchastnici[], int count);
void IzberiPobeditel(const Uchastnici uchastnici[], int count);

int main() {

    Uchastnici uchastnici[MAX_UCHASTNICI];
    int count = 0;
    char filename[] = "uchastnici.dat";
    VzemiOtFaila(uchastnici, count, filename);

    int choice;
    do {
        Menu();
        cin >> choice;

        switch (choice) {
        case 1: DobaviUchasnici(uchastnici, count); break;
        case 2: PokazhiUchasnici(uchastnici, count); break;
        case 3: NameriNaiMalkiq(uchastnici, count); break;
        case 4: TursiPoIme(uchastnici, count); break;
        case 5: PodrediPoGodini(uchastnici, count); break;
        case 6: ZapaziVuvFaila(uchastnici, count, filename); break;
        case 7: VzemiOtFaila(uchastnici, count, filename); break;
        case 8: PodMenu(uchastnici, count); break;
        case 9: RazdeliNaKategorii(uchastnici, count); break;
        case 10: IzberiPobeditel(uchastnici, count); break;
        case 0: cout << "Изход от програмата.\n"; break;
        default: cout << "Неправилен избор.\n"; break;
        }
    } while (choice != 0);


    ZapaziVuvFaila(uchastnici, count, filename);

    return 0;
}

void Menu() {
    cout << "\n--- Основно меню ---\n";
    cout << "1. Добавяне на участници\n";
    cout << "2. Показване на всички участници\n";
    cout << "3. Търсене на най-младият участник\n";
    cout << "4. Търсене по име\n";
    cout << "5. Подреждане по възраст\n";
    cout << "6. Запис на участниците във файл\n";
    cout << "7. Зареждане на участниците от файл\n";
    cout << "8. Подменю с допълнителни функции\n";
    cout << "9. Разделяне на участниците в категории\n";
    cout << "10. Определяне на победителите\n";
    cout << "0. Изход\n";
    cout << "Вашият избор: ";
}

void DobaviUchasnici(Uchastnici uchastnici[], int& count) {
    int n;
    cout << "Въведете броят на новите учасници (до " << MAX_UCHASTNICI - count << "): ";
    cin >> n;

    if (n > MAX_UCHASTNICI - count) {
        cout << "Превишавате броя на участниците!\n";
        return;
    }

    for (int i = 0; i < n; i++) {
        cout << "Участник " << count + 1 << ":\n";
        uchastnici[count].nomer = count + 1;
        cout << "Име: ";
        cin.ignore();
        cin.getline(uchastnici[count].ime, 50);
        cout << "Възраст: ";
        cin >> uchastnici[count].godini;
        cout << "Пол (М/Ж): ";
        cin >> uchastnici[count].pol;
        cout << "Бедрена обиколка: ";
        cin >> uchastnici[count].obikolkaBedro;
        cout << "Раменна обиколка: ";
        cin >> uchastnici[count].obikolkaRamo;
        cout << "Обиколка на шията: ";
        cin >> uchastnici[count].obikolkaVrat;
        cout << "Обиколка на прасеца: ";
        cin >> uchastnici[count].obikolkaPrasets;
        count++;
    }
}

void PokazhiUchasnici(const Uchastnici uchastnici[], int count) {
    if (count == 0) {
        cout << "Няма въведени участници.\n";
        return;
    }

    cout << "\nСписък с участниците:\n";
    for (int i = 0; i < count; i++) {
        cout << "Номер: " << uchastnici[i].nomer
            << ", Име: " << uchastnici[i].ime
            << ", Възраст: " << uchastnici[i].godini
            << ", Пол: " << uchastnici[i].pol
            << ", Бедрена обиколка: " << uchastnici[i].obikolkaBedro
            << ", Раменна обиколка: " << uchastnici[i].obikolkaRamo
            << ", Обиколка на шията: " << uchastnici[i].obikolkaVrat
            << ", Обиколка на прасеца: " << uchastnici[i].obikolkaPrasets
            << '\n';
    }
}

void NameriNaiMalkiq(const Uchastnici uchastnici[], int count) {
    if (count == 0) {
        cout << "Няма въведени участници.\n";
        return;
    }

    int mingodini = uchastnici[0].godini;
    for (int i = 1; i < count; i++) {
        if (uchastnici[i].godini < mingodini) {
            mingodini = uchastnici[i].godini;
        }
    }

    cout << "Участникът с най-ниската възраст е (" << mingodini << "):\n";
    for (int i = 0; i < count; i++) {
        if (uchastnici[i].godini == mingodini) {
            cout << uchastnici[i].ime << '\n';
        }
    }
}

void TursiPoIme(const Uchastnici uchastnici[], int count) {
    if (count == 0) {
        cout << "Няма въведени участници.\n";
        return;
    }

    char searchime[50];
    cout << "Въведете име на участника, който търсите: ";
    cin.ignore();
    cin.getline(searchime, 50);

    bool found = false;
    for (int i = 0; i < count; i++) {
        if (strcmp(uchastnici[i].ime, searchime) == 0) {
            cout << "Намерен участник:\n";
            cout << "Номер: " << uchastnici[i].nomer
                << ", Име: " << uchastnici[i].ime
                << ", Възраст: " << uchastnici[i].godini
                << ", Пол: " << uchastnici[i].pol << '\n';
            found = true;
        }
    }

    if (!found) {
        cout << "Няма участник с това име.\n";
    }
}

void PodrediPoGodini(Uchastnici uchastnici[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (uchastnici[j].godini > uchastnici[j + 1].godini) {
                Uchastnici temp = uchastnici[j];
                uchastnici[j] = uchastnici[j + 1];
                uchastnici[j + 1] = temp;
            }
        }
    }
    cout << "Участниците са подредени по възраст.\n";
}

void ZapaziVuvFaila(const Uchastnici uchastnici[], int count, const char* filename) {
    ofstream file(filename, ios::binary);

    if (!file) {
        cout << "Грешка при запис във файла.\n";
        return;
    }

    file.write((char*)&count, sizeof(count));
    file.write((char*)uchastnici, sizeof(Uchastnici) * count);

    file.close();
    cout << "Участниците са записани успешно във файла.\n";
}

void VzemiOtFaila(Uchastnici uchastnici[], int& count, const char* filename) {
    ifstream file(filename, ios::binary);

    if (!file) {
        cout << "Файлът не съществува.\n";
        count = 0;
        return;
    }

    file.read((char*)&count, sizeof(count));
    file.read((char*)uchastnici, sizeof(Uchastnici) * count);

    file.close();
    cout << "Данните са заредени от файла.\n";
}

void PodMenu(const Uchastnici uchastnici[], int count) {
    int choice;
    do {
        cout << "\n--- Подменю ---\n";
        cout << "1. Подреждане и извеждане по години и име\n";
        cout << "2. Търсене по възраст и пол\n";
        cout << "0. Назад\n";
        cout << "Вашият избор: ";
        cin >> choice;

        switch (choice) {
        case 1: {
            Uchastnici temp[MAX_UCHASTNICI];
            memcpy(temp, uchastnici, sizeof(Uchastnici) * count);

            for (int i = 0; i < count - 1; i++) {
                for (int j = 0; j < count - i - 1; j++) {
                    if (temp[j].godini > temp[j + 1].godini ||
                        (temp[j].godini == temp[j + 1].godini &&
                            strcmp(temp[j].ime, temp[j + 1].ime) > 0)) {
                        Uchastnici swap = temp[j];
                        temp[j] = temp[j + 1];
                        temp[j + 1] = swap;
                    }
                }
            }

            cout << "\n Участниците са подредени по реда възраст и име:\n";
            PokazhiUchasnici(temp, count);
            break;
        }
        case 2:
            TursiPoGodiniIPol(uchastnici, count);
            break;
        case 0:
            cout << "Връщане към основното меню.\n";
            break;
        default:
            cout << "Неправилен избор.\n";
            break;
        }
    } while (choice != 0);
}

void TursiPoGodiniIPol(const Uchastnici uchastnici[], int count) {
    if (count == 0) {
        cout << "Няма въведени участници.\n";
        return;
    }

    int searchgodini;
    char searchpol;
    cout << "Въведете възраст: ";
    cin >> searchgodini;
    cout << "Въведете пол (М/Ж): ";
    cin >> searchpol;

    cout << "\n Резултати от търсенето:\n";
    bool found = false;
    for (int i = 0; i < count; i++) {
        if (uchastnici[i].godini == searchgodini && uchastnici[i].pol == searchpol) {
            cout << "Номер: " << uchastnici[i].nomer
                << ", Име: " << uchastnici[i].ime
                << ", Възраст: " << uchastnici[i].godini
                << ", Пол: " << uchastnici[i].pol << '\n';
            found = true;
        }
    }

    if (!found) {
        cout << "Няма участници, които да отговарят на тези критерии .\n";
    }
}

void RazdeliNaKategorii(const Uchastnici uchastnici[], int count) {
    Uchastnici categoryI[MAX_UCHASTNICI], categoryII[MAX_UCHASTNICI];
    Uchastnici categoryIII[MAX_UCHASTNICI], categoryIV[MAX_UCHASTNICI];
    int countI = 0, countII = 0, countIII = 0, countIV = 0;

    for (int i = 0; i < count; i++) {
        if (uchastnici[i].godini >= 14 && uchastnici[i].godini <= 16) {
            categoryI[countI++] = uchastnici[i];
        }
        else if (uchastnici[i].godini >= 17 && uchastnici[i].godini <= 19) {
            categoryII[countII++] = uchastnici[i];
        }
        else if (uchastnici[i].godini >= 20 && uchastnici[i].godini <= 22) {
            categoryIII[countIII++] = uchastnici[i];
        }
        else if (uchastnici[i].godini >= 23 && uchastnici[i].godini <= 25) {
            categoryIV[countIV++] = uchastnici[i];
        }
    }

    cout << "\n Категория I (14-16):\n";
    PokazhiUchasnici(categoryI, countI);
    cout << "\n Категория II (17-19):\n";
    PokazhiUchasnici(categoryII, countII);
    cout << "\n Категория III (20-22):\n";
    PokazhiUchasnici(categoryIII, countIII);
    cout << "\n Категория IV (23-25):\n";
    PokazhiUchasnici(categoryIV, countIV);
}

void IzberiPobeditel(const Uchastnici uchastnici[], int count) {
    struct Winner {
        Uchastnici Uchastnici;
        double proportion;
    };

    Winner winners[MAX_UCHASTNICI];
    int winnerCount = 0;

    for (int i = 0; i < count; i++) {
        double proportion = uchastnici[i].obikolkaBedro /
            (uchastnici[i].obikolkaRamo +
                uchastnici[i].obikolkaVrat +
                uchastnici[i].obikolkaPrasets);
        if (proportion > 0) {
            winners[winnerCount].Uchastnici = uchastnici[i];
            winners[winnerCount].proportion = proportion;
            winnerCount++;
        }
    }

    for (int i = 0; i < winnerCount - 1; i++) {
        for (int j = 0; j < winnerCount - i - 1; j++) {
            if (winners[j].proportion < winners[j + 1].proportion) {
                Winner temp = winners[j];
                winners[j] = winners[j + 1];
                winners[j + 1] = temp;
            }
        }
    }

    cout << "\nПобедителите са подредени по намаляващ на П(Пропорционални телесни мерки):\n";
    for (int i = 0; i < winnerCount; i++) {
        cout << "Име: " << winners[i].Uchastnici.ime
            << ", П: " << winners[i].proportion << '\n';
    }
}


Leave a Comment