# Struktūros: objektų masyvai (rikiavimas)
# Vaizdo pamoka
# Pavyzdžiai
# Pavyzdys 1
Rikiavimas pagal vieną savybę.
Kodas:
#include <iostream>
#include <iomanip>
using namespace std;
struct zmogus
{
string vardas;
string pavarde;
int amzius;
double ugis;
zmogus(string vardas, string pavarde, int amzius, double ugis)
{
this->vardas = vardas;
this->pavarde = pavarde;
this->amzius = amzius;
this->ugis = ugis;
}
void isvedimas(string komentaras)
{
cout << komentaras << endl;
cout << vardas << " " << pavarde
<< " (" << amzius << " m.) yra "
<< ugis << " m. ugio.\n\n";
}
};
void isvedimas(string komentaras, zmogus zmones[], int kiekis)
{
cout << komentaras << endl;
cout << "-----------------------------------------\n";
cout << "Vardas, pavarde Amzius Ugis, m\n";
cout << "-----------------------------------------\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(22) << left << zmones[i].vardas << " "
<< setw(10) << zmones[i].amzius << " "
<< zmones[i].ugis << endl;
}
cout << "-----------------------------------------\n\n";
}
void rikiavimas(zmogus zmones[], int kiekis)
{
bool rikiuoti = true;
while (rikiuoti)
{
rikiuoti = false;
for (int i = 0; i < kiekis - 1; i++)
{
if (zmones[i].amzius > zmones[i + 1].amzius)
{
swap(zmones[i], zmones[i + 1]);
rikiuoti = true;
}
}
}
}
int main()
{
zmogus zmones[] = {
zmogus("Tomas", "Tomauskas", 23, 1.8),
zmogus("Giedrius", "Giedriauskas", 25, 1.75),
zmogus("Inga", "Ingauskiene", 24, 1.67),
zmogus("Paulina", "Povilaityte", 20, 1.7),
zmogus("Ignas", "Ignauskas", 19, 1.9)
};
int kiekis = 5;
isvedimas("Pradiniai duomenys", zmones, kiekis);
rikiavimas(zmones, kiekis);
isvedimas("Surikiuoti pagal amziu duomenys", zmones, kiekis);
return 0;
}
Rezultatai:
Pradiniai duomenys
-----------------------------------------
Vardas, pavarde Amzius Ugis, m
-----------------------------------------
Tomas 23 1.8
Giedrius 25 1.75
Inga 24 1.67
Paulina 20 1.7
Ignas 19 1.9
-----------------------------------------
Surikiuoti pagal amziu duomenys
-----------------------------------------
Vardas, pavarde Amzius Ugis, m
-----------------------------------------
Ignas 19 1.9
Paulina 20 1.7
Tomas 23 1.8
Inga 24 1.67
Giedrius 25 1.75
-----------------------------------------
# Pavyzdys 2
Rikiavimas pagal dvi savybes (kai pirmas sutampa, tada pagal antrą).
Kodas:
#include <iostream>
#include <iomanip>
using namespace std;
struct zmogus
{
string vardas;
string pavarde;
int amzius;
double ugis;
zmogus(string vardas, string pavarde, int amzius, double ugis)
{
this->vardas = vardas;
this->pavarde = pavarde;
this->amzius = amzius;
this->ugis = ugis;
}
void isvedimas(string komentaras)
{
cout << komentaras << endl;
cout << vardas << " " << pavarde
<< " (" << amzius << " m.) yra "
<< ugis << " m. ugio.\n\n";
}
};
void isvedimas(string komentaras, zmogus zmones[], int kiekis)
{
cout << komentaras << endl;
cout << "-----------------------------------------\n";
cout << "Vardas, pavarde Amzius Ugis, m\n";
cout << "-----------------------------------------\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(22) << left << zmones[i].vardas << " "
<< setw(10) << zmones[i].amzius << " "
<< zmones[i].ugis << endl;
}
cout << "-----------------------------------------\n\n";
}
void rikiavimas(zmogus zmones[], int kiekis)
{
bool rikiuoti = true;
while (rikiuoti)
{
rikiuoti = false;
for (int i = 0; i < kiekis - 1; i++)
{
if (zmones[i].amzius > zmones[i + 1].amzius
|| (zmones[i].amzius == zmones[i + 1].amzius &&
zmones[i].vardas > zmones[i + 1].vardas))
{
swap(zmones[i], zmones[i + 1]);
rikiuoti = true;
}
}
}
}
int main()
{
zmogus zmones[] = {
zmogus("Tomas", "Tomauskas", 23, 1.8),
zmogus("Giedrius", "Giedriauskas", 25, 1.75),
zmogus("Inga", "Ingauskiene", 25, 1.67),
zmogus("Paulina", "Povilaityte", 20, 1.7),
zmogus("Adomas", "Adomaitis", 25, 1.9)
};
int kiekis = 5;
isvedimas("Pradiniai duomenys", zmones, kiekis);
rikiavimas(zmones, kiekis);
isvedimas("Surikiuoti pagal amziu ir varda duomenys", zmones, kiekis);
return 0;
}
Rezultatai:
Pradiniai duomenys
-----------------------------------------
Vardas, pavarde Amzius Ugis, m
-----------------------------------------
Tomas 23 1.8
Giedrius 25 1.75
Inga 25 1.67
Paulina 20 1.7
Adomas 25 1.9
-----------------------------------------
Surikiuoti pagal amziu ir varda duomenys
-----------------------------------------
Vardas, pavarde Amzius Ugis, m
-----------------------------------------
Paulina 20 1.7
Tomas 23 1.8
Adomas 25 1.9
Giedrius 25 1.75
Inga 25 1.67
-----------------------------------------
# Užduotys
# Užduotis 1
Žemiau nurodytoje programoje aprašykite rikiavimo funkciją, kuri duomenis surikiuotų pagal pavardę didėjimo tvarka.
Išveskite pradinius ir surikiuotus duomenis.
Papildomai: taip pat, pamėginkite išrikiuoti kiekvieno studento pažymius didėjimo tvarka.
#include <iostream>
#include <iomanip>
using namespace std;
struct studentas
{
string vardas;
string pavarde;
int pazymiai[20];
int paz_kiekis;
studentas(string vardas, string pavarde, int pazymiai[], int paz_kiekis)
{
this->vardas = vardas;
this->pavarde = pavarde;
for (int i = 0; i < paz_kiekis; i++)
{
this->pazymiai[i] = pazymiai[i];
}
this->paz_kiekis = paz_kiekis;
}
};
void isvedimas(string komentaras, studentas studentai[], int kiekis)
{
cout << komentaras << endl;
cout << "---------------------------------------------------\n";
cout << "Vardas Pavarde Pazymiai\n";
cout << "---------------------------------------------------\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(15) << left << studentai[i].vardas << " "
<< setw(15) << studentai[i].pavarde << " ";
for (int j = 0; j < studentai[i].paz_kiekis; j++)
{
cout << studentai[i].pazymiai[j] << " ";
}
cout << endl;
}
cout << "---------------------------------------------------\n\n";
}
int main()
{
studentas studentai[] = {
studentas("Petras", "Petraitis", new int [] {7, 8, 6, 5, 4}, 5),
studentas("Ignas", "Ignauskas", new int [] {8, 8, 9, 7, 5}, 5),
studentas("Gintare", "Gintaryte", new int [] {9, 8, 9}, 3),
studentas("Indre", "Indrute", new int [] {8, 7, 4, 8, 9, 6, 8}, 7),
studentas("Jolanta", "Jolantyte", new int [] {7, 8, 7, 8, 9}, 5),
studentas("Paulius", "Paulinskas", new int [] {9, 9, 8, 7, 9}, 5)
};
int kiekis = 6;
isvedimas("PRADINIAI DUOMENYS", studentai, kiekis);
return 0;
}
# Užduotis 2
Žemiau nurodytą programą papildykite taip, kad knygas būtų galima rikiuoti tokiais būdais:
- Pagal puslapių skaičių mažėjimo tvarka.
- Pagal kainą didėjimo tvarka.
Abiejais atvejais, kai skaičius (puslapiai ar kaina) sutampa - antras rikiavimo kriterijus yra pagal pavadinimą didėjimo tvarka.
Išveskite pradinius ir surikiuotus duomenis.
#include <iostream>
#include <iomanip>
using namespace std;
struct knyga
{
string pavadinimas;
string autorius;
int puslapiu_sk;
double kaina;
int metai;
knyga(string pavadinimas, string autorius, int puslapiai, double kaina, int metai)
{
this->pavadinimas = pavadinimas;
this->autorius = autorius;
this->puslapiu_sk = puslapiai;
this->kaina = kaina;
this->metai = metai;
}
};
void isvedimas(string komentaras, knyga knygos[], int kiekis)
{
cout << komentaras << endl;
cout << "------------------------------------------------------------------------------------------------\n";
cout << "Knygos pavadinimas Autorius Psl. sk. Kaina, eur Metai\n";
cout << "------------------------------------------------------------------------------------------------\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(45) << left << knygos[i].pavadinimas << " "
<< setw(18) << knygos[i].autorius << " "
<< setw(10) << knygos[i].puslapiu_sk << " "
<< setw(11) << setprecision(2) << fixed << knygos[i].kaina << " "
<< knygos[i].metai << endl;
}
cout << "------------------------------------------------------------------------------------------------\n\n";
}
int main()
{
knyga knygos[] = {
knyga("Haris Poteris ir Azkabano kalinys", "Rowling", 250, 19.99, 2005),
knyga("7 efektyviai veikianciu zmoniu iprociai", "P. Petraitis", 200, 15.49, 2018),
knyga("Lietuvos istorija", "Istorikas Jonas", 320, 19.99, 2010),
knyga("Knyga apie automobilius", "Meistras M", 145, 10, 2008),
knyga("Programavimo ABC", "P. Progr", 149, 15.99, 2016),
knyga("Bibliografija apie A", "Albertas B.", 246, 18.45, 2017)
};
int kiekis = 6;
isvedimas("PRADINIAI DUOMENYS", knygos, kiekis);
return 0;
}
# Užduotis 3 (laisva forma)
Pasirinkite vieną iš anksčiau parašytų programų, kurioje būtų objektų masyvai ir išrikiuokite duomenis norima tvarka.
Papildomai: naudokite du kriterijus rikiavimui.