Создать структуру, которая будет хранить информации о знаке зодиака, с именем
Znak. Структура Znak должна содержать следующие поля:name — фамилия, имя и отчество;zodiac — знак зодиака;bday — день рождения (массив из трёх чисел).Программа, должна уметь выполнять следующие действия:
- ввод с клавиатуры данных в массив
book, который состоит из восьми элементов типаZnak; - вывод на экран информации о людях, родившихся в месяц, значения которого введено с клавиатуры, если таких нет, выдать на дисплей соответствующее сообщение.
- упорядочивание записей по знакам Зодиака;

Рисунок 1 — Массив структур «Знак зодиака»
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
int getIntZodiak(char * str); // прототип функции, которая возвращает порядковый номер знака зодиака
struct Znak
{
char name[50]; // фамилия, имя
char zodiac[20]; // знак зодиака
int bday[3]; // дата рождения дд.мм.гг
};
// массив указателей на строки (знаки зодиака)
const char *sign_zodiac[12] = {"Овен", "Телец", "Близнецы", "Рак" , "Лев", "Дева",
"Весы", "Скорпион", "Стрелец", "Козерог", "Водолей", "Рыбы" }; // порядок следования знаков зодиака
int main()
{
const int size_array = 8; // количество записей
Znak book[size_array]; // объявляем массив структур
int counter_rec = 0; // счётчик записей
while (counter_rec < size_array) // пока не внесено 8 записей
{
cout << "Введите имя и фамилию через пробел: ";
cin.getline(book[counter_rec].name, 50);
cout << "Введите знак зодиака: ";
cin.getline(book[counter_rec].zodiac, 20);
cout << "Введите дату рождения в формате (дд.мм.гг) ";
cin >> setw(2) >> (book[counter_rec].bday[0]); // считать первые два символа, т.е. день
cin.ignore(); // пропустить символ точки
cin >> setw(2) >> book[counter_rec].bday[1]; // считать следующие два символа, т.е. месяц
cin.ignore(); // пропустить символ точки
cin >> setw(4) >> book[counter_rec].bday[2]; // считать четыре символа, т.е. год
cin.get(); // считываем символ новой строки '\n'
counter_rec++; // инкремент счётчика записей
}
// сортировка записей в массиве структур
for (int ctr1 = 0; ctr1 < size_array; ctr1++)
{
for (int ctr2 = ctr1 + 1; ctr2 < size_array; ctr2++)
{
if (getIntZodiak(book[ctr1].zodiac) > getIntZodiak(book[ctr2].zodiac)) // если порядок не правильный, то поменять местами записи
{
char temp_name[50]; // временная переменная для перестановки строк: имя и знак зодиака
// перестановка имён
strcpy(temp_name, book[ctr1].name);
strcpy(book[ctr1].name, book[ctr2].name);
strcpy(book[ctr2].name, temp_name);
// перестановка знака зодиака
strcpy(temp_name, book[ctr1].zodiac);
strcpy(book[ctr1].zodiac, book[ctr2].zodiac);
strcpy(book[ctr2].zodiac, temp_name);
int temp_data[3] = {book[ctr1].bday[0], book[ctr1].bday[1], book[ctr1].bday[2]}; // временный массив, для обмена д.р.
// перестановка дат рождения
book[ctr1].bday[0] = book[ctr2].bday[0];
book[ctr1].bday[1] = book[ctr2].bday[1];
book[ctr1].bday[2] = book[ctr2].bday[2];
book[ctr2].bday[0] = temp_data[0];
book[ctr2].bday[1] = temp_data[1];
book[ctr2].bday[2] = temp_data[2];
}
}
}
int month = 0;
cout << "Введите порядковый номер месяца: ";
cin >> month;
if (month < 1 || month > 12)
{
cout << "Месяц указан не корректно!" << endl;
//return -1;
}
else
{
// печать записей, месяц которых совпадает с введённым
cout << endl;
bool no_records = false; // переменная-флаг, отвечающая за существование записей, месяц которых равен введённому
for (int counter = 0; counter < size_array; counter++)
{
if (book[counter].bday[1] == month) // если совпадает номер месяца в записи с введённым с клавиатуры
{
no_records = true;
cout << book[counter].name << endl; // имя и фамилия
cout << book[counter].zodiac << endl; // знак зодиака
cout << setfill('0') << setw(2) << book[counter].bday[0] << "."
<< setw(2) << book[counter].bday[1] << "." << setw(2) << book[counter].bday[2] << endl << endl; // дата рождения
}
}
if (no_records) cout << "Нет людей родившихся " << month << " месяца." << endl;
}
return 0;
}
int getIntZodiak(char * str) // функция возвращает порядковый номер знака зодиака
{
for (int counter = 0; counter < 12; counter++)
{
if (!strcmp(str,sign_zodiac[counter])) // если знаки зодиака совпадают, то вернуть порядковый номер
return counter;
}
return -1; // возвращаемое значение, в случае, если имя передаваемое как параметр не совпало ни с одним знаком зодиака
}
Данная программа написана в среде разработки QT, в ОС Linux. Чтобы данный код сработал в MVS вначале исходника нужно добавить строку #include «stdafx.h». И в конце main() перед return 0; строку system(«pause»);. Возможно проявятся и другие ошибки, но их будет не трудно исправить, подключив недостающие заголовочные файлы. Результат работы программы показан на рисунке 1.
Комментарии
gornyyvladimir
Немножко усовершенствовал: массив не статичный, знак зодиака определяется автоматически.
#include <string> #include <vector> #include <iostream> #include <iomanip> #include <algorithm> #include <vcl.h> #pragma hdrstop struct Znak { string name; string zodiac; int bday[3]; }; void AddNew( vector<Znak> & data ); void ShowAll( const vector<Znak> & data ); int GetZodiacNo( string zodiac ); void SortZodiac( vector<Znak> & data ); #pragma argsused int main(int argc, char* argv[]) { std::vector<Znak> book; bool isExit = true; while(isExit) { char key; cout<<"Menu: \n"<<"1 - Add new\n"<<"2 - Show all\n"<<"3 - Sort\n" <<"0 - Exit\n"; cin>>key; switch(key) { case '1': AddNew(book); break; case '2': ShowAll(book); break; case '3': SortZodiac(book); break; case '0': isExit = false; break; } } return 0; } void AddNew( vector<Znak> & data ) { Znak tmp; cout<<"Enter name: "; cin>>tmp.name; cout<<"Enter bday day mounth year: \n"; cin>>tmp.bday[0]; cin>>tmp.bday[1]; cin>>tmp.bday[2]; if((tmp.bday[0] >= 21 && tmp.bday[1] == 3) || (tmp.bday[0]<=19 && tmp.bday[1] == 4)) tmp.zodiac = "oven"; else if((tmp.bday[0] >= 20 && tmp.bday[1] == 4) || (tmp.bday[0]<=20 && tmp.bday[1] == 5)) tmp.zodiac = "telec"; else if((tmp.bday[0] >= 21 && tmp.bday[1] == 5) || (tmp.bday[0]<=20 && tmp.bday[1] == 6)) tmp.zodiac = "bliznec"; else if((tmp.bday[0] >= 21 && tmp.bday[1] == 6) || (tmp.bday[0]<=22 && tmp.bday[1] == 7)) tmp.zodiac = "rak"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 7) || (tmp.bday[0]<=22 && tmp.bday[1] == 8)) tmp.zodiac = "lev"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 8) || (tmp.bday[0]<=22 && tmp.bday[1] == 9)) tmp.zodiac = "deva"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 9) || (tmp.bday[0]<=22 && tmp.bday[1] == 10)) tmp.zodiac = "vesi"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 10) || (tmp.bday[0]<=21 && tmp.bday[1] == 11)) tmp.zodiac = "scorpion"; else if((tmp.bday[0] >= 22 && tmp.bday[1] == 11) || (tmp.bday[0]<=21 && tmp.bday[1] == 12)) tmp.zodiac = "strelec"; else if((tmp.bday[0] >= 22 && tmp.bday[1] == 12) || (tmp.bday[0]<=19 && tmp.bday[1] == 1)) tmp.zodiac = "kozerog"; else if((tmp.bday[0] >= 20 && tmp.bday[1] == 1) || (tmp.bday[0]<=18 && tmp.bday[1] == 2)) tmp.zodiac = "vodoley"; else if((tmp.bday[0] >= 19 && tmp.bday[1] == 2) || (tmp.bday[0]<=20 && tmp.bday[1] == 3)) tmp.zodiac = "riba"; else tmp.zodiac = "oven"; data.push_back(tmp); } void ShowAll( const vector<Znak> & data ) { for(size_t i=0; i<data.size(); i++) { cout<<"Name: "<<data.at(i).name<<"\n"; cout<<"Zodiac: "<<data.at(i).zodiac<<"\n"; cout<<"Bday: "<<data.at(i).bday[0]<<"."<<data.at(i).bday[1]<<"." <<data.at(i).bday[2]<<"\n"; } } int GetZodiacNo( string zodiac ) { if(zodiac == "oven") return 1; else if(zodiac == "telec") return 2; else if(zodiac == "bliznec") return 3; else if(zodiac == "rak") return 4; else if(zodiac == "lev") return 5; else if(zodiac == "deva") return 6; else if(zodiac == "vesi") return 7; else if(zodiac == "scorpion") return 8; else if(zodiac == "strelec") return 9; else if(zodiac == "kozerog") return 10; else if(zodiac == "vodoley") return 11; else if(zodiac == "riba") return 12; } void SortZodiac( vector<Znak> & data ) { Znak tmp; for(size_t i = 0; i < data.size() - 1; ++i) { for(size_t j = 0; j < data.size() - 1; ++j) { if (GetZodiacNo(data.at(j + 1).zodiac) < GetZodiacNo(data.at(j).zodiac)) { tmp = data.at(j + 1); data.at(j + 1) = data.at(j); data.at(j) = tmp; } } } ShowAll(data); }gornyyvladimir
#include <string> #include <vector> #include <iostream> #include <iomanip> #include <algorithm> #include <vcl.h> #pragma hdrstop struct Znak { string name; string zodiac; size_t bday[3]; }; void AddNew( vector<Znak> & data ); void ShowAll( const vector<Znak> & data ); int GetZodiacNo( string zodiac ); void SortZodiac( vector<Znak> & data ); void ShowDate( const vector<Znak> & data ); #pragma argsused int main(int argc, char* argv[]) { std::vector<Znak> book; bool isExit = true; while(isExit) { char key; cout<<"Menu: \n"<<"1 - Add new\n"<<"2 - Show all\n"<<"3 - Sort\n" <<"4 - Find by birthday\n"<<"0 - Exit\n"; cin>>key; switch(key) { case '1': AddNew(book); break; case '2': ShowAll(book); break; case '3': SortZodiac(book); break; case '4': ShowDate(book); break; case '0': isExit = false; break; } } return 0; } void AddNew( vector<Znak> & data ) { Znak tmp; cout<<"Enter name: "; cin>>tmp.name; cout<<"Enter bday day mounth year: \n"; cin>>tmp.bday[0]; cin>>tmp.bday[1]; cin>>tmp.bday[2]; if((tmp.bday[0] >= 21 && tmp.bday[1] == 3) || (tmp.bday[0]<=19 && tmp.bday[1] == 4)) tmp.zodiac = "oven"; else if((tmp.bday[0] >= 20 && tmp.bday[1] == 4) || (tmp.bday[0]<=20 && tmp.bday[1] == 5)) tmp.zodiac = "telec"; else if((tmp.bday[0] >= 21 && tmp.bday[1] == 5) || (tmp.bday[0]<=20 && tmp.bday[1] == 6)) tmp.zodiac = "bliznec"; else if((tmp.bday[0] >= 21 && tmp.bday[1] == 6) || (tmp.bday[0]<=22 && tmp.bday[1] == 7)) tmp.zodiac = "rak"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 7) || (tmp.bday[0]<=22 && tmp.bday[1] == 8)) tmp.zodiac = "lev"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 8) || (tmp.bday[0]<=22 && tmp.bday[1] == 9)) tmp.zodiac = "deva"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 9) || (tmp.bday[0]<=22 && tmp.bday[1] == 10)) tmp.zodiac = "vesi"; else if((tmp.bday[0] >= 23 && tmp.bday[1] == 10) || (tmp.bday[0]<=21 && tmp.bday[1] == 11)) tmp.zodiac = "scorpion"; else if((tmp.bday[0] >= 22 && tmp.bday[1] == 11) || (tmp.bday[0]<=21 && tmp.bday[1] == 12)) tmp.zodiac = "strelec"; else if((tmp.bday[0] >= 22 && tmp.bday[1] == 12) || (tmp.bday[0]<=19 && tmp.bday[1] == 1)) tmp.zodiac = "kozerog"; else if((tmp.bday[0] >= 20 && tmp.bday[1] == 1) || (tmp.bday[0]<=18 && tmp.bday[1] == 2)) tmp.zodiac = "vodoley"; else if((tmp.bday[0] >= 19 && tmp.bday[1] == 2) || (tmp.bday[0]<=20 && tmp.bday[1] == 3)) tmp.zodiac = "riba"; else tmp.zodiac = "oven"; data.push_back(tmp); } void ShowAll( const vector<Znak> & data ) { for(size_t i=0; i<data.size(); i++) { cout<<"Name: "<<data.at(i).name<<"\n"; cout<<"Zodiac: "<<data.at(i).zodiac<<"\n"; cout<<"Bday: "<<data.at(i).bday[0]<<"."<<data.at(i).bday[1]<<"." <<data.at(i).bday[2]<<"\n"; } } int GetZodiacNo( string zodiac ) { if(zodiac == "oven") return 1; else if(zodiac == "telec") return 2; else if(zodiac == "bliznec") return 3; else if(zodiac == "rak") return 4; else if(zodiac == "lev") return 5; else if(zodiac == "deva") return 6; else if(zodiac == "vesi") return 7; else if(zodiac == "scorpion") return 8; else if(zodiac == "strelec") return 9; else if(zodiac == "kozerog") return 10; else if(zodiac == "vodoley") return 11; else if(zodiac == "riba") return 12; return 1; } void SortZodiac( vector<Znak> & data ) { Znak tmp; for(size_t i = 0; i < data.size() - 1; ++i) { for(size_t j = 0; j < data.size() - 1; ++j) { if (GetZodiacNo(data.at(j + 1).zodiac) < GetZodiacNo(data.at(j).zodiac)) { tmp = data.at(j + 1); data.at(j + 1) = data.at(j); data.at(j) = tmp; } } } ShowAll(data); } void ShowDate( const vector<Znak> & data ) { size_t day, month, year; bool isFind = false; cout<<"Enter date day month year: "; cin>>day; cin>>month; cin>>year; for(size_t i=0; i<data.size(); i++) { if((data.at(i).bday[0] == day) && (data.at(i).bday[1] == month) && (data.at(i).bday[2] == year)) { cout<<"Name: "<<data.at(i).name<<"\n"; cout<<"Zodiac: "<<data.at(i).zodiac<<"\n"; cout<<"Bday: "<<data.at(i).bday[0]<<"."<<data.at(i).bday[1]<<"." <<data.at(i).bday[2]<<"\n"; isFind = true; } } if(!isFind) cout<<"Not find :(\n"; }petruska
Вот мой вариант,правда не очень понял «день рождения (массив из трёх чисел)» ,поэтому сделал отдельные инты для для даты!
#include "stdafx.h" // here all librarys struct Sign // main struct { string name; string sign; int bday1; int bday2; int bday3; }; int _tmain(int argc, _TCHAR* argv[]) { const int size=8; // you can change size of persons (for cheak program) Sign sign[size]; // enter data cout << "Enter info about persons:" <<endl; for (int i=0; i < size; i++) { cout << "Enter name of " <<i+1<< " person: "; cin >>sign[i].name; cout << "Enter sign of the zodiac of " <<i+1 << " person: "; cin >>sign[i].sign; cout << "Enter DOB of " <<i+1 << " person:" <<endl; cout << "Enter data of birth: "; cin >>sign[i].bday1; cout << "Enter data of month: "; cin >>sign[i].bday2; cout << "Enter data of year: "; cin >>sign[i].bday3; cout <<endl; } cout << "All information was successfully enter!" <<endl; // find person with enter month int month=0; cout << "Enter number of month, when a person is born: "; cin >>month; int clear=0; for (int i=0; i < size; i++) { if (sign[i].bday2 == month) //compare person's month of bday { cout <<endl << sign[i].name <<endl <<sign[i].sign <<endl <<sign[i].bday1<<'.'<<sign[i].bday2<<'.'<<sign[i].bday3 <<endl; clear++; } } if ( clear == 0) cout << "Can't find any person with it reques!" <<endl; // show sort list char show; cout <<endl<< "Do you want see sort list? (Y/N)"; cin >>show; if (show == 'y' || show == 'Y') { // buble sort for (int i=0; i < size-1; i++) { if ( sign[i].bday2 < sign[i+1].bday2) { //temp values string tName; string tSign; int tB1,tB2,tB3; // save all appropriate values tName=sign[i].name; sign[i].name=sign[i+1].name; sign[i+1].name=tName; tSign=sign[i].sign; sign[i].sign=sign[i+1].sign; sign[i+1].sign=tSign; tB1=sign[i].bday1; sign[i].bday1=sign[i+1].bday1; sign[i+1].bday1=tB1; tB2=sign[i].bday2; sign[i].bday2=sign[i+1].bday2; sign[i+1].bday2=tB2; tB3=sign[i].bday3; sign[i].bday3=sign[i+1].bday3; sign[i+1].bday3=tB3; } } // show sort list cout << "Sort list:" <<endl; for (int i=0; i < size; i++) { cout << sign[i].name <<endl <<sign[i].sign <<endl <<sign[i].bday1<<'.'<<sign[i].bday2<<'.'<<sign[i].bday3 <<endl; cout <<endl; } } return 0; }