Program pascal "mini calculator"

Pascal este un limbaj imperativ, creat inițial pentru a ajuta la predarea noțiunilor de programare structurati studenților. Delphi, urmașul lui Pascal, este un mediu de dezvoltare pentru aplicații Windows. Delphi este primul limbaj de programare (Object Pascal, mai exact) care a îmbinat ușurința în programare a limbajelor de nivel înalt și puterea uneltelor de lucru de nivel scăzut într-un mediu RAD.

Program pascal "mini calculator"

Postby getlow12 » 04 May 2011, 20:25

Buna tuturor. Recent am inceput sa fac programarea in Pascal si o idee ma tot obsedeaza si nu resusesc sa ii dau de capat. Vreau sa fac un program gen un calculator, adica:
Optiunea 1. Suma a doua numere
Op 2 Produsul
.
.
Op x.O anumita operatie.
Vreau ca atunci cand cineva tasteaza numarul optiunii sa introduca a,b,c ...x si sa primeasca rezultatul.

Ceea ce nu stiu eu este cum sa fac sa leg optiunea X cu operatie respectiva.
0,0p / 0 votes
"Hacking is an ART and we are the ARTist"
User avatar
getlow12
Bit
 
Joined: 04 May 2011
Status: 0

Re: Program pascal"mini calculator"

Postby andreiandreiq » 04 May 2011, 20:43

Salut,

Poti sa ne arati ce ai incercat pana acuma ? Nu e asa greu de facut, dar totul depinde de ceea ce sti tu sa faci pana acuma in Pascal, intre timp uita-te peste topicul cu: Tutoriale Pascal (ideal ar fi sa le citesti).

P.S. Daca ai timp si chef, prezinta-te.
0,0p / 0 votes
Image
User avatar
andreiandreiq
Word
 
Joined: 30 Dec 2009
Status: 33.33

Re: Program pascal"mini calculator"

Postby Cosmin_NTG » 04 May 2011, 20:46

Pai cel mai simplu ar fi sa lucrezi cu subprograme (procedure cred ca este in pascal).
Lungimea codului va fi direct proportionala cu numarul operatiilor si cred ca nu numai lungimea ci si timpul de executie.
Eu as face in felul urmator:
In functia principala introduci numarul optiunii iar apoi, cu ajutorul instructiunii switch (nu stiu cum este in pascal, asa e in C), valoarea se duce la un anumit caz in care se afla apelarea unei functii (subprogram) iar functia reprezinta operatia respectiva. Mai concret: daca n (de exemplu) == 1, apeleaza functia adunare, daca n == 2, apeleaza functia produs s.a.m.d..
Eu cred ca voi reusi sa scriu codul in C++ dar nu cred ca te va ajuta la ceva daca tu studiezi pascal. Alte idei in afara de subprograme nu imi vin acum in minte...probabil intr-o structura repetitiva sa citesti n-ul si in acea structura sa ai mai multe structuri conditionale care sa execute operatia respectiva.
Ceva de genul: cat timp (n<>0) executa
citeste n
daca n==1
citeste a,b
scrie suma
daca n==2
citeste a,b
scrie produs
.............
Asa cred ca este cel mai simplu.
Bafta.
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Program pascal"mini calculator"

Postby getlow12 » 04 May 2011, 22:10

M-am gandit la ceva ca tot zicea cosmin daca fac ceva de genul:
program minicalculator;
var a,b,n:integer;
begin
writeln('Alegeti operatia din sir:');readln();
Writeln('1.Adunarea a doua numere;');readln();
writeln('2.Produsul a doua numere.');readln();
apoi de aici in jos sa pun doua conditii daca n=1 si apoi daca n=2.Asta ar putea merge?Daca da cum sa fac n?Adica de unde sa vada programul de unde sa-l ia.Ar fi fost mult mai simplu sa zic daca 1,2 atunci dar asa nu pot.MA rog poate ati inteles la ce ma refer.O sa mai lucrez maine dupa teza.
0,0p / 0 votes
"Hacking is an ART and we are the ARTist"
User avatar
getlow12
Bit
 
Joined: 04 May 2011
Status: 0

Re: Program pascal"mini calculator"

Postby DarkByte » 04 May 2011, 22:18

Tutorialul despre conditii si bucle ar trebui sa fie ce ai tu nevoie. Ai putea sa te uiti si peste meniul demonstrativ - s-ar putea sa te ajute.

Unde ai nelamuriri, intreaba :)

Spor la butonat !

L.E. in cazul expus de tine, structura "case" ar trebui sa-ti fie de ajutor (sau un IF multiplu).
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Program pascal"mini calculator"

Postby andreiandreiq » 04 May 2011, 22:54

Cum a spus si DarkByte, structura "case" ar trebuie sa iti fie de ajutor (e foarte usor de folosit). Pe langa "case" ai nevoie si de o structura "repeat" sau "while", din moment ce tu vrei sa alegi o optiune si sa execute ceva, sa alegi alta optiune si sa execute altceva etc.

Bafta

Offtopic
0,0p / 0 votes
Image
User avatar
andreiandreiq
Word
 
Joined: 30 Dec 2009
Status: 33.33

Re: Program pascal"mini calculator"

Postby getlow12 » 05 May 2011, 09:36

Am citit tutorialul cu instructiuni si bucle dar pentru nu prea am inteles.sa incerc sa vad totusi
din ce am inteles cred ca ar veni cam asa:
variabile
begin
writeln( alegi op de mai jos)
writeln(1.adunare)
writeln(1.produs)
case 1 of
si aici pun writeln(dati a );readln(a);
writeln(dati b );readln(b);
writeln(suma celor doua nr este ,a+b)
eu cam asa am inteles.
0,0p / 0 votes
"Hacking is an ART and we are the ARTist"
User avatar
getlow12
Bit
 
Joined: 04 May 2011
Status: 0

Re: Program pascal"mini calculator"

Postby DarkByte » 05 May 2011, 10:37

Da, e ok ... dar fiindca nu ai nicio instructiune de ciclare (bucla), se va executa o singura data - o singura operatie.
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Program pascal"mini calculator"

Postby getlow12 » 06 May 2011, 10:02

MIa iesit ceva dar inca am nelamuriri.Ecam greu sa inveti singur ce si cum fac astea mai ales cum nu se fac din clasa a 8a.pun ce am pana acuma.
  1. Program MiniCalculator;
  2. var a,b,nr:integer;
  3. begin
  4. Writeln('Selectia operatia din sirul de ma jos: ');readln();
  5. writeln('1.Aduna doua numere naturale; ');readln(nr);
  6. Writeln('2.Inmulteste doua numere naturale: ');readln();
  7. case nr of 1:writeln('Ati Ales suma');
  8.            2:writeln('Ati ales produsul')
  9.            end;
  10.            readln
  11.            end.

in timp ce scriam acest post mi-a venit alta idee si am modificat rezultand asta, dar imi da niste erori ... poate ma puteti ajuta.
  1. Program MiniCalculator;
  2. var a,b,nr:integer;
  3. begin
  4. Writeln('Selectia operatia din sirul de ma jos: ');readln();
  5. writeln('1.Aduna doua numere naturale; ');readln(nr);
  6. Writeln('2.Inmulteste doua numere naturale: ');readln(nr);
  7. case nr of 1:writeln('Ati Ales suma');
  8. begin
  9. writeln('Dati a: ');readln(a);
  10. writeln('Dati b: ');readln(b);
  11. witeln('Suma este: ',a+b);readln();
  12. end.
  13. else
  14. writeln('Ati ales produsul');
  15. begin
  16. writeln('Dati a: ');readln(a);
  17. writeln('Dati b: ');readln(b);
  18. writeln('Produsul este: ',a*b);
  19. readln
  20. end;
  21. end.


Poate reusesc sa-l fac si eu saptamana asta.:))
0,0p / 0 votes
"Hacking is an ART and we are the ARTist"
User avatar
getlow12
Bit
 
Joined: 04 May 2011
Status: 0

Re: Program pascal"mini calculator"

Postby DarkByte » 06 May 2011, 10:18

Pentru inceput, invata-te sa indentezi si sa spatiezi un program - te va ajuta la debugging. Si pe noi, la fel ...

Codul tau de mai sus (al doilea) ar trebui sa arate cam asa:
  1. Program MiniCalculator;
  2. var
  3.   a, b, nr: integer;
  4. begin
  5.   Writeln('Selectia operatia din sirul de ma jos: '); readln();
  6.   writeln('1.Aduna doua numere naturale; '); readln(nr);
  7.   Writeln('2.Inmulteste doua numere naturale: '); readln(nr);
  8.   case nr of 1:
  9.     writeln('Ati Ales suma');
  10.     begin
  11.       writeln('Dati a: '); readln(a);
  12.       writeln('Dati b: '); readln(b);
  13.       witeln('Suma este: ',a + b); readln();
  14.     end.
  15.     else
  16.       writeln('Ati ales produsul');
  17.       begin
  18.         writeln('Dati a: '); readln(a);
  19.         writeln('Dati b: '); readln(b);
  20.         writeln('Produsul este: ', a * b);
  21.         readln
  22.       end;
  23. end.


Acum se vede destul de clar unde ai greseli, nu ?

In primul rand, daca ai mai multe instructiuni pentru o ramura din case, foloseste begin - end si pune toate instructiunile inauntru. Deci ... writeln ala urmat de begin (apare in doua locuri - linia 9 si 16) NU e bun.

Alta problema ca ai un Witeln pe linia 13 ... probabil un WriteLn scris gresit.

Alta problema e ca niciun end nu se termina cu punct, in afara de ultimul - dar tu ai unul pe linia 14.

Ultima problema (din cate am vazut eu), e faptul ca nu ai inchis structura case - nu are "end" ... ar trebui sa fie undeva intre linia 22 si 23.

Rezolva greselile astea si incearca sa nu le mai faci altadata :)

Succes !

Offtopic
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Program pascal "mini calculator"

Postby getlow12 » 06 Jul 2011, 22:56

Deci dupa o lunga perioada de inactivitate am revenit cu aceasta idee de aceasta data cu mai multe rezultate.Inca nu e terminat caci voi mai adauga cateva dar sunt fericit ca am reusit si asa.
L.E:in pascal e spatiat si se observa mai lejer.Ms DarkByte pentru sfat.

  1. Program Caluculator;
  2. Uses Crt;
  3. Label Return;
  4. var SEL,a,b:integer;
  5.     YN:char;
  6.  
  7. begin
  8. return:Clrscr;
  9. Writeln('Alegeti operatia corepunzatoare din lista de mai jos: ');
  10. Writeln('[1].Adunarea a doua numere');
  11. Writeln('[2].Scaderea a doua numere');
  12. Writeln('OBS:Nu apasati alte taste in afara de cele numerice');
  13. writeln('sau o eroare va aparea!!!');
  14. readln(SEL);
  15. case SEL of
  16.     1 : begin
  17.          writeln('Ati ales adunarea!');
  18.          writeln('Dati primul nr: ');readln(a);
  19.          writeln('Dati cel de-al doilea nr: ');readln(b);
  20.          writeln('Suma celor doua numere este: ',a+b);
  21.          readln();
  22.          Delay(2000);
  23.          writeln('Vreti sa incercati alta operatie?');
  24.          YN := Readkey;
  25.          Case YN of
  26.              'y' : Begin
  27.                    writeln('Veti reveni la meniul initial');
  28.                    Delay(1000);
  29.                    Goto return;
  30.                    end;
  31.              'n' : Begin
  32.                    Writeln('Nuuuuuuu.....');
  33.                    Delay(1000);
  34.                    Halt;
  35.                    end;
  36.              end;
  37.         end;
  38.     2 : begin
  39.           writeln('Ati ales scaderea!');
  40.           Writeln('Dati primul nr: ');readln(a);
  41.           writeln('Dati cel de-al doilea nr: ');readln(b);
  42.           Writeln('Diferenta celor doua numere este: ',a-b);
  43.           readln();
  44.           Delay(2000);
  45.           writeln('Vreti sa incercati alta operatie?');
  46.           YN := Readkey;
  47.           Case YN of
  48.              'y' : Begin
  49.                    writeln('Veti reveni la meniul initial');
  50.                    Delay(1000);
  51.                    Goto return;
  52.                    end;
  53.              'n' : Begin
  54.                    Writeln('Nuuuuuuu.....');
  55.                    Delay(1000);
  56.                    Halt;
  57.                    end;
  58.              end;
  59.        end;
  60.    end;
  61. end.
0,0p / 0 votes
"Hacking is an ART and we are the ARTist"
User avatar
getlow12
Bit
 
Joined: 04 May 2011
Status: 0

Re: Program pascal "mini calculator"

Postby DarkByte » 06 Jul 2011, 23:04

Foloseste tagul code cand postezi programe (citeste pe aici pentru mai multe informatii) - ti-am editat eu acum.

Legat de program : GOTO este nitel cam ... "ilegal". Citeste primul paragraf din tutorialul despre instructiuni conditionate si bucle. Foloseste un while sau un repeat in locul saltului neconditionat.
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Program pascal "mini calculator"

Postby eni4ever » 06 Jul 2011, 23:14

^ Apropo de "GO TO": ca și o lectură ușoară înainte de lăpticul ce precede somnicul, recomand un articol considerat de mulți ca fiind unul dintre cele mai de impact publicații din CS în urma căreia s-a abandonat trend-ul cu GO TO încă de la sfârșitul anilor '60 (cred) și anume "A Case against the GO TO Statement." a colosului Dijkstra.

Spor
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Program pascal "mini calculator"

Postby DarkByte » 07 Jul 2011, 00:02

^ Nu te-ai uitat in tutorialul de la mine, asa-i ? :P
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Program pascal "mini calculator"

Postby morpheus » 07 Jul 2011, 00:30

Conform anumitor teorii, da.
Dar ... inca apare destul de frecvent, inclusiv in codul unor proiecte de mare vizibilitate.
De exemplu, in kernelul de linux (de pilda http://lxr.linux.no/#linux+v2.6.39/fs/hfsplus/dir.c#L105), unde se foloseste frecvent ca si mecanism de cleanup ... iar felul in care e folosit uneori chiar poate creste usurinta de a citi si intelege respectivul cod.
  1.  
  2. int error = my_function();
  3. if (error)
  4.     goto cleanup;
  5. ....
  6. cleanup:
  7.     perform_cleanup();
  8.     return error;
  9.  
0,0p / 0 votes
User avatar
morpheus
Word
 
Joined: 30 Dec 2009
Location: Bucharest, Romania
Status: 54.84

Re: Program pascal "mini calculator"

Postby DarkByte » 07 Jul 2011, 08:17

Da, morpheus, in anumite cazuri GO TO este chiar folositor (exceptia care confirma regula ?). However, in codul lui getlow12 de mai sus nu e cazul.
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Program pascal "mini calculator"

Postby getlow12 » 07 Jul 2011, 09:14

Am recitit, dar vai de capul meu. Oricum trebuia sa mentionez ca nu stapanesc TOT ceea ce e in program, cel putin inca. Apoi daca as folosi while cum ar trebui sa arate pentru a se reintoarce la meniul initial ? Va multumesc ca ajutati pe unul ca mine :)
0,0p / 0 votes
"Hacking is an ART and we are the ARTist"
User avatar
getlow12
Bit
 
Joined: 04 May 2011
Status: 0

Re: Program pascal "mini calculator"

Postby DarkByte » 07 Jul 2011, 09:27

Folosind repeat (bucla infinita si pastrand codul in ideea programului tau), codul ar trebui sa arate cam asa:

  1. Program Calculator;
  2. Uses Crt;
  3.  
  4. var SEL, a, b: integer;
  5.     YN:char;
  6.  
  7. begin
  8.   repeat {replace 1}
  9.     Clrscr;
  10.     Writeln('Alegeti operatia corepunzatoare din lista de mai jos: ');
  11.     Writeln('[1]. Adunarea a doua numere');
  12.     Writeln('[2]. Scaderea a doua numere');
  13.  
  14. { - nu prea cred ca mai e nevoie de astea doua linii :)
  15.   - daca se introduce altceva (in afara de 1 sau 2), va reveni la meniu
  16.     Writeln('OBS:Nu apasati alte taste in afara de cele numerice');
  17.     writeln('sau o eroare va aparea!!!');}
  18.  
  19.     readln(SEL);
  20.     case SEL of
  21.       1:
  22.         begin
  23.           writeln('Ati ales adunarea!');
  24.           writeln('Dati primul nr: ');readln(a);
  25.           writeln('Dati cel de-al doilea nr: ');readln(b);
  26.           writeln('Suma celor doua numere este: ',a+b);
  27.         end;
  28.       2:
  29.         begin
  30.           writeln('Ati ales scaderea!');
  31.           Writeln('Dati primul nr: ');readln(a);
  32.           writeln('Dati cel de-al doilea nr: ');readln(b);
  33.           Writeln('Diferenta celor doua numere este: ',a-b);
  34.         end;
  35.     end;
  36.  
  37.     Delay(2000);
  38.     Writeln(#13#10 + 'Vreti sa incercati alta operatie (Y / N) ?');
  39.     YN := Readkey;
  40.     case YN of
  41.       'y', 'Y':
  42.         begin
  43.           writeln('Veti reveni la meniul initial');
  44.           Delay(1000);
  45.         end;
  46.       'n', 'N':
  47.         begin
  48.           Writeln('Nuuuuuuu.....');
  49.           Delay(1000);
  50.           Break;
  51.         end;
  52.     end;
  53.  
  54.   until False; {replace 2}
  55. end.


Pentru a folosi while, inlocuiesti linia (replace1) cu
  1.  while True do
  2.     begin


si linia (replace2) cu

Dupa cum vezi, codul a devenit (relativ) mult mai scurt decat al tau (tine cont si de comentariile din cod) ... si este mai clar. Also, nici nu trebuie sa "vanezi" locurile din care se face saltul neconditionat (GOTO).

Am o curiozitate: de ce ai folosit ReadLn intr-un loc si ReadKey intr-altul ? Eu as fi mers cu ReadKey all the way.

P.S. nu am avut unde compila codul, deci e posibil sa-ti dea cine stie ce erori de compilare. Sper, totusi, sa nu fie cazul.
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Program pascal "mini calculator"

Postby andreiandreiq » 07 Jul 2011, 10:01

@DarkByte: Stai liniștit, am compilat eu codul și merge. I-ar mai trebui o opțiune de ieșire, gen: 3.Ieșire, și ceva mesaj în cazul în care ai tastat alt număr (bineînțeles aceste sarcini ii revin lui getlow12).
0,0p / 0 votes
Image
User avatar
andreiandreiq
Word
 
Joined: 30 Dec 2009
Status: 33.33

Re: Program pascal "mini calculator"

Postby DarkByte » 07 Jul 2011, 10:02

^ Good to know, thanks.

Optiunea de iesire ar fi buna, dar nu strict necesara - are una dupa ce a executat o operatie. Mesaj in cazul in care ai tastat ceva ce nu trebuie ar fi, in schimb, interesant :D

Bring it on, getlow12 :D
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Next

Return to Pascal / Delphi

Who is online

Users browsing this forum: No registered users and 0 guests