Aahojky.Mám udělat tady tento program,ale nevím jak ho udlat,tak bych potřebovala nějak poradit.Vím jen, že se to musí určitě udělat přes Random a Randomize.
Zadání:
Sestavte program, který ze vstupního souboru načte seznam žáků a poté náhodně vybere zadaný počet žáků ke zkoušení.
VSTUP: seznam žáků – soubor ZACI.TXT
počet žáků ke zkoušení
VÝSTUP: přehled vylosovaných žáků
Vstupní soubor mám...Je tam je seznam jmen.
Díky
Fórum › Pascal
LOSOVANI
1) Nactes ze souboru jmena zaku. Asi nejjednodussi bude pouzit pole (array) a Readln v cyklu while not eof(soubor) a nezapomen si pamatovat, kolik jich je. U kazdeho jmena je potreba mit jeste promennou typu boolean, ve ktere si budes pamatovat, jestli uz jsi ho vybrala (na zacatku u vsech false). A zavolej Randomize.
2) Tolikrat, kolik zaku se ma vyzkouset, udelas tohle:
- Vyber nahodne cislo z intervalu 1..pocet zaku (Random s vhodnym cislem v zavorce).
- Pokud je zak s timto cislem uz vybrany (ma tu boolovskou promennou nastavenou na true), opakuj predchozi bod (kdyby nekdo omylem zadal vetsi pocet zaku ke zkouseni nez kolik jich je ve tride, tak by se to tady zaseklo v nekonecne smycce, takze nezapomen zadane hodnoty zkontrolovat a pripadne opravit).
- Nastav nalezenemu zakovi, ze uz je vybrany (true).
3) Vypis vybrane zaky (cyklus pro cele pole, vypises jmena tech, u kterych je true).
Staci takhle?
Moje stránka.
To Mircosoft : Ahojky.Už jsem něco zplodila s pomocí kamaráda,ale nevím jestli je to ono.
Uses crt;
type pole =array[0..30] of string;
function Losuj(zaci: Pole; pocet: Integer):String;
begin
Losuj:= zaci[random(pocet)];
end;
var i: Byte;
S: Text;
zaci: pole;
pocetnaz: Integer;
vysledek: String;
begin
Assign(S,'C:\Pascal\zaci.txt');
Reset(S);
Randomize;
TextColor(Green);
Writeln('---- Program na zkouseni zaku ----');
TextColor(White);
Writeln;
Write('Zadej pocet zaku ke zkouseni (maximalne 30): ');
Readln(pocetnaz);
Writeln;
i:=0;
while not(eof(S)) do
begin
Readln(S,zaci[i]);
Inc(i);
end;
Close(S);
while not(pocetnaz = 0) do
begin
Writeln;
Vysledek:= Losuj(zaci,i);
Writeln(vysledek);
Pocetnaz:= pocetnaz - 1;
end;
Readkey;
end.
Problem je v tom poslednim cyklu while not(pocetnaz = 0) do ... . Takhle vzdycky vyberes zaka, vypises ho na obrazovku, ale nezapamatujes si, ze uz si ho vybrala a priste ho muzes klidne vylosovat jeste jednou, coz nechces. Takze treba: var vybrani:array[0..30] of boolean. Na zacatku nastav na false. Funkci Losuj uprav: jednak aby vracela cislo zaka a ne jeho jmeno a jednak aby Random tahal z rozsahu pocet+1 a ne pocet (jinak by bral cisla 0..29 a ne 0..30). Kdyz vylosujes cislo zaka, zobraz jmeno (zaci[cislo]) a zapamatuj si, ze je vybrany (vybrani[cislo]:=true). Od volani Losuj po vypsani zaka to hod do cyklu repeat ... until not vybrani[cislo], aby se zabranilo vicenasobnemu vyberu jednoho zaka.
Potom si jeste pro jistotu uprav nacitani: krome podminky not eof pridej jeste or(i<=30), aby nedoslo k problemum, kdyby bylo v souboru vic radku nez jak mas velke to pole.
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
Náhodné losování ze skupiny prvků (graficky) — založil Quality
Moderátoři diskuze