C++

Массив структур «Знак зодиака»

Создать структуру, которая будет хранить информации о знаке зодиака, с именем 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»);. Возможно проявятся и другие ошибки, но их будет не трудно исправить, подключив недостающие заголовочные файлы.
Теги:
Массив структур
Добавлено: 11 Апреля 2018 10:09:17 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...