Mediana liczb z pliku

0

Witam. Miałem za zadanie napisać program wyświetlający mediane liczb z pliku, zakładając, że liczby są posortowane rosnąco/malejąco. Nie miałem z tym większych problemów. Własne ambicje zmusiły mnie do napisania lepszej wersji;] czyli nie zakładając posortowania. Napisałem tak jak mi się zdawało, że dobrze. Później zacząłem gmatwać tak, że ledwo się mogę odnaleźć w tym kodzie (jestem "mocno początkujący").

#include <iostream>
#include <fstream>
#include <cstdlib>

int main()
{
	using namespace std;
	
	int licznik(0), ilosc_min(0), ilosc_max(0);
	double liczba(0), test2(0), mediana(0), test(0);
	char nastepna(0);
	
	ifstream kwej, pwej, swej, wej, wejscie, dwej;
	ofstream pwyj, swyj;
	
	cout << "Trwa czytanie w pliku...\n";
	
	dwej.open("lista.txt");
	if (dwej.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit(1);
	}
	while (dwej >> liczba)
	{
		licznik++;
	}
	
	dwej.close();
	liczba = 0;
	
	kwej.open("lista.txt");
	if (kwej.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit(1);
	}
	
	pwyj.open("pwyj.txt");
	if (pwyj.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit (1);
	}

	kwej.get(nastepna);

	while (! kwej.eof())
	{
		pwyj.put(nastepna);
		kwej.get(nastepna);
	}
	kwej.close();
	pwyj.close();
	nastepna = 0;
	
	wejscie.open("lista.txt");
	if (wejscie.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit(1);
	}
	swyj.open("swyj.txt");
	if (swyj.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit (1);
	}
	wejscie.get(nastepna);
	while (! wejscie.eof())
	{
		swyj.put(nastepna);
		wejscie.get(nastepna);
	}
	wejscie.close();
	swyj.close();
	nastepna = 0;
	
	pwej.open("lista.txt");
	if (pwej.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit(1);
	}
	
	wej.open("swyj.txt");
	if (swej.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit(1);
	}
	

	do
	{
		
		
		swej.open("pwyj.txt");
		if (swej.fail() )
		{
			cout << "Nie udało się otworzyć pliku";
			exit(1);
		}
		
		pwej >> test;
		wej >> test2;
		
		if ((licznik%2) == 0)
		{
			while (swej >> liczba)
			{
				if (test > liczba)
				{
					ilosc_min++;
				}
				if (test < liczba)
				{
					ilosc_max++;
				}
				
				if (test2 > liczba)
				{
					ilosc_min++;
				}
				if (test2 < liczba)
				{
					ilosc_max++;
				}
			}
			if (ilosc_min==ilosc_max)
			{
				mediana = (test + test2) / 2;
			}
		}
		
		else
		{
			while (swej >> liczba)
			{
			
				if (test > liczba)
				{
					ilosc_min++;
				}
				if (test < liczba)
				{
					ilosc_max++;
				}
			}
			if (ilosc_min==ilosc_max)
			{
				test=mediana;
			}
		}
		ilosc_min=0;
		ilosc_max=0;
		
		swej.close();
	} while (mediana==0);
	
	pwej.close();
	wej.close();

	cout << "Mediana liczb w pliku wynosi " << mediana << endl;
	return (0);
}
 

Jedyne co się wyświetla na ekranie to "Trwa czytanie w pliku" i nic się nie dzieje. Wiem, że większość z was mnie wyśmieje, ale nie wiem jak sobie z tym poradzić. Proszę was o pomoc.

0

dwej.open("lista.txt");
if (dwej.fail() )
{
cout << "Nie udało się otworzyć pliku";
exit(1);
}
while (dwej >> liczba) // while(!dwej.eof){ dwej >> liczba; licznik++ }
{
licznik++;
}

0

Lepsza Mediana.cpp error: could not convert ‘dwej.std::basic_ios<_CharT, _Traits>::eof [with _CharT = char, _Traits = std::char_traits<char>]’ to ‘bool’
Lepsza Mediana.cpp error: in argument to unary !

tzn. nie działa

0

aa, nie zwrocilem uwagi na eof... ale to i tak nic nie daje. pliki są tworzone ok ale na ekranie tylko to co pisalem

0

przepraszam, troche mnie nie bylo...
pworocilem do tego i sprobowalem od innej strony, czyli samemu posortowac liczby a pozniej dzialaloby tak jak z plikiem z posortowanymi...

#include <iostream>
#include <cstdlib>
#include <fstream>

using namespace std;
int main ()
{
	int miejsce2(0), miejsce(0), licznik(0);
	double test2(0), test(0), liczba, suma(0), mediana(0);
	ifstream swej, pwej, wej;
	ofstream swyj;
	pwej.open("lista.txt");
	if (pwej.fail() )
	{
		cout << "Nie udało się otworzyć pliku";
		exit(1);
	}
	while (pwej >> liczba)
	{
		licznik++;
	}
	
	liczba = 0;
	pwej.close();
	
	miejsce2 = licznik / 2 + 1;
	
	swej.open("lista.txt");
	if (swej.fail() )
	{
		cout << "Nie udało się otworzyć pliku lista.txt";
		exit(1);
	}
	swyj.open("swyj.txt");
	if (swyj.fail() )
	{
		cout << "Nie udało się utworzyć pliku swyj.txt";
		exit(1);
	}
	while (swej >> test)
	{
		swej >> liczba;
	
		if (liczba > test)
		{
			test2 = test;
		}
		else
		{
			test2 = liczba;
		}
		while (swej >> liczba)
		{
			if (liczba < test2)
			test2 = liczba;
		}
		swyj << test2;
		swyj.put('\n');
	} 
	swej.close();
	swyj.close();
	
	wej.open("swyj.txt");
	if (wej.fail())
		cout << "Nie udało się otworzyć pliku swyj.txt";
		exit(1);
		
	while (wej >> liczba)
	{
		miejsce++;
	if ((licznik%2) == 0)
	{
		if (miejsce==licznik / 2)
		{
			suma = liczba+suma;
		}
		if (miejsce==miejsce2)
		{
			suma = liczba+suma;
		}
		mediana = suma/2;
	}
	else
	{
		if (miejsce==miejsce2)
		{
			mediana = liczba;
		}
	}
	}
	cout << "Medianą liczb w pliku jest liczba " << mediana << endl;
	
	wej.close();
	return (0);
}
 

lista.txt:
1 2 3
w swyj.txt zapisuje sie tylko 1...

0

Wczytaj wszystkie liczby do tablicy i posortuj w pamięci a nie w pliku. Masz do tego funkcję sort() w <algorithm>. Później możesz wszystko zapisać z powrotem do pliku, a medianę też już masz :)

0

ehh, jak juz pisalem jestem moocno początkujący:( widocznie to jeszcze nie na mój rozum (nie umiem sie jeszcze poslugiwac ani tablicami ani funkcja sort)... wroce do tego kiedys;) dzieki wszystkim za pomoc

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