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

vectory,listy,struktury

Ostatnio zmodyfikowano 2015-12-25 00:29
Autor Wiadomość
Zdziszek
Temat założony przez niniejszego użytkownika
vectory,listy,struktury
» 2015-12-20 21:31:26
Witam, mam problem z pewnym zadaniem. Napisałem program, który pobiera od użytkownika imię, nazwisko studenta oraz przedmioty, oceny z tych przedmiotów i wyświetla studenta z najwyższą oceną, jeśli są dwie takie same to obydwie itp.
C/C++
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<map>
#include<conio.h>
#include<stdlib.h>
#include<string>
#include<vector>
#include<list>
#include<algorithm>
#include<fstream>
using namespace std;


struct ocena
{
    string przedmiot;
    double wartosc;
};

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

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


vector < ocena > szukaj_najwyzszej_oceny( list < indeks >& l )
{
    vector < ocena > kopia; //vektor dodatkowy do ktorego zapisywane sa najwyzsze oceny
   
    for( auto v = l.begin(); v != l.end(); ++v )
    {
        for( int i = 0; i <( * v ).oceny.size(); i++ )
        {
            if(( * v ).oceny[ i ].wartosc <( * v ).oceny[ i + 1 ].wartosc ) //sortowanie ocen od najwyzszej do najnizszej
                 swap(( * v ).oceny[ i ].wartosc,( * v ).oceny[ i + 1 ].wartosc );
           
        }
        kopia.push_back(( * v ).oceny[ 0 ] ); //dodanie pierwszej oceny, czyli najwyzszej do wektora
        for( int i = 0; i <( * v ).oceny.size(); i++ )
        {
            if(( * v ).oceny[ i ].wartosc ==( * v ).oceny[ 0 ].wartosc ) //jesli nastepna ocena jest taka sama jak najwyzsza to rowniez jest dodawana do wektora
                 kopia.push_back(( * v ).oceny[ i ] );
           
        }
    }
    return kopia;
}

void wyswietl_najwyzsze_oceny( const list < indeks >& l, const vector < ocena >& a )
{
    for( auto v = l.begin(); v != l.end(); ++v ) //wyswietla studentow oraz najwyzsza ocene
    {
        cout <<( * v ).imie << " " <<( * v ).nazwisko << endl;
        for( auto i = a.begin(); i != a.end(); ++i )
        {
            cout <<( * i ).przedmiot << " " <<( * i ).wartosc << endl;
        }
    }
}

int main()
{
    list < indeks > indeksy;
   
    int wybor;
    while( 1 )
    {
        cout << "1. Dodaj studenta." << endl;
        cout << "2. Wyswietl studentow i ich oceny." << endl;
        cout << "3. Wyswietl studentow i ich oceny alfabetycznie." << endl;
        cout << "4. Wyswietl najwyzsza ocene." << endl;
        cin >> wybor;
       
        switch( wybor )
        {
        case 1:
            {
                indeks i;
                pobierz( i );
                indeksy.push_back( i );
                break;
            }
           
        case 4:
            {
                vector < ocena > ram = szukaj_najwyzszej_oceny( indeksy ); //to case w ktorym wystepuje blad
                wyswietl_najwyzsze_oceny( indeksy, ram );
                break;
            }
        }
    }
   
   
    cout << endl << endl << endl << endl;
   
    system( "pause" );
    return 0;
}

Program ma wyświetlić imię, nazwisko studenta oraz tylko tę ocenę lub oceny, które są najwyższe, tych niższych nie wyświetla. Problem polega na tym, że podczas pracy programu wyskakuje mi błąd:
Expression:vector subscript out of range.
Ktoś mógłby mi pomóc?

Edit:
Przepraszam za pomylenie działów.
P-142198
mateczek
» 2015-12-20 21:46:16
P-142199
carlosmay
» 2015-12-20 22:25:59
C/C++
if(( * v ).oceny[ i ].wartosc <( * v ).oceny[ i + 1 ].wartosc ) // tutaj wychodzisz poza zakres vectora przy sprawdzaniu ostatniego elementu

Do sortowanie użyj std::sort z <algorithm>.
std::sort()
P-142201
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-12-20 23:00:30
Tylko właśnie ja zrobiłem klasyczne sortowanie, bo za pomocą funkcji sort wyskakiwały mi błędy, stworzyłem sobie taką funkcję do sortowania:
C/C++
bool po_ocenie( const ocena & o1, const ocena & o2 )
{
    if( o1.wartosc < o2.wartosc )
         return true;
   
    return false;
}

Tylko teraz w jaki sposób tego użyć?Próbowałem na wiele sposobów, np
oceny.sort( po_ocenie )
 nie działa oraz wiele podobnych, również. Podpowiedziałbyś jak to tutaj ulokować?

Edit:
W sumie znalazłem dwa rozwiązania, jedno to dałem w pętli
oceny.size() - 1
, a drugie to w mainie zadeklarowałem
list < ocena > a;
 i w case wpisalem
a.sort( po_ocenie )
 i w obydwu przypadkach efekt był taki sam:
wprowadzone dane:Jan Kowalski wf 3 i Jan Nowak wf 5.

Jan Kowalski
wf 3
wf 3
wf 5
wf 5
Jan Nowak
wf 3
wf 3
wf 5
wf 5

Dobrze to w takim razie zrobiłem tylko program źle działa, czy te moje dwa sposoby są złe?
P-142202
carlosmay
» 2015-12-21 00:05:31
( o1.wartosc < o2.wartosc )
 operator '<' zamień na '>' i będzie sortowanie malejące.

std::sort() : jeśli funkcja zwróci true to pierwszy przekazany argument ma poprzedzać drugi,
natomiast jeśli zwróci false drugi ma poprzedzać pierwszy.
Z tego wynika, że zmiana operatora porównania zmienia kolejność sortowania z rosnącej na malejącą.
P-142203
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-12-21 00:50:01
Tylko nie wiem w jaki sposób mam tej funkcji użyć, bo przy każdej kombinacji jaką stosuje wyskakuje błąd, mam na myśli jak to zapisać, bo te dwa sposoby co próbowałem to działają źle przez co sama zmiana znaku nic nie robi
P-142204
carlosmay
» 2015-12-21 04:05:02
std::sort( *.begin(), *.end(), po_ocenie );
P-142207
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-12-23 21:40:09
Dalej mi tu coś nie pasuje z tym sortowaniem, bo wyskakują błędy, ale myślę, że stworzenie nowej struktury w, której uwzględnię odpowiednie zmienne powinno rozwiązać te problemy i pozwolić to posortować, pokombinuję, dzięki za pomoc=]
P-142285
« 1 » 2
  Strona 1 z 2 Następna strona