online: 13; azi: 560; total: 52566 Manual clasa a x a - Implementarea structurilor de date - Inregistrarea

Manual clasa a X a

Implementarea structurilor de date

Inregistrarea

Într-o clasă sunt maxim 30 de elevi, fiecare elev fiind identificat prin nume şi prenume. Elevul poate primi maxim 5 note la o disciplină, pe semestru, şi o notă la teză. Datele se citesc dintr-un fişier text, în care, pe prima linie este scris numărul de elevi din clasă — n, iar apoi, pe câte o linie, sunt înregistrate atributele pentru fiecare elev: numele, prenumele şi notele. Dacă are mai puțin de 5 note, notelor lipsă li se va atribui valoarea 0. Să se calculeze şi să se afişeze mediile elevilor din clasă la acea disiplină , în ordinea:
a) descrescătoare a mediilor;
b) alfabetică a numelui şi prenumelui.
# include < iostream >
# include < fstream >
# include < string >
# include < iomanip >
using namespace std ;
struct Student {
string nume;
string prenume;
float note[ 6 ];
};
int main () {
int n;
Student elevi[ 30 ];
ifstream fin ( "elevi.txt" ) ;
if (! fin. is_open ()) {
cout << "Nu am putut deschide fisierul !" ;
return 0 ;
}
fin >> n;
fin. get (); // citim newline-ul dupa n
for ( int i = 0 ; i < n; i++) {
getline (fin, elevi[i].nume);
getline (fin, elevi[i].prenume);
float sumaNote = 0 ;
for ( int j = 0 ; j < 5 ; j++) {
fin >> elevi[i].note[j];
sumaNote += elevi[i].note[j];
}
elevi[i].note[ 5 ] = 0 ; // initializam nota la teza cu 0
if ( sumaNote != 0 ) {
elevi[i].note[ 5 ] = sumaNote / 5 ;
}
fin. get (); // citim newline-ul dupa ultima nota
}
// a) sortam descrescator dupa media notelor
for ( int i = 0 ; i < n - 1 ; i++) {
for ( int j = i + 1 ; j < n; j++) {
if (elevi[j].note[ 5 ] > elevi[i].note[ 5 ]) {
swap (elevi[i], elevi[j]);
}
}
}
cout << "Medii descrescatoare : \n" ;
for ( int i = 0 ; i < n; i++) {
cout << setw ( 20 ) << left << elevi[i].nume + " " + elevi[i].prenume << "Media: " << fixed << setprecision ( 2 ) << elevi[i].note[ 5 ] << endl ;
}
// b) sortam dupa nume si prenume
for ( int i = 0 ; i < n - 1 ; i++) {
for ( int j = i + 1 ; j < n; j++) {
if (elevi[j].nume < elevi[i].nume || (elevi[j].nume == elevi[i].nume && elevi[j].prenume < elevi[i].prenume)) {
swap (elevi[i], elevi[j]);
}
}
}
cout << "\ nMedii alfabetic: \n" ;
for ( int i = 0 ; i < n; i++) {
cout << setw ( 20 ) << left << elevi[i].nume + " " + elevi[i].prenume << "Media: " << fixed << setprecision ( 2 ) << elevi[i].note[ 5 ] << endl ;
}
fin. close ();
return 0 ;
}
În acest exemplu, am folosit o funcție lambda pentru a compara elevii în funcție de medie și apoi în ordine alfabetică. De asemenea, am folosit sortarea din biblioteca < algorithm > pentru a sorta vectorul de elevi în funcție de aceste criterii.
Expresia sort(elevi, elevi + n, [](Elev a, Elev b) {...}) este un exemplu de utilizare a funcției sort din biblioteca standard C++.
Argumentul elevi reprezintă adresa de început a vectorului de elevi, iar elevi + n reprezintă adresa de final a vectorului (adică adresa primului element din afara vectorului).
[](Elev a, Elev b) {...} reprezintă un lambda expresion (o funcție anonimă), care primește două argumente de tip Elev și returnează true dacă primul argument trebuie să fie înaintea celui de-al doilea argument în sortare.
În general, sort este o funcție din biblioteca standard C++ care poate fi folosită pentru a sorta un vector sau o parte dintr-un vector într-un anumit mod specificat prin lambda expresion-ul din al treilea argument.
Pentru a sorta un vector de elemente în C++ fără a folosi funcția sort() , puteți utiliza diverse algoritmi de sortare, cum ar fi bubble sort, insertion sort, selection sort sau quicksort .
De exemplu, pentru a sorta un vector de numere întregi în ordine crescătoare folosind bubble sort, puteți utiliza următorul cod:
int n = 5 ;
int arr [n] = { 3 , 1 , 4 , 2 , 5 };
for ( int i = 0 ; i < n - 1 ; i++) {
for ( int j = 0 ; j < n - i - 1 ; j++) {
if ( arr [j] > arr [j+ 1 ]) {
int temp = arr [j];
arr [j] = arr [j+ 1 ];
arr [j+ 1 ] = temp ;
}
}
}
// Afisare elemente sortate
for ( int i = 0 ; i < n; i++) {
cout << arr [i] << " " ;
Pentru a sorta un vector de structuri Elev în ordine descrescătoare a mediilor, puteți utiliza un algoritm de sortare similar cu bubble sort sau selection sort. De exemplu, pentru a sorta un vector de elevi în ordine descrescătoare a mediilor, puteți utiliza următorul cod:
int n = 5 ;
Elev elevi[n] = {...};
for ( int i = 0 ; i < n - 1 ; i++) {
for ( int j = 0 ; j < n - i - 1 ; j++) {
if (elevi[j].media < elevi[j+ 1 ].media) {
Elev temp = elevi[j];
elevi[j] = elevi[j+ 1 ];
elevi[j+ 1 ] = temp ;
}
}
}
// Afisare elevi sortati dupa media descrescator
for ( int i = 0 ; i < n; i++) {
cout << elevi[i].nume << " " << elevi[i].prenume << " - media: " << elevi[i].media << endl ;
}

Acest cod utilizează bubble sort pentru a sorta elevii după media descrescătoare. În fiecare iterație a buclei externe, se compară fiecare pereche de elevi adiacenți și se face o interschimbare dacă primul elev are media mai mică decât cel de-al doilea.