Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Dobrý den,
mám problém s následující úlohou v Pascalu:
V textovém souboru CISLA.TXT jsou uložena přirozená čísla. Každé z těchto čísel může mít až 100 dekadických cifer a je zapsáno na samostatném řádku souboru. Zápis žádného čísla nezačíná vedoucími nulami. Čísla v souboru nejsou nijak uspořádána a hodnoty se v souboru mohou libovolně opakovat.
Napište program, který určí největší číslo obsažené v souboru a počet jeho výskytů. Oba výsledky program vypíše na standardní výstup, každý na samostatný řádek.
Příklad vstupního souboru CISLA.TXT:
5555555555555555555555555555
7777777777777777777777777777
55
7777777777777777777777777777
123123123
Odpovídající správný výstup:
7777777777777777777777777777
2
Mé řešení pro mnou zadané hodnoty funguje správně, avšak když program zadám ke kontrole, hlásí mi "Runtime error 201: Range check error". Napadlo mě, že by to mohlo být tím, že soubor CISLA.txt může obsahovat více, než 1000 řádků. Pokud by to mohlo být tím, tak bych se rád zeptal, jak v deklaraci zařídit, abychom měli pole maximální délky, které by odpovídalo různým počtům řádků v souboru.
mé řešení:
program Cisla;
uses CRT;
const MAX = 1000;
VAR line,b: array [1..MAX] of string;
myfile:text;
i,m,pocet,vyskyt,maxlen,T,maxindx:INTEGER;
begin
//init
assign(myfile,'CISLA.TXT'); //prirazeni jmena souboru
pocet:=0;
reset(myfile); //otevre soubor pro cteni
//nacte jednotlive radky do pole stringu
while not eof(myfile) do
begin
inc(pocet); //pocita radky s cisly v souboru
readln(myfile,line[pocet]);
writeln(line[pocet]);
end;
//hledame delku nejdelsiho stringu
maxlen:=0;
for i:=1 to pocet do
begin
//writeln(length(line[i]));
if(length(line[i])>maxlen) then
maxlen:=length(line[i]);
end;
//zkopirujeme si jen stringy s nejvetsi delkou do pole stringu b[].
//pocet stringu bude m.
m:=0;
for i:=1 to pocet do
if(length(line[i])=maxlen) then
begin
inc(m);
b[m]:=line[i];
end;
//dale prohledavame jen pole b
//vyhledam index "nejvetsiho" stringu
maxindx:=0;
for i:=1 to m do
if(b[i]>b[maxindx]) then
maxindx:=i;
//vypise nejvetsi cislo
writeln();
writeln(b[maxindx]);
//spocitam, kolikrat se vyskytuje
vyskyt:=0;
for i:=1 to m do
if(b[i]=b[maxindx]) then
inc(vyskyt);
//vypis vyskytu
writeln(vyskyt);
delay(2000);
end.
Offline
↑ Flaky:
Hezký den,
ano, zakopaný pes je v tom, že si upravuješ zadání. V zadání není řečeno, že soubor nebude delší než 1000 řádků, takže musíš předpokládat libovolně dlouhý soubor.
Dále si uvědom, že máš hledat největší číslo, takže je zbytečné načítat co paměti celý soubor a procházet si pole čísel v paměti. Zbytečná duplikace dat. Prostě si na začátku definuj řetězec Max:="0". No a s tím postupně porovnávej jednotlivé načtené řádky. Pokud bude načtené číslo větší, přepíšeš hodnotu Max a vynuluješ čítač, pokud bude stejné, inkrementuješ čítač, a pokud bude menší, půjdeš dál. Až dojdeš na konec souboru, měl bys mít výsledek.
Edit: Přehlédl jsem rozsah čísla, takže jinak...
Offline
Stránky: 1