Program losujący n dat i zapisujący je w tablicy struktur

0

W szkole zadali nam takie zadanko :

Napisz program, który wylosuje n dat i zapisze je w tablicy struktur Data, a następnie posortuje te daty od najwcześniejszej lub od ostatniej.

Mam takie coś:

#include <iostream>
#include <ctime>
#include <windows.h>

using namespace std;

struct Data{
    int d,m,r;
};

     Data D[100], H;

struct Miesiac{
    int dni;
    char *tekst;
};

struct Miesiac Tab[12]={
    {31,"styczen"},
    {28,"luty"},
    {31,"marzec"},
    {30,"kwiecień"},
    {31,"maj"},
    {30,"czerwiec"},
    {31,"lipiec"},
    {31,"sierpien"},
    {30,"wrzesien"},
    {31,"pazdziernik"},
    {30,"listopad"},
    {31,"grudzien"}
};


int main()
{
    int n,w=0,x=0,z=1,q=0;
    cout<<"Podaj ilosc dat do wylosowania: ";
    cin>>n;
    srand(time(0));
    cout<<"\n";

        //losowanie

        for (w; w<n; w++){


        //a=zakres_dolny+rand()%(zakres_gorny-zakres_dolny+1)

        D[w].r=(-5000)+rand()%(5000-(-5000)+1);
        D[w].m=1+rand()%(12-1+1);
        D[w].d=1+rand()%(Tab[D[w].m-1].dni-1+1);
        cout<<"Wygenerowana data to: ";
        cout << D[ w ].d, D[ w ].m, D[ w ].r;
        cout<<endl;
    }



    //sortowanie


    for (x; x<n; x++){
        for (z; z<n; z++){
            if (D[x]>D[z]){
                H=D[z];
                D[z]=D[x];
                D[x]=H;
            }
        }
    }

    //wyswietlanie

    for (q; q<n; q++){
        cout<<"Wygenerowana data to: ";
        cout<<D[q].d, D[q].m, D[q].r;
        cout<<endl;
    }


    system("pause");
    return 0;
}

Błąd jest podczas sortowania

    //sortowanie


    for (x; x<n; x++){
        for (z; z<n; z++){
            if (D[x]>D[z]){
                H=D[z];
                D[z]=D[x];
                D[x]=H;
            }
        }
    } 

Błąd:

|64|error: no match for 'operator>' (operand types are 'Data' and 'Data')|

Z góry dziękuję za pomoc.

1

Kompilator sam nie domyśli się co się dzieje więc sam musisz mu podać operator> aby móc porównywać daty.

Przy okazji:

  • przypisywanie stałych c-stringów do char* nie jest już poprawnym kodem C++
  • dlaczego nie użyjesz funkcji sortującej z biblioteki standardowej.
0
kq napisał(a):

Kompilator sam nie domyśli się co się dzieje więc sam musisz mu podać operator> aby móc porównywać daty.

Przy okazji:

  • przypisywanie stałych c-stringów do char* nie jest już poprawnym kodem C++
  • dlaczego nie użyjesz funkcji sortującej z biblioteki standardowej.

W jaki sposób mu podać ten "operator>"

"- przypisywanie stałych c-stringów do char* nie jest już poprawnym kodem C++" - Jak jest poprawnie ?

"- dlaczego nie użyjesz funkcji sortującej z biblioteki standardowej" poszukam i spróbuję.

1

Musisz go napisać. bool operator>(Data const&l, Data const&r). W C++11 masz ułatwienie i możesz skorzystać z pomocy std::tie:

bool operator>(Data const&l, Data const&r)
{
	return std::tie(l.r,l.m,l.d) > std::tie(r.r,r.m,r.d);
}

"- przypisywanie stałych c-stringów do char* nie jest już poprawnym kodem C++" - Jak jest poprawnie ?

char const*, jeśli musisz.

"- dlaczego nie użyjesz funkcji sortującej z biblioteki standardowej" poszukam i spróbuję.

Polecam std::sort - tylko tam potrzeba operatora< zamiast operatora> ;)

0

Dobrze przeczytałem, że potrzebuję biblioteki

#include <tuple> 

??

#if __cplusplus < 201103L
#error This file requires compiler and library support for the
ISO C++ 2011 standard. This support is currently experimental, and must be
enabled with the -std=c++11 or -std=gnu++11 compiler options.
#endif

Dobrze myślę, że mam to dodać do

struct Data

??

0

Tak, potrzebujesz kompilatora zgodnego z C++11 i musisz go nakłonić do kompilacji w tym standardzie (-std=c++11 w gcc i clangu). Jeśli to niemożliwe to wszystkie porównania musisz napisać ręcznie (co potrafi tworzyć zaskakująco dużo błędów, ponieważ algorytmy sortujące absolutnie wymagają, aby zawsze prawdziwe było stwierdzenie, że jeśli prawdą jest A > B, to B > A jest fałszem).

Nie, lepiej daj to jako zewnętrzną funkcję przyjmującą dwie const referencje.

0

To bez sensu to zadanie bo w domu to zrobię, a w szkole nie odpalę, a jak odpalę .exe i pokażę kod to każą to skompilować... Hmm

1 użytkowników online, w tym zalogowanych: 0, gości: 1