C++ sortiranje

lijep pozdrav,

Zadatak mi je ucitati podatke iz 3 text datoteke i sortirati ih od najboljeg prema najgorem, zamislimo da su skijaši oznaceni s rednim brojem i vremenom utrke min:sek, znaci treba ih ucitati iz te 3 datoteke, sortirati i na kraju ispisati po plasmanu.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct Natjecatelj{
int redniBroj;
Vrijeme rezultat;
};

struct Vrijeme{
int sek;
int sto;
};

struct Natjecatelj{
	int redniBroj;
	Vrijeme rezultat;
};

int _tmain(int argc, _TCHAR* argv[])
{
	
	int brojNatjecatelja; 
	int i,j;

	// 3 datoteke
	Natjecatelj polufinale1[8]; 
	Natjecatelj polufinale2[8];
	Natjecatelj polufinale3[8];

	ifstream ulaz1; //ucitavanje datoteke
	ulaz1.open("polufinale01.txt");
	if(!ulaz1){
		cout << "Ne valja" << endl;
		
		system ("pause");
		return 0;
		
	}
	
	int sifraNatjecatelja=0; //koliko sam podataka ucitao
	while(!ulaz1.eof()){
		string linija;
		getline (ulaz1,linija);

		polufinale1[sifraNatjecatelja].redniBroj=atoi(linija.substr(0,linija.find(' ')).c_str()); 
		linija.erase(0,linija.find(' ')+1);

		polufinale1[sifraNatjecatelja].rezultat.sek=atoi(linija.substr(0,linija.find(':')).c_str());
		linija.erase(0,linija.find(':')+1);

		polufinale1[sifraNatjecatelja].rezultat.sto=atoi(linija.c_str());
		
		sifraNatjecatelja++;
	}




	system ("pause");
	return 0;
}

Ovdje sam stao i jednostavno ne znam dalje… netko pomoć?
Unaprijed hvala.

Algoritam po kojem se sortira je isti kao i kod običnih nizova, s tim što se ovdje radi sa strukturama, odnosno složenim tipovima, i za to ti je potrebna jedna funkcija koja će zamjeniti članove struktura, u slučaju da je kriterij zadovoljen. Obzirom da se radi o malom broju podataka, ovo će proći. U slučaju da radiš s velikom količinom podataka, pogledaj QuickSort algoritam.

Pretpostavio sam da je polufinale1 niz struktura koje želiš sortirati po rezultatu, i da je sifraNatjecatelja ukupan broj članova niza strukura.

U tom slučaju slijedeći kod bi trebao raditi.

EDIT: Pretpostavio sam i da unos podataka iz datoteke u strukturu radi ispravno.

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

using namespace std;

struct Vrijeme{
int sek;
int sto;
};

struct Natjecatelj{
	int redniBroj;
	Vrijeme rezultat;
};

void ispisiClan(struct Natjecatelj *lista) {
		printf("%d\t%d:%d\n", lista->redniBroj, lista->rezultat.sek, lista->rezultat.sto);
}

void ispisi(struct Natjecatelj *lista, int n) {
	for(int i=0; i<n; i++) {
		ispisiClan(&lista[i]);
	}
	printf("\n");
}

void zamjena(struct Natjecatelj *lista, int p1, int p2) {
	struct Natjecatelj t;
	
	t.redniBroj = lista[p1].redniBroj;
	t.rezultat.sek = lista[p1].rezultat.sek;
	t.rezultat.sto = lista[p1].rezultat.sek;
	
	lista[p1].redniBroj = lista[p2].redniBroj;
	lista[p1].rezultat.sek = lista[p2].rezultat.sek;
	lista[p1].rezultat.sto = lista[p2].rezultat.sto;

	lista[p2].redniBroj = t.redniBroj;
	lista[p2].rezultat.sek = t.rezultat.sek;
	lista[p2].rezultat.sto = t.rezultat.sto;
};

int main(int argc, _TCHAR* argv[])
{
	
	int brojNatjecatelja = 5; 
	int i,j;

	// 3 datoteke
	Natjecatelj polufinale1[8]; 
	Natjecatelj polufinale2[8];
	Natjecatelj polufinale3[8];

	ifstream ulaz1; //ucitavanje datoteke
	ulaz1.open("polufinale01.txt");
	if(!ulaz1){
		cout << "Ne valja" << endl;
		
		system ("pause");
		return 0;
		
	}
	
	int sifraNatjecatelja=0; //koliko sam podataka ucitao
	while(!ulaz1.eof()){
		string linija;
		getline (ulaz1,linija);

		polufinale1[sifraNatjecatelja].redniBroj=atoi(linija.substr(0,linija.find(' ')).c_str()); 
		linija.erase(0,linija.find(' ')+1);

		polufinale1[sifraNatjecatelja].rezultat.sek=atoi(linija.substr(0,linija.find(':')).c_str());
		linija.erase(0,linija.find(':')+1);

		polufinale1[sifraNatjecatelja].rezultat.sto=atoi(linija.c_str());
		
		sifraNatjecatelja++;
	}


	ispisi(polufinale1, sifraNatjecatelja);

	for(i=0;i<sifraNatjecatelja-1;i++)
		for(j=i+1;j<sifraNatjecatelja;j++)
		{
			if(polufinale1[i].rezultat.sek > polufinale1[j].rezultat.sek)
					zamjena(polufinale1,i,j);
		}

	for(i=0;i<sifraNatjecatelja-1;i++)
		for(j=i+1;j<sifraNatjecatelja;j++)
		{
			if((polufinale1[i].rezultat.sek == polufinale1[j].rezultat.sek) && (polufinale1[i].rezultat.sto > polufinale1[j].rezultat.sto))
					zamjena(polufinale1,i,j);
		}

	ispisi(polufinale1,sifraNatjecatelja);

	system ("pause");
	return 0;
}

Ako zapne, piši.

[quote=“igor”]Algoritam po kojem se sortira je isti kao i kod običnih nizova, s tim što se ovdje radi sa strukturama, odnosno složenim tipovima, i za to ti je potrebna jedna funkcija koja će zamjeniti članove struktura, u slučaju da je kriterij zadovoljen. Obzirom da se radi o malom broju podataka, ovo će proći. U slučaju da radiš s velikom količinom podataka, pogledaj QuickSort algoritam.

Pretpostavio sam da je polufinale1 niz struktura koje želiš sortirati po rezultatu, i da je sifraNatjecatelja ukupan broj članova niza strukura.

U tom slučaju slijedeći kod bi trebao raditi.

EDIT: Pretpostavio sam i da unos podataka iz datoteke u strukturu radi ispravno.

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

using namespace std;

struct Vrijeme{
int sek;
int sto;
};

struct Natjecatelj{
	int redniBroj;
	Vrijeme rezultat;
};

void ispisiClan(struct Natjecatelj *lista) {
		printf("%d\t%d:%d\n", lista->redniBroj, lista->rezultat.sek, lista->rezultat.sto);
}

void ispisi(struct Natjecatelj *lista, int n) {
	for(int i=0; i<n; i++) {
		ispisiClan(&lista[i]);
	}
	printf("\n");
}

void zamjena(struct Natjecatelj *lista, int p1, int p2) {
	struct Natjecatelj t;
	
	t.redniBroj = lista[p1].redniBroj;
	t.rezultat.sek = lista[p1].rezultat.sek;
	t.rezultat.sto = lista[p1].rezultat.sek;
	
	lista[p1].redniBroj = lista[p2].redniBroj;
	lista[p1].rezultat.sek = lista[p2].rezultat.sek;
	lista[p1].rezultat.sto = lista[p2].rezultat.sto;

	lista[p2].redniBroj = t.redniBroj;
	lista[p2].rezultat.sek = t.rezultat.sek;
	lista[p2].rezultat.sto = t.rezultat.sto;
};

int main(int argc, _TCHAR* argv[])
{
	
	int brojNatjecatelja = 5; 
	int i,j;

	// 3 datoteke
	Natjecatelj polufinale1[8]; 
	Natjecatelj polufinale2[8];
	Natjecatelj polufinale3[8];

	ifstream ulaz1; //ucitavanje datoteke
	ulaz1.open("polufinale01.txt");
	if(!ulaz1){
		cout << "Ne valja" << endl;
		
		system ("pause");
		return 0;
		
	}
	
	int sifraNatjecatelja=0; //koliko sam podataka ucitao
	while(!ulaz1.eof()){
		string linija;
		getline (ulaz1,linija);

		polufinale1[sifraNatjecatelja].redniBroj=atoi(linija.substr(0,linija.find(' ')).c_str()); 
		linija.erase(0,linija.find(' ')+1);

		polufinale1[sifraNatjecatelja].rezultat.sek=atoi(linija.substr(0,linija.find(':')).c_str());
		linija.erase(0,linija.find(':')+1);

		polufinale1[sifraNatjecatelja].rezultat.sto=atoi(linija.c_str());
		
		sifraNatjecatelja++;
	}


	ispisi(polufinale1, sifraNatjecatelja);

	for(i=0;i<sifraNatjecatelja-1;i++)
		for(j=i+1;j<sifraNatjecatelja;j++)
		{
			if(polufinale1[i].rezultat.sek > polufinale1[j].rezultat.sek)
					zamjena(polufinale1,i,j);
		}

	for(i=0;i<sifraNatjecatelja-1;i++)
		for(j=i+1;j<sifraNatjecatelja;j++)
		{
			if((polufinale1[i].rezultat.sek == polufinale1[j].rezultat.sek) && (polufinale1[i].rezultat.sto > polufinale1[j].rezultat.sto))
					zamjena(polufinale1,i,j);
		}

	ispisi(polufinale1,sifraNatjecatelja);

	system ("pause");
	return 0;
}

Ako zapne, piši.[/quote]

Hvala puno, uspio sam rijesiti pomocu tvog algoritma…
:gitara:


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja