121 / 153
Nov 2018

a dlaczego miałby ci dać AC, skoro masz niezgodność wyniku dla przykładowych danych ?
najpierw doprowadź do zgodności, a dopiero potem proś o pomoc

masz prosty program oraz proste dane przykładowe, dla których otrzymujesz zły wynik - więc masz szansę samodzielnie znaleźć błąd :slight_smile:

ja zaś nie ma zwyczaju rozwiązywać cudzych problemów - co najwyżej je wskazuję :slight_smile:

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?

Poprawnie.

W kolejnych liniach, dla każdego testu, liczba 0 < n < 100 i n liczb całkowitych dodatnich nie większych niż 100.

Czyli
4 1 2 3 4
4 4 3 2 1
4 0 3 2 4

w każdym z powyższych wierszów czwórka to ilość liczb jaka nastąpi za chwilę.

Średnią liczymy z liczb: 0 3 2 4

19 days later
19 days later

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?

Nie przeczytałeś tego wątku, prawda?
Jest tutaj test którego nie przechodzisz i to widać z oddali.

@redysz

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 :frowning:

  1. Testuj w ideone, a nie u siebie
  2. 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).
  3. Ł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ć.

Dzięki za rady, już zabieram się za poprawę. Co do zero elementowej tablicy, na początku pętli nadajemy wartość dla int gruszka i wszystko działa. Mam rozumieć że błędem jest początkowe definiowanie gruszka = 0 i zmienianie tego 0 na inna liczbę?

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:

  1. zastosować vector: https://en.cppreference.com/w/cpp/container/vector:2
    vector tablica;
    int rozmiar;
    cin >> rozmiar;
    tablica.resize(rozmiar);

  2. zastosować tablicę tworzoną dynamicznie (wskaźniki, operator new);
    float *tablica;
    int rozmiar;
    cin >> rozmiar;
    tablica = new float[rozmiar];

  3. 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.

Wielkie dzięki! Zastosuje się do tych możliwości. I tak przestane robić taki bałagan w kodzie, to nie ma sęsu gdy do niego się wróci po x czasie.

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ź?

  1. nie używaj float tylko double (przynajmniej na SPOJu i w większości przypadków w życiu)
  2. podejscia nie są typu double. Robisz o zgrozo niejawną konwersję i jak zawsze w takich przypadkach prosisz się o guza przez błędy precyzji
  3. co z delete[]?

@mariusz193
WIELKIE DZIĘKI dostałem AC :smiley:

@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

6 months later

Może ktoś pomóc z testem dla którego program nie będzie działał będę wdzięczny.

ok zmieniłem nieco kod tak aby wszystko rozgrywało się w jednej pętli ale nadal jest coś nie tak. Z jakiego testu dostane jeszcze negatywny wynik ?

sprawdzałem ten test i program zwraca dla niego 1 co więc jest z nim nie tak?

To jest zły wynik :frowning: Przeczytaj UWAŻNIE treść zadania. Przecież już wcześniej podałem Ci, że Twój program podaje zły wynik dla tego testu.

w przykładach, które zamieściłeś jest jeden błędny wynik

Dzięki wielki rzeczywiście program źle działał dla wariantu
7 3 1 2 4 5 6 4
skończyło się na ponownym napisaniu z wykorzystaniem double zamiast int ale wszystko działa

2 months later

Masz dwa błędne zakresy dla pętli - powinny wyglądać tak:

for (int j = 0; j < n; j++) 
// ...
for (int j = 0; j < n - 1; j++)
19 days later

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;

}

Jeden widzę. Problem z czytaniem ze zrozumieniem.

Jestem instruktorem żeglarstwa [między innymi] i za stary jestem, aby się bać byle czego :wink:

10 months later

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!

Źle interpretujesz linijki. Pierwsza liczba w każdej linii podaje liczbę liczb :wink: z jakich liczysz średnią. Czyli powinno być 2.5 a nie 2.8

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… :slight_smile: Żeby było jasne, ja się Ciebie nie czepiam tylko tak sobie rozmyślam

Hehe w sumie się zgadzam w 100%. Czasem mnie najdzie napisać za dużo, nie wiem dlaczego.

Wiem, też mi się zdarzało :slight_smile: Z drugiej strony często taki absolutny początkujący, jak dojdzie do ściany to nie próbuje się wspiąć tylko się zniechęca i odpuszcza. Pytanie czy chodzi tu wyłącznie o pisanie kodów czy też o rozwiązywanie problemów.

2 months later

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;

}