#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.
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 ), która z pewnością dobrze tłumaczy polecenie
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.