Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int N=10;
- const int MaxLNLen=15,
- MaxFNLen=15,
- MaxNum=11,
- Today=26,
- Tomonth=12,
- Toyear=2016;
- string spaces(int num){
- string spacess{};
- for(int i=0; i<num; i++)
- spacess+=' ';
- return spacess;
- }
- struct NOTE{
- string lastName{}, firstName{};
- int * birthDay;
- string phoneNumber{};
- string operatorName{};
- NOTE(string lastName,
- string firstName,
- int* birthDay,
- string phoneNumber,
- string operatorName){
- this->lastName=lastName,
- this->firstName=firstName,
- this->birthDay=birthDay,
- this->phoneNumber=phoneNumber,
- this->operatorName=operatorName;
- }
- NOTE(){
- }
- void scanNOTE(ifstream &fin){
- birthDay=new int[3];
- fin >> this->lastName >>
- this->firstName >>
- this->birthDay[0] >> this->birthDay[1] >> this->birthDay[2] >>
- this->phoneNumber >>
- this->operatorName;
- }
- void printNOTE(){
- cout << lastName << spaces(MaxLNLen-lastName.length()) <<
- firstName << spaces(MaxFNLen-firstName.length()) <<
- birthDay[0] << spaces(3-log(birthDay[0]+1)/log(10)) <<
- birthDay[1] << spaces(3-log(birthDay[1]+1)/log(10)) <<
- birthDay[2] << spaces(8-log(birthDay[2]+1)/log(10)) <<
- phoneNumber << spaces(MaxNum-phoneNumber.length()) <<
- operatorName << endl;
- }
- };
- bool cmpLN(const NOTE &A, const NOTE &B){ // Для сортировки по фамилии
- return A.lastName<B.lastName;
- }
- bool cmpNum(const NOTE &A, const NOTE &B){ // Для сортировки по номеру телефона
- return A.phoneNumber<B.phoneNumber;
- }
- bool cmpBD(const NOTE &A, const NOTE &B){ // Для сортировки по дню рождения
- return A.birthDay[0]<B.birthDay[0];
- }
- bool cmp3Num(const NOTE &A, const NOTE &B){ // Для сортировки по первым трем цифрам номера телефона
- return A.phoneNumber.substr(0,3)<B.phoneNumber.substr(0,3);
- }
- void printNOTE(NOTE* &testArNOTE){ // Вывод базы абонентов
- cout << "Last Name" << spaces(MaxLNLen-9) <<
- "First Name" << spaces(MaxFNLen-10) <<
- "Birthday" << spaces(6) <<
- "Number" << spaces(MaxNum-6) <<
- "Operator\n";
- for(int i=0; i<N; i++){
- testArNOTE[i].printNOTE();
- }
- }
- void findSortAndPrintOper(string &oper, NOTE * &testArNOTE){
- sort(testArNOTE, testArNOTE+N, cmpNum); //Сортируем по номеру телефона
- int count{};
- for(int i=0; i<N; i++)
- if (testArNOTE[i].operatorName==oper)
- count++;
- if(count==0)
- cout << "Abonents with operator name \"" << oper << "\" not found\n";
- else{
- cout << "Last Name" << spaces(MaxLNLen-9) <<
- "First Name" << spaces(MaxFNLen-10) <<
- "Birthday" << spaces(6) <<
- "Number" << spaces(MaxNum-6) <<
- "Operator" << spaces(5) <<
- "Old\n";
- for(int i=0; i<N; i++)
- if (testArNOTE[i].operatorName==oper)
- cout << testArNOTE[i].lastName << spaces(MaxLNLen-testArNOTE[i].lastName.length()) <<
- testArNOTE[i].firstName << spaces(MaxFNLen-testArNOTE[i].firstName.length()) <<
- testArNOTE[i].birthDay[0] << spaces(3-log(testArNOTE[i].birthDay[0]+1)/log(10)) <<
- testArNOTE[i].birthDay[1] << spaces(3-log(testArNOTE[i].birthDay[1]+1)/log(10)) <<
- testArNOTE[i].birthDay[2] << spaces(8-log(testArNOTE[i].birthDay[2]+1)/log(10)) <<
- testArNOTE[i].phoneNumber << spaces(MaxNum-testArNOTE[i].phoneNumber.length()) <<
- testArNOTE[i].operatorName << spaces(13-testArNOTE[i].operatorName.length()) <<
- Toyear-testArNOTE[i].birthDay[2] - (Tomonth==testArNOTE[i].birthDay[1]?Today<testArNOTE[i].birthDay[0]:Tomonth<testArNOTE[i].birthDay[1]) << endl;
- }
- }
- void findSortAndPrintMonth(int &month, NOTE * &testArNOTE){
- sort(testArNOTE, testArNOTE+N, cmpBD); // Сортируем по дню рождения
- int count{};
- for(int i=0; i<N; i++)
- if (testArNOTE[i].birthDay[1]==month)
- count++;
- if(count==0)
- cout << "Abonents with birth month \"" << month << "\" not found\n";
- else{
- cout << "Last Name" << spaces(MaxLNLen-9) <<
- "First Name" << spaces(MaxFNLen-10) <<
- "Birthday" << spaces(6) <<
- "Number" << spaces(MaxNum-6) <<
- "Operator\n";
- for(int i=0; i<N; i++)
- if (testArNOTE[i].birthDay[1]==month)
- cout << testArNOTE[i].lastName << spaces(MaxLNLen-testArNOTE[i].lastName.length()) <<
- testArNOTE[i].firstName << spaces(MaxFNLen-testArNOTE[i].firstName.length()) <<
- testArNOTE[i].birthDay[0] << spaces(3-log(testArNOTE[i].birthDay[0]+1)/log(10)) <<
- testArNOTE[i].birthDay[1] << spaces(3-log(testArNOTE[i].birthDay[1]+1)/log(10)) <<
- testArNOTE[i].birthDay[2] << spaces(8-log(testArNOTE[i].birthDay[2]+1)/log(10)) <<
- testArNOTE[i].phoneNumber << spaces(MaxNum-testArNOTE[i].phoneNumber.length()) <<
- testArNOTE[i].operatorName << endl;
- }
- }
- int main(){
- ifstream fin("abonDataBase.txt");
- fin >> N;
- NOTE *testArNOTE = new NOTE[N];
- for(int i=0; i<N; i++){ // Считываем данные из файла
- testArNOTE[i].scanNOTE(fin);
- }
- char key{};
- cout << "Menu:\t2 -- print database,\n\t3 -- sort of last name,\n\t4 -- same oper,\n\t5 -- birth month,\n\t6 -- sort 3 num,\n\tE -- Exit\n";
- cin >> key;
- while(key!='E'){ // Пока пользователь не нажет "Е"
- switch(key){
- case '2': // Нажал 2, выводим данные
- {
- while(key=='2' || key=='Y'){
- printNOTE(testArNOTE);
- cout << "Retry? Y -- Yes, N -- No, E -- Exit\n";
- cin >> key;
- }
- break;
- }
- case '3': // Нажал 3, сортируем по фамилии
- {
- while(key=='3' || key=='Y'){ // Неочевидно, зачем повторять, но почему бы и нет...
- sort(testArNOTE, testArNOTE+N, cmpLN);
- cout << "Retry? Y -- Yes, N -- No, E -- Exit\n";
- cin >> key;
- }
- break;
- }
- case '4':{ // Нажал 4, находим всех абонентов с заданным оператором, сортируем и выводим
- string oper{};
- while(key=='4' || key=='Y'){
- cout << "Print operator name: ";
- cin >> oper;
- findSortAndPrintOper(oper, testArNOTE);
- cout << "Retry? Y -- Yes, N -- No, E -- Exit\n";
- cin >> key;
- }
- break;
- }
- case '5': // Наэал 5, находим всех абонентов с заданным месяцев дня рождения, сортируем по дню и выводим
- {
- int month{};
- while(key=='5' || key=='Y'){
- cout << "Print month: ";
- cin >> month;
- findSortAndPrintMonth(month, testArNOTE);
- cout << "Retry? Y -- Yes, N -- No, E -- Exit\n";
- cin >> key;
- }
- break;
- }
- case '6': // Нажал 6, сортируем по первым 3 цифрам номера телефона и выводим
- {
- while(key=='6' || key=='Y'){
- sort(testArNOTE, testArNOTE+N, cmp3Num);
- printNOTE(testArNOTE);
- cout << "Retry? Y -- Yes, N -- No, E -- Exit\n";
- cin >> key;
- }
- break;
- }
- }
- if (key=='E') // Если вдруг в каком-то из пунктов пользователь нажал на выход, не спрашиваем у него второй раз
- return 0;
- cout << "Menu:\t2 -- print database,\n\t3 -- sort of last name,\n\t4 -- same oper,\n\t5 -- birth month,\n\t6 -- sort 3 num,\n\tE -- Exit\n";
- cin >> key;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement