29 / 153
Jan 2016

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.

hm. nie da się "pominąć" przykładu...

chodzi o to, że pierwsza liczba, którą Tobie podają, to po prostu rozmiar tablicy. Jeśli nie wiesz jak zadeklarować rozmiar tablicy w trakcie działania programu, to poczytaj o tablicach dynamicznych lub o kontenerach tablic.

Polecam dodatkowo przeczytać raz jeszcze treść (w szczególności INPUT - który mówi o liczbie "n" od 0 do 100, a dopiero następnie o podaniu n konkretnych liczb :slight_smile: ), która z pewnością dobrze tłumaczy polecenie :slight_smile:
Pozdrawiam

Pierwsza liczba w input którą podają to liczba pętli =3.
Potem masz 5 liczb w tablicy
4 1 2 3 4 <- 5liczb
4 4 3 2 1 <- 5 liczb
4 0 3 2 4 <- 5 liczb
Nie ma pomiędzy liczbą pętli a wpisywaniem liczb do tablicy liczby jaką ilość zmiennych ma przechowywać tablica.

Czyli prawidłowy Input powinien wyglądać tak:
t = 3 liczba testów

5 wielkość tablicy nr 1
4 1 2 3 4 uzupełnienie tablicy nr 1

5 wielkość tablicy nr 2
4 4 3 2 1 uzupełnienie tablicy nr 2

5 wielkość tablicy nr 3
4 0 3 2 4 uzupełnienie tablicy nr 3

A output tak:
3 pierwsza liczba najbliższa średniej w tablicy nr 1
3 pierwsza liczba najbliższa średniej w tablicy nr 2
3 pierwsza liczba najbliższa średniej w tablicy nr 3

Pozdrawiam:)

edit

anim_90 zajarzyłem chyba o co Ci chodzi:P. To tłumaczyło by tego inputa bez deklaracji tablicy ale wciąż nie kminie skąd w output przy średnich kolejno 2.8, 2.8 i 2.6 liczby najbliżej średniej to w dwóch przypadkach 2 a nie 3 w każdym przypadku:O. Nie kminie też skąd program ma wiedzieć, że chodzi nam o tablice na 5 zmiennych jeśli tak naprawdę w treści zadania jest przedział n od 0 do 100. Skąd program będzie wiedzieć, że użytkownik chce mieć tablicę na 14 zmiennych jeśli tego nigdzie nie zadeklaruje?

1 liczba w każdej linii to ilość liczb w tablicy, jest ich tam po 4 a nie 5. W przykładach masz:
4 (ilość liczb a potem te 4 liczby czyli) 1 +2 + 3 + 4 średnia 10 / 4 = 2.5
4 liczby 4 + 3 + 2+ 1 średnia 10 / 4 = 2.5 ( te same co w pierwszym tylko odwrotna kolejność)
4 liczby 0 + 3 + 2 + 4 średnia 9 / 4 = 2.25

To że we wszystkich przykładach jest po 4 liczby to czysty przypadek.