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