/* Užduotį paruošė ir sprendė Eimutis Karčiauskas
DUOTAS mokinių sąrašas -
RASKITE kiek taškų surinko atskirų klasių mokiniai,
Klases surikiuokite taškų mažėjimo tvarka bei klasės kodą.
<<< Pradiniai duomenys - perkelkite į failą >>>
6
Simonas 12a 66
Martyna 10b 100
Jonas 11c 75
Marius 11c 68
Stepas 12a 77
Darius 12c 68
*/
#include <iostream>
#include <algorithm>
using namespace std;
struct Mokinys {
string vardas;
string klase; // klasės kodas
int taskai;
};
Mokinys mokiniai[100]; // pagal nutylėjimą reikšmės nulinės
int msk = 0; // mokinių sąraše kiekis
struct Klase {
string vardas; // klasės kodas
int mok_sk; // klasės mokinių skaičius
int taskai; // klasės mokinių taškų suma
};
Klase klases[30]; // pagal nutylėjimą reikšmės nulinės
int ksk = 0; // klasių sąraše kiekis
//==================================================
// taikysime paiešką su apsaugine reikšme pabaigoje !
// randa klasės indeksą pagal paieškos kodą
// o jei nėra, tai papildo klasių masyvą
int rastiKlase(string paieska) {
klases[ksk].vardas = paieska; // visada rasime :)
int i = 0;
while (klases[i].vardas != paieska) i++;
if(i == ksk) ksk++; // jei nebuvo - padidiname
return i;
}
//------------------------------------------------
void skaiciuoti(){ // grupuojame pagal klases
for (int i = 0; i < msk; i++){
Mokinys m = mokiniai[i];
int ki = rastiKlase(m.klase);
klases[ki].mok_sk++;
klases[ki].taskai += m.taskai;
}
}
//------------------------------------------------
void spausdinti(){ // pageidaujamų rezultatų išvedimas
cout << "===\n klasiu_sk= " << ksk << endl;
for (int i = 0; i < ksk; i++){
Klase k = klases[i];
cout << k.vardas << ' '
<< k.mok_sk << ' '
<< k.taskai << endl;
}
}
//------------------------------------------------
void skaityti(){ // iš srauto cin formuojamas sąrašas
cin >> msk;
for (int i = 0; i < msk; i++){
Mokinys m;
cin >> m.vardas >> m.klase >> m.taskai;
mokiniai[i] = m;
cout << m.vardas << '\t'
<< m.klase << ' '
<< m.taskai << endl;
}
}
//============================================
bool arTvarka(Klase a, Klase b){ // rikiavimo kriterijus
return a.taskai > b.taskai ||
a.taskai == b.taskai && a.vardas < b.vardas;
}
// rikiavimo algoritmas - visada toks pat :)
void rikiuoti(Klase mas[], int n){
for (int i=0; i<n-1; i++)
for (int j = i+1; j < n; j++)
if(!arTvarka(mas[i], mas[j]))
swap(mas[i], mas[j]);
}
//------------------------------------------------
int main(){
freopen ("U1.txt","r",stdin);
//freopen ("U1rez.txt","w",stdout); // pradžioje uždenkite
skaityti();
skaiciuoti();
rikiuoti(klases, ksk);
//sort(klases, klases + ksk, arTvarka);
spausdinti();
}
6
Simonas 12a 66
Martyna 10b 100
Jonas 11c 75
Marius 11c 68
Stepas 12a 77
Darius 12c 68