dwa zsynchronizowane wektory

Odpowiedz Nowy wątek
2011-08-10 14:14
0

Witam,

Mam problem z dwoma zsynchronizowanymi wektorami. Program zaczyna się sypać od momentu
Wprowadz swoje oceny posrednie i ocene z egzaminu koncowego.

Treść zadania z książki: napisz program, który będzie przetwarzał oceny więcej niż jednego studenta. Program powinien
przechowywać dwa synchronizowane kontenery vector: pierwszy powinien zawierać nazwiska studentów, drugi
powinien przechowywać oceny końcowe, wyliczane na podstawie wprowadzanych danych. Można wstępnie założyć
niezmienną liczbę ocen z zadań domowych.

Kod:

 
#include "stdafx.h"
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Podaj imiona studentow" << endl;
    string imie;
    vector<string>imieStudenta;
    while (cin >> imie)
        imieStudenta.push_back(imie);
    // sprawdz czy studen podal jakies imiona
    typedef vector<string>::size_type rozmWektora;
    rozmWektora rozmiar = imieStudenta.size();
    if (rozmiar == 0)
    {
        cout << endl << "Musisz wprowadzic imiona" << endl;
        return 1;
    }
 
    //zapytaj o oceny z kolokwiow i ocene z egaminu koncowego
    cout << "Wprowadz swoje oceny posrednie i ocene z egzaminu koncowego" << endl;
    double midterm, final;
    cin >> midterm >> final;
 
    // zapytaj o oceny z zadan domych
    cout << "Wprowadz wszystkie posiadane oceny z zadan domowych, "
        "liste ocen zakoncz znakiem konca pliku: " << endl;
    double x;
    vector<double> homework(20);
 
    // niezmiennik
    // homework zawiera wszystkie odczytane do tej pory oceny
    while (cin >> x)
        homework.push_back(x);
 
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
    if (size == 0)
    {
        cout << endl << "Musisz wprowadzic oceny" << endl;
        return 1;
    }
    // posortuj oceny
    sort(homework.begin(), homework.end());
 
    // oblicz mediane ocen zadan domowych
    vec_sz mid = size /2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid] - 1) / 2
                            : homework[mid];
    // oblicz i wyprowadz ocene koncowa studenta
    streamsize prec = cout.precision();
    cout << 0.2 * midterm + 0.4 * final * 0.4 * median
        << setprecision(prec) << endl;
 
    system("pause");
    return 0;               
}

Pozostało 580 znaków

2011-08-10 15:46
0

A co to znaczy "zaczyna się sypać"?
Zgaduję sobie, że może podajesz mu oceny z przecinkiem, tam gdzie powinny być z kropką? (a może na odwrót?)

Pozostało 580 znaków

2011-08-10 17:22
0

Wprowadzam:
Rafal
Lukasz
ctrl+z

Otrzymuje:
Wprowadz swoje oceny posrednie i ocene z egzaminu koncowego
Wprowadz wszystkie posiadane oceny z zadan domowych, liste ocen zakoncz znakiem konca pliku
-1.11072e+061
Debugowałem program i zaczyna przeskakiwać już ten etap

 
    ...
    double midterm, final;
    cin >> midterm >> final;
    ...

Przeskakuje także

 
    ...
    while (cin >> x)
        homework.push_back(x);
    ...

Liczb nawet nie zdążę wpisać, a już koniec programu.

Pozostało 580 znaków

2011-08-10 18:28
1

W momencie jak wklepiesz ctrl+z w strumieniu ląduje EOF. Teraz jeżeli strumień wpadnie na EOF to podnosi się flaga błędu i strumień pozostaje w stanie błędu tak długo, aż nie wyczyścisz wszystkich flag błędów (metoda clear()). Jak już się pewnie domyślasz: jeżeli strumień jest w stanie błędu(metoda good() zwraca false) to wszystkie operacje we/wy się nie udają.

=>Musisz w odpowiednim miejscu wywoływać cin.clear(); i być może cin.ignore() (ale nie chce mi się tego sprawdzać)


edytowany 1x, ostatnio: byku_guzio, 2011-08-10 18:28

Pozostało 580 znaków

2011-08-10 19:40
0

Teraz jest ok w sensie poprawności kodu. Pytanie, czy mój kod zgadza się z treścią zadania? Niepokoi mnie
to pojęcie dwa zsynchronizowane wektory. Według mnie teraz nie są zsynchronizowane, bo
imiona studentów nie są powiązane z "ocenami". Książka to C++ Potęga języka. Koenig, Moo.

Kod programu:

 
#include "stdafx.h"
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Podaj imiona studentow" << endl;
    string imie;
    vector<string>imieStudenta;
    while (cin >> imie)
        imieStudenta.push_back(imie);
    // sprawdz czy studen podal jakies imiona
    typedef vector<string>::size_type rozmWektora;
    rozmWektora rozmiar = imieStudenta.size();
    if (rozmiar == 0)
    {
        cout << endl << "Musisz wprowadzic imiona" << endl;
        return 1;
    }
 
    //zapytaj o oceny z kolokwiow i ocene z egaminu koncowego
    cout << "Wprowadz swoje oceny posrednie i ocene z egzaminu koncowego" << endl;
    double midterm, final;
    cin.clear();
    cin >> midterm >> final;
 
    // zapytaj o oceny z zadan domych
    cout << "Wprowadz wszystkie posiadane oceny z zadan domowych, "
        "liste ocen zakoncz znakiem konca pliku: " << endl;
    double x;
    vector<double> homework(20);
 
    // niezmiennik
    // homework zawiera wszystkie odczytane do tej pory oceny
    while (cin >> x)
        homework.push_back(x);
 
    typedef vector<double>::size_type vec_sz;
    vec_sz size = homework.size();
    if (size == 0)
    {
        cout << endl << "Musisz wprowadzic oceny" << endl;
        return 1;
    }
    // posortuj oceny
    sort(homework.begin(), homework.end());
 
    // oblicz mediane ocen zadan domowych
    vec_sz mid = size /2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid] - 1) / 2
                            : homework[mid];
    // oblicz i wyprowadz ocene koncowa studenta
    streamsize prec = cout.precision();
    cout << 0.2 * midterm + 0.4 * final * 0.4 * median
        << setprecision(prec) << endl;
 
    system("pause");
    return 0;               
}
Po pierwsze, pobierasz oceny tylko jednego studenta, co już nie jest zgodne z treścią zadania. Po drugie tej synchronizacji chyba się nie da zrobić za pomocą STLa, ale spróbuje to teraz ogarnąć (w sumie nawet nie dlatego, żeby tobie pomóc, ale sam jestem ciekawy). - Zjarek 2011-08-10 20:03
Chyba jedynym wyjściem by była implementacja własnego iteratora, który wie o tych dwóch wektorach, choć ja bym to zrobił przez wektor struktur / par / czy użycie mapy zamiast wektorów (zależnie od sytuacji, ale zrobienie tego przez iteratory dla mnie by było po prostu brzydkie). - Zjarek 2011-08-10 20:08

Pozostało 580 znaków

2011-08-10 20:13
0

Ja to uprościłem tak, jak potrafiłem. Pętla for (int i = 0; i < imieStudenta.size() -1; i++). Do struktur, interatorów
jeszcze w książce nie dojechałem.

 
#include "stdafx.h"
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Podaj imiona studentow" << endl;
    string imie;
    vector<string>imieStudenta;
    while (cin >> imie)
        imieStudenta.push_back(imie);
    // sprawdz czy studen podal jakies imiona
    typedef vector<string>::size_type rozmWektora;
    rozmWektora rozmiar = imieStudenta.size();
    if (rozmiar == 0)
    {
        cout << endl << "Musisz wprowadzic imiona" << endl;
        return 1;
    }
 
    cout << "Wprowadz dla kolejnego studenta" << endl;
    for (int i = 0; i < imieStudenta.size() -1; i++)
    {
        cout << "Dla studenta:  " << imieStudenta[i];
        //zapytaj o oceny z kolokwiow i ocene z egaminu koncowego
        cout << "Wprowadz swoje oceny posrednie i ocene z egzaminu koncowego" << endl;
        double midterm, final;
        cin.clear();
        cin >> midterm >> final;
 
        // zapytaj o oceny z zadan domych
        cout << "Wprowadz wszystkie posiadane oceny z zadan domowych, "
        "liste ocen zakoncz znakiem konca pliku: " << endl;
        double x;
        vector<double> homework(5);
 
        // niezmiennik
        // homework zawiera wszystkie odczytane do tej pory oceny
        while (cin >> x)
            homework.push_back(x);
 
        typedef vector<double>::size_type vec_sz;
        vec_sz size = homework.size();
        if (size == 0)
        {
            cout << endl << "Musisz wprowadzic oceny" << endl;
            return 1;
        }
        // posortuj oceny
        sort(homework.begin(), homework.end());
 
        // oblicz mediane ocen zadan domowych
        vec_sz mid = size /2;
        double median;
        median = size % 2 == 0 ? (homework[mid] + homework[mid] - 1) / 2
                                : homework[mid];
        // oblicz i wyprowadz ocene koncowa studenta
        streamsize prec = cout.precision();
        cout << 0.2 * midterm + 0.4 * final * 0.4 * median
            << setprecision(prec) << endl;
    }
    system("pause");
    return 0;               
}
 
edytowany 1x, ostatnio: TAXIarz, 2011-08-10 20:15
Dlaczego od size odejmujesz 1? Jeżeli tablicę są indeksowane od zera, to wszystkie indeksy jej elementów i tylko one są >=0 i < rozmiaru tablicy. Trochę źle zrozumiałem tą synchronizację wektorów, myslałem, że chcesz posortować studentów po ocenach. Nie masz jeszcze drugiej tablicy z ocenami końcowymi studentów. - Zjarek 2011-08-10 20:20
To byłby trzeci vector, a mowa o dwóch. - TAXIarz 2011-08-11 13:43
Ale ten drugi wektor nie przechowuje ocen końcowych. - Zjarek 2011-08-11 14:02
Już coś wykombinowałem, teraz sprawdzam poprawność wyników - TAXIarz 2011-08-11 14:06

Pozostało 580 znaków

2011-08-11 17:44
0

Poprawiłem tak, ale wrzeszczy mi, że "Expression: vector subscript out of range"

Dla danych: 2,3 oraz: 2,3,4,5
Wynik powinien być: 3.

 
#include "stdafx.h"
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    // wczytaj imiona studentow
    cout << "Podaj imiona studentow" << endl;
    string imie;
    vector<string>imieStudenta;
    while (cin >> imie)
        imieStudenta.push_back(imie);
    // sprawdz czy studen podal jakies imiona
    typedef vector<string>::size_type rozmWektora;
    rozmWektora rozmiar = imieStudenta.size();
    if (rozmiar == 0)
    {
        cout << endl << "Musisz wprowadzic imiona" << endl;
        return 1;
    }
 
    cout << "Wprowadz dla kolejnego studenta" << endl;
    for (int i = 0; i < imieStudenta.size(); i++)
    {
        cout << "Dla studenta:  " << imieStudenta[i] << endl;
        //zapytaj o oceny z kolokwiow i ocene z egaminu koncowego
        cout << "Wprowadz swoje oceny posrednie i ocene z egzaminu koncowego" << endl;
        double midterm, final;
        cin.clear();
        cin >> midterm >> final;
 
        // zapytaj o oceny z zadan domych
        cout << "Wprowadz wszystkie posiadane oceny z zadan domowych, "
        "liste ocen zakoncz znakiem konca pliku: " << endl;
        double x;
        vector<double> homework;
 
        // niezmiennik
        // homework zawiera wszystkie odczytane do tej pory oceny
        while (cin >> x)
            homework.push_back(x);
 
        typedef vector<double>::size_type vec_sz;
        vec_sz size = homework.size();
        if (size == 0)
        {
            cout << endl << "Musisz wprowadzic oceny" << endl;
            return 1;
        }
        // posortuj oceny
        sort(homework.begin(), homework.end());
 
        // oblicz mediane ocen zadan domowych
        vec_sz mid = size /2;
        double median;
        median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2
                                : homework[mid];
 
        vector<double>ocenyKoncowe;
        double koncowe = 0.2 * midterm + 0.4 * final + 0.4 * median; 
        ocenyKoncowe.push_back(koncowe);
        streamsize prec = cout.precision();
        cout << "Oceny koncowe to" << setprecision(3) 
            << ocenyKoncowe[i] << setprecision(prec) << endl;
    }
 
    system("pause");
    return 0;               
}
vector<double> ocenyKoncowe przez cały czas wykonywania programu ma maksymalnie 1 element. Jak masz problem, to spróbuj nad nim posiedzieć z dzień, dwa z pomocą googli testując program, wg mnie da Ci to o wiele więcej niż pytania po forach. - Zjarek 2011-08-11 17:55
Masz racje, ale porady od forumowiczów dało mi już więcej niż jakiekolwiek studia, bo jakoś jestem w stanie ruszyć problem. - TAXIarz 2011-08-11 18:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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