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

Spoj- średnia arytmetyczna

Object Storage Arubacloud
0 głosów
485 wizyt
pytanie zadane 25 kwietnia 2019 w SPOJ przez Padomen Początkujący (260 p.)
zmienione kategorie 25 kwietnia 2019 przez Patrycjerz

Proszę o wyłumaczenie czemu w zadania srednia arytmetyczna wychodza takie wyniki skoro we wszystkich przypadkach liczba najblizej jest 3. Oto moj kod:

#include <iostream>

using namespace std;

int proby,piec=5,wynik[3];
float srednia[3],ro[5],najm[3],liczba[5];

int main()
{
    cin>>proby;
    for (int i=1;i<=proby;i++)
    {
        for (int y=1;y<=piec;y++)
        {
            cin>>liczba[y];
        }

    srednia[i]=(liczba[1]+liczba[2]+liczba[3]+liczba[4]+liczba[5])/5;


        ro[1]=srednia[i]-liczba[1];
        ro[2]=srednia[i]-liczba[2];
        ro[3]=srednia[i]-liczba[3];
        ro[4]=srednia[i]-liczba[4];
        ro[5]=srednia[i]-liczba[5];

        if (ro[1]<0){ro[1]=ro[1]*(-1);}
        if (ro[2]<0){ro[2]=ro[2]*(-1);}
        if (ro[3]<0){ro[3]=ro[3]*(-1);}
        if (ro[4]<0){ro[4]=ro[4]*(-1);}
        if (ro[5]<0){ro[5]=ro[5]*(-1);}

        if ((int)srednia[i]-liczba[1]==0){wynik[i]=liczba[1];continue;} else if ((ro[1]<ro[2]) && (ro[1]<ro[3]) && (ro[1]<ro[4]) && (ro[1]<ro[5])){wynik[i]=liczba[1];continue;}
        if ((int)srednia[i]-liczba[2]==0){wynik[i]=liczba[2];continue;} else if ((ro[2]<ro[1]) && (ro[2]<ro[3]) && (ro[2]<ro[4]) && (ro[2]<ro[5])){wynik[i]=liczba[2];continue;}
        if ((int)srednia[i]-liczba[3]==0){wynik[i]=liczba[3];continue;} else if ((ro[3]<ro[2]) && (ro[3]<ro[1]) && (ro[3]<ro[4]) && (ro[3]<ro[5])){wynik[i]=liczba[3];continue;}
        if ((int)srednia[i]-liczba[4]==0){wynik[i]=liczba[4];continue;} else if ((ro[4]<ro[2]) && (ro[4]<ro[3]) && (ro[4]<ro[1]) && (ro[4]<ro[5])){wynik[i]=liczba[4];continue;}
        if ((int)srednia[i]-liczba[5]==0){wynik[i]=liczba[5];continue;} else if ((ro[5]<ro[2]) && (ro[1]<ro[5]) && (ro[5]<ro[4]) && (ro[5]<ro[1])){wynik[i]=liczba[5];continue;}



    }
    for (int i=1;i<=proby;i++)
    {
        cout<<wynik[i]<<endl;
    }



    return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 25 kwietnia 2019 przez niezalogowany
edycja 25 kwietnia 2019
Zastanów się czy liczba[5] znajduje się w tablicy o rozmiarze 5. Zakładasz, że w każdej linii wejścia będzie pięć liczb - to błąd. Przeczytaj dokładniej treść zadania. Poza tym nie potrzebujesz wcale tablic srednia (wystarczy pojedyncza zmienna), ro, najm, wynik.
komentarz 25 kwietnia 2019 przez reaktywny Nałogowiec (40,990 p.)
Dokładnie,
0 głosów
odpowiedź 25 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)
Po pierwsze, podaj proszę treść zadania ze SPOJ'a.

Po drugie, powinieneś użyć pętli w zadaniu.
komentarz 25 kwietnia 2019 przez niezalogowany

@DeBos123 

Osobiście głównie pisze w C, stąd brak vector'a, ale w działaniu kodu różnicy nie ma.

W standardzie C++ nie ma VLA. Tylko niektóre kompilatory to wspierają zachowując kompatybilność z C. Stosowanie tego w C++ to zła praktyka. 

Mógłbyś to rozwinąć?

Przecież dla wejścia 4 1 2 3 4 średnia to 2.5, więc w twoim kodzie wynikiem będzie 2, co się zgadza, ale dla wejścia 4 4 3 2 1 dostaniesz taki sam wynik, a pierwszy elementem najbliższym średniej jest 3, a nie 2. Popraw mnie jeżeli się mylę.

Sprawdź takie dane:

IN:
1
3 1 0 2
OUT:
1

W moim kodzie bardziej chodziło o to, żeby działał i autor miał ogólny zamysł algorytmu, a nie żeby kod był idealny, bez ostrzeżeń itp.

IMHO fajnie by było gdyby kod nie zawierał prostych błędów takich jak niezainicjalizowane zmienne czy niedokładne warunki (i > 0).

komentarz 25 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)

@Padomen, 

o co chodzi z tym double

double to typ zmiennoprzecinkowy, czyli ułamki itp.

Trzeba użyć tutaj tego typu, ponieważ dla wejścia 4 1 2 3 4, średnia to będzie 2.5, czyli 2 i 3 są w jednakowej odległości od średniej, czyli wynik to 2. W przypadku gdy użyłbym int'a średnia zostałaby zaokrąglona do 3, czyli wynikiem byłoby 3.

co robi komenda abs?

abs to funkcja, która zwraca wartość bezwględną podanej liczby, czyli dla 10 zwróci 10, a dla -10 też zwróci 10.

Użyłem jej tutaj, ponieważ dla średniej 2.5 i liczby 2 różnica wyniesie 0.5, a dla 3 będzie to -0.5, czyli wyjdzie na to, że 3 jest bliżej do 2.5, co jest nieprawdą, ponieważ róznica jest mniejsza.

komentarz 25 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)

@Hipcio,

W standardzie C++ nie ma VLA. Tylko niektóre kompilatory to wspierają zachowując kompatybilność z C. Stosowanie tego w C++ to zła praktyka.

Tutaj się nie będę wykłucał, ponieważ nie piszę w C++, ale w moim kodzie chodziło bardziej o sam zamysł algorytmu.

Sprawdź takie dane:

Sprawdziłem.

1+0+2=3
3/3=1

1 jest najbliżej średniej, ponieważ róznica wynosi 0.

niezainicjalizowane zmienne

Na ten temat już się wypowiedziałem.

niedokładne warunki (i > 0).

Mógłbyś napisać co jest nie tak z tym warunkiem?

komentarz 25 kwietnia 2019 przez niezalogowany

@DeBos123

Mógłbyś napisać co jest nie tak z tym warunkiem?

Poprawna odpowiedź to 1. Twój program wypisze 0, ponieważ nie sprawdzi różnicy pierwszej liczby i średniej.

Wcześniej się pomyliłem z tym szukaniem od końca. Zwracam honor.

komentarz 25 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)
Rzeczywiście był błąd w końcowym kodzie, we fragmentach kodu, które są wyżej nie było takiego błędu. Edytowałem komentarz.
0 głosów
odpowiedź 25 kwietnia 2019 przez serdaw Użytkownik (740 p.)

Masz możliwość zrobić to tak :

Tworzysz zmienną oznaczającą ilość testów.

Otwierasz pętlę która ma się powtarzać ilość testów

Tworzysz zmienną oznaczającą ilość liczb w danym teście (w każdym teście pierwsza liczba oznacza ilość liczb w tablicy)

Tworzysz tablicę od ilości liczb oraz zmienną liczącą sumę

Pętlą pobierasz liczby do tablicy oraz do oraz sumujesz je do zmiennej

Po zsumowaniu obliczasz średnią z sumy i ilości liczb

Tworzysz zmienną np. szukana i podstawiasz pod nią pierwszy element tablicy

Tworzysz zmienną nie całkowitą ( float, double )  i podstawiasz pod nią wartość bezwzględną różnicy pierwszego elementu tablicy i średniej ( potrzebujesz biblioteki matematycznej )

   float roznica = abs(tablica[0]-srednia);

Powtarzasz pętlę tyle razy ile jest elementów tablicy-1 ( zerowy element już mamy zrobiony, więc zaczynasz od 1 elementu tablicy a nie 0 ). Sprawdzasz czy wartość zmiennej z powyższego akapitu jest > niż wartość bezwzględna tablicy[ i ]. Jeżeli tak pod zmienną np. szukana podstawiasz element tablicy[ i ]

Na koniec wyświetlasz szukaną

Podobne pytania

0 głosów
1 odpowiedź 1,027 wizyt
pytanie zadane 7 sierpnia 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)
0 głosów
0 odpowiedzi 251 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez Flaxi Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 239 wizyt

92,568 zapytań

141,424 odpowiedzi

319,633 komentarzy

61,956 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!

...