eMatematikas
Pradžia Forumai + Nauja tema Nariai
Įrankiai
Formulės Testai Egzaminai
Prisijungti Registruotis
       

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

0

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

0

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

Paskutinį kartą atnaujinta 2018-12-28

0

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

0

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

0

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

        }
    }
}

0

Norėdami rašyti žinutes privalote prisijungti!