Skip to content

Instantly share code, notes, and snippets.

@su8
Created March 15, 2025 14:08
Show Gist options
  • Save su8/5501f37428a2c4d527ee79d68223e0ac to your computer and use it in GitHub Desktop.
Save su8/5501f37428a2c4d527ee79d68223e0ac to your computer and use it in GitHub Desktop.
#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <string>
#include <fstream>
using namespace std;
const int MAX_UCHASTNICI = 30;
struct Uchastnici {
int nomer;
string ime;
int godini;
string 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(void) {
Uchastnici uchastnici[MAX_UCHASTNICI];
int count = 0;
char filename[] = "uchastnici.dat";
VzemiOtFaila(uchastnici, count, filename);
int choice;
string str;
do {
Menu();
cin >> str;
choice = static_cast<int>(std::strtol(str.c_str(), static_cast<char **>(NULL), 10));
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 EXIT_SUCCESS;
}
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();
//getline(cin, uchastnici[count].ime);
cin >> uchastnici[count].ime;
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;
}
string searchime;
cout << "Въведете име на участника, който търсите: ";
cin.ignore();
cin >> searchime;
bool found = false;
for (int i = 0; i < count; i++) {
if (uchastnici[i].ime == searchime) {
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 &&
temp[j].ime == temp[j + 1].ime)) {
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[0] == 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';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment