eMatematikas Prisijunk Forumas Egzaminų užduotys ONLINE testai

IT VBE 2018 2 užduotis. Slidininkai. Rikiavimas pagal 2 raktus.


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ū!

Sąlyga(pavažiavus apačioje): https://www.nec.lt/failai/7417_IT-VBE-1_2018-GALUTINE.pdf

#include <iostream>
#include <fstream>

using namespace std;

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];

    skaitytiDuom(m, atrinkti, minut, sec);
    rikiuotiZmones(m, atrinkti, minut, sec);
    spausdintiRez(m, atrinkti, minut, sec);

    return 0;
}

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();
}

Galima su struktūrom geriau padaryt buvo, nesenai pradėjau mokytis tik, nepagalvojau. Tai tik dėl rikiavimo neaišku..

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 skaiciuotiUztrukusiLaika(int n, Slidininkas A[], int m, Slidininkas B[], Slidininkas C[])
{
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            if(B[i].vardas == A[j].vardas){
                C[i].vardas = B[i].vardas;
                C[i].sec = ((B[i].val * 3600 + B[i].minut * 60 + B[i].sec) - (A[j].val * 3600 + A[j].minut * 60 + A[j].sec)) % 60;
                C[i].minut = ((B[i].val * 3600 + B[i].minut * 60 + B[i].sec) - (A[j].val * 3600 + A[j].minut * 60 + A[j].sec)) / 60;
                break;
            }
        }
    }
}

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

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;
}

Kodėl mokyklose leidžiama vadinti kintamuosius/funkcijas lietuvių kalbą? :?

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]);
              }

        }
    }
}

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »