IT VBE 2018 2 užduotis. Slidininkai. Rikiavimas pagal 2 raktus.
tomkius1 +10
Sveiki, niekaip nesugalvoju kaip atlikti rikiavimą pagal 2 raktus (užduotyje slidininkus reikėjo surikiuoti pagal laiką didėjančiai, o jei laikai sutampa, abėcėliškai pagal vardus). Dabar programa rikiuoja tik pagal laikus. Taip pat gal kas patars, kaip buvo galima tą atrinkimą patogiau padaryti. Ačiū!
void skaitytiDuom(int& m, string atrinkti[], int minut[], int sec[]); void rikiuotiZmones(int m, string atrinkti[], int minut[], int sec[]); void spausdintiRez(int m, string atrinkti[], int minut[], int sec[]);
int main() { int m, minut[30], sec[30]; string atrinkti[30];
void skaitytiDuom(int& m, string atrinkti[], int minut[], int sec[]) { ifstream fin("duom.txt"); int n, val1[30], minut1[30], sec1[30]; int valandos, minutes, sekundes; string prad[30]; char eil[21]; fin >> n; for(int i = 0; i < n; i++){ fin.ignore(80, '\n'); fin.get(eil, 21); prad[i] = eil; fin >> val1[i]; fin >> minut1[i]; fin >> sec1[i]; } fin >> m; for(int i = 0; i < m; i++){ fin.ignore(80, '\n'); fin.get(eil, 21); atrinkti[i] = eil; fin >> valandos; fin >> minutes; fin >> sekundes; for(int j = 0; j < n; j++){ if(prad[j] == atrinkti[i]){ sec[i] = ((sekundes + (minutes * 60) + (valandos * 3600)) - (sec1[j] + (minut1[j] * 60) + (val1[j] * 3600))) % 60; minut[i] = ((sekundes + (minutes * 60) + (valandos * 3600)) - (sec1[j] + (minut1[j] * 60) + (val1[j] * 3600))) / 60; break; } } } fin.close(); }
void rikiuotiZmones(int m, string atrinkti[], int minut[], int sec[]) { for(int i = 0; i < m - 1; i++){ for(int j = i + 1; j < m; j++){ if(minut[i] * 60 + sec[i] > minut[j] * 60 + sec[j]){ string temp = atrinkti[i]; atrinkti[i] = atrinkti[j]; atrinkti[j] = temp; int temp2 = minut[i]; minut[i] = minut[j]; minut[j] = temp2; temp2 = sec[i]; sec[i] = sec[j]; sec[j] = temp2; } } } }
void spausdintiRez(int m, string atrinkti[], int minut[], int sec[]) { ofstream fout("rez.txt"); for(int i = 0; i < m; i++) fout << atrinkti[i] << minut[i] << " " << sec[i] << endl; fout.close(); }
tomkius1 +10
Galima su struktūrom geriau padaryt buvo, nesenai pradėjau mokytis tik, nepagalvojau. Tai tik dėl rikiavimo neaišku..
tomkius1 +10
Perdariau programą su struktūrom kad būtų. Gal atsiras kas paaiškins kaip surikiuoti pagal du kriterijus reikia..
#include <iostream> #include <fstream>
using namespace std;
struct Slidininkas{ string vardas; int val, minut, sec; };
void skaitytiDuomenis(int& n, int& m, Slidininkas A[], Slidininkas B[]); void skaiciuotiUztrukusiLaika(int n, Slidininkas A[], int m, Slidininkas B[], Slidininkas C[]); void rikiuotiFinisavusius(int m, Slidininkas C[]); void spausdintiRezultatus(int m, Slidininkas C[]);
int main() { int n, m; Slidininkas A[30], B[30], C[30]; // A-pradiniai, B-finisave, C-finisave su uztruktu laiku
skaitytiDuomenis(n, m, A, B); skaiciuotiUztrukusiLaika(n, A, m, B, C); rikiuotiFinisavusius(m, C); spausdintiRezultatus(m, C);
return 0; }
void skaitytiDuomenis(int& n, int& m, Slidininkas A[], Slidininkas B[]) { ifstream fin("U2.txt"); char eil[21]; fin >> n; for(int i = 0; i < n; i++){ fin.ignore(80, '\n'); fin.get(eil, 21); A[i].vardas = eil; fin >> A[i].val; fin >> A[i].minut; fin >> A[i].sec; } fin >> m; for(int i = 0; i < m; i++){ fin.ignore(80, '\n'); fin.get(eil, 21); B[i].vardas = eil; fin >> B[i].val; fin >> B[i].minut; fin >> B[i].sec; } fin.close(); }
void rikiuotiFinisavusius(int m, Slidininkas C[]) { for(int i = 0; i < m - 1; i++){ for(int j = i + 1; j < m; j++){ if(C[i].minut * 60 + C[i].sec > C[j].minut * 60 + C[j].sec){ Slidininkas D = C[i]; C[i] = C[j]; C[j] = D; } } } }
void spausdintiRezultatus(int m, Slidininkas C[]) { ofstream fout("U2rez.txt"); for(int i = 0; i < m; i++) fout << C[i].vardas << " " << C[i].minut << " " << C[i].sec << endl; fout.close(); }
pakeista prieš 5 m
valdas3 +1276
Užduoties neskaičiau, tai galbūt reikęs pakeisti > į < kur nors (ir su C++ neprogramuoju), bet pagrindinė mintis turbūt tokia: bool laikasVeliau = C[i].minut * 60 + C[i].sec > C[j].minut * 60 + C[j].sec; bool laikasLygus = C[i].minut * 60 + C[i].sec == C[j].minut * 60 + C[j].sec; bool vardasVeliau = C[i].vardas > C[j].vardas; if(laikasVeliau || (laikasLygus && vardasVeliau){ Slidininkas D = C[i]; C[i] = C[j]; C[j] = D; }
almostlow +3116
Kodėl mokyklose leidžiama vadinti kintamuosius/funkcijas lietuvių kalbą? :?
Dozz +92
Manau taip turėtų veikt. Nesigilinau per daug bet kodėl nenaudoji valandų laiko tikrinimui? Ir dar patarimas geriau naudok swap(); funkcija vietoje temp kintamųjų sukūrimo. void rikiuotiFinisavusius(int m, Slidininkas C[]) { for(int i = 0; i < m - 1; i++){ for(int j = i + 1; j < m; j++){ if(C[i].minut * 60 + C[i].sec > C[j].minut * 60 + C[j].sec) { //Slidininkas D = C[i]; //C[i] = C[j]; //C[j] = D; swap(C[i], C[j]); } else if (C[i].minut * 60 + C[i].sec == C[j].minut * 60 + C[j].sec) { if(C[i].vardas > C[j].vardas) swap(C[i], C[j]); }