Структури

Задача 4. Решение:

#include<iostream>
using namespace std;
struct Book
{
   char title[31];
   char author[31];
   double price;
   char ISBN_num[11];
};
int main()
{
   int n;
   double p;
   Book arr[51];
   cin>>n;
   for(int i=0;i<n;i++)
   {
    cin.get();
        cin.getline(arr[i].title,31);
    cin.getline(arr[i].author,31);
    cin>>arr[i].price;
    cin>>arr[i].ISBN_num;
   }
   cin>>p;
   for(int j=0;j<n;j++)
   {
    if(arr[j].price>p)
    {
        cout<<arr[j].title<<' ';
                cout<<arr[j].author<<' ';
                cout<<arr[j].price<<' ';
                cout<<arr[j].ISBN_num<<endl;
    }
   }
   return 0;
}

Задача 5. Решение:

#include<iostream>
using namespace std;
struct Firma
{
   char name[31];
   char egn[11];
   char duty[21];
   double payment;
};
int main()
{
   int n;
   Firma workers[21];
   cin>>n;
   for(int i=0;i<n;i++)
   {
    cin.get();
        cin.getline(workers[i].name,31);
    cin>>workers[i].egn;
    cin>>workers[i].duty;
    cin>>workers[i].payment;
   }
   for(int j=0;j<n;j++)
   {
    if(workers[j].payment<700)
       {
          cout<<workers[j].name<<endl;
       }
    }
   return 0;
}

Задача 6. Решение:

#include<iostream>
#include<string>
using namespace std;
struct Hospital
{
   char name[31];
   char diagnose[31];
   int days;
};
int main()
{
   int n;
   char buf[2];
   Hospital pacients[50];
   cin>>n;
   for(int i=0;i<n;i++)
   {
    cin.get();
        cin.getline(pacients[i].name,31);
    cin>>pacients[i].diagnose;
    cin>>pacients[i].days;
   }
   int ind=0,max=pacients[0].days;
   char FindDiagnose[31];
   cin>>FindDiagnose;
   for(int j=0;j<n;j++)
   {
    if(strcmp(pacients[j].diagnose,FindDiagnose)==0)
       {
           cout<<pacients[j].name<<endl;
        }
        if(max<pacients[j].days)
       {
      max=pacients[j].days;
      ind=j;
        }
   }
   cout<<pacients[ind].name<<" ";
   cout<<pacients[ind].diagnose<<" ";
   cout<<pacients[ind].days<<endl;
   return 0;
}

Задача 7. В тази задача е необходимо да се реализира сортиране по първо име. Най-очевидната идея е да се използва един от двата изучени метода за сортиране на масив с елементи от тип People. За сравнение на имената трябва да се използва функцията strcmp(), след което се правят размени на съответните елементи на масива (записи от тип структура) така, както сортировката го налага.

Решение 1:

#include<iostream>
#include<string>
using namespace std;
struct People
{
   char first_name[16];
   char last_name[16];
   char egn[11];
};
int main()
{
   int n,i,j;
   People peoples[51], swap;
   cin>>n;
   for(i=0;i<n;i++)
   {
    cin>>peoples[i].first_name;
    cin>>peoples[i].last_name;
    cin>>peoples[i].egn;
   }
   //Сортиране на елементите на масива по метода на мехурчето
   for(i=0;i<n-1;i++)
    for(j=0;j<n-i-1;j++)
    if(strcmp(peoples[j].first_name, peoples[j+1].first_name)>0)
        {
            swap=peoples[j];
            peoples[j]=peoples[j+1];
            peoples[j+1]=swap;
        }
   for(i=0;i<n;i++)
   {
    cout<<peoples[i].first_name<<" ";
    cout<<peoples[i].last_name<<" ";
    cout<<peoples[i].egn<<endl;
   }
   return 0;
}

Проблемът в горното решение е, че при сортирането се извършва разместване на цели структури и низовете, включени в тях. Когато обемът на данните за обработка е голям, изчислителният процес се забавя.

По-рационално решение е да не се преместват самите елементи на масива (от тип структура). Може да се ползва нов масив от целочислен тип, елементите на който да съответстват на индексите на входния масив. Така при сортирането ще бъдат разменяни само елементите на втория масив (индексите на входния масив). Тези индекси ще се използват, за да бъдат изведени елементите на структурния масив в сортиран ред.

Решение 2:

#include<iostream>
#include<string>
using namespace std;
struct People
{
   char first_name[16];
   char last_name[16];
   char egn[11];
};
int main()
{
   int n;
   People peoples[51];
   int arr[51],i,j,swap;
   cin>>n;
   for(i=0;i<n;i++)
   {
    cin>>peoples[i].first_name;
    cin>>peoples[i].last_name;
    cin>>peoples[i].egn;
    /* Запазване на индексите на масива peoples в масива arr */
    arr[i]=i;
   }
   /* Сортиране на елементите на масива по метода на 
   мехурчето, като се сортират индексите на масива arr*/
   for(i=0;i<n-1;i++)
    for(j=0;j<n-i-1;j++)
    if(strcmp(peoples[arr[j]].first_name, peoples[arr[j+1]].first_name)>0)
    {
        swap=arr[j];
        arr[j]=arr[j+1];
        arr[j+1]=swap;
    }
   for(i=0;i<n;i++)
   {
    cout<<peoples[arr[i]].first_name<<" ";
    cout<<peoples[arr[i]].last_name<<" ";
    cout<<peoples[arr[i]].egn<<endl;
   }
   return 0;
}