Versiunea pentru tiparit a acestui topic

Click aici pentru a vizualiza acest topic in formatul original

HanuAncutei.com - ARTA de a conversa _ Software, Hardware si Programare _ Ajutor In Pascal (problema De Liceu)

Trimis de: stained pe 21 Apr 2008, 07:34 PM

Buna seara.

"Se introduce un sir de n numere intregi, de la tastatura. Sa se afiseze:

a)maximul dintre numerele negative
b)minimul dintre numerele negative
c)maximul dintre numerele pozitive
d)minimul dintre numerele pozitive."

As aprecia daca vreunul mi-ar putea rezolva aceasta problema, dar cu explicatiile de rigoare. Multumesc anticipat. smile.gif

Trimis de: Blakut pe 21 Apr 2008, 09:26 PM

Cand ai un sir de numere, ca sa le ordonezi crescator:

compari numerele intre ele (vecinele din sir) doua cate doua si verifici daca n < n+1. Daca e treci mai departe, daca nu inversezi n cu n+1. Cand ajungi la sfarsitul sirului repeti operatiunea cu sirul modificat, pana cand nu mai gasesti nici o pereche care sa fie invers decat conditia.

Acuma ca stii sa ordonezi siruri de numere, in ordinea crescatoare compari toate numerele cu 0. Alea care sunt mai mici sunt negativele si alea care sunt mai mari sunt pozitivele. Alegi apoi ultimul numar negativ gasit, primul numar negativ gasit, primul numar pozitiv gasit si ultimul numar pozitiv gasit si ai cam toate valorile cautate.

Sintaxa si alcatuirea nu stau sa ti-o povestesc, dar presupun ca o poti face si singur.

Trimis de: stained pe 21 Apr 2008, 09:49 PM

QUOTE(Blakut @ 21 Apr 2008, 10:26 PM) *
Cand ai un sir de numere, ca sa le ordonezi crescator:

compari numerele intre ele (vecinele din sir) doua cate doua si verifici daca n < n+1. Daca e treci mai departe, daca nu inversezi n cu n+1. Cand ajungi la sfarsitul sirului repeti operatiunea cu sirul modificat, pana cand nu mai gasesti nici o pereche care sa fie invers decat conditia.

Acuma ca stii sa ordonezi siruri de numere, in ordinea crescatoare compari toate numerele cu 0. Alea care sunt mai mici sunt negativele si alea care sunt mai mari sunt pozitivele. Alegi apoi ultimul numar negativ gasit, primul numar negativ gasit, primul numar pozitiv gasit si ultimul numar pozitiv gasit si ai cam toate valorile cautate.

Sintaxa si alcatuirea nu stau sa ti-o povestesc, dar presupun ca o poti face si singur.



Ei bine, chiar de aceea am postat aici. Sorry, dar habar nu (mai) am de Pascal. Am lucrat foarte demult in el. Solutia la problema aceasta i-ar trebui verisorului meu pe maine dimineata. Macar raspunsurile... rolleyes.gif

Trimis de: Blakut pe 22 Apr 2008, 09:14 AM

Pascal nu stiu, adica stiu programare in general, am lucrat cu C si Fortran, ma descurc, dar nu stiu exact sintaxa la pascal.

ordonarea unui sir "a" se face asa, in c (nu folosesc comanda for ca intra mai rau in ceata)
while(b!=1)
do{

while (i<=n)
do {
b=0;
if (a[i]>a[i+1]) {k=a[i+1]; a[i+1]=a[i]; a[i]=k; b=1;}
i=i+1;
}
}


programul inverseaza elementele alaturate pana cand toate sunt in ordine crescaotare. Daca gaseste o pereche prost pusa, o inverseaza si variabila b devine 1, astfel incat la sfarsitul primei bucle while programul stie ca mai trebuie parcursa odata bucla interioara.

Trimis de: axel pe 22 Apr 2008, 09:40 AM

Setezi b gresit.
In plus, sortezi doar ca sa aflii minime si maxime? rolleyes.gif

Trimis de: Blakut pe 22 Apr 2008, 10:26 AM

De fapt ar trebui ca de fiecare data cand face o inversare sa sorteze iar de la inceput sirul. Mai sigur asa, si atunci elimin b complet. De obicei foloseam for pentru chestii de genul asta, spartul in do si while nu mi-a placut niciodata.

Pai sigur ca e mai usor sa sortez. Ca vrea minime si maxime dintre negative si pozitive, si asta mi se pare calea cea mai scurta. Plus ca poti sa mai adaugi si alte cerinte dupa, daca ai chef.

Trimis de: axel pe 22 Apr 2008, 11:04 AM

Cu sortare, daca faci bine, iese un algoritm O(n log n). Dar ai bagat bubble sort, si asa ca e O(n^2).
Cu o simpla parcurgere a sirului (cu niste if-uri), iese O(n).
Si e si mai simplu: nu trebuie sa stii algoritmi de sortare.
Oricum, si cu sir sortat, tot trebuie iterat (sau cautat binar). Ca ai conditiile acelea cu negativ/pozitiv.

Trimis de: stained pe 22 Apr 2008, 03:10 PM

QUOTE(axel @ 22 Apr 2008, 10:40 AM) *
In plus, sortezi doar ca sa aflii minime si maxime? rolleyes.gif


Da, cam asta as vrea.

Trimis de: Blakut pe 22 Apr 2008, 04:44 PM

Ok, uite cum vine:
input:
citesti numerel si le bagi in sir.

CODE
procesare:
i=0
while(i<=n)
{
<span class="postcolor">i=i+1;</span>
<span class="postcolor">if (a[i]>a[i+1])  {
     k=a[i+1];
     a[i+1]=a[i];
     a[i]=k;
     i=1} //sau 0, depinde de unde incep sirurile in pascal

}
</span><span class="postcolor">//Practic ori de cate ori gaseste o pereche  inversata o ia de la inceput. Cand nici o pereche nu mai e inversata se  iese din bucla.</span>
<span class="postcolor">afisare:
pentru cel ami mic numar negative:
//folosesc comanda cout, da nu stiu cum are pasca? write? whatever
if (a[1]<0) write a[1];
else write "nu exista numar"; // primul numar, si cel mai mic, va fi primul din sir dupa ordonare. Daca nu e negativ, normal ca nu il afisam
// cel mai mare numar negativ:
while(i<=n)
{if (a[i]<0) i=i+1;
  else {write a[i-1]; break;} //practic verifica daca numerele sunt mai mici ca 0 pe rand. Cand ajunge la un numar ami mare, afiseaza                                             //numarul precedent, care era evident mai mic ca zero, dar cel mai mare dintre negative, si iese din bucla..
}

</span><span class="postcolor">while(i<=n)
   {if (a[i]<0) i=i+1;
    else {write a[i]; break;} // la fel ca mai sus, doar ca intoarce prima valoare pozitiva gasita. Evident ca aia va fi cea mai mica val pozitiva
                                    
   }
   </span>
<span class="postcolor">write a[n]; //cel mai mare numar din sir
</span>

Trimis de: Blakut pe 22 Apr 2008, 04:46 PM

Ok, uite cum vine:

input:
citesti numerel si le bagi in sir.

procesare:
i=0
while(i<=n)
{
i=i+1;
if (a[i]>a[i+1]) {
k=a[i+1];
a[i+1]=a[i];
a[i]=k;
i=1} //sau 0, depinde de unde incep sirurile in pascal

}
//Practic ori de cate ori gaseste o pereche inversata o ia de la inceput. Cand nici o pereche nu mai e inversata se iese din bucla.
afisare:
pentru cel ami mic numar negative:
//folosesc comanda cout, da nu stiu cum are pasca? write? whatever
if (a[1]<0) write a[1];
else write "nu exista numar"; // primul numar, si cel mai mic, va fi primul din sir dupa ordonare. Daca nu e negativ, normal ca nu il afisam
// cel mai mare numar negativ:
while(i<=n)
{if (a[i]<0) i=i+1;
else {write a[i-1]; break;} //practic verifica daca numerele sunt mai mici ca 0 pe rand. Cand ajunge la un numar ami mare, afiseaza //numarul precedent, care era evident mai mic ca zero, dar cel mai mare dintre negative, si iese din bucla..
}

while(i<=n)
{if (a[i]<0) i=i+1;
else {write a[i]; break;} // la fel ca mai sus, doar ca intoarce prima valoare pozitiva gasita. Evident ca aia va fi cea mai mica val pozitiva

}

write a[n]; //cel mai mare numar din sir

Trimis de: stained pe 26 Apr 2008, 08:44 PM

Multumesc frumos. Se poate topic closed. Sarbatori Fericite! rolleyes.gif

Tehnic:Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)