Niepoprawne liczenie min() i max() w tablicy znaków

0

Mam program, który przy podaniu 0 kończy wpisywanie liczb do tablicy albo po jej zapełnieniu. Podaje max i min wartosci. Przy podaniu wiecej liczb to program działa, natomiast gdy podam z 3 liczby i podam 0, wykazuje dziwne wartosci w min i max i srednia wychodzi calkowita, mimo ze jest zainicjowana jako float

#include <iostream>

#include <iomanip>
using namespace std;
const int MAX_N = 10;
int main()
{
    int tab[MAX_N];
    int min, max;
    float srednia = 0.0;

    for (int i = 0; i < 10; i++) {
        cin >> tab[i];
        if (tab[i] == 0) {
            break;
        }
    }

    min = tab[0];
    for (int i = 0; i < 10; i++) {
        if (min > tab[i])
            min = tab[i];
    }
    max = tab[0];

    for (int i = 0; i < 10; i++) {
        if (max < tab[i])
            max = tab[i];
    }
    int licznik = 0;
    int suma = 0;
    for (int i = 0; i < 10; i++) {
        suma = suma + tab[i];
        licznik++;
        srednia = suma / licznik;
    }

    cout << min << endl;
    cout << max << endl;
    cout << srednia << endl;
}
2

Czemu, srednia jest liczona w pętli? suma i, licznik to inty.

1

@dayanuch: Masz statyczną tablice więc w pętli jak sprawdzisz warunek czy i nie jest większe od MAX_N to nie przepełnia z tablicy.

3

Musisz zapamiętać liczbę wczytanych do tablicy elementów i jej potem używać. Bez tego żadne rozwiązanie nie będzie miało sensu.

0
dayanuch napisał(a):

Przy podaniu wiecej liczb to program działa,

kq napisał(a):

Bez tego żadne rozwiązanie nie będzie miało sensu.

I kto ma rację?

@dayanuch:
Nic takj nie zdradza, że ktoś jest pocztkujacym, jak przekonanie że jego program działa (w podtekście: działa dobrze). Niektórzy z tego wyrastają, i z nich niektórzy zostają programistami.

2

A po kiego ci ta tablica?

#include <iostream>
using namespace std;

int main()
{
    int value,min,max,sum,count;

    for(sum=count=0;(cin>>value)&&(value);++count)
    {
      if(!count) min=max=value;
      else if(max<value) max=value;
      else if(min>value) min=value;
      sum+=value;
    }
    if(!count) cout<<"brak podanych danych"<<endl;
    else
    {
      cout<<"min: "<<min<<endl;
      cout<<"max: "<<max<<endl;
      cout<<"srednia: "<<sum/(double)count<<endl;
    }
    return 0;
}
1

Problem polega na tym, że gdy podczas wpisywania tych liczb użyjesz brake'a i nie zapiszesz wartości do wszystkich elementów w tablicy, to reszta tych nieprzypisanych komórek tak czy siak będą miały jakieś wartości. I w momencie jak szukasz min i max, to porównujesz te twoje wartości do tych "dziwnych" i dostajesz takie wyniki. Powinno pomóc zadeklarowanie tej tablicy jako pustej:

int tab[MAX_N] = {};

Tylko wciąż jest problem, teraz szukając min i max bierzesz pod uwage wartości 0, jakie zostały przypisanę podczas tej deklaracji. Czyli:

if (min > tab[i])

załóżmy 1 > 0 i przypisze 0.

Dlatego najlepiej jeszcze przed tym braki'em przypisać sobie do zmiennej liczbe tych przypisanych elementów. A potem podczas szukania min, max, liczenia sumy i średniej iterować do tej długości, aby pominąć te komórki z wartością 0.

typu:

if (tab[i] == 0) {
            dlugosc = i;
            break;
        }

a na dole pełny kod.

#include <iostream>

#include <iomanip>
using namespace std;
const int MAX_N = 10;
int main()
{
    int tab[MAX_N] = {};
    int min, max;
    float srednia = 0.0;
    
    int dlugosc = MAX_N;
    
    for (int i = 0; i < dlugosc; i++) {
        cin >> tab[i];
        if (tab[i] == 0) {
            dlugosc = i;
            break;
        }
    }

    min = tab[0];
    for (int i = 0; i < dlugosc; i++) {
        if (min > tab[i])
            min = tab[i];
    }
    max = tab[0];

    for (int i = 0; i < dlugosc; i++) {
        if (max < tab[i])
            max = tab[i];
    }
    int licznik = 0;
    int suma = 0;
    for (int i = 0; i < dlugosc; i++) {
        suma = suma + tab[i];
        licznik++;
        srednia = suma / licznik;
    }

    cout << min << endl;
    cout << max << endl;
    cout << srednia << endl;
}

Oprócz tego troszkę rzeczy dało by się uprościć/naprawić, o paru z nich pisali wyżej. Np. licznikiem teraz mogłaby być zmienna dlugosc + 1, sume możesz zliczać podczas podawania liczb, a średnią liczyć poza pętlą, suma powinna być typem zmiennoprzecinkowym.

2
#include <iostream>
using namespace std;

int main()
{
    const int MAX_N=10;
    int tab[MAX_N];
    int min,max,sum,count;

    for(count=0;(count<MAX_N)&&(cin>>tab[count])&&(tab[count]);++count) {}
    for(int i=sum=0;i<count;++i)
    {
        int value=tab[i];
        if(!i) min=max=value;
        else if(max<value) max=value;
        else if(min>value) min=value;
        sum+=value;
    }
    if(!count) cout<<"brak podanych danych"<<endl;
    else
    {
        cout<<"min: "<<min<<endl;
        cout<<"max: "<<max<<endl;
        cout<<"srednia: "<<sum/(double)count<<endl;
    }
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1