wracając do zadania:
Example
Input:
3
4 1 2 3 4
4 4 3 2 1
4 0 3 2 4
Output:
2
3
2
Przecież trzecia tablica 4 0 3 2 4 suma to: 13, a średnia arytmetyczna to: 13/5= 2.6, ZATEM PIERWSZY ELEMENT TABLICY, który spełnia warunki zadania to 3 a nie 2.
A wy Panowie jak rozumiecie zadanie, bo nie wiem czemu jest tam 2?
Witam!
kod: https://pastebin.com/QpC6GpB51
Mam problem z tym, że dla ciągu liczb 4 1 2 3 4 i 4 4 3 2 1 coutput to 2. A według zadania dla 4 4 3 2 1 output to 3.
Jeżeli zmienne sa zapisane tylko jako int to średnia z 2.8 zmienia sie na 2, dlatego najbliżej jest 2.
Przy float ach średnia równa sie 2.8 dlatego bliżej jest 3.
Mam z tym straszny problem jak to zgrabne zapisać żeby nie było za długie, jakieś rady?
update
kod https: https://pastebin.com/JRVAn1Lg5
Udało mi się to poprawić, mimo to dalej mi odrzuca jakieś rady?
Przepraszam za syf w kodzie ale strasznie długo przy tym siedzę.
a z resztą testu z zadania też nie przechodzisz: https://ideone.com/OcD6fr9. W zasadzie to żadnego testu nie przechodzi. Ten program na pewno miał rozwiązywać to zadanie?
Dzięki za odpowiedź, doceniam twój czas.
Gdy u mnie wpisuje liczby z zadania wszystko działa (Ale skoro u w twoim teście nie działa to oczywiste jest że jest źle! ale nie wiem co jest nie tak.
najpierw wpisuje 3 (ilosc operacji) pętla for zależna od wpisanej wartości
następnie wpisuje 4 (ile liczb podam do obliczen) tablica o pojemności wpisanej liczby
następnie wpisuje 1 2 3 4 (liczby do operacji) zwykle zmienne
Wszystko działa nie ważne jak wpiszesz, czy po sobie czy w kolumnie itp
Nie mam pojęcia czemu w twoim teście dało takie wyniki
- Testuj w ideone, a nie u siebie
- Tak się dzieje bo masz inny kompilator / inne coś / a masz błąd w kodzie i następuje tzw. undefined behaviour (w zależności od kompilatora może stać się różna rzecz - problem może być różnie obsłużony).
- Łatwo zauważyć co (i jak bardzo) masz źle dla innych danych z tego wątku.
Gdzie jest Twoje undefined behaviour? W zasadzie wszędzie, polecam jakiś kurs, dobrą książkę najpierw przerobić zanim zaczniesz robić te zadania. Przykład:
int gruszka=0;
float tablica [gruszka];
Na prawdę chciałeś stworzyć zeroeleementową tablicę?
I co wtedy robi to:
for (int i=0; i<gruszka; i++)
{
cin>>liczba;
tablica [i]=liczba;
}
Wstawia dane w i
-te miejsce zeroelementowej tablicy? Cud, że działa w ogóle.
Edit: Powyższe jednak nie jest Twoim największym problemem, a jakość kodu. Kod jest tak brzydki, że nie możesz się w nim połapać i nikt kto nie jest zawodowym programistą się nie połapie. Zapamiętaj raz na zawsze: napisanie ładnego kodu jest ważniejsze od tego by on poprawnie działał. Jak działa niepoprawnie, a jest czysty to szybko błąd można naprawić, jak działa poprawnie, ale jest taki jak Twój to przy najdrobniejszej zmianie się rozjedzie.
Edit2: Tak dla podkreślenia powtórzę: najważniejsze żeby kod był ładny. Później ewentualnie może działać.
Nie. Błąd jest w tym, że definiujesz gruszka = 0 i w następnej linii tworzysz tablicę o rozmiarze gruszka. Nigdzie pomiędzy nie nadajesz jej wartości (dopiero po stworzeniu zeroelementowej tablicy).
Wkleiłem stricte dwie linie Twojego kodu. Dajesz gruszka=0
i od razu stwórz tablicę o rozmiarze gruszka
. Widzisz to?
Jeśli chcesz stworzyć tablicę a dopiero potem nadać jej rozmiar to są trzy wyjścia:
-
zastosować vector: https://en.cppreference.com/w/cpp/container/vector:2
vector tablica;
int rozmiar;
cin >> rozmiar;
tablica.resize(rozmiar); -
zastosować tablicę tworzoną dynamicznie (wskaźniki, operator new);
float *tablica;
int rozmiar;
cin >> rozmiar;
tablica = new float[rozmiar]; -
stworzyć na początku tablicę o rozmiarze którego na pewno nie przekroczysz, treść zadania podaje że masz do zsumowania maksymalnie 99 liczb więc 100 elementowa tablica wystarczy:
float tablica[100];
a potem indeksować od zera do wartości rozmiar.
PS. stosuj “normalne” nazewnictwo, jak ktoś zobaczy w kodzie banan = gruszka/jablko; - to może później nie wiedzieć co toto wogle robi.
Napisałem kod od nowa, poprawiając tablice według waszych rad.
Również kod przechodzi test https://ideone.com/xYG3hh10
Sędzia SPOJ mimo to go odrzuca, mógłby ktoś mnie naprowadzić na odpowiedź?
@mariusz193
WIELKIE DZIĘKI dostałem AC
@tarpauwatratar
ad 1. Dzięki na pewno się przyda.
ad 2. Faktycznie, ciezko o podejscie 1.3, będę pamiętał.
ad 3. Mój błąd powinienem chyba zrobić tak:
"zastosować tablicę tworzoną dynamicznie (wskaźniki, operator new);
float *tablica;
int rozmiar;
cin >> rozmiar;
tablica = new float[rozmiar];"
Jak radził czaffik
Witam, mój pierwszy kod więc mam nadzieje ,że nikogo nie przestraszę. Przy trzecim teście jako liczbę najbliżej średniej wskazuje mi 3 zamiast 2 ktoś jest w stanie wskazać mi błąd/błędy ?
#include
#include
#include <math.h>
using namespace std;
int liczby[5];
double srednia;
int wynik, ile;
int main()
{
cin >> ile;
for (int i=0; i<ile; i++)
{
cin>>liczby[i];
srednia+=liczby[i];
}
srednia=srednia/4;
//cout<<srednia<<endl;
wynik=0;
for (int i=0; i<ile; i++)
{
if (fabs(srednia-liczby[i-1]< srednia-wynik))
{
wynik=liczby[i-1];
i++;
}
}
cout<<wynik;
return 0;
}
Dzień dobry wieczór,
Wyjątkowo nie mam problemu z kodem a z zadaniem:
Średnia z 5ciu podanych liczb (4 1 2 3 4) to 2.8 więc najbliżej średniej jest liczba 3, a w zadaniu jest podane że powinna wyjść 2
Dlaczego tak a nie inaczej (widziałem że mowa o pierwszym elemencie z listy ale w takim razie gdzie jaka jest granica błędu?)
A, i jeszcze mój kod: https://ideone.com/yDU25t
Pozdrawiam!
Eeeech, wykładasz tak od razu kawa na ławę… Pamiętam moje problemy z tym zadaniem. Ni w ząb nie mogłem zrozumieć przykładów testowych. Przeczytałem wszystkie komentarze na forum dotyczące tego zadania, przeczytałem kilka razy treść zadania, ale w sumie co tu wiele czytać - średnia to średnia, zadanie proste tylko autorowi coś się pomyliło… Ale zacząłem jednak myśleć, przecież są ludzie, którzy rozwiązali to zadanie. Czy im też się pomyliło? Jeszcze raz przeczytałem wszystkie komentarze i wreszcie PRZECZYTAŁEM treść zadania. Gdy ją zrozumiałem to dalej już było banalne. Fakt, że zajęło mi to trochę czasu, bo kilka razy je sobie odpuszczałem i brałem się za inne. Nie wiem czy dobrze jest tłumaczyć wszystko tak literalnie w sytuacji, gdy zadanie jest NAPRAWDĘ DOBRZE opisane przez autora. W końcu w programowaniu chodzi nie tylko o umiejętność napisania kodu, ale i o zrozumienie problemu. W każdym razie tak mi się wydaje… Żeby było jasne, ja się Ciebie nie czepiam tylko tak sobie rozmyślam
Witam nie mam pojęcia dlaczego ten kod mi nie przechodzi może chciałby ktoś rzucić okiem ?
#include
using namespace std;
int main() {
int n;
cin >> n;
double srednia;
double suma = 0;
int index = 0;
for (int i = 0; i < n; ++i) {
int m;
cin >> m;
int t[m];
for (int j = 0; j < m; ++j) {
cin >> t[j];
suma += t[j];
}
srednia = suma / m;
double najblizszywartosc = abs(srednia - t[0]);
for (int j = 0; j < m; ++j) {
if (najblizszywartosc > abs(srednia - t[j])) {
najblizszywartosc = abs(srednia - t[j]);
index = j;
}
}
cout << t[index] << endl;
suma = 0;
}
return 0;
}