Ezt a feladatot kaptuk suliban, tud segíteni vki?
Részben megoldottam a feladatot,de aztán megállt a tudomány.Az info tanár kitalálta,hogy írjunk egy olyan programot,hogyha egy textboxba kiadjuk ezt az utasítást,hogy "for valami = x to y do",akkor listázza ki egy valódi for utasításban megadottak értékeit. Sajnos csak minden 1 helyi értékkel működik és azt kellene megoldani,hogyha valaki ezt a parancsot adja ki, hogy
for kutyagumi=65342 to 896322, vagy ha ezt hogy
for z= 1 to 332 do
akkor is is működjön és listázza ki az értékeket egy másik szövegdobozba.Annyi kevés fogalmam van,hogy valami pozicionáló és beszúró függvényekkel lehet,hogy meg lehetne oldani,bár ebben sem vagyok biztos,de azokhoz viszont végképp nem konyítok semmit.Nem is nagyon értem ezt,hogy minek kér ilyen nehéz feladatot tőlünk.Elég makacs és goromba is ez a tanár sajnos. Sok mindent el sem mond az órán és olyan feladatokat ad fel,amihez még nekünk kell hozzátanulnunk néha.
Eddig jutottam,segítsetek kiegészíteni,mert időm az nincs sok rá,hétfőre le kellene adnom. Ha nagyon durva a feladat megoldása és a kérés,akkor hagyjátok inkább a fenébe,max kapok rá egy 2-est,vagy karót.Vitatkozni nincs kedvem és időm sincs rá. Csupán egy gyors segítséget kérek,ha nem túl nagy kérés.
Előre is köszi!
most ügy működik legalább, hogyha beírod,hogy
for u=0 to 9 do akkor kiírja az értékeket,vagy ha
for i=2 to 7 do akkor is, de sajna több helyi értékkel nem szuperál.
procedure TForm1.Button1Click(Sender: TObject);
const egyenlo='=';
{const to2='to';}
{const do2='do';}
var s,s1,s2,s3:string;
var x,y,i:integer;
var valtozo:string;
begin
x:=strtoint(memo1.text[7]);
y:=strtoint(memo1.text[12]);
valtozo:=memo1.Text[5];
s1:='to';
s:=memo1.seltext;
insert(s1,s,memo1.SelStart);
s3:='do';
s2:=memo1.seltext;
insert(s3,s2,memo1.SelStart);
if memo1.text='for '+valtozo+egyenlo+inttostr(x)+' '+s+' '+inttostr(y)+ ' '+s2 then begin
for i:=x to y do begin memo2.lines.Add(inttostr(i));
end;
end;
end;
end.
Nem jó megoldás, hogy kiszeded a stringből az adott indexen levőket.
Amit csinálni kellene:
-Az egész textbox tartalmát kiszeded egy stringbe
-Végigiterálsz a stringen
--Ha az elején van "for", akkor megy tovább, különben hiba
--Ha a string következő karaktere nem "=" és nem null, akkor addig megy, amíg nem talál "=" jelet vagy a string végig. Ha nem talált, akkor hiba.
--ha a string következő nem null karaktere szám, akkor eltárolod, ha nem akkor hiba.
--Ha a string következő nem null karaktere a "to" és van utána egy szám, akkor elmented a számot a változóba, különben hiba.
Ha pedig nincs szükség feltétel ellenőrzésre, akkor megkeresed a 2 számot a stringben és elmented őket.
Legegyszerűbb ha ráengedsz egy regxet, és ha megfelel akkor már pofon egyszerű kiszedni a 2 számot.
^for\s[A-Za-z]+\s?=\s?\d+\sto\s\d+$
http://regexr pont com/3bp5r
és a for után valami "akármi" változónak kell lennie, hiszen azt is véletlenszerűen választja meg a programozó, nem mindig "i" vagy "a" vagy "b" a változó,hanem valamikor "macskafarka", vagy "tejfől" is lehet akár, "for akármi = x to y do" akkor értékelje ki a műveletet.
Akárhogy is nézem a
"Fornak" is egy stringben kellene lennie, ami ráadásul állandó is
A 'valaminek'-nek is
az '='-jelnek is
a bal odali számoknak is külön változó kell
a jobb oldai számoknak is ugyszintén
a "to" az megint egy rohadt string
és a "do" is ugyanaz
tehát
var s,s1,s2,s3,s4:string
s:=memo1.text;
s2:='for'; {For}
s3:=strtoint(memo1.text) {Valami}
s4:=strtoint(memo1.text); {=}
s5:=inttostr(memo1.text); {233}
s6:=strtoint(memo1.text); {To}
s7:=strtoint(memo1.text); {652}
s8:=strtoint(memo1.text); {Do}
és mindez benne egy memoban, ráadásul beszúrva,vagy pozicionálva,vagy a rosseb se tudja
és még a kiértékelés egy másik memóba.Hát nemtom ez nekem sok sajnos.Meghaladja a képességeimet:)
For valami = x to y do
s v e szam1 s1 szam2 s2
Akárhogy is számolom írom le magamnak érthetően akkor sem tudom,hogy mindezek után mit kell tenni, hova kellene beszúrni,vagy pozicionálni és főleg mivel.
var s:string;
var v:string;
var e:string;
var szam:integer;
var s1:string;
var szam2:integer;
var s2:string;
begin
s:='for';
v:=memo1.text;
e:=memo1.text;
szam:=inttostr(szam1);
s1:='to';
szam2:=inttostr(szam2);
s2:='do';
Na és akkor innét mi van? :))
Latom sokat foglalkozol a temaval, viszont a tanarod nem magyarazott el mindent rendesen.
1. A 'for'-t, 'do'-t nem kell eltarolni valtozoban. Ez megroviditi a kodod rendesen.
2. String.split fuggvennyel ezt egyszeruen meg lehet csinalni. Viszont igy fontos, hogy a kerdesed elejen levo formatumban hasznald a bemenetet (kesobb lehagytad a space-t az = elott).
// Space-k menten feldaraboljuk a bemenetet tombbe
String[] bemenet = memo1.text.split(' ');
// Leellenorizzuk a fix tagokat:
if (bemenet.size!=7 || bemenet[0]!="for" || bemenet[2]!="=" || bemenet[4]!="to" || bemenet[6]!="do") {
memo2.lines.Add("rossz bemenet");
return;
}
// Ha jo a bemenet, kivesszuk a szamokat
x = strtoint(bemenet[3]);
Tobbit mar szerintem tudni fogod.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!