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

Уровень сложности:

Создать структуру, которая будет хранить информации о знаке зодиака, с именем 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.

Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. gornyyvladimir

    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

      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";
      }
  2. petruska

    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;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.