• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

minimum z przedziału

Object Storage Arubacloud
0 głosów
669 wizyt
pytanie zadane 6 grudnia 2016 w C i C++ przez mateusz0307 Nowicjusz (170 p.)

Witam, napisałem program, który losuje i wyświetla 100 liczb z przedziału 40-70, następnie podaje najmniejszą i największą wartość z wylosowanych liczb oraz oblicza średnią z parzystych wylosowanych liczb.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    int tab[100],min=tab[0],max=tab[0]; float suma=0,ilosc=0,srednia;
    srand(time(0));
    for(int i=0;i<100;i++)
    {
        tab[i]=rand()%31+40;
        cout<<tab[i]<<" ";
        if(tab[i]>max)
            {
                max=tab[i];
            }
        if(tab[i]<min)
            {
                min=tab[i];
            }
        suma+=tab[i];
        if(tab[i]%2)
            {
                ilosc++;
            }
        srednia=suma/ilosc;
    }
    cout<<endl<<"Minimum wynosi "<<min<<endl;
    cout<<"Maximum wynosi "<<max<<endl;
    cout<<"Srednia wynosi "<<srednia;
    return 0;
}

Niestety niepoprawnie wyświetla minimum. Będę wdzięczny za pomoc. Pozdrawiam.

4 odpowiedzi

+1 głos
odpowiedź 6 grudnia 2016 przez lnkoc Stary wyjadacz (13,960 p.)
edycja 6 grudnia 2016 przez lnkoc
 
Najlepsza

Błąd polega na tym, że po definicji tablicy w niej są jakieś śmieciowe wartości, które uznajesz za prawdziwe i przypisujesz je do zmiennych min i max, lepiej by było gdybyś najpierw (przed pętlą) wylosował jakieś wartości i je przypisał do zmiennych, następnie kontynuował pętlę już od i = 1:

tab[0] = rand() % 31 + 40;
min = tab [0];
max = tab[0];
if (tab[0] %2 ) {
    ilosc = 1;
    suma = tab[0];
}
else {
    ilosc = 0;
}
for(int i = 1l i < 100; i++) {
// twoja zawartość pętli poza linijką:
//srednia = suma / ilosc; // bo tę linijkę powinieneś liczyć tylko raz po zakończeniu pętli
// i jeszcze jedno: suma+=tab[i]; powinno być w warunku if, ponieważ liczysz średnią tylko parzystych elementów, zatem poprawnie w pętli powinieneś napisać: 
    if(tab[i]%2) {
        suma+=tab[i];
        ilosc++;
    }
}
srednia = suma / ilosc; // tak jest poprawnie, choć poprawniej byłoby:

if(ilosc) srednia = suma / ilosc; // ponieważ może się zdarzyć, że dostaniesz tylko liczby nieparzyste

 

komentarz 6 grudnia 2016 przez mateusz0307 Nowicjusz (170 p.)

Teraz już rozumiem. Dzięki.smiley

komentarz 6 grudnia 2016 przez lnkoc Stary wyjadacz (13,960 p.)
w międzyczasie wniosłem poprawki do kodu, więc je również ogarnij.
1
komentarz 6 grudnia 2016 przez lnkoc Stary wyjadacz (13,960 p.)
ostatnia poprawka, właśnie zauważyłem, że sumę z pierwszego elementu należy warunkowo dodać lub nie.
+1 głos
odpowiedź 6 grudnia 2016 przez criss Mędrzec (172,590 p.)
W 7. linii przypisujesz do min i max wartość pierwszej komórki tablicy. Wiadomo co miałeś na myśli, ale obecnie nie bardzo ma to sens, bo w chwili przypisywania, wylosowanej (oczekiwanej przez ciebie) wartości w tej komórce jeszcze nie ma. I najprawdopobniej z tego wynika błąd bo reszta kodu odnośnie min/max wygląda ok.

Kolejny problem jest w liczeniu, jak to określiłeś, średniej elementów parzystych. Program nie liczy średniej, tylko dzieli sume wszystkich elementów przez liczbe elementów parzystych. Ciężko powiedzieć co to jest, ale na pewno nie średnia.
komentarz 6 grudnia 2016 przez mateusz0307 Nowicjusz (170 p.)
Rzeczywiście, nie zauważyłem tego błędu ze średnią. Dzięki za pomoc.
0 głosów
odpowiedź 6 grudnia 2016 przez niezalogowany

Program wydaje się dobrze działać:

> a.exe
69 45 54 56 64 58 46 57 62 56 62 70 56 40 43 63 56 56 47 60 56 59 69 65 63 40 48 52 49 68 52 56 58 54 63 55 53 55 49 50 70 61 48 69 68 59 53 42 46 69 60 58 65 41 49 45 50 68 45 64 54 65 49 66 42 41 48 54 63 58 66 51 46 63 48 49 54 50 56 52 42 43 42 68 63 45 59 64 41 43 54 45 63 50 56 43 43 64 59 69
Minimum wynosi 40
Maximum wynosi 1877994752
Srednia wynosi 122.111

> a.exe
61 60 66 41 53 67 57 55 62 47 61 68 41 44 49 69 51 55 58 53 56 46 59 66 40 65 52 49 47 56 47 57 50 60 61 63 58 63 61 45 52 66 41 69 52 61 52 65 55 42 52 57 69 40 46 41 58 61 47 57 47 51 58 48 54 47 43 61 50 44 49 50 50 55 49 64 69 70 41 53 48 51 58 51 43 65 46 56 43 48 70 45 65 56 69 65 69 66 65 47
Minimum wynosi 40
Maximum wynosi 1877994752
Srednia wynosi 92.8983

> a.exe
48 51 57 47 47 66 56 42 70 53 43 46 42 45 43 42 52 59 53 70 40 63 59 68 63 61 61 45 51 70 48 63 69 41 55 68 48 54 48 69 44 66 68 53 50 59 66 57 68 63 48 40 56 70 69 55 45 43 51 65 70 69 41 46 51 67 60 43 65 52 46 45 68 51 59 49 58 61 52 66 57 41 43 56 50 53 56 54 65 64 45 63 43 67 44 70 69 68 57 64
Minimum wynosi 40
Maximum wynosi 1877994752
Srednia wynosi 102.963

Nie rozumiem jedynie po co tworzysz tablicę 100-elementową (nie potrzebujesz jej) oraz sumę oraz ilość trzymasz w float, skoro te wartości to zawsze int

@edit, błąd leży w tutaj: min=tab[0]

W momencie stworzenia tab[0] tam są śmieci, więc przypisanie śmieci do min to jest jak proszenie się o problemy, najbardziej poprawne będzie albo zmodyfikowanie algorytmu albo przypisanie do MAX_INT

komentarz 6 grudnia 2016 przez criss Mędrzec (172,590 p.)
Te floaty pewnie do poprawnego obliczenia średniej (która już całkowita być nie musi). Można to załatwić rzutowaniem, ale widocznie autor o tym nie wiedział :P
1
komentarz 6 grudnia 2016 przez niezalogowany
Rzutowanie załatwiłby za niego kompilator, no ale ok jak woli
komentarz 6 grudnia 2016 przez criss Mędrzec (172,590 p.)
Nope, dopiero wynik dzielenia zostanie zrzutowany i nadal będziemy mieli liczbe całkowitą tyle, że typu float. Chyba, że mówisz o czymś innym o czym nie wiem.
komentarz 6 grudnia 2016 przez niezalogowany
Dobra, masz rację. Coś języki mi się pomyliły :P
komentarz 6 grudnia 2016 przez criss Mędrzec (172,590 p.)
Ha :D
0 głosów
odpowiedź 6 grudnia 2016 przez binkey Użytkownik (530 p.)

Sam algorytm znajdowania min max można prościej i lepiej w oddzielnej pętli: 

for (int i=1; i<100;i++)
    if (tab[i] >max)
        max = tab [i];
    else if (tab[i]<min)
        min = tab[i];

 

Podobne pytania

0 głosów
6 odpowiedzi 1,031 wizyt
pytanie zadane 8 lutego 2017 w C i C++ przez cubus Początkujący (430 p.)
0 głosów
1 odpowiedź 162 wizyt
pytanie zadane 2 marca 2019 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 541 wizyt
pytanie zadane 17 grudnia 2017 w C i C++ przez CatNet Nowicjusz (220 p.)

92,548 zapytań

141,390 odpowiedzi

319,509 komentarzy

61,932 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...