Mam drobny problem potrebuju do programu vlozit cylus for tak by mi cyklil tak dlouho dokud nenarazi na posledni radek ale radku je n. tim myslim jako ze muzou bejt dva a nebo milion... zde dam jeste kod kde se vyskytnul muj problem....
program faktor;
var rozklad:string;
var n,jaky,cislo1,pocet,i:longint;
begin;
i:=1;
for pocet:=1 to 2E31 do begin {/!!!! <<---- zde je muj problem----- }
read(cislo1);
n:=2;
rozklad:='';
jaky:=0;
while cislo1<>1 do
begin
while ((cislo1 mod n)=0) do
begin
if not(i=1) then write(' ');
i:=i+1;
cislo1:=cislo1 div n;
write(n,'');
end;
n:=n+1;
end;
writeln;
end.
Fórum › Pascal
Problem s for cyklem
na todle je lepsi repeat until... for je pro presne znamy pocet opakovani...
+ nejsem si jist jestli se 2E31 nebere trosku jinak nez myslis... je to
20 0000000000 0000000000 0000000000 = 2 * 10^31
nikoliv
2147483647 = 2^31 - 1
EDIT: ano.. jak zminil Mircosoft taky je to realne :D mi to nejak vypadlo pri psani... a for se nema rad s realnem..
to co davas do foru musi mit predchudce a nasledovnika.. tj ordinalni typ
To zoufalec : Pokud znáš počet opakování předtím než ten cyklus spustíš, není problém načíst číslo n (celočíselnou proměnnou) a pak udělat for-cyklus od 1 do n. Ale jestli se počet dozvíš až během cyklu, použij repeat, jak píše KIIV.
Pozor, že 2E31 je reálné číslo a to se na meze for-cyklu ani na řídicí proměnnou nedá použít v žádném případě.
- V tom programu mi celý řádek s forem připadá, jako kdyby tam vůbec nepatřil - jednak pro něj nevidím žádný smysl a jednak je za nim begin, ke kterému už tam není ukončovací end.
- Proměnná jaky je k ničemu.
- Podmínka while ((cislo1 mod n)=0) mi připadá chybná, dal bych tam naopak while ((cislo1 mod n)<>0) (cislo1 chceš dělit číslem n, dokud to jde, ne dokud to nejde).
Moje stránka.
ten algoritmus funguje spravne ...... uz to mam vyzkouseny.......
ale repeat until taky musim dopredu vedet kolik budu mit radku na vstupu....
btw ten kod sem malinko zmenil ale ted to nacte vsechny cisla v radku a udela to jejich faktorizaci coz je pro me spatne
ja potrebuju kdyz dostanu na vstupu
10
6
100
abych dostal na vystupu
2 5
2 3
2 2 5 5
radek muzu dostat jeden a nebo treba 1000 proste nahodne bez varovani
tady je poopraveny kod..... s pouzitim while....
program roznasouprv;
var rozklad:string;
n,jaky,cislo1,pocet,i:longint;
begin;
while not eoln do
begin
i:=1;
read(cislo1);
n:=2;
rozklad:='';
jaky:=0;
while cislo1<>1 do
begin
while ((cislo1 mod n)=0) do
begin
if not(i=1) then write(' ');
i:=i+1;
cislo1:=cislo1 div n;
write(n,'');
end;
n:=n+1;
end;
writeln;
end;
end.
diky predem za pomoc ...... pripadne o vysvetleni logickeho postupu jak uvazovat v takovych to pripadech....
Moment... vstupní čísla čteš z klávesnice nebo ze souboru? V případě klávesnice by ukončovací podmínka mohla být nějaká speciální hodnota (např. nula), kterou zadá uživatel. V případě souboru to řeší funkce Eof (ne Eoln).
Repeat a While se ukončuje logickou podmínkou, takže počet opakování znát nepotřebuješ. Prostě skončíš, až ta podmínka bude splněna.
P.S.: možná by ti mohlo pomoci tohle: http://mircosoft.ic.cz/download/prvocisla.zip
Moje stránka.
mno teoreticky klavesnici ale nemam uplne predstavu vyhodnocuje to skolni system....... a tak jsem to zkusil eof a to mi nevzal.... tak opravduu uz nevim prej programovani pro zavatecniky 1 :D mam co delat abych tyden po prednasce a cviku pochopil jak ty veci pracujou..... takze je to pro me trosku problem.....
jeste drobnost kdyz jsem tam napsal na tvrdo todle tak jsem dostal 10% spravne ..... tak teoreticky bych to musel udelat s ohromnym mnozstvim for cyklu s podminkama tak aby si to nejak zjistilo kolik radku je na vstupu ...... ale mam takovej dojem ze bych u toho zestarnul......
program roznasouprv;
var rozklad:string;
var n,jaky,cislo1,cislo2,cislo3,cislo4,i:longint;
begin;
i:=1;
read(cislo1);
read(cislo2);
read(cislo3);
read(cislo4);
n:=2;
rozklad:='';
jaky:=0;
while cislo1<>1 do
begin
while ((cislo1 mod n)=0) do
begin
if not(i=1) then write(' ');
i:=i+1;
cislo1:=cislo1 div n;
write(n,'');
end;
n:=n+1;
end;
writeln;
n:=2;
rozklad:='';
jaky:=0;
while cislo2<>1 do
begin
while ((cislo2 mod n)=0) do
begin
if not(i=1) then write(' ');
i:=i+1;
cislo2:=cislo2 div n;
write(n,'');
end;
n:=n+1;
end;
writeln;
n:=2;
rozklad:='';
jaky:=0;
while cislo3<>1 do
begin
while ((cislo3 mod n)=0) do
begin
if not(i=1) then write(' ');
i:=i+1;
cislo3:=cislo3 div n;
write(n,'');
end;
n:=n+1;
end;
writeln;
n:=2;
rozklad:='';
jaky:=0;
while cislo4<>1 do
begin
while ((cislo4 mod n)=0) do
begin
if not(i=1) then write(' ');
i:=i+1;
cislo4:=cislo4 div n;
write(n,'');
end;
n:=n+1;
end;
writeln;
end.
takhle to poroslo alespon prvnim testem a dalo mi to tech 10% ale dle me jen pro to ze sem trefil prvni zkoumany pocet ostatni testy mi vyhodily wrong answer......
Sákryš, tak se známkovacím robotem jsem se ještě nesetkal :-O.
Ten vnější cyklus bych viděl nějak takhle:
var cislo:longint;
...
writeln('Zadavej cisla. Zadanim nuly se skonci.');
repeat
readln(cislo);
if cislo<>0 then ...zpracuj ho...
until cislo=0;
...
Prostě budeš načítat a zpracovávat čísla tak dlouho, dokud bude uživatele bavit je psát.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
Problém s cyklem while — založil Tase
Problem s cyklem while — založil slipka
Pomoc s cyklem if/else — založil Thomisso
Procházení cyklem složky — založil Ralis
Vytváření proměných cyklem FOR — založil pidgin
Moderátoři diskuze