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.
Bbone tutaj niestety nie działa. Przy edycji, zaznaczamy myszą wklejony kod i albo klikamy </> albo wciskamy dwa klawisze ctr k
PS
@jasieka - właśnie to za Ciebie zrobiłem.
PS 2
Kilka postów wyżej - fabs
A co gdy tym szukanym jest pierwszy element tablicy? : http://discuss.spoj.com/t/1102-srednia-arytmetyczna-pp0604a/11685/22
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.
#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ą 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
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ę 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***
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.
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???
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.