21 / 153
Dec 2015

Dziękuję za rady, udało mi się zaliczyć. smile
Postaram się poprawić kod, na tyle, byś mógł spać spokojnie. wink

fabs rzeczywiście się przydaje. blush

8 days later

Najpierw popraw swój kod, żeby był bardziej czytelny. Zastosuj wcięcia i popraw obie pętle for, bo nie wiem czy ci ucięło coś w tym kodzie, czy nie wiesz jak działa ta pętla. Od wklejania kodu formatowanego z wcięciami służy znacznik BBone.

PS. Ewentualnie możesz wkleić swój kod na ideone i podać linka na forum.

po pierwsze, do porównywania liczba z przecinkiem służy fabs, abs jest tylko do całkowitych. Poza tym zeruj jciekawe przy każdym obrocie pętli for (int i...), a najlepiej przenieś deklarację tej zmiennej do niej, poza nią potrzebujesz przecież tylko t. Po tym powinno ci zaliczyć to zadanie, nie zapomnij usunąć kodu jak to zrobi.

Dzięki wszystkim, pomogło. Nie sądziłem, że będzię taki odzew (jestem nowy). Kod usunąłem. Jeszcze raz wszystkim bardzo serdecznie dziękuje wink

Witam, mam takze problem z tym zadaniem, gdyz testy podane na SPOJu przechodza ale dostaje WA. Ma ktos moze wiecej testow?

9 days later
#include <iostream>

using namespace std;

int main()
{
int t;
cin>>t;

for(int i=0;i<t;i++)
{
    int ile;
    int suma=0, srednia=0;
    cin>>ile;

    int *tab;
    tab = new int [ile];

    for(int i=0;i<ile;i++)
    {
        cin>>tab[i];
        suma += tab[i];
    }

    srednia = suma/ile;

    int naj;
    naj=srednia;

    for(int i=0;i<ile;i++)
    {

        if (tab[i]>naj)
        {
            naj-tab[i]<naj;
            tab[i]=naj;
        }
        else if (tab[i]<naj)
        {
            (naj-tab[i])*(-1)<naj;
            tab[i]-naj;
        }

    }

    cout<<naj<<endl;

    delete [] tab;
}

return 0;

}

Witam! Mógłby mi ktoś pomóc w znalezieniu błędu w tym kodzie?

Błąd pierwszy:

int srednia;

a przez to błąd jest tutaj:

srednia = suma/ile;

Zauważ, że średnia rzadko kiedy jest liczbą całkowitą smile Ale to nie są jedyne błędy.

Nie wiem jak inni (bo ja może jestem w błędzie), ale całkowicie nie rozumiem tego zapisu w "ifach"...

   if (tab[i]>naj)
        {
            naj-tab[i]<naj;
            tab[i]=naj;
        }
        else if (tab[i]<naj)
        {
           (naj-tab[i])*(-1)<naj;
            tab[i]-naj;
        }
}

To chyba jest bez sensu. Mówię o tych porównaniach smile

To w ifach to jest tak że jak liczba jest mniejsza od naj które początkowo jest średnią to się ją tylko odejmuje i najmniejsza z nich będzie najbliższa średniej a jak liczba jest większa od naj to też się ją od naj odejmuje tylko że wtedy wyjdzie minus i dzięki *(-1) zamieni się na plus i najmniejsza będzie najbliższa średniej, Trochę pogmatwane ale na kartce działa

Ok, pomińmy Twój tok myślenia, ale zapis taki jak masz :

naj-tab[i]<naj;

lub

(naj-tab[i])*(-1)<naj;

, które znajdują się w środku ifów - nie w nawiasie, tylko w środku - w C++ nie oznacza nic chyba... może poza wyrażeniem logicznym. Albo wstaw to dodatkowo w "if" lub przyrównaj to do czegoś... Może się mylę, może ktoś mnie wyprowadzi z błędu, ale tak sądzę smile Zauważ, że jak wyrzucisz linię33 i 38 to nic się w wyniku nie zmieni.

a co do samego zadania, to tok myślenia masz chyba prawidłowy, ale zapis do du*** smiley

Inne zadania idą łatwiej ale na tym się jakoś zawiesiłem i nie mogłem wymyślić niczego innego ;/ Spróbuję trochę to pozmieniać. Jak proponował byś zmienić zapis tego co w if'ie? bo nie mam pomysłu na nic innego ;/

Jak już wspomniano wcześniej w tym temacie jest funkcja fabs(), która zwraca wartość bezwzględną. czyli fabs (naj-tab[i]) da taki sam wynik jak fabs(tab[i] - naj), albo prościej fabs (2 - 5) da ci w wyniku 3, ponieważ minus "obetnie". Dzięki temu te ify staną się zbędne.

2 months later

Pytanie do testu:
3
4 1 2 3 4
4 4 3 2 1
4 0 3 2 4

pierwsza i druga średnia to 2,5. a 2,5 jest tak samo blisko 2 jak i 3 więc dlaczego wynik nie będzie w obu zadaniach 2? no chyba że zrobić to na int i wtedy wynik takiej średniej to będzie 2. Czy dobrze myślę?

Pytanie drugie. Jak traktować 0 w trzecim teście? bo jak pominę do liczenia średniej to 9/3=3 i wynik to 2, ale takiego rozwiązanie mi nie przyjmuje i nie wiem dlaczego.

Proponuję:
1. Przeczytać dokładnie treść zadania - całą treść, nawet kilka razy.
2. Dodać w programie linijkę [lub kilka] drukujące obliczane wartości, np:
cout << srednia << endl; przy wysyłaniu trzeba je oczywiście usunąc
3. Dla testu wypisać cout << 10 / 4
a potem np cout << (double) 10/4

PS
Wyobraź sobie, że masz kumpla, z którym codziennie dzielisz się jabłkami. Wcoraj przyniosłeś 2 a kolega 3 jabłka. Po podziale, każdy miał 2.5 Ale dzisiaj kolega zapomniał, a Ty masz 3. Więc, czy: (3+0)/2 =? czy (3)/1 =?

PS 2
Skąd w ogóle taki pomysł, aby pomijać cokolwiek, przy liczeniu średniej [np gorsze oceny, przy liczeniu średniej oceny]. Pewnie, dlatego, że na siłę chcesz dopasować wyniki do błędnych obliczeń, a to wynika, z niezrozumienia zadania - wystarczy dokładniej je przeczytać.

Już chyba rozumiem. Czyli to nie chodzi o wskazanie numeru elementu tablicy, tylko wartość tego elementu. Dodatkowo liczymy wersję (3+0)/2. Zasugerowałem się wcześniejszym zadaniem i zacząłem zbytnio kombinować że w różnych dziedzinach matematyki zero raz jest uznawane jako dodatnie, a raz nie.

Tak nawiasem mówiąc, to zrobiłem już jakieś 30 zadań z tej listy i wg mnie zbyt mało jest podawanych przykładów do samodzielnego sprawdzenia poprawności kodu.

Nie wiem czy dobrze zrozumiałem twoją sugestię, Przykłady w zadaniu nie służą do sprawdzania poprawności kodu. Są po to, aby lepiej zrozumieć zadanie i aby można było je "obejrzeć" ręcznie na kartce papieru. Takie dane, są siłą rzeczy bardzo podstawowe i oczywiście poprawny kod powinien je też poprawnie rozwiązać ale do samodzielnego sprawdzania poprawności, trzeba samodzielnie stworzyć, wygenerować, wymyśleć więcej a także większe testy. Na tym polega umiejętność programowania, nie tylko kodowanie ale i samodzielne testowanie i sprawdzanie poprawności kodu.

Dodałem przez przypadek 2 posty i nie widzę opcji kosza:/.

Hej, czy ktoś może mi podpowiedzieć DLACZEGO:
Example
Input:
3
4 + 1 + 2 + 3 + 4 = 14 -> średnia = 14 / 5 = 2,8 najbliżej średniej jest 3
4 + 4 + 3 + 2 + 1 = 14 -> średnia = 14 / 5 = 2,8 najbliżej średniej jest 3
4 + 0 + 3 + 2 + 4 = 13 -> średnia = 13 / 5 = 2,6 najbliżej średniej jest 3

Output:
2 Dlaczego 2 skoro najbliżej średniej jest 3???
3
2 Dlaczego 2 skoro najbliżej średniej jest 3???

DLACZEGO?
Nie mam zielonego pojęcia. Może nie rozumiesz treści zadania?
"... liczba 0 < n < 100 i n liczb ..."
n = 4 i n liczb: 1, 2, 3, 4 średnia = (1 + 2 + 3 + 4) / 4

No ale w takim przypadku w input powinna być chyba deklaracja wielkości tablicy:
t = 3 liczba pętli
n = 4 liczba komorek w tablicy
średnia = (1 + 2 + 3 + 4) / 4

W przykładzie wpisujesz od razu 5 liczb, nie ma w input liczby która deklaruje wielkość tablicy. W dodatku dwa wyniki w output są nieprawidłowe. Przykład powinien odnosić się do zadania tworząc kompatybilną całość a nie mieszać głowie:P. Narbej nie da się pogodzić treści i przykładu- dlatego tak tu skaucze:D. W każdym bądź razie spróbuję napisać program do treści zadania pomijając exampla.