Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Използвани библиотеки
- #include <iostream>
- #include <string>
- #include <sstream>
- #include <iomanip>
- // Използвano именувано пространство
- using namespace std;
- // Структура, която съдържа всичката нужна информация за един абонамент
- struct Subscription {
- string signerName, phoneNumber, contractNumber;
- int contractDuration{}, callShortest{}, callTotalDuration{}, callNationalDuration{}, callInternationalDuration{}, callsTotal{}, callNational{}, callInternational{};
- double monthlyTotalTax{}, monthlyNationalTax{}, monthlyInternationalTax{};
- };
- // Функция за брояч на абонаменти
- // Вика се винаги в края на inputSubscription() функцията
- void subscriptionCounter(Subscription* S, int& Count, Subscription createSubscription) {
- S[Count] = createSubscription;
- Count++;
- }
- // Функция за добавяне на абонаменти
- void addSubscription(Subscription* S, int& Count) {
- srand((unsigned int)time(NULL));
- Subscription addSubscription;
- // Променливи използвани за създаването на телефонен номер за абонамента
- string num = "+35987";
- int rand1 = 0, rand2 = 0, rand3 = 0, rand4 = 0, rand5 = 0, rand6 = 0, rand7 = 0;
- // Променливи използвани за създаването на договор номер за абонамента
- int year = 0, month = 0, day = 0, num2 = 0;
- // Въвежда се име на човек
- cout << endl << "QUESTION: Name of the contract signer: ";
- cin.ignore();
- getline(cin, addSubscription.signerName);
- // Въвежда се дължина на договор (1-2 години)
- // Въведеното число трябва да е 1 или 2. Ако не е 1 или 2, програмата извежда грешка и запитва отново
- do {
- cout << endl << "QUESTION: Duration of contract (1 or 2 years): ";
- cin >> addSubscription.contractDuration;
- if (addSubscription.contractDuration < 1 || addSubscription.contractDuration > 2) {
- cout << endl << "SYSTEM MESSAGE: Invalid choice, please try again!" << endl;
- }
- } while (addSubscription.contractDuration < 1 || addSubscription.contractDuration > 2);
- cout << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////////////" << endl << endl;
- // Генерира произволна година, месец и ден
- year = rand() % 21 + 2001;
- month = rand() % 12 + 1;
- day = rand() % 31 + 1;
- num2 = rand() % 99 + 1;
- // Конвертира променливите цели числа (година, месец и ден) в низове
- ostringstream y_num, m_num, d_num, n_num;
- y_num << year;
- // Проверка на стойностите (month, day, num2), ако са <= от 9, добавя 0 пред тях и ги превръща в низ
- // Ако са по-големи от 9, просто ги превръща в низ без да добавя 0 пред тях
- if (month <= 9) {
- m_num << setw(2) << setfill('0') << month;
- }
- else {
- m_num << month;
- }
- if (day <= 9) {
- d_num << setw(2) << setfill('0') << day;
- }
- else {
- d_num << day;
- }
- if (num2 <= 9) {
- n_num << setw(2) << setfill('0') << num2;
- }
- else {
- n_num << num2;
- }
- // Задава получените низове като номер на договора за съответният абонамент
- addSubscription.contractNumber = y_num.str() + m_num.str() + d_num.str() + n_num.str();
- // Проверка на всички добавени абонаменти, ако има такива, за съвпадения в номер на договор
- // Ако има съвпадение в номер на договор, програмата генерира нов номер и го задава като нов за този абонамент
- // Ако няма съвпадения, програмата продължата и задава първоначално генерираният номер на договор за съответният абонамент
- for (int i = 0; i < Count; i++) {
- if (addSubscription.contractNumber == S[i].contractNumber) {
- year = rand() % 21 + 2001;
- month = rand() % 12 + 1;
- day = rand() % 31 + 1;
- num2 = rand() % 99 + 1;
- ostringstream y_num, m_num, d_num, n_num;
- y_num << year;
- if (month <= 9) {
- m_num << setw(2) << setfill('0') << month;
- }
- else {
- m_num << month;
- }
- if (day <= 9) {
- d_num << setw(2) << setfill('0') << day;
- }
- else {
- d_num << day;
- }
- if (num2 <= 9) {
- n_num << setw(2) << setfill('0') << num2;
- }
- else {
- n_num << num2;
- }
- addSubscription.contractNumber = y_num.str() + m_num.str() + d_num.str() + n_num.str();
- }
- }
- cout << "SYSTEM MESSAGE: Program automatically generated ( " << addSubscription.contractNumber << " ) as a contract number for this subscription." << endl;
- // Генерира 7 променливи със стойност от 1-9
- rand1 = rand() % 9 + 1;
- rand2 = rand() % 9 + 1;
- rand3 = rand() % 9 + 1;
- rand4 = rand() % 9 + 1;
- rand5 = rand() % 9 + 1;
- rand6 = rand() % 9 + 1;
- rand7 = rand() % 9 + 1;
- // Конвертира променливите цели числа (rand1, rand2, rand3, rand4, rand5, rand6, rand7) променливи в низове
- ostringstream r_num1, r_num2, r_num3, r_num4, r_num5, r_num6, r_num7;
- r_num1 << rand1;
- r_num2 << rand2;
- r_num3 << rand3;
- r_num4 << rand4;
- r_num5 << rand5;
- r_num6 << rand6;
- r_num7 << rand7;
- // Събира всички низове в един низ и го задава като телефонен номер на съотвеният абонамент
- addSubscription.phoneNumber = num + r_num1.str() + r_num2.str() + r_num3.str() + r_num4.str() + r_num5.str() + r_num6.str() + r_num7.str();
- // Проверка на всички добавени абонаменти, ако има такива, за съвпадения в телефонни номера
- // Ако има съвпадение в номерата, програмата генерира нов номер и го слага като нов номер за абонамента
- // Ако няма съвпадения, програмата продължата и задава първоначално генерираният номер за съответният абонамент
- for (int i = 0; i < Count; i++) {
- if (addSubscription.phoneNumber == S[i].phoneNumber) {
- rand1 = rand() % 9 + 1;
- rand2 = rand() % 9 + 1;
- rand3 = rand() % 9 + 1;
- rand4 = rand() % 9 + 1;
- rand5 = rand() % 9 + 1;
- rand6 = rand() % 9 + 1;
- rand7 = rand() % 9 + 1;
- ostringstream r_num1, r_num2, r_num3, r_num4, r_num5, r_num6, r_num7;
- r_num1 << rand1;
- r_num2 << rand2;
- r_num3 << rand3;
- r_num4 << rand4;
- r_num5 << rand5;
- r_num6 << rand6;
- r_num7 << rand7;
- addSubscription.phoneNumber = num + r_num1.str() + r_num2.str() + r_num3.str() + r_num4.str() + r_num5.str() + r_num6.str() + r_num7.str();
- }
- }
- cout << "SYSTEM MESSAGE: Program automatically generated ( " << addSubscription.phoneNumber << " ) as a phone number for this subscription." << endl;
- // Добавя абонамента към брояча
- subscriptionCounter(S, Count, addSubscription);
- cout << "SYSTEM MESSAGE: Program successfully added subscription to counter!" << endl << endl;
- // Връща обратно към main() функцията
- return;
- }
- // Функция за провеждане на разговори (интернационални и международни) за всеки добавен абонамент
- // Измерва се времетраенето на разговор като се генерира случайно число между 1 секунда и 3600 секунди
- void makePhoneCalls(Subscription* S, int& Count) {
- srand((unsigned int)time(NULL));
- // Променлива, която се генерира между 1-2 и се използва за да се определи вида на разговора (международен или национален)
- int callType = 0;
- // Променлива, която се генерира между 1-3600 и се използва за да се определи времетраенето на разговора
- int callDuration = 0;
- system("cls");
- cout << "//////////////////////////////" << endl;
- cout << "// RESULTS FROM CALLS //" << endl;
- cout << "//////////////////////////////" << endl << endl;
- for (int i = 0; i < Count; i++) {
- // Абоната има <= от 19 обаждания
- // Програмта създава пройзволно число между 1 и 2.
- // 1 = Национален | 2 - Международен
- if (S[i].callsTotal < 20) {
- callType = rand() % 2 + 1;
- S[i].callsTotal += 1;
- // Национален разговор
- if (callType == 1) {
- S[i].callNational += 1;
- callDuration = rand() % 3600 + 1;
- S[i].callNationalDuration += callDuration;
- // Извеждане на резултатите
- cout << "// Phone Number: " << S[i].phoneNumber << " // Call Type: National" << " // Call Duration: " << callDuration << " sec." << endl << endl;
- }
- // Международен разговор
- else {
- S[i].callInternational += 1;
- callDuration = rand() % 3600 + 1;
- S[i].callInternationalDuration += callDuration;
- // Извеждане на резултатите
- cout << "// Phone Number: " << S[i].phoneNumber << " // Call Type: International" << " // Call Duration: " << callDuration << " sec." << endl << endl;
- }
- if (S[i].callsTotal == 1) {
- S[i].callShortest = callDuration;
- }
- else {
- if (callDuration < S[i].callShortest) {
- S[i].callShortest = callDuration;
- }
- }
- }
- // Абоната е достигнал максминалният брой обаждания, той ще бъде пропуснат
- else {
- cout << "SYSTEM MESSAGE: ( " << S[i].phoneNumber << " ) has already made a maximum of 20 calls. He won't be making any calls, therefore he will be skipped." << endl << endl;
- }
- }
- // Връща обратно към main() функцията
- system("pause");
- return;
- }
- // Функцията пресмята общата национална и международна такса от обажданията на всеки абонамент
- // После ги събира като една обща месечна такса
- // Извежда таблица с резултатите
- void calculateMonthlyTax(Subscription* S, int& Count) {
- system("cls");
- cout << "//////////////////////////////" << endl;
- cout << "// RESULTS FROM CALCULATION //" << endl;
- cout << "//////////////////////////////" << endl << endl;
- for (int i = 0; i < Count; i++) {
- double national = 0, international = 0;
- // Пресмятане на таксите за национални обаждания
- for (int a = 0; a < S[i].callNationalDuration; a++) {
- national += 0.1;
- }
- // Пресмятане на таксите за международни обаждания
- for (int b = 0; b < S[i].callInternationalDuration; b++) {
- international += 0.25;
- }
- // Събиране и задаване на национални и международни такси като една обща
- S[i].monthlyTotalTax = national + international;
- // Извеждане на резултатите
- cout << "// Phone Number: " << S[i].phoneNumber << " // National Taxes: " << national << " lev." << " // International Taxes: " << international << " lev." << " // Total Taxes: " << S[i].monthlyTotalTax << " lev." << endl << endl;
- }
- // Връща обратно към main() функцията
- system("pause");
- return;
- }
- // Функция, която извежда всички абонаменти и всичката информация за всеки един от тях
- void showSubscriptions(Subscription* S, int& Count) {
- system("cls");
- cout << "//////////////////////////" << endl;
- cout << "// SUBSCRIPTIONS LIST //" << endl;
- cout << "//////////////////////////" << endl << endl;
- for (int i = 0; i < Count; i++) {
- cout << "// Signer Name: " << S[i].signerName << " // Contract Number: " << S[i].contractNumber << " // Contract Duration: ";
- if (S[i].contractDuration == 1) {
- cout << S[i].contractDuration << " year";
- }
- else {
- cout << S[i].contractDuration << " years";
- }
- cout << " // Phone Number: " << S[i].phoneNumber << " // National Calls: " << S[i].callNational << " // International Calls: " << S[i].callInternational << " // Monthly Tax: " << S[i].monthlyTotalTax << endl << endl;
- }
- cout << "///////////////////////////////////////////////////////////////////////////" << endl << endl;
- cout << "SYSTEM MESSAGE: Program successfully listed all subscriptions added so far!" << endl << endl;
- // Връща обратно към main() функцията
- system("pause");
- return;
- }
- // Функция, която извежда всички абонати, които им остава 1 година до края на договора
- void showSubscriptionsWithExpiringContracts(Subscription* S, int& Count) {
- system("cls");
- cout << "/////////////////////////////////////////////" << endl;
- cout << "// SUBSCRIPTIONS WITH EXPIRING CONTRACTS //" << endl;
- cout << "/////////////////////////////////////////////" << endl << endl;
- for (int i = 0; i < Count; i++) {
- if (S[i].contractDuration == 1) {
- cout << "// Phone Number: " << S[i].phoneNumber << " // Contract Duration: " << S[i].contractDuration << " year" << endl << endl;
- }
- }
- // Връща обратно към main() функцията
- system("pause");
- return;
- }
- // Функция, която извежда абоната с най-малка месечна такса
- void showSubscriptionsWithLeastMonthlyTax(Subscription* S, int& Count) {
- // Променлив, която поддържа десетични числа и има начална стойност от INT_MAX, което е 2,147,483,647
- double temp = INT_MAX;
- system("cls");
- cout << "/////////////////////////////////////////////" << endl;
- cout << "// SUBSCRIPTION WITH MINIMAL MONTHLY TAX //" << endl;
- cout << "/////////////////////////////////////////////" << endl << endl;
- // Цикъл, който намира най-ниската месечна такса и я задава като стойност за променливата temp
- for (int i = 0; i < Count; i++) {
- if (S[i].monthlyTotalTax < temp) {
- temp = S[i].monthlyTotalTax;
- }
- }
- // Цикъл, който сръвнява променливата temp с месечните такси на всеки абонамент
- // Като намери съвпадение изкарва съответният абонамент
- for (int j = 0; j < Count; j++) {
- if (S[j].monthlyTotalTax == temp) {
- cout << "// Phone Number: " << S[j].phoneNumber << " // Monthly Tax: " << temp << " lev." << endl << endl;
- }
- }
- // Връща обратно към main() функцията
- system("pause");
- return;
- }
- void showSubscriptionWithMostInternationalCalls(Subscription* S, int& Count) {
- // Променлива, която поддържа цели числа и има начална стойност от 0
- int temp = 0;
- system("cls");
- cout << "///////////////////////////////////////////////////" << endl;
- cout << "// SUBSCRIPTIONS WITH MOST INTERNATIONAL CALLS //" << endl;
- cout << "///////////////////////////////////////////////////" << endl << endl;
- // Цикъл, който намира най-много международни обаждания и ги задава като стойност за променливата temp
- for (int i = 0; i < Count; i++) {
- if (S[i].callInternational > temp) {
- temp = S[i].callInternational;
- }
- }
- // Цикъл, който сръвнява променливата temp с броя международни обаждания на всеки абонамент
- // Като намери съвпадение, изкарва съответният абонамент и колко обаждания има
- // Функцията ще изведе повече от един абонамент ако има повече от един с еднакъв брой обаждания
- for (int i = 0; i < Count; i++) {
- if (S[i].callInternational == temp) {
- cout << "// Phone Number: " << S[i].phoneNumber << " // International Calls: " << temp << endl << endl;
- }
- }
- // Връща обратно към main() функцията
- system("pause");
- return;
- }
- void showSubscriptionWithShortestCall(Subscription* S, int& Count) {
- // Променлива, която поддържа цели числа и има начална стойност от 0
- int temp = INT_MAX;
- system("cls");
- cout << "///////////////////////////////////////" << endl;
- cout << "// SUBSCRIPTION WITH SHORTEST CALL //" << endl;
- cout << "///////////////////////////////////////" << endl << endl;
- for (int i = 0; i < Count; i++) {
- if (S[i].callShortest < temp) {
- temp = S[i].callShortest;
- }
- }
- // Цикъл, който сръвнява променливата temp със стойността на всеки абонамент
- // Като намери съвпадение, изкарва съответният абонамент и колко обаждания има
- // Функцията ще изведе повече от един абонамент ако има повече от един с еднакъв брой обаждания
- for (int i = 0; i < Count; i++) {
- if (S[i].callShortest == temp) {
- cout << "// Phone Number: " << S[i].phoneNumber << " // Call Duration: " << temp << " sec." << endl << endl;
- }
- }
- // Връща обратно към main() функцията
- system("pause");
- return;
- }
- int main() {
- Subscription S[10];
- string choiceAdd;
- int choice;
- int subscriptions = 0;
- do {
- system("cls");
- cout << "//////////////////////////////" << endl;
- cout << "// MENU //" << endl;
- cout << "//////////////////////////////" << endl << endl;
- cout << "1# - Add one subscription" << endl;
- cout << "2# - Add multiple subscriptions" << endl;
- cout << "3# - Make phone calls" << endl;
- cout << "4# - Calculate monthly tax for all subscriptions" << endl;
- cout << "5# - Show all subscriptions" << endl;
- cout << "6# - Show subscription(s) with expiring contracts" << endl;
- cout << "7# - Show subscription(s) with minimal monthly tax" << endl;
- cout << "8# - Show subscription(s) with most international calls" << endl;
- cout << "9# - Show subscription with shortest call" << endl;
- cout << "10# - CLOSE PROGRAM" << endl << endl;
- do {
- cout << "Enter choice: ";
- cin >> choice;
- } while (choice < 1 || choice > 10);
- switch (choice) {
- case 1: {
- if (subscriptions == 10) {
- system("cls");
- cout << "////////////////////////////////////////////////////////////////////" << endl;
- cout << "// YOU REACHED THE MAXIMUM NUMBER OF ALLOWED SUBSCRIPTIONS //" << endl;
- cout << "// RETURNING YOU TO MAIN MENU //" << endl;
- cout << "////////////////////////////////////////////////////////////////////" << endl << endl;
- system("pause");
- break;
- }
- else {
- do {
- system("cls");
- cout << "//////////////////////////////" << endl;
- cout << "// SINGLE SUBSCRIPTION //" << endl;
- cout << "//////////////////////////////" << endl;
- addSubscription(S, subscriptions);
- system("pause");
- if (subscriptions == 10)
- {
- system("cls");
- cout << "////////////////////////////////////////////////////////////////////" << endl;
- cout << "// PROGRAM ADDED YOUR SUBSCRIPTION(S) TO COUNTER //" << endl;
- cout << "// //" << endl;
- cout << "// YOU REACHED THE MAXIMUM NUMBER OF ALLOWED SUBSCRIPTIONS //" << endl;
- cout << "// RETURNING YOU TO MAIN MENU //" << endl;
- cout << "////////////////////////////////////////////////////////////////////" << endl << endl;
- system("pause");
- break;
- }
- else if (subscriptions < 10)
- {
- system("cls");
- cout << "////////////////////////////////////////////////////////////////////" << endl;
- cout << "// PROGRAM ADDED YOUR SUBSCRIPTION(S) TO COUNTER //" << endl;
- cout << "// YOU MAY ENTER " << 10 - subscriptions << " MORE SUBSCRIPTIONS //" << endl;
- cout << "// //" << endl;
- cout << "// WOULD YOU LIKE TO ADD MORE SUBSCRIPTIONS? //" << endl;
- cout << "// ENTER (Y/y) TO ADD OR ANYTHING ELSE TO RETURN TO MAIN MENU //" << endl;
- cout << "////////////////////////////////////////////////////////////////////" << endl << endl;
- cout << "Enter choice: ";
- cin >> choiceAdd;
- }
- } while (choiceAdd == "Y" || choiceAdd == "y");
- break;
- }
- }
- case 2: {
- if (subscriptions == 10) {
- system("cls");
- cout << "////////////////////////////////////////////////////////////////////" << endl;
- cout << "// YOU REACHED THE MAXIMUM NUMBER OF ALLOWED SUBSCRIPTIONS //" << endl;
- cout << "// RETURNING YOU TO MAIN MENU //" << endl;
- cout << "////////////////////////////////////////////////////////////////////" << endl << endl;
- system("pause");
- break;
- }
- else {
- do {
- int n;
- system("cls");
- cout << "//////////////////////////////" << endl;
- cout << "// MULTIPLE SUBSCRIPTIONS //" << endl;
- cout << "//////////////////////////////" << endl << endl;
- cout << "SYSTEM MESSAGE: Choose how many subscriptions to add: ";
- cin >> n;
- cout << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////////////" << endl;
- for (int i = 0; i < n; i++) {
- addSubscription(S, subscriptions);
- }
- if (subscriptions == 10)
- {
- system("cls");
- cout << "////////////////////////////////////////////////////////////////////" << endl;
- cout << "// PROGRAM ADDED YOUR SUBSCRIPTION(S) TO COUNTER //" << endl;
- cout << "// //" << endl;
- cout << "// YOU REACHED THE MAXIMUM NUMBER OF ALLOWED SUBSCRIPTIONS //" << endl;
- cout << "// RETURNING YOU TO MAIN MENU //" << endl;
- cout << "////////////////////////////////////////////////////////////////////" << endl << endl;
- system("pause");
- break;
- }
- else if (subscriptions < 10)
- {
- system("cls");
- cout << "////////////////////////////////////////////////////////////////////" << endl;
- cout << "// PROGRAM ADDED YOUR SUBSCRIPTION(S) TO COUNTER //" << endl;
- cout << "// YOU MAY ENTER " << 10 - subscriptions << " MORE SUBSCRIPTIONS //" << endl;
- cout << "// //" << endl;
- cout << "// WOULD YOU LIKE TO ADD MORE SUBSCRIPTIONS? //" << endl;
- cout << "// ENTER (Y/y) TO ADD OR ANYTHING ELSE TO RETURN TO MAIN MENU //" << endl;
- cout << "////////////////////////////////////////////////////////////////////" << endl << endl;
- cout << "Enter choice: ";
- cin >> choiceAdd;
- }
- } while (choiceAdd == "Y" || choiceAdd == "y");
- break;
- }
- }
- case 3: {
- makePhoneCalls(S, subscriptions);
- break;
- }
- case 4: {
- calculateMonthlyTax(S, subscriptions);
- break;
- }
- case 5: {
- showSubscriptions(S, subscriptions);
- break;
- }
- case 6: {
- showSubscriptionsWithExpiringContracts(S, subscriptions);
- break;
- }
- case 7: {
- showSubscriptionsWithLeastMonthlyTax(S, subscriptions);
- break;
- }
- case 8: {
- showSubscriptionWithMostInternationalCalls(S, subscriptions);
- break;
- }
- case 9: {
- showSubscriptionWithShortestCall(S, subscriptions);
- break;
- }
- }
- } while (choice != 10); {
- system("cls");
- cout << "//////////////////////////////" << endl;
- cout << "// QUITTING PROGRAM //" << endl;
- cout << "//////////////////////////////" << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement