Pereiti prie turinio

Reikia pagalbos dėl rikiavimo C++


Rekomenduojami pranešimai

Sveiki,

 

Darydamas 2009 informatikos VBE 2 užduotį - "Varžybos" susidūriau viena problema.

Grupėse bėgikų laikus išrikiuoju gerai, bet man išrikiuoja tik bėgikų laikus, o bandydamas išrikiuoti ir vardus man rodo, kad yra klaida ([Error] invalid array assignment).

 

Gal kas nors žinote kitą būdą, kaip išrikiuoti laikus kartu su vardais?

 

 

Štai ta mano programa -

 

#include <fstream>
using namespace std;
/* duomenu/ruzeultatu failai */
const char CDfv[] = "duom.txt";
const char CRfv[] = "rez.txt";

/* Globalus kintamieji */
typedef char kvardas[21];
int n;
int k[50];
int up;			//laiko rikiavimui pagalbinis kintamasis
char up2[21];		//vardu rikiavimui pagalbinis rikiavimas
int kki[50];

struct katinai {
kvardas kv[50];  	//katino vardas
int min[50];		//minutes per kiek atbego
int sec[50];  		//sekundes per kiek atbego
int laik[50];     	//laikas sekundemis per kiek atbego
}cat[100];

void skaitymas ();
void rikiavimas ();
void spausdinti ();

/* Pagrindine funkcija */
int main (){
skaitymas ();
rikiavimas ();	
spausdinti ();
return 0;    
}

/* Proceduros */
void skaitymas () {
ifstream duom (CDfv);
duom>>n;
for (int i=0; i<n; i++) {
	duom>>k[i];
	duom.ignore ();
	for (int j=0; j<k[i]; j++) {
		duom.get (cat[i].kv[j], 20);
		duom>>cat[i].min[j]>>cat[i].sec[j];
		cat[i].laik[j] = cat[i].min[j] * 60 + cat[i].sec[j];
		duom.ignore ();	     		
	}
	kki[i] = k[i] / 2;
}
duom.close ();     
}

void rikiavimas () {
for (int i=0; i<n; i++) {
	for (int j=0; j<k[i]; j++) {
		for (int p=0; p<k[i]; p++) {
			if (cat[i].laik[j] < cat[i].laik[p]) {
				up = cat[i].laik[p];			//
				cat[i].laik[p] = cat[i].laik[j];	// isrikiuoja laikus
				cat[i].laik[j] = up;  			//

				up2 = cat[i].kv[p];			//
				cat[i].kv[p] = cat[i].kv[j];		//pagal mane taip turetu isrikiuoti vardus                                  
				cat[i].kv[j] = up2;			//
			}       
		}    	
	}
}     
}

void spausdinti () {
ofstream rez (CRfv);
for (int i=0; i<n; i++) {
	for (int j=0; j<kki[i]; j++) {
		rez<<cat[i].kv[j]<<cat[i].laik[j]/60<<" "<<cat[i].laik[j]%60<<endl;   
	}  
}      
rez.close ();
}

 

Duomenų failas -

http://img197.imageshack.us/img197/5565/96575557.png

 

Pridedu ir šią programą su visais reikalingais failais.

Varzybos.rar

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man atrodo kad tu cia strukturos pati masyva turi rikiuotis o ne jos elementus, nes dabar tai tu tiesiog pacia struktura isdarkai.

Gal galėtum parodyti kaip atrodo pačios struktūros rikiavimas? Matai, aš C++ naujokas dar, nelabai įsivaizduoju kaip tai turi atrodyti.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Masyvo masyvui priskirt negalima, t.y.

int A[5] = {1, 2, 3, 4, 5};
int B[5] = {6, 7, 8, 9, 10};
A = B // Apsispjaudom errorais

Naudoji vardams string ir nematai vargo. O pagal tai, kaip darai, tai rikiuoji gerai, nes kaip suprantu pvz cat[0] atitinka pirmos grupes duomenis, o ne kazkuri konkretu dalyvi.

Redagavo hafnis1324
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Masyvo masyvui priskirt negalima, t.y.

int A[5] = {1, 2, 3, 4, 5};
int B[5] = {6, 7, 8, 9, 10};
A = B // Apsispjaudom errorais

Naudoji vardams string ir nematai vargo. O pagal tai, kaip darai, tai rikiuoji gerai, nes kaip suprantu pvz cat[0] atitinka pirmos grupes duomenis, o ne kazkuri konkretu dalyvi.

Tai string'as man tiktu jeigu vardų būtų tik vienas ar du, bet jeigu vardą sudarytų nuo 2 iki 5 žodžiu? Nes kiek žinau, tai string nuskaito, šiuo atveju vardą, iki tarpo, ar ne?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai string'as man tiktu jeigu vardų būtų tik vienas ar du, bet jeigu vardą sudarytų nuo 2 iki 5 žodžiu? Nes kiek žinau, tai string nuskaito, šiuo atveju vardą, iki tarpo, ar ne?

Ziurint kaip skaitai :) Tavo atveju tai pradziai nuskaityciau taip kaip tu, i char masyva ir tada ta char masyva priskirciau stringui (taip duoda priskirt);

char x[21]; string x2;
duom.get(x, 20);
x2 = x;

Ir dabar naudoji visur ta x2.

O stringa gali iki kur nori skaityt, tokiais atvejais kai yra kazkokie tai pavadinimai ar vardai is keliu zodziu, tai juos atskiria skyrikliais (kad ir kableliais) ir tada skaitai taip:

getline(duom, stringas, ',');

Redagavo hafnis1324
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...