Tutoriale Pascal - discutii

Tutoriale Pascal - discutii

Postby DarkByte » 20 Apr 2011, 09:09

Daca ai vreo nelamurire legata de continutul tutorialelor din aceasta sectiune, intreaba aici si te vom ajuta.
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Tutoriale Pascal - discutii

Postby D4rk0 » 20 Jul 2011, 13:45

Salut.

Ideea este urmatoare, maine am examen de admitere din informatica. Subiectele teoretice imi fac ceva probleme.

Am 2-3 intrebari iar daca ai putea sa raspunzi as fi foarte foarte recunoscator.

1) Ce este "Durata de viata a unei variabile " ? un exemplu sugestiv ?
2)(subiectul suna asa) Formulati "problema de cautare". Descrieti in pseudocod 2 algoritmi de cautare si discutati nivelul de complexitate al acestora.
3)Am un pseudocod

algoritm ceface
Citeste N(N>0,natural)
s<-0
k<-2
cattimp k<n executa
daca n mod k = 0 atunci
s<-s+k
sfdaca
k<-k+1
sfcattimp
tipareste s
sfalgoritm

Desi algoritmul este simplu luand in considerare ca tot ce face este sa calculeze suma divizorilor unui numar mai putin 1 is el insusi ,una dintre cerinte este sa dau o varianta OPTIMA a acestui algoritm.

Din punctul meu de vedere algoritmul acesta este cat de optim se poate avand in vedere ca dintre while repeat si for , while este chiar cel mai optim.


Multumesc anticipat.Sper la un raspuns cat mai rapid. Maine la 8 sunt deja in examen.
0,0p / 0 votes
User avatar
D4rk0
Bit
 
Joined: 20 Jul 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 20 Jul 2011, 13:50

D4rk0 wrote:1) Ce este "Durata de viata a unei variabile " ? un exemplu sugestiv ?

O variabila locala (definita intr-un subprogram) este "vazuta" doar in acel subprogram (si in subprogramele lui - daca nu se refoloseste numele variabilei). De aici rezulta ca durata de viata a unei variabile locale este egala cu rularea subprogramului. Cand iesi dintr-o functie / procedura, variabilele locale "au murit".

Durata de viata a variabilelor globale este pe toata durata executiei programului.

D4rk0 wrote:2)(subiectul suna asa) Formulati "problema de cautare". Descrieti in pseudocod 2 algoritmi de cautare si discutati nivelul de complexitate al acestora.
Cam atat. Am cautat enorm dupa un raspuns si nu am gasit nimic , niciunde.

Daca ai un array de 2000 de numere intregi (unice in array - sau nu) si vrei sa afli pozitia numarului 17 (sau sa vezi daca exista), trebuie sa cauti in array. Poti cauta secvential (pornind de la primul element si terminand cu ultimul - sau in sens invers), poti cauta binar (imparti array-ul in doua, succesiv, pana gasesti elementul cautat - o sa fac un mini-tutorial pe tema asta, dar nu e mare branza) ... poti cauta random (nu e prea eficient :P), poti cauta in ce fel vrei tu :)

D4rk0 wrote:3)

Am un pseudocod

algoritm ceface
Citeste N(N>0,natural)
s<-0
k<-2
cattimp k<n executa
daca n mod k = 0 atunci
s<-s+k
sfdaca
k<-k+1
sfcattimp
tipareste s
sfalgoritm

Desi algoritmul este simplu luand in considerare ca tot ce face este sa calculeze suma divizorilor unui numar mai putin 1 is el insusi ,una dintre cerinte este sa dau o varianta OPTIMA a acestui algoritm.

Din punctul meu de vedere algoritmul acesta este cat de optim se poate avand in vedere ca dintre while repeat si for , while este chiar cel mai optim.

N-am nervi sa ma uit pe pseudocod (sunt la birou - poate se indura altcineva), dar sunt mai multe metode de a calcula suma divizorilor (uite aici o alternativa).

Totusi, altceva mi-a sarit in ochi: while e chiar cel mai optim dintre buclele din Pascal ? Nici nu stiu de unde sa incep, da' sa vedem ce pot face:
  • cel mai optim ? "Optim" nu are grad de comparatie.
  • while este mai bun decat repeat ? Nici vorba, sunt similare. Orice bucla while poate fi rescrisa cu repeat (si invers !) fara a afecta cu nimic complexitatea unui algoritm.
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Tutoriale Pascal - discutii

Postby D4rk0 » 20 Jul 2011, 13:56

N-am nervi sa ma uit pe pseudocod (sunt la birou - poate se indura altcineva), dar sunt mai multe metode de a calcula suma divizorilor (uite aici o alternativa).

Totusi, altceva mi-a sarit in ochi: while e chiar cel mai optim dintre buclele din Pascal ? Nici nu stiu de unde sa incep, da' sa vedem ce pot face:
cel mai optim ? "Optim" nu are grad de comparatie.
while este mai bun decat repeat ? Nici vorba, sunt similare. Orice bucla while poate fi rescrisa cu repeat (si invers !) fara a afecta cu nimic complexitatea unui algoritm.


Pseudocodul este simplu , nu asta e ideea,ideea e ca imi cere sa-l optimizez si pur si simplu nu inteleg cum poate fi mai optim decat este deja.

Am scris in pascal pseudocodul inlocuind while-ul acela cu repeat si for la randul sau , am rulat si ca rezultat am primit while ca fiind cel mai optim insa diferenta este foarte mica , de aceea am spus ca dintre cele 3 , while e cel mai eficient.

Daca ai un array de 2000 de numere intregi (unice in array - sau nu) si vrei sa afli pozitia numarului 17 (sau sa vezi daca exista), trebuie sa cauti in array.

In legatura cu problema de cautare...deci,practic , pot face ceva de genul

for i:=1 to n do
if a[i]=17 then writeln ('pozitia e ',i); ?

Am luat in considerare aceasta varianta dar mi se pare exagerat de simplu.Nu intelegeam enuntul,ce imi cere exact sa fac.
0,0p / 0 votes
User avatar
D4rk0
Bit
 
Joined: 20 Jul 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 20 Jul 2011, 14:08

D4rk0 wrote:Am scris in pascal pseudocodul inlocuind while-ul acela cu repeat si for la randul sau , am rulat si ca rezultat am primit while ca fiind cel mai optim insa diferenta este foarte mica , de aceea am spus ca dintre cele 3 , while e cel mai eficient.

Cate teste ai facut ? Cand vrei sa vezi diferente de durata la rularea unei bucati de cod, rulezi de minim cateva ori (sau, daca ruleaza foarte rapid, chiar de mii de ori) si cronometrezi (direct din program) cat dureaza. Faci testul expus inainte de mai multe ori si faci media rezultatelor.

Faci testul de mai sus cu while, apoi cu repeat - iar, la sfarsit, sa tii cont de faptul ca nu poti calcula chiar exact ce se intampla, datorita multi-tasking-ului. Windows (sau Linux - sau orice alt SO multi-tasking) aloca timp pentru programul tau cum si cand vrea el - in functie de cat load are (cate programe pornite, cat sunt de busy, etc etc). Explicatia asta a mea pentru multi-tasking e, intr-adevar, rudimentara, dar nu departe de adevar.

Legat de codul tau care cauta numarul 17, ai o (mica) problema. La un array mare (mii, zeci de mii de elemente - sau mai mare) sau la multe cautari in array, ce se intampla cand ai numarul cautat in primele pozitii ? Afiseaza pozitia SI cauta mai departe ! Daca nu ai nevoie de TOATE pozitiile, foloseste Break pentru a iesi din bucla (for, in cazul tau). Ai gasit o pozitie, ai iesit, gata. Asta face parte, sa zicem, din optimizare :)
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Tutoriale Pascal - discutii

Postby D4rk0 » 20 Jul 2011, 14:17

Da, voi folosi break in mod sigur. Voiam sa fiu sigur insa ca asta este ceea ce mi-ai sugerat tu. :)
0,0p / 0 votes
User avatar
D4rk0
Bit
 
Joined: 20 Jul 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby Mihai » 21 Jul 2011, 18:21

Legat de calcularea sumei divizorilor, poți observa că dacă numărul N este divizibil cu un număr K, atunci automat va fi divizibil și cu N/K. Astfel, poți reduce complexitatea algoritmului de la O(N) la O(sqrt(N)) - destul de bine, zic eu :). În pseudocod, ar veni cam așa:

  1. citește N
  2.  
  3. pentru k de la 2 la radical din N
  4.     dacă N este divizibil cu k
  5.         adaugă k și N/k la suma divizorilor (inițializată cu 0)
  6.     sfârșit dacă
  7. sfârșit pentru
  8.  
  9. dacă N este pătrat perfect
  10.     scade radical din N din sumă
  11. sfârșit dacă
0,0p / 0 votes
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25

Re: Tutoriale Pascal - discutii

Postby WhiteAngel » 27 Sep 2011, 21:33

Salutare!
Nu am gasit niciunde in acest forum scurtaturi de la tastatura, decat cateva dintre cele mai folosite. Stiti vreun loc unde pot gasi o lista mai mare? Ma intereseaza cele care permit o miscare mai libera in program, printre linii si instructiuni, spre exemplu CTRL + Y (sterge linia la care se afla cursorul).
Multumiri anticipate!

In rest, foarte bune tutorialele. Felicitari!
0,0p / 0 votes
User avatar
WhiteAngel
Bit
 
Joined: 27 Sep 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 27 Sep 2011, 22:27

Depinde foarte mult de IDE.

Borland Pascal, DevPascal, FreePascal, Lazarus, Delphi ? Ce anume te intereseaza ?
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Tutoriale Pascal - discutii

Postby WhiteAngel » 28 Sep 2011, 05:40

Am uitat sa precizez, folosesc Turbo Pascal v. 7.0 by Borland International, Inc. :)
0,0p / 0 votes
User avatar
WhiteAngel
Bit
 
Joined: 27 Sep 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 28 Sep 2011, 08:57

Am dat o tura pe net, dar nu am gasit scurtaturile lui Turbo Pascal. Am gasit, in schimb, o lista pentru FreePascal care ar trebui sa fie destul de similara (din ce-mi amintesc). O sa vad diseara, daca am timp, daca am ceva pe-acasa.

Vezi ca sunt si scurtaturi alternative pentru PageUp (Ctrl + R) sau alte butoane care, probabil, o sa te mire ca exista. Don't worry, alea erau folosite pentru tastaturile vechi - care nu aveau taste speciale. Desi IDE-ul a evoluat, a pastrat scurtaturile vechi pentru compatibilitate.

Legat de asta, un mic exemplu. Array-urile Pascal se pot declara:
  1. someArray : array [1 .. 10] of byte;
, dar se pot declara si in felul urmator:
  1. someArray : array (.1 .. 10 .) of byte;

Again, aceeasi problema cu tastaturile vechi si lucruri pastrate pentru compatibilitate :)
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Tutoriale Pascal - discutii

Postby WhiteAngel » 29 Sep 2011, 18:13

Am gasit lucrurile care ma interesau. :-bd
Mersi frumos!

Sunt multe lucruri ca si procedura break (de care am dat uitandu-ma prin acest forum) sau secventa "repeat until keypressed;" in loc de readln la sfarsit pentru a pastra user screen-ul, sau tot ce tine de design, estetica pe care nu le stiu inca in limbajul de programare pascal, insa dupa doar 1 an de studii cred ca e ok. M-ar interesa si lucrurile mai mult sau mai putin facultative care tin de pascal, dar astea mai pot inca astepta.

Voi reveni daca mai am alte intrebari, daca nu te superi. :)
0,0p / 0 votes
User avatar
WhiteAngel
Bit
 
Joined: 27 Sep 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 29 Sep 2011, 20:29

WhiteAngel wrote:Am gasit lucrurile care ma interesau. :-bd
Mersi frumos!
Great !

WhiteAngel wrote:Voi reveni daca mai am alte intrebari, daca nu te superi. :)
Dimpotriva ! Oricand ai intrebari :)

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

Re: Tutoriale Pascal - discutii

Postby transparentul » 23 Oct 2011, 19:21

Mi-au folosit foarte mult tutorialele de Pascal de aici! Multumesc mult!
0,0p / 0 votes
User avatar
transparentul
Bit
 
Joined: 22 Oct 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby Se7en » 28 Dec 2011, 12:27

Salut! Am si eu o dilema.Cum pot sa fac ca un vector x sa preia pe rand alti 2 vectorii astfel x[1]=a[1],x[2]=v[1] si tot asa.
O idee?? :-S
0,0p / 0 votes
User avatar
Se7en
Bit
 
Joined: 28 Dec 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 28 Dec 2011, 12:31

Nu sunt sigur ca am inteles.

Vrei sa intercalezi doi vectori (a si v) in vectorul x ? Fii putin mai explicit, te rog.
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Tutoriale Pascal - discutii

Postby Se7en » 28 Dec 2011, 12:59

Da scuza-mi limbajul de newbie.
Am reusit sa fac dar cand trece la x[2] va afisa a[2] nu a[1].
0,0p / 0 votes
User avatar
Se7en
Bit
 
Joined: 28 Dec 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 28 Dec 2011, 15:05

Deci vrei ca vectorul x sa fie de forma asta:

x = (a[1], v[1], a[2], v[2], a[3], v[3], ...)

Daca asta vrei (si admitand ca lungimile vectorilor a si v sunt diferite), vezi programul de mai jos:

  1. var
  2.   x, a, v: array [1 .. 100] of integer;
  3.   lenx, lena, lenv, min, i: integer;
  4. begin
  5.   lenx := 0;
  6.  
  7.   a[1] := 1;
  8.   a[2] := 2;
  9.   a[3] := 3;
  10.   a[4] := 4;
  11.   a[5] := 5;
  12.   lena := 5;
  13.  
  14.   v[1] := 10;
  15.   v[2] := 20;
  16.   lenv := 2;
  17.  
  18.   if (lena < lenv)
  19.     then min := lena
  20.     else min := lenv;
  21.   lenx := lena + lenv;
  22.  
  23.   for i := 1 to lenx do
  24.     begin
  25.       if (i <= min * 2)
  26.         then
  27.           if (i mod 2 = 1)
  28.             then x[i] := a[i div 2 + 1]
  29.             else x[i] := v[i div 2]
  30.         else // daca lungimile lui a si v sunt identice, acest ELSE nu este necesar
  31.           if (min = lena)
  32.             then x[i] := v[lenv - lenx + i]
  33.             else x[i] := a[lena - lenx + i];
  34.     end;
  35. end.


Probabil ca exista si o metoda mai usoara, dar nu mi-a venit niciuna pe moment :)

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

Re: Tutoriale Pascal - discutii

Postby Se7en » 28 Dec 2011, 18:31

Merci dar e cam complicat la nivelul meu de a 9 :P
Eu am facut asa ,dar numa nu imi merge
  1. var a,v,x:array[1..100] of integer;n,i:integer;
  2. Begin
  3.   write('n=');readln(n);
  4.   For i:=1 to n do
  5.     Begin
  6.       write('v[',i,']=');readln(v[i]);
  7.     End;
  8.   For i:=1 to n do
  9.     Begin
  10.       write('a[',i,']=');readln(a[i]);
  11.     End;
  12.   For i:=1 to 2*n do
  13.     If (i mod 2=1) then
  14.                     Begin
  15.                      x[i]:=v[i];
  16.                      write(x[i]);
  17.                      writeln;
  18.                     End
  19.                  else
  20.                     Begin
  21.                      x[i]:=a[i];
  22.                      write(x[i]);
  23.                      writeln;
  24.                     End;
  25.   readln;
  26. END.
  27.  

Tot imi trece cand ajunge la x[2] la a[2] in loc de a[1]
0,0p / 0 votes
User avatar
Se7en
Bit
 
Joined: 28 Dec 2011
Status: 0

Re: Tutoriale Pascal - discutii

Postby DarkByte » 28 Dec 2011, 18:38

E normal ... uita-te la codul meu sa vezi de la ce indici (din array-urile a si v) se iau valori pentru x[i].
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Next

Return to Tutoriale Pascal

Who is online

Users browsing this forum: No registered users and 0 guests