Media aritmetica a elementelor dintr-o stiva


(Mădă Linna) #1

Sa se calculeze media aritmetica a elementelor dintr-o stiva.
Ma poate ajuta cineva? rog frumos


(Marian Popescu) #2

php, java? Scoala DevForum îți rezolvă problemele.


(Mădă Linna) #3

Trebuie sa-l scriu in code blocks.


(Marian Popescu) #4

adică limbajul de programare e C sau C++? Oricum, postarea ta va fi ștearsă de un admin.


(Serghei Amelian) #5

Dacă chiar vrea să înţeleagă cum se face, n-ar trebui să fie şters. @Mada_Linna, ce ai incercat şi ce nu merge?


(Mădă Linna) #6

Da. De ce o sa fie stearsa?


(Mădă Linna) #7

Ideea e ca nu prea reusesc nimic la asta, ma bate rau programarea. As vrea sa inteleg cu explicatii cum se face, daca ma poate ajuta cineva de aici… sau nu asa se fac lucrurile pe site-ul asta? Abia mi-am facut cont si nu stiu.


(Ionuț Staicu) #8

Pentru că nu suntem grup de studiu și nu rezolvăm teme.

Te putem ajuta, îți putem explica, dar vrem să vedem ceva implicare și din partea ta. Ergo pune codul tău și spune unde te-ai încurcat.


(Serghei Amelian) #9

Dacă ceri să ţi se facă tema, well… asta nu se va întâmpla. Dacă ne povesteşti ce ai incercat şi ce n-ai reuşit, poate se va găsi cineva să te îndrume. Măcar ştii ce-i aia o stivă?


(cosmos) #10
  1. aduni elementele din stiva
  2. imparti suma la cate sunt
  3. afisezi rezultatul

Daca trebuie in C este mai complicat, in java, c# este mai usor

Succes !


(Mădă Linna) #11

Am creat stiva

a=1;
varf=new nod;
cin>>varf->info;
while(a!=0)
{
p=new nod;
cin>>p->info;
p->leg=varf;
varf=p;
cout<<"Continuati?";
cin>>a;
}
afisarea
while(varf!=NULL)
{
q=varf;
cout<<q->info<<endl;
varf=q->leg;
delete q;
}

media nu imi iese
{
    nod *a;
    a = primul ;
    if(a==NULL)
        cout<<"stiva e goala. "<<endl;
    else
    {
        int i=0,s=0;
        while(a->leg!=primul)
        {
            cout<<a->info<<" ";
            i++;
            s=s+(a->info);
            a=a->leg;
        }
        cout<<ultimul->info<<" ";
        s=s+(ultimul->info);
        i++;
        cout<<endl<<"nr de elem este : "<<i<<endl;
        cout<<"s="<<s<<endl;
        cout<<"media aritmetica este :"<<(float)s/i;
    }
}


(Serghei Amelian) #12

Pune codul complet, să nu stăm să descifrăm ce-i pe acolo. Am senzaţia că nu prea e în regulă acel “delete q”, că îţi şterge nodurile în timpul afişării, iar când ajunge la calculul mediei foloseşte adrese de memorie invalide, de aia probabil apar rezultate bizare, probabil aleatoare.


(cosmos) #13

Decat sa te complici cu ceea ce ai facut acolo, mai bine stergi tot si cauta pe net cum implementezi o stiva. Stiva are operatiile de push - adauga, pop - scoate si cred ca peek - vezi varful. Mai sunt utile si isEmpty() si isFull() ca sa vezi daca este goala sau plina

In cazul tau au nevoie sa scoti element cu element din lista cu pop si sa le aduni, iar apoi le imparti la cate sunt.

Operatia pop ia cate un element, deci va fi nevoie sa iterezi cu un for. Poti afla cate elemente ai folosind sizeof(stack). Atentie, va trebui sa scazi 1 pt a afla ce ai introdus tu.

Pt implementarea stivei poti folosi ceea ce este aici


Poti folosi oricare implementare, cu array sau lista inlantuita

//stiva implementata care are elemente

int sum = 0;
float average = 0.0;

for (int i = 1; i < nr_elem_stiva; i++)
{
    sum += pop(stiva);
}
average = sum / (nr_elem_stiva);
printf("media este : %f", average);

Daca nu iti iese ceva poti sa vezi aici codul.


Observatiile asupra codului sunt binevenite.


(Serghei Amelian) #14

Senzatia mea este că problema a fost abordată greşit. Dacă stau bine să mă gândesc, stiva nu e gândită pentru a fi utilizată de două ori. Dacă ai folosit-o pentru afişare, nu mai poţi s-o foloseşti pentru calculul mediei, pentru că stiva este golită în timp ce o citeşti pentru afişare.

M-am uitat cum este implementată în PHP şi, într-adevăr:

Stack::pop — Removes and returns the value at the top of the stack

Soluţia corectă ar fi să faci afişarea şi însumarea valorilor simultan, să nu ai două loop-uri.