Создать структуру, которая будет хранить информации о знаке зодиака, с именем
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
Немножко усовершенствовал: массив не статичный, знак зодиака определяется автоматически.
gornyyvladimir
petruska
Вот мой вариант,правда не очень понял «день рождения (массив из трёх чисел)» ,поэтому сделал отдельные инты для для даты!