30 / 153
Jan 2016

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.

Face palm:D

Wielkie dzięki wszystkim za cierpliwość, haha.

Edit

Namieszałem trochę za co jeszcze raz chcę przeprosić i jednocześnie podziękować użytkownikom sig, anim_90 i narbej, za to, że chciało im się pomagać mojej skromnej osobie:).