Runtime Error 201 pri vyhledavani v setridenem poli – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Runtime Error 201 pri vyhledavani v setridenem poli – Pascal – Fórum – Programujte.comRuntime Error 201 pri vyhledavani v setridenem poli – Pascal – Fórum – Programujte.com

 

sh00ter0
Newbie
17. 11. 2010   #1
-
0
-

Zdravim, dostal jsem ukol, napsat program pro vyhledavani v setridenem poli.
Vše v pohodě, dělám to přes půlení intervalů, ale náš školní systém pro vyhodnocování úkolů mi v jednom testu z 8 který dělá hází RE 201 a absolutne me nenapada kde bych moh pracovat mimo index, samozrejme ty data se kterejma ten test pracuje neznam,
kod je zde

var n, h, d, stred, k, pos: 1..1000000;

data: array[0..1000000] of integer;
inp, inp2, outp: text;
a: integer;

begin
assign (inp, 'data.in');
assign (inp2, 'dotazy.in');
assign (outp, 'vysledky.out');

reset(inp);
reset(inp2);
rewrite(outp);

readln(inp, n);
for pos := 1 to n do
read(inp, data[pos]);

readln(inp2, k);
for pos := 1 to k do
begin
read(inp2, a);
d := 1;
h := n;
while h - d > 1 do
begin
stred := (h + d) div 2;
if (data[stred] > a) then
h := stred - 1
else if (data[stred] < a) then
d := stred + 1
else
begin
d := stred;
h := stred;
while (d>1) AND (data[d] = a) do dec(d);
end;
end;
if (data[d] = a) then write(outp, d, ' ')
else if (data[h] = a) then write(outp, h, ' ')
else write(outp, '0 ');
end;

close (inp);
close (inp2);
close (outp);
end.


díky za radu pokud někdo máte nápad :)


pripadne kod je i v priloze

Nahlásit jako SPAM
IP: 94.113.85.–
zdenda
~ Anonymní uživatel
257 příspěvků
17. 11. 2010   #2
-
0
-

Nevím, jaké byly požadavky, ale těch chyb je tam víc.
RE 2 když nebudou ty soubory existovat
RE 106 když v nich budou nesmyslné hodnoty
RE 201 když hodnoty budou mimo rozsah (jako N 0, nebo data 33000)

Nahlásit jako SPAM
IP: 213.211.51.–
sh00ter0
Newbie
17. 11. 2010   #3
-
0
-

já vím, už jsem na N = 0 přišel, ale to že existují a nepřekročí rozsah integeru je v zadání :) díky :)

Nahlásit jako SPAM
IP: 94.113.85.–
Mircosoft+1
Věrný člen
18. 11. 2010   #4
-
0
-

Problém je nejspíš s tím stred:=(h+d) div 2. Při dostatečně velkých hodnotách h a d může vyjít mezivýsledek (ještě před tím div 2) větší než 1000000. Spraví se to zvětšením rozsahu d a h na 2000000.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
sh00ter0
Newbie
21. 11. 2010   #5
-
0
-

je to vyřešený, ale stred nemuze bejt vetsi nez 1000000 protoze h i d jsou max 1000000 tim padem 1000000*2/2 je zas milion ;)

Nahlásit jako SPAM
IP: 94.113.85.–
Mircosoft+1
Věrný člen
22. 11. 2010   #6
-
0
-

Výsledek ne, ale neviditelné mezivýsledky jo - bacha na to. Počítač to vidí takhle:

- Mám výraz s operandy h a d (oba rozsah 0..milion), výsledek jde do Stredu (taky 0..milion) a pak je tam dvojka, která je menší než milion. Takže si pro mezivýsledky vyhradím pomocnou proměnnou o rozsahu taky 0..milion.
- Spočítám h+d. Když vyjde víc než milion, nahlásím chybu.
- Výsledek vydělím dvěma.
- Výsledek uložím do Stredu.

Na tohle dost často padá třeba Pythagorova věta - vím, že výsledek bude relativně malé číslo, tak deklaruju operandy jako integery, jenže pak mi mocniny přetečou ještě před odmocněním a už se to veze.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
zdenda
~ Anonymní uživatel
257 příspěvků
22. 11. 2010   #7
-
0
-

Ne, mezivýsledek má plný rozsah hostitelského typu (tady nejméně +-2Gi) a konečný výsledek už bude ve vymezeném intervalu.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Runtime error 64736 — založil Kalgys

Polynom - run-time error 201 — založil danny04

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý