Prog.Hu

Két szám közötti négyzetszámok
50

2013-09-08T21:26+02:00
Neovaki
NeovakiProg.Hu
regisztrált tag
Sziasztok,



Ez a program a beírt 2 szám közötti négyzetszámokat kellene, hogy kiírja, de sajnos nem működik és nem tudom, hogy hol lehet a hiba. Segítenétek?

A turbo pascal ebben a sorban: i:= (ettol to eddig); ír hibát: "Error 89: ")" expected.

PROGRAM negyzetszamok;
USES Crt;

Var
   ettol, eddig, i: word;


BEGIN
     ClrScr;

WriteLn ('Melyik szamtol?');
Read (ettol);

WriteLn ('Melyik szamig?');
Read (eddig);

i:= (ettol to eddig);

While ettol<= eddig Do
BEGIN
WriteLn (i:4, sqr(i):6);

i:=i+1;
End;
Readkey;
End.


Nagyon köszönöm előre is.
Mutasd a teljes hozzászólást!
Két szám közötti négyzetszámok
2013-09-08T21:26+02:00
Neovaki
NeovakiProg.Hu
regisztrált tag
A hatos szerepe, hogy megadja hány karakteren jelenjen meg a kiírandó szám.

pl:
writeln(i:6:2);

azt jelenti, hogy 6 karakter hosszú lesz a szám, és ebből 2 a tizedesjegyek lesznek. Tehát a :4 és :6 -nak semmi köze a lényegi megoldáshoz.

Ráadásul a
WriteLn (ettol:4, sqr(ettol):6);

minden számot kiír. nem csak a négyzetszámokat! Ráadásul minden számnak a négyzetét. Nem mondja meg róla, hogy négyzetszám-e.

A helyes megoldást az én hozzászólásomban láthatod.
Mutasd a teljes hozzászólást!
Oszd meg másokkal is!

Ezt az "(ettol to eddig)" formulát honnan szedted???

A "While ettol<=eddig Do"... is végtelen ciklus lesz, hiszen az eddig mindig nagyobb marad az ettolnel (kiveve, ha nem így írták be)! Helyesen: "for i:=ettol to eddig do"...
Mutasd a teljes hozzászólást!
PROGRAM negyzetszamok;
USES Crt;

Var
   ettol, eddig:word;


BEGIN
     ClrScr;

WriteLn ('Melyik szamtol?');
Read (ettol);

WriteLn ('Melyik szamig?');
Read (eddig);

While ettol<= eddig Do
BEGIN
WriteLn (ettol:4, sqr(ettol):6);

ettol:=ettol+1;
End;
Readkey;
End.
Mutasd a teljes hozzászólást!
Ha már teljes kódot írsz:

Writeln(ettol:4, sqr(ettol):6);

ok, látom javítottál

de FOR ciklus akkor is helyesebb lenne!!!
Mutasd a teljes hozzászólást!
Oh, nagyon köszönöm a szuper gyors válaszokat. De most mégis kinek adjam a pontot? :(


polyJoe, azt az "ettol eddig" formulát info tanár írta egy másik program kapcsán és abból próbáltam meg megcsinálni ezt a programot. (eddig összesen volt 2 pascalos info órám)


Ezt a részt itt nem teljesen értem:

WriteLn (ettol:4, sqr(ettol):6);

ettol:=ettol+1;

El tudnád magyarázni, hogy pontosan mi mit jelent? Például mi az az sqr(ettol):6?
Mutasd a teljes hozzászólást!
Először kiírja az ettol változó értékét és utána az ettol változó értékének a négyzetét. Utána hozzáad az ettolhöz egyet (, hogy a következő alkalommal, ne ugyanezt ismételje) és újraindul a ciklus.
Én nem ragaszkodom amúgy a ponthoz.
Mutasd a teljes hozzászólást!
A ciklust így kellene megírni:

  writeln('Negyzetszamok:');
  for i := ettol to eddig do begin
    if (trunc(sqrt(i)) = sqrt(i)) then begin
      writeln(i);
    end;
  end;

Az if utasítás megnézi, hogy a szám gyöke megegyezik-e a szám gyökének a lekerekített értékével, ha igen, akkor négyzetszámról van szó.
Mutasd a teljes hozzászólást!
Köszönöm, most már végképp nem tudom, hogy kinek adjam a pontot.


Még ez a sor nem világos:

WriteLn (ettol:4, sqr(ettol):6);


ettol:4 - ez azt jelenti, hogy az ettől az mindenképpen 4 lesz, mivel az az első négyzetszám?

sqr(ettol):6 - ez se világos. Ugye az sqr(ettol) az megmondja az "ettol" négyzetét. De utána miért kell az a 6-os?
Mutasd a teljes hozzászólást!
De utána miért kell az a 6-os?

Próbáld ki vele is meg nélküle is és megtudod...
Mutasd a teljes hozzászólást!
6 nélkül nem azt írja ki, amit kell. De még mindig nem teljesen világos, hogy mi a 6-os szerepe.
Mutasd a teljes hozzászólást!
És ha kicseréled a 6-ost pl. 16-osra?
Mutasd a teljes hozzászólást!
A hatos szerepe, hogy megadja hány karakteren jelenjen meg a kiírandó szám.

pl:
writeln(i:6:2);

azt jelenti, hogy 6 karakter hosszú lesz a szám, és ebből 2 a tizedesjegyek lesznek. Tehát a :4 és :6 -nak semmi köze a lényegi megoldáshoz.

Ráadásul a
WriteLn (ettol:4, sqr(ettol):6);

minden számot kiír. nem csak a négyzetszámokat! Ráadásul minden számnak a négyzetét. Nem mondja meg róla, hogy négyzetszám-e.

A helyes megoldást az én hozzászólásomban láthatod.
Mutasd a teljes hozzászólást!
Nagyon szépen köszönöm a kerek egész magyarázatot, így már értem az egészet. Köszönöm.
Mutasd a teljes hozzászólást!
Akkor, hogy néz ki a programod végleges verziója?
Mutasd a teljes hozzászólást!
PROGRAM negyzetszamok;
USES Crt;

Var
   ettol, eddig, index:word;


BEGIN
     ClrScr;

WriteLn ('Melyik szamtol?');
Read (ettol);

WriteLn ('Melyik szamig?');
Read (eddig);

  writeln('Negyzetszamok:');
  for index := ettol to eddig do begin
    if (trunc(sqrt(index)) = sqrt(index)) then begin
      writeln(index);
    end;
  end;

ettol:=ettol+1;
Readkey;
End.
Mutasd a teljes hozzászólást!
OK!

Viszont:

ettol:=ettol+1;

felesleges. Mit akarsz ettől az ettol valtozótól még ott a program végén?
Mutasd a teljes hozzászólást!
Oh, tényleg! Köszönöm.

Az sqrt és az sqr között mi a különbség?
Mutasd a teljes hozzászólást!
Nézd meg a súgóban!
Mutasd a teljes hozzászólást!
Továbbá jó lenne, ha valamiféle egységes stílust kitalálnál a program írásakor.

Néhány kulcsszót tisztán nagy betűvel írsz néhányat pedig nagy kezdőbetűvel. pl. PROGRAM , Var

Aztán néha nagybetűvel kezded a függvényt aztán pedig kisbetűvel.
pl: WriteLn , writeln

Továbbá a sorok előtti space karakterek száma is össze-vissza jelentkezik.

Én valahogy így írtam vona meg a programot:

program negyzetszamok;

uses
  crt;

var
  ettol, eddig, index : word;

begin
  clrScr;

  writeln('Melyik szamtol?');
  read(ettol);

  writeln('Melyik szamig?');
  read(eddig);

  writeln('Negyzetszamok:');
  for index := ettol to eddig do begin
    if (trunc(sqrt(index)) = sqrt(index)) then begin
      writeln(index);
    end;
  end;

  readln;
end.
Mutasd a teljes hozzászólást!
sqrt : négyzetgyökvonás
sqr : négyzetre emelés
Mutasd a teljes hozzászólást!
Köszönöm, így tényleg átláthatóbb, majd igyekezni fogok, hogy rendezettek legyenek a kódjaim. Azt hiszem én maradok annál a változatnál, hogy minden kulcsszó nagybetű.

Köszönök mindent.
Mutasd a teljes hozzászólást!
Oszd meg másokkal is!