Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

vectory, listy, wyswietlanie

Ostatnio zmodyfikowano 2015-12-13 14:06
Autor Wiadomość
Zdziszek
Temat założony przez niniejszego użytkownika
vectory, listy, wyswietlanie
» 2015-12-12 21:35:23
Witam, mam problem z pewnym zadaniem.
C/C++
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
#include<list>
using namespace std;

struct ocena
{
    string przedmiot;
    double wartosc;
   
};

struct indeks
{
    string imie;
    string nazwisko;
    vector < ocena > oceny;
   
    int id;
};

void pobierz( indeks & o )
{
   
    cout << "Podaj imie i nazwisko studenta: ";
    cin >> o.imie >> o.nazwisko;
    cin.ignore();
    ocena oc;
   
    do
    {
       
        cout << "Podaj przedmiot: ";
        getline( cin, oc.przedmiot );
        if( oc.przedmiot ==( string ) "" )
             break;
       
        cout << "Podaj ocene: ";
        cin >> oc.wartosc;
        o.oceny.push_back( oc );
        cin.ignore();
       
       
       
    } while( 1 );
   
}


void wyswietl1( const indeks & o )
{
    cout << o.imie << " " << o.nazwisko << endl;
}


bool po_ocenie( const ocena & e1, const ocena & e2 )
{
    return e1.wartosc < e2.wartosc;
   
}

void wyswietl_oceny( const vector < ocena >& o )
{
    for( auto v = o.begin(); v != o.end(); ++v )
    {
        cout <<( * v ).przedmiot << " " <<( * v ).wartosc << endl << endl;
    }
}

void wyswietl_po_ocenie( const list < indeks >& l )
{
   
    for( auto v = l.begin(); v != l.end(); ++v )
    {
        wyswietl1( * v );
       
       
    }
}



int main()
{
    list < indeks > indeksy;
    list < ocena > indek;
    indeks i;
    int N = 0;
    indeks ind[ 30 ];
    int wybor;
    while( 1 )
    {
        cout << "1. Wczytaj dane studenta." << endl;
        cout << "2. Wyswietl studentow." << endl;
        cout << "3. Sortuj po nazwisku." << endl;
        cout << "4. Sortuj po ocenie." << endl;
        cout << "5. " << endl;
        cin >> wybor;
       
       
        switch( wybor )
        {
        case 1:
            pobierz( i );
            indeksy.push_back( i );
            break;
        case 4:
            indek.sort( po_ocenie );
            wyswietl_po_ocenie( indeksy );
            break;
           
           
        }
    }
   
   
   
    system( "pause" );
    return 0;
}

Problem polega na tym, że program najpierw pobiera dane studenta(imię, nazwisko, przedmioty, oceny), a potem ma wyświetlić dane studentów ale po posortowanych ocenach(case 4) i nie wiem w jaki sposób to zrobić, bo albo wyskakują błędy, że program nie może skonwertować z 'ocena' na 'indeks', albo są problemy z funkcją bool(też z argumentami) albo program się kompiluje, ale nie wyświetla tych ocen. Próbowałem na mnóstwo sposobów, ale nie mam pojęcia jak to zrobić, nie wiem jak połączyć wyświetlanie imienia, nazwiska oraz przedmiotów i ocen, bo są to inne typy, ktoś mógłby mi pomóc?Z góry dziękuję.
P-141850
carlosmay
» 2015-12-12 22:21:25
Może tutaj znajdziesz pomysł i rozwiązanie problemu.
Podobny temat

Pomijam fakt, że kod jest pomieszany to:
C/C++
list < indeks > indeksy; // tutaj w obiektach zawiera sie tablica ocen bo jest skladowa struktury 'indeks'
list < ocena > indek; // wiec to nie wiem w jakim celu powstalo
indeks i;
int N = 0;
indeks ind[ 30 ]; // to jest nieuzywane
int wybor;
 
Moja rada: poznać dokładniej struktury (konstruktory i funkcje składowe (metody)).
P-141852
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-12-12 22:55:32
W mainie są tam nieużywane zmienne i tablice, bo kombinowałem na wiele sposobów, gdy wyskakiwały mi błędy, tylko ich nie usunąłem,a na temat struktur i metod trochę czytałem, ale i tak nie wiem jak poradzić sobie z problemem. Mógłbyś mnie nakierować w jaki sposób za pomocą jednej funkcji wyświetlić imię, nazwisko oraz przedmiot, wartość?Bo z tym mam największy problem, a są one zadeklarowane za pomocą 'ocena' i 'indeks' i wyskakują błędy, że nie można skonwertować z jednego na drugie. Chciałbym to zrobić za pomocą iteratorów, żeby móc potem bez problemu zmieniać np z vectora na listę itp.
P-141854
carlosmay
» 2015-12-12 23:05:13
Mógłbyś mnie nakierować w jaki sposób za pomocą jednej funkcji wyświetlić imię, nazwisko oraz przedmiot, wartość?
 Napisz funkcje składową w strukturze indeks .
Bo z tym mam największy problem, a są one zadeklarowane za pomocą 'ocena' i 'indeks' i wyskakują błędy, że nie można skonwertować z jednego na drugie.
 Bo w miejscu gdzie kompilator spodziewa się obiektów typu indeks dostaje obiekty typu ocena . Toteż zgłasza bunt.

Przeczytaj uważnie temat z linka, który wrzuciłem. Jest tam sporo info. W międzyczasie naskrobię przykład metody wyświetlającej dane ze struktur.
P-141855
carlosmay
» 2015-12-12 23:17:49
To tak z grubsza.
C/C++
struct ocena
{
    string przedmiot;
    double wartosc;
    // tutaj konstruktory
    void show_ocena() {
        cout << przedmiot << "- " << wartosc << endl;
    }
};

struct indeks
{
    string imie;
    string nazwisko;
    vector < ocena > oceny;
    int id;
    // tutaj konstruktory (bez nich nie zadzialasz na kontenerach)
    void show() { // metoda wyswietlajaca dane studenta
        cout << "id studenta: " << id << " ";
        cout << imie << " " << nazwisko << ". ";
        for( auto it = oceny.begin(); it != oceny.end(); it++ )
             it->show_ocena();
       
        cout << endl;
    }
};

int main()
{
    vector < indeks > vindeks;
    // majstrowanie obiktow typu indeks
    // odczyt wszystkich studentow
    for( vector < indeks >::iterator it = vindeks.begin(); it != vindeks.end(); it++ )
         it->show();
   
}
 
P-141856
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-12-13 00:03:19
Dzięki, zrobiłem coś takiego:
C/C++
struct ocena
{
    string przedmiot;
    double wartosc;
    ocena( const string & przedmiot, double wartosc )
        : przedmiot( przedmiot )
         , wartosc( wartosc )
    { }
    void show_ocena()
    {
        cout << przedmiot << "- " << wartosc << endl;
    }
   
};

struct indeks
{
    string imie;
    string nazwisko;
    vector < ocena > oceny;
    int id;
    indeks( const string & imie, const string & nazwisko, int & id, vector < ocena > & oceny )
        : imie( imie )
         , nazwisko( nazwisko )
         , id( id )
         , oceny( oceny )
    { }
    void show()
    {
        cout << "id studenta: " << id << " ";
        cout << imie << " " << nazwisko << endl;
        for( auto it = oceny.begin(); it != oceny.end(); ++it )
             it->show_ocena();
       
        cout << endl;
       
       
       
    }
};


void pobierz( indeks & o )
{
   
    cout << "Podaj imie i nazwisko studenta: ";
    cin >> o.imie >> o.nazwisko;
    cin.ignore();
    ocena oc; //tu podkresla zmienna
   
    do
    {
       
        cout << "Podaj przedmiot: ";
        getline( cin, oc.przedmiot );
        if( oc.przedmiot ==( string ) "" )
             break;
       
        cout << "Podaj ocene: ";
        cin >> oc.wartosc;
        o.oceny.push_back( oc );
        cin.ignore();
       
       
       
    } while( 1 );
   
}

int main()
{
    list < indeks > indeksy;
    vector < indeks > vindeks;
    indeks i; //tu podkresla zmienna
    int N = 0;
   
    int wybor;
    while( 1 )
    {
        cout << "1. Wczytaj dane studenta." << endl;
        cout << "2. Wyswietl studentow." << endl;
        cout << "3. Sortuj po nazwisku." << endl;
        cout << "4. Sortuj po ocenie." << endl;
        cout << "5. " << endl;
        cin >> wybor;
       
       
        switch( wybor )
        {
        case 1:
            pobierz( i );
            indeksy.push_back( i );
            break;
        case 4:
            for( vector < indeks >::iterator it = vindeks.begin(); it != vindeks.end(); it++ )
                 it->show();
           
            break;
           
           
        }
    }
   
   
   
    system( "pause" );
    return 0;
}

Tylko teraz pojawił się inny problem:

Error C2512 'ocena': no appropriate default constructor available
Error C2512 'indeks': no appropriate default constructor available

i podkreśla mi zmienną "indeks i;" w funkcji main oraz "ocena oc;" w funkcji pobierz, w czym jest problem, nie współgra to jakoś z konstruktorami, czy źle je napisałem?
No i właśnie mam pytanie, bo w strukturze indeks mam vector typu 'ocena' i nie da się jakoś w ten sposób zgrać tych danych, żeby je razem wyświetlić, zamiast używać konstruktorów?
P-141859
carlosmay
» 2015-12-13 00:49:25
Wykomentowałem miejsca gdzie należy napisać konstruktory (z argumentami i domyślne) dla tych obiektów.
Bez nich nie ruszysz.
Zwróć uwagę na "default".
P-141861
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-12-13 14:06:23
Ok,dzięki=] Popróbuję i dam znać
P-141888
« 1 »
  Strona 1 z 1