20 / 153
Dec 2015

Po przeanalizowaniu, twojej analizy, wydaje mi się, że to jest jednak, u Ciebie, nadal nie zupełnie jasne wink

Poprawione twoje zdanie/myśl:
Gdy piszemy:
int w;
to deklarujemy zmienną typu int o nazwie w, która nie ma nic wspólnego ani z wskaźnikiem ani z tablicą. Jest po prostu [sobie] zwykłą zmienną, która "przechowuje" [zawiera, "pamięta"] dowolną wartość liczbową w zakresie int [-2^31, +2^31-1].


Poprawione twoje zdanie/myśl:
... gdy wskaznik ma przypisany [zawiera/"pamięta"] adres pierwszego elementu tablicy:
int *w, *tablica;
tablica = new int [cos]; //po co tak?*/ a jeżeli już tak, to linię wcześniej *tablica
w = tablica;
to wypisujac *w pobieramy wartosc pierwszego elementu tablicy, a inkrementujac wskaznik ++w, typu int, jego wartość [przechowywany/wskazywany adres] zwieksza sie [dla typu int o 4] czyli *w [pobiera] jest wartością następnego elementu tablicy.

W tym wypadku, tak naprawdę, wskaźnik nie różni się specjalnie od indeksu tablicy, więc jak masz kłopoty ze zrozumieniem działania wskaźników, to może na razie zapomnij o wskaźnikach a używaj po prostu zwykłej tablicy i jej indeksów.
Ewentualnie poczytaj w "dobrej" książce rozdział poświęcony wskaźnikom.

W takim razie, po co są w ogóle wskaźniki, jeżeli są tym samym co indeks tablicy?
1. Czasami wskaźnik/i upraszczają zapis kodu.
2. Gdy tablica jest dwu i więcej wymiarowa i gdy koder wie jak poszczególne elementy takiej tablicy "siedzą/leżą" w pamięci i gdy koder wie co robi ..... to czasami używa wskaźników.
3. Użycie wskaźników czasami skraca znacząco kod i ukrywa/szyfruje jego faktyczne działanie [gdy brak komentarzy] przed okiem laika. [to taki trochę żart] wink
4. Koder, który liznął assemblera lub który orientuje się jak "to" działa od środka [procesor, pamięć, język maszynowy/assembler] nie powinien mieć problemu ze zrozumieniem i stosowaniem wskaźników lub z rezygnacji z ich usługi.
5. Gdy koder/programista używa tablic i struktur dynamicznych [alokowanych dynamicznie], wtedy wskaźniki mogą być/[są] niezastąpione.

PS
Uważam jednak, że więcej zyskasz czytając porządny opis tego wszystkiego, niż to co ja napisałem. Jeżeli jednak spodobał Ci się mój opis, domagam się serduszek w dużej ilości wink Z góry dzięki


*/ Zmienna tablica jest już wskaźnikiem, więc nie jest potrzebny następny wskaźnik: w
W takim przykładzie możemy zadeklarować tablicę statycznie:
int *w, tablica[coś];

Dobra, już rozumiem. Zmyliła mnie nazwa zmiennej. Rozjaśniła mi wszystko Twoja wypowiedź z tą deklaracją zwykłej zmiennej. Haha wiem trochę o tych pamięciach procesora, sam programuje płytki MSP430 na laboratoriach z Architektury Komputerów więc ogólną koncepcję liznąłem. Wskaźniki są niezastąpione według mnie choćby w celu użycia ich w strukturach danych typu lista, drzewo binarne no i nieraz znacznie skracają czas działania algorytmu gdzie zamiast właśnie jadąc po indeksach komputer przeskakuje po andresach zmiennych elementów tablicy.

Pozdrawiam i życzę udanego weekendu =)

8 days later

Strzelałbym, że problem tkwi w tym punkcie smile

if((tab[y]==srednia-mini)||(tab[y]==srednia+mini))

przykład : średnia = 10;
mini = 5;

jeżeli t[0] == 10-5=5 lub t[0]= 10+5=15 to wszystko jedno i to samo, niech będzie moim wynikiem !

5 i 15 to nie to taka sama wartość przyjacielu wink

Do tego zaokrąglij sobie średnią gdy ją liczysz funkcją round.

Pozdrawiam wink

Przez tego if'a SPOJ nie chce zaliczyć mi zadania?

Wcześniej obliczona minimalna odległość wskazuje na liczbę najbliższą średniej, którą można przedstawić w postaci srednia-mini lub srednia+mini.
Ponieważ nie wiadomo czy najpierw wprowadzona została 5 czy 15, ten if ma kolejno sprawdzić wszystkie elementy tablicy i znależć pierwszą liczbę której odległość od średniej jest równa mini.
Albo 5 albo 15, nie ma różnicy, bo są tak samo oddalone od średniej grin

Co zmieni zaokrąglenie średniej? worried

Nie wiem, czemu SPOJ nie zalicza Ci tego kodu, ale mi też się twój kod nie podoba. wink

  1. Gdy używasz zmiennej typu double unikaj "dokładnego" jej porównywania --> "=="
  2. Taką funkcjonalność [3 x if] ma funkcja fabs(...) [nie mylić z abs]

Czy to powoduje WA? nie wiem i w tej chwili nie ma tego jak sprawdzić.

===============
JUŻ MOŻNA
===============
Faktycznie poniższa linijka jest błędem - błędy zaokrąglenia liczb zmiennoprzecinkowych:

Popraw to na:

if (odl[y] == mini)

Ale i tak twój kod dalej będzie mnie straszył i nawiedzał po nocach wink
Powyższa poprawka to tylko taka proteza - minimum na AC. Poprawić możnaby i należało dużo więcej.

Dziękuję za rady, udało mi się zaliczyć. smile
Postaram się poprawić kod, na tyle, byś mógł spać spokojnie. wink

fabs rzeczywiście się przydaje. blush

8 days later

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.

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.

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