dwa zsynchronizowane wektory

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;				
}
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?)

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.

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ć)

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;				
}
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;				
}

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;				
}

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