[C++] program sortujący listę

diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę

Post autor: diego_maradona »

Program ma za zadanie odczytać listę osób przyjętych na studia z pliku list.txt gdzie są one posortowane w kolejności alfabetycznej w postaci:

(Numer na liście uporządkowanej w kolejności alfabetycznej) ID NAZWISKO Imię Punkty

np:
7 25653 BOROWSKI Wiktor 160
i posortować kandydatów w zależności od otrzymanych punktów ( zaczynając od tego co ma ich najmniej )
Nowoposortowana lista ma się znaleźć w pliku, którego nazwę wprowadza użytkownik w czasie działania programu.


Oto moja próba rozwiązania tego problemu

Kod: Zaznacz cały

// sorting_list.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>


using namespace std;

const int MAX_FILE_NAME_LENGTH = 100;
const int MAX_NUMBER_OF_CANDIDATES = 500;

void initialiseCstring ( char fileName[], int MAX_FILE_NAME_LENGTH );
void sort (char name[]);

int main()
{
    
	int i;
	
	char fileName[MAX_FILE_NAME_LENGTH];
	


	initialiseCstring (fileName , MAX_FILE_NAME_LENGTH);

	cout<< " Program sorts a list of students, in ascending order (depending of points) \n " 
		<< " Enter the  name of the file with sorted list  \n ";

	for ( i = 0 ; i < MAX_FILE_NAME_LENGTH ; i++)
		{
			cin.get ( fileName[i]);
			
			
			if (fileName[i]=='\n')
			break;
		}
	sort ( fileName );


	cout<<endl;
	system("PAUSE");
	return 0;
}

void initialiseCstring (char Cstring[],int maxLength )
{
	int i;

	for ( i = 0; i< maxLength  ; i++)
		Cstring[i]='\0';
	
}

void sort( char name[])
{
	int i;
	ofstream outData;
	ifstream inData;

	int alphabeticalPlace[MAX_NUMBER_OF_CANDIDATES];
	int ID[MAX_NUMBER_OF_CANDIDATES];
	int points[MAX_NUMBER_OF_CANDIDATES];
	int firstOutOfOrder, location ;
	int temp;


	string lastName;
	string firstName;

	inData.open ( "list.txt" );
	outData.open (name);


	if (!inData) 
	cout<< "LOAD FAILURE \n" ;
	else 
	cout<< "LOAD COMPLETE \n" ;
	
	while (inData)
	{	
		

		for ( i = 0 ; i < MAX_NUMBER_OF_CANDIDATES ; i++)
		inData >> alphabeticalPlace[i] >> ID[i] >> lastName[i] >> firstName[i] >> points[i];
		
		for ( firstOutOfOrder = 1 ; firstOutOfOrder < MAX_NUMBER_OF_CANDIDATES ; firstOutOfOrder++)
			if (points[firstOutOfOrder] < points[firstOutOfOrder - 1 ])
			{
				temp = points[firstOutOfOrder];
				location = firstOutOfOrder;

				do
				{
					points[location] = points[location-1];
					location--;
				}
				while (location > 0 && points[location - 1 ] > temp ) ;

				points[location] = temp;
			}
		
		for ( i = 0 ; i < MAX_NUMBER_OF_CANDIDATES ; i++)
		outData << alphabeticalPlace[i] << ID[i] << lastName[i] << firstName[i] << points[i];
		cout    << alphabeticalPlace[i] << ID[i] << lastName[i] << firstName[i] << points[i];
		cout<<"DONE! \n";
	
	}

	inData.close();
	outData.close();

}
po skompilowaniu wyskakuje dość nietypowy błąd którego nie rozumiem :? :
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] program sortujący listę

Post autor: Afish »

Wyleciałeś poza tablicę.

-- 14 sierpnia 2011, 21:14 --

Kod: Zaznacz cały

string lastName;
string firstName;
....
inData >> alphabeticalPlace[i] >> ID[i] >> lastName[i] >> firstName[i] >> points[i];
To wygląda podejrzanie. Chcesz wczytać jeden znak?
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę

Post autor: diego_maradona »

Ok, zamieniłem na tablicę i teraz jest

Kod: Zaznacz cały

// sorting_list.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>


using namespace std;

const int MAX_FILE_NAME_LENGTH = 100;
const int MAX_NUMBER_OF_CANDIDATES = 500;

void initialiseCstring ( char fileName[], int MAX_FILE_NAME_LENGTH );
void sort (char name[]);

int main()
{
    
	int i;
	
	char fileName[MAX_FILE_NAME_LENGTH];
	


	initialiseCstring (fileName , MAX_FILE_NAME_LENGTH);

	cout<< " Program sorts a list of students, in ascending order (depending of points) \n " 
		<< " Enter the  name of the file with sorted list  \n ";

	for ( i = 0 ; i < MAX_FILE_NAME_LENGTH ; i++)
		{
			cin.get ( fileName[i]);
			
			
			if (fileName[i]=='\n')
			break;
		}
	sort ( fileName );


	cout<<endl;
	system("PAUSE");
	return 0;
}

void initialiseCstring (char Cstring[],int maxLength )
{
	int i;

	for ( i = 0; i< maxLength  ; i++)
		Cstring[i]='\0';
	
}

void sort( char name[])
{
	int i;
	ofstream outData;
	ifstream inData;

	int alphabeticalPlace[MAX_NUMBER_OF_CANDIDATES];
	int ID[MAX_NUMBER_OF_CANDIDATES];
	int points[MAX_NUMBER_OF_CANDIDATES];
	int firstOutOfOrder, location ;
	int temp;


	string lastName[MAX_NUMBER_OF_CANDIDATES];
	string firstName[MAX_NUMBER_OF_CANDIDATES];

	inData.open ( "list.txt" );
	outData.open (name);


	if (!inData) 
	cout<< "LOAD FAILURE \n" ;
	else 
	cout<< "LOAD COMPLETE \n" ;
	
	while (inData)
	{	
		

		for ( i = 0 ; i < MAX_NUMBER_OF_CANDIDATES ; i++)
		inData >> alphabeticalPlace[i] >> ID[i] >> lastName[i] >> firstName[i] >> points[i];
		
		for ( firstOutOfOrder = 1 ; firstOutOfOrder < MAX_NUMBER_OF_CANDIDATES ; firstOutOfOrder++)
			if (points[firstOutOfOrder] < points[firstOutOfOrder - 1 ])
			{
				temp = points[firstOutOfOrder];
				location = firstOutOfOrder;

				do
				{
					points[location] = points[location-1];
					location--;
				}
				while (location > 0 && points[location - 1 ] > temp ) ;

				points[location] = temp;
			}
		
		for ( i = 0 ; i < MAX_NUMBER_OF_CANDIDATES ; i++)
		{
			outData << alphabeticalPlace[i] << ID[i] << lastName[i] << firstName[i] << points[i];
			cout    << alphabeticalPlace[i] << ID[i] << lastName[i] << firstName[i] << points[i];
			
		}
		cout<<"DONE! \n";
	}

	inData.close();
	outData.close();

}
tylko że teraz napotkałem kolejny problem - nie chce się stworzyć plik outputowy :|
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] program sortujący listę

Post autor: Afish »

No to sprawdź, dlaczego. Prawa dostępu masz? Strumień jest poprawnie otwarty? Program kończy się bezbłędnie? Występują jakieś błędy w trakcie zapisu?
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę

Post autor: diego_maradona »

Z prawami dostępu problemów nie ma, chyba błąd tkwi gdzieś w mechaniźmie nazywania pliku outputowego z poziomu konsoli ( nigdy wcześniej nie robiłem takiego programu, zawsze ściśle określona nazwa pliku zawarta była w kodzie źródłowym ) .
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] program sortujący listę

Post autor: Afish »

No to sprawdź flagi strumienia. Poza tym dlaczego wczytujesz nazwę pliku getem? I to do tego do tablicy? Nie lepiej użyć std::string?
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę

Post autor: diego_maradona »

Ok, w sumie to dużo wygodniej i czytelniej było użyć zwykłego stringa z biblioteki <string> i potem przekonwertować na C-string przy tworzeniu pliku outputowego. Teraz plik otwiera się normalnie, ale output jest delikatnie mówiąc niesatysfakcjonujący

Kod: Zaznacz cały

// sorting_list.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>


using namespace std;


const int MAX_NUMBER_OF_CANDIDATES = 100;


void sort (string name);

int main()
{
    
	int i;
	
	string fileName;
	


	

	cout<< " Program sorts a list of students, in ascending order (depending of points) 
 " 
		<< " Enter the  name of the file with sorted list  
 ";

	cin >> fileName;
	
	cout<<"Data will be stored at: "<< fileName<< endl;
	sort ( fileName );


	cout<<endl;
	system("PAUSE");
	return 0;
}


void sort( string name)
{
	int i;
	ofstream outData;
	ifstream inData;

	int alphabeticalPlace[MAX_NUMBER_OF_CANDIDATES];
	int ID[MAX_NUMBER_OF_CANDIDATES];
	int points[MAX_NUMBER_OF_CANDIDATES];
	int firstOutOfOrder, location ;
	int temp;


	string lastName[MAX_NUMBER_OF_CANDIDATES];
	string firstName[MAX_NUMBER_OF_CANDIDATES];

	inData.open ( "list.txt" );
	outData.open (name.c_str());


	if (!inData) 
	cout<< "LOAD FAILURE 
" ;
	else 
	cout<< "LOAD COMPLETE 
" ;
	
	if (!outData)
	cout << "INITIALISING OUTPUT FILE FAILURE 
";
	else
	cout << "INITIALISING OUTPUT FILE OK 
";

	system("PAUSE");

	while (inData)
	{	
		

		for ( i = 0 ; i < MAX_NUMBER_OF_CANDIDATES ; i++)
		inData >> alphabeticalPlace[i] >> ID[i] >> lastName[i] >> firstName[i] >> points[i];
		
		for ( firstOutOfOrder = 1 ; firstOutOfOrder < MAX_NUMBER_OF_CANDIDATES ; firstOutOfOrder++)
			if (points[firstOutOfOrder] < points[firstOutOfOrder - 1 ])
			{
				temp = points[firstOutOfOrder];
				location = firstOutOfOrder;

				do
				{
					points[location] = points[location-1];
					location--;
				}
				while (location > 0 && points[location - 1 ] > temp ) ;

				points[location] = temp;
			}
	}	
		for ( i = 0 ; i < MAX_NUMBER_OF_CANDIDATES ; i++)
		{
			outData << alphabeticalPlace[i] << " " << ID[i] << " " << lastName[i] <<" " << firstName[i] <<" "<< points[i]<<endl;
			cout    << alphabeticalPlace[i] << " " << ID[i] << " " << lastName[i] <<" " << firstName[i] <<" "<< points[i]<<endl;
			
		}
		cout<<"DONE! 
";
	

	inData.close();
	outData.close();

}
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] program sortujący listę

Post autor: Afish »

diego_maradona pisze:output jest delikatnie mówiąc niesatysfakcjonujący
To znaczy? Jak jest, a jak być powinno? Nie każdy ma pod ręką kompilator (pomijając fakt, że są wakacje i nie każdemu chce się takowy uruchamiać), więc bez porządnego opisu sytuacji Ci nie pomoże.
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę

Post autor: diego_maradona »

lista wciąż jest w kolejności alfabetycznej , zamiast zdobytych punktów są jakieś dziwne liczby a po 12 osobie to już nawet zamiast nazwiska i imienia są owe przypadkowe liczby.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] program sortujący listę

Post autor: Afish »

Sortowanie masz złe, bo przepisujesz tylko liczbę punktów, a reszty danych nie ruszasz. A te dziwne liczby to efekt tego, że nie wyczyściłeś tablic po alokacji pamięci.
diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++] program sortujący listę

Post autor: diego_maradona »

Widzę że będę musiał gruntownie przebudować ten program używając klas/structów i dynamicznych tablic bo tak to nawet jeśli udałoby mi się zrobić poprawnie działający program to byłby on strasznie nieczytelny.
ODPOWIEDZ