online: 2; azi: 407; total: 52413 Manual clasa a xi a - Tehnici de programare - Divide et impera

Manual clasa a Xi a

Tehnici de programare

Divide et impera

Într un fişier text sunt scrise următoarele informații: pe primul rând numărul de elevi din clasă — n, iar pe următoarele n rânduri următoarele informaţii despre un elev: numele, prenumele şi mediile semestriale la disciplina informatică. În cadrul unui rând datele sunt separate prin spațiu. Să se scrie un program care să realizeze următoarele cerințe. Fiecare cerință va fi rezolvată printr-un subprogram. Ordonarea elementelor vectorului şi căutarea unui elev în vector se vor face folosind algoritmii cei mai eficienti.
a. Se citesc datele din fişierul text şi se calculează media anuală a fiecărui elev.
c. Pentru numele şi prenumele unui elev semestriale şi media anuală.
d. Se scriu informațiile obținute în urma prelucrărilor într-un alt fişier text
# include <iostream>
# include <fstream>
# include <string>
# include <cstring>
# include <cstdlib>
using namespace std;
struct Elev {
string nume;
string prenume;
double medie_sem1;
double medie_sem2;
double medie_anuala;
};
int compare ( const void *a, const void *b) {
Elev *elev_a = (Elev *)a;
Elev *elev_b = (Elev *)b;
int cmp_nume = elev_a->nume. compare (elev_b->nume);
if (cmp_nume == 0 ) {
return elev_a->prenume. compare (elev_b->prenume);
}
return cmp_nume;
}
void citeste_date (Elev elevi[], int n, ifstream &in) {
for ( int i = 0 ; i < n; i++) {
in >> elevi[i].nume >> elevi[i].prenume >> elevi[i].medie_sem1 >> elevi[i].medie_sem2;
elevi[i].medie_anuala = (elevi[i].medie_sem1 + elevi[i].medie_sem2) / 2 ;
}
}
void scrie_date (Elev elevi[], int n, ofstream &out) {
for ( int i = 0 ; i < n; i++) {
out << elevi[i].nume << " " << elevi[i].prenume << " "
<< elevi[i].medie_sem1 << " " << elevi[i].medie_sem2 << " " << elevi[i].medie_anuala << endl;
}
}
int main () {
ifstream in ( "input.txt" ) ;
ofstream out ( "output.txt" ) ;
int n;
in >> n;
Elev elevi[n];
citeste_date (elevi, n, in);
qsort (elevi, n, sizeof (Elev), compare);
scrie_date (elevi, n, out);
in. close ();
out. close ();
return 0 ;
}

C onținut al fișierului de intrare input.txt :
5
Popescu Ion 9.2 8.5
Ionescu Ana 10 9.8
Vasilescu Maria 7.5 8
Petrescu George 6 7.3
Georgescu Elena 8.7 9.3
După ce rulezi programul cu acest fișier de intrare, vei obține un fișier de ieșire output.txt care conține informațiile despre elevi, incluzând mediile anuale, ordonate alfabetic după nume și prenume. Fișierul output.txt arată în felul următor:
Georgescu Elena 8.7 9.3 9
Ionescu Ana 10 9.8 9.9
Petrescu George 6 7.3 6.65
Popescu Ion 9.2 8.5 8.85
Vasilescu Maria 7.5 8 7.75