Zadaní je jednoduché:
Ze vstupního souboru načíst data do polí, seřadit a vypsat do výstupního souboru. <udělat výsledkovou listinu závodu>
Vstupní soubor je ve formátu <bez uvozovek>:
"startovní číslo"
"jméno"
"body"
výstup má být:
"pořadí", "startovní číslo", "jméno" , "počet bodů"
/příklad vstupního souboru/
1
Novak
56
2
Cerny
72
3
Dvorak
65
4
Pech
81
5
Dorota
58
6
Netvor
48
7
Trdlo
52
8
Zdrhl
63
/konec př./
Daný program je napsán ale je problém s řazením jmen a startovních čísel. Počet bodů jeřezen v pořádku. Bohužel se nepodařilo najít chybu.
Zdrojový kód:
program razeni_podle_bodu;
uses crt;
type startovnicisla=array [1..100] of integer;
jmeno=array [1..100] of string;
body=array [1..100] of integer;
var stc:startovnicisla;
jm:jmeno;
bod:body;
vstup,vystup:text;
i,q,n,j,max,pormax,stcm:integer;
maxjm:string;
begin
clrscr;
assign(vstup,'C:\vstup.txt');
reset(vstup);
i:=0;
while not(eof(vstup)) do
begin
i:=i+1;
readln(vstup,stc[i]);
readln(vstup,jm[i]);
readln(vstup,bod[i]);
end;
n:=i;
for i:=1 to n do
begin
writeln(i,', ',stc[i],', ',jm[i],', ',bod[i]);
end;
readln;
for q:=1 to (n-1) do
begin
max:=bod[q]; pormax:=q;
for j:=(q+1) to n do
begin
if bod[j]>max then
begin
max:=bod[j];
pormax:=j;
maxjm:=jm[j];
stcm:=stc[j];
end;
end;
stc[pormax]:=stc[q];
stc[q]:=stcm;
jm[pormax]:=jm[q];
jm[q]:=maxjm;
bod[pormax]:=bod[q];
bod[q]:=max;
end;
assign(vystup,'C:\listina.txt');
rewrite(vystup);
writeln('Poradi, Startovni cislo, Jmeno, pocet bodu');
for i:=1 to n do
begin
writeln(i,', ',stc[i],', ',jm[i],', ',bod[i]);
end;
readln;
end.
pro zjednodušení jsou v průběhu programu zařezeny cykly výpisy dat. ve finálním programu nebudou. Prosím pomozte najít chybu...Děkuji
Fórum › Pascal
Výsledková listina
Zkus nějak upřesnit pojem "problém s řazením jmen a startovních čísel". Ať na to koukám jak chci důkladně, žádnou chybu nevidím - jména i startovní čísla jsou ošetřena správně. Je pravda, že s jedním polem recordů by to bylo přehlednější než se třemi oddělenými poli, ale to je jenom kosmetický detail bez vlivu na funkci.
Teď mě napadá... nemyslel jsi tím problémem náhodou to, že když má několik závodníků stejný počet bodů, tak bys je chtěl mít seřazené ještě podle startovního čísla nebo jména? Na to bys musel použít ještě jeden řadicí cyklus; to, co tam máš teď, ti řadí jenom podle počtu bodů.
Moje stránka.
Připojuju soubor kde je ona chyba vidět. Horní polovina - načtená pole bez řezení (odpovídá - sem je to ještě správně) . Dolní polovina - výpis polí po seřazení
Body se seřadí dobře ale jména a startovní čísla jsou špatná. pořadí se generuje samo ve finálním výpisu. Recordem by to bylo jednoduší ale v tomto programu měla být použita pole.
To je teda záhada... zkusím si ten program odkrokovat, takovéhle záhady nemám rád :-).
Moje stránka.
Já bych nic nekrokoval a celý program bych zjednodušil. Základem je opravdu použití typu record. A řazení bych napsal trochu polopatičtěji:
program razeni_podle_bodu;
uses crt;
type
Tzavodnik = record
jmeno:string[30];
body:integer;
stc:integer;
end;
var
Zavodnik:array[1..100] of TZavodnik;
temp:TZavodnik;
vstup,vystup:text;
n,i:integer;
bylyzmeny:boolean;
begin
clrscr;
assign(vstup,'vstup.txt');
reset(vstup);
n:=0;
while not(eof(vstup)) do
begin
n:=n+1;
readln(vstup,zavodnik[n].stc);
readln(vstup,zavodnik[n].jmeno);
readln(vstup,zavodnik[n].body);
end;
for i:=1 to n do writeln(i,', ',zavodnik[i].stc,', ',
zavodnik[i].jmeno,', ',
zavodnik[i].body);
readln;
repeat
bylyzmeny:=false;
for i:=1 to n-1 do
if zavodnik[i].body<zavodnik[i+1].body then
begin
temp:=zavodnik[i];
zavodnik[i]:=zavodnik[i+1];
zavodnik[i+1]:=temp;
bylyzmeny:=true;
end;
until bylyzmeny=false;
assign(vystup,'listina.txt');
rewrite(vystup);
writeln('Poradi, Startovni cislo, Jmeno, pocet bodu');
for i:=1 to n do writeln(i,', ',zavodnik[i].stc,', ',
zavodnik[i].jmeno,', ',
zavodnik[i].body);
readln;
end.
Heuréka!
Chyběla tam inicializace maxim:
for q:=1 to (n-1) do
begin
max:=bod[q]; pormax:=q;
maxjm:=jm[q]; stcm:=stc[q]; {<- tohle je potřeba přidat}
for j:=(q+1) to n do
begin
if bod[j]>max then
begin
max:=bod[j];
pormax:=j;
maxjm:=jm[j];
stcm:=stc[j];
end;
end;
stc[pormax]:=stc[q];
stc[q]:=stcm;
jm[pormax]:=jm[q];
jm[q]:=maxjm;
bod[pormax]:=bod[q];
bod[q]:=max;
end;
Jinak je algoritmus v pořádku.Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vysledkova tabule — založil eazy
Asp.net - "vysledkova tabulka" — založil Anonymní uživatel
Moderátoři diskuze