eMatematikas Prisijunk Forumas VBE užduotys ONLINE testai

Duomenų rikiavimas pagal kelis punktus


Sveiki, turiu uždavinį kuriame duota n-mokinių skaičius, mokinio vardas ir pavardė (20 pozicijų), lytis (m, v) ir gimimo data (metai, mėnuo ir diena). Šiuos duomenis reikia surikiuoti nuo vyriausio iki jauniausio.

Pvz. duomenys buvo:

8
Julius Stepauskas  v 1998 5 14
Karolis Lingys      v 1997 12 5
Samanta Rimavičiūtė m 1998 4 13
Lukas Didžbalis    v 1998 9 1
Andrius Kaminskas  v 1998 8 15
Ieva Apanavičiūtė  m 1997 11 4
Eglė Surdokaitė    m 1998 2 16
Saulius Vilkelis    v 1998 2 14

Ir turi atrodyti štai taip:

Vaikinai:
*****************************
Karolis Lingys      1997 12 5
Saulius Vilkelis    1998 2 14
Julius Stepauskas  1998 5 14
Andrius Kaminskas  1998 8 15
Lukas Didžbalis    1998 9 1
*****************************
Merginos:
*****************************
Ieva Apanavičiūtė  1997 11 4
Eglė Surdokaitė    1998 2 16
Samanta Rimavičiūtė 1998 4 13
*****************************

Mano kodas:


#include <iostream>
#include <fstream>
#include <cmath>
#include <cstring>
#include <string>
#include <iomanip>

using namespace std;

struct rusiavimas
{
    string vardpav;
    char lytis;
    int metai, menuo, diena;
};

void skaityti (rusiavimas a[], int &n);
void rik_isrinkimu(rusiavimas a[], int  n);

int main()
{
    int n;
    rusiavimas a[99];
    skaityti(a,n);
    cout << "Vaikinai:" <<endl;
    cout << "********************************" <<endl;
    rik_isrinkimu(a,n);
    for (int i=0; i<n; i++)
    {
        if (a[i].lytis=='v')
        {
            cout <<a[i].vardpav<<" "<<a[i].lytis<<" "<<a[i].metai<<" "<<a[i].menuo<<" "<<a[i].diena<<endl;
        }
    }
    cout << "********************************" <<endl;
    cout << "Merginos:" <<endl;
    cout << "********************************" <<endl;
    for (int i=0; i<n; i++)
    {
        if (a[i].lytis=='m')
        {
            cout <<a[i].vardpav<<" "<<a[i].lytis<<" "<<a[i].metai<<" "<<a[i].menuo<<" "<<a[i].diena<<endl;
        }
    }
    cout << "********************************" <<endl;
    return 0;
}

void skaityti (rusiavimas a[], int &n)
{
    char pav[21];
    ifstream in ("duom.txt");
    in >> n;
    for (int i=0; i<n; i++)
    {
        in.ignore(80,'\n');
        in.get (pav,21);
        a[i].vardpav=pav;
        in >> a[i].lytis >> a[i].metai >> a[i].menuo >> a[i].diena;
        //cout <<a[i].vardpav<<" "<<a[i].lytis<<" "<<a[i].metai<<" "<<a[i].menuo<<" "<<a[i].diena<<endl;
    }
    in.close();
}

void rik_isrinkimu (rusiavimas a[], int  n)
{
    int mina;
    rusiavimas b;
    for(int i = 0; i < n-1; i++)
    {
        mina = i;
        for (int j = i+1; j < n; j++)
          if (a[j].metai<a[mina].metai && a[j].menuo>a[mina].menuo && a[j].diena<a[mina].diena)
                mina = j;
        b = a[i];
        a[i] = a[mina];
        a[mina] = b;
    }
}



Lyg ir viskas link tos pusės, tik nebeatsimenu kaip rikiuoti pagal kelis kriterijus.

Taves praso surikiuoti data nuo ("vyriausio iki jauniausio.") ty nuo maziausio iki didziausio, pagal viena rakta o ne pagal kelis. Nes taves praso surikiuti pagal viena kintamaji.

(ty 2020-12-12) o ne ( 2020 ir 12 ir 12)

Pvz:
Turetum pasiversti metus i dienas prie ju prideti mėnesius taip pat pasiverstus i dienas, bei prideti dienas. Tada gausi kazkoki skaiciu(2020*365 + 12*31 + 12) pagal kuri ir turetum rikiuoti.
Si skaiciu gali priskirti i struktura, ir paskui jau surikiavus data nereikes atgal verstis dienu i data, kai noresi spausdinti.

Toliau paciame rykiavime(antrame cikle), ir rasyk ka rykiuoji/keitineji, ty varda, pavarde, data, etc.

:)

Dabar kaip as suprantu tavo koda: tu bandai rykiuoti(taciau blogai kaip suprantu) pagal metus, menesius ir dienas atskirai.



gl

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