19 / 80
Feb 2017

Odnośnie tego samego zadania. Mam taki oto kod,

#include <iostream>
using namespace std;
int main()
{
    int ilosc_prob;
    cin>>ilosc_prob;
    for(int i=1; i<=ilosc_prob; i++)
    {
        int ilosc_liczb;

        cin>>ilosc_liczb;

        int *tablica;
        tablica = new int [ilosc_liczb];

            for (int j=1; j<=ilosc_liczb; j++)
            {
                cin>>tablica[j];
            }
                for (int k=ilosc_liczb; k>=1; k--)
            {
                cout<<tablica[k]<<" ";
            }
        cout<<endl;
        //delete [] tablica;
    }
 
}

sprawdza się on przy rozwiązywaniu danych testowych, natomiast sędzia zgłasza błąd SIGABRT. Czy ktos moglby wytlumaczyc mi dlaczego tak sie dzieje ?

Powodem są te dwie linijki:

tablica = new int [ilosc_liczb];

            for (int j=1; j<=ilosc_liczb; j++)

U Ciebie [w twoim systemie] program nie jest dokładnie sprawdzany, czy np nie są przekraczane indksy tablic [w c/c++ liczone od zera]. Na spoju jednak jest to dokonywane i dlatego tam błąd SIGABRT

7 months later

Cześć, nie bardzo rozumiem co powoduje błędną odpowiedź bo kiedy ja przeprowadzam test wszystko zdaje się być w porządku, gdyby jakiś światły umysł chciał mi podpowiedzieć byłbym bardzo wdzięczny.
[cpp]
#include

using namespace std;
int t,n=0;

int main()
{
cin>>t;
for(int i=0;i<=t;i++)
{
cin>>n;
int tab[n];
for(int j=0;j<n;j++){
cin>>tab[j];
}
for(int h=n-1;h>=0;h--)
{
cout<<tab[h]<<" ";
}
}

return 0;
}

[/cpp]

Po pierwsze pętle robisz od 0 do i<=t czyli zawsze o jeden test więcej niż wpisujesz
Po drugie po pętli która odwraca ci wyrazy musisz dać cout<<endl; żeby podać następną długość ciągu liczb w nowej linii. Po zmianie tych rzeczy dostałem akcept

Zadziałało dzięki wielkie, tak myślałem ze jest jakiś problem z rozdzielaniem wyjść. Bardzo mi pomogłeś:>

2 months later

Witam serdecznie

Czy może mi ktoś powiedzieć dlaczego dostaje komunikat błędna odpowiedź?:

int t, i=1, tablica[101];

cin>>t;

    do
        {
        cin>>tablica[0];

            for (int j=1; j<=tablica[0]; j++)

                cin>>tablica[j];

            for (int j=tablica[0]; j>=1; j--)

                cout<<tablica[j]<<" ";

        cout<<endl;
        i=i+1;
        }
   while (i==t);

Będę bardzo wdzięczny za podpowiedź :slight_smile:

In

3
7 1 2 3 4 5 6 7
3 3 2 11
3 1 2 3

Poprawny out:

7 6 5 4 3 2 1
11 2 3
3 2 1

Zaprawdę powiadam Ci, wypisanie poprawnej odpowiedzi dla testów przykładowych pozwala jedynie stwierdzić, że być może zrozumiałeś treść zadania :wink: . Resztę testów musisz sam wymyślać.

Przy okazji: co to za voodo?

for (int j=1; j<=tablica[0]; j++)
cin>>tablica[j];
for (int j=tablica[0]; j>=1; j--)
cout<<tablica[j]<<" ";

Nie lepiej normalnie?

int ile;
cin >> ile;
for (int j=0; j<ile; j++)
cin>>tablica[j];
for (int j=ile-1; j>=0; j--)
cout<<tablica[j]<<" ";

Trochę zaciemnia to Twoje intencje.

Dziękuję za odpowiedź :slight_smile: znalazłem błąd.

Co do voodoo - uczę się sam, mam swoje lata a zaczynam od zera (kiedyś na studiach pisałem w Pascalu) więc czasami mam problem z myśleniem "out of the box". Po prostu stwierdziłem że wszystkie zmienne liczby wczytam do tablicy :).

Nie wiem gdzie szukać takich rozjaśnień.

Jeszcze raz dzięki za pomoc :slight_smile:

4 months later

witam,
Czy doradzi ktoś początkującej jak zmienić kod dostający SIGSEGV (Segmentation fault) na SPOJ'u by został zaakceptowany? Błąd dot. ograniczonego dostępu do pamięci, ale nic mi to nie mówi :confused:
Oczywiście tak ja w temacie - chodzi o zadanie PP0502B - Tablice
Chyba że należy tutaj użyć wskaźników?
Mam kod zbliżony rozumowaniu do kodu użytkowników: lukaster i wuduchild. Wasze kody dostały AC?

aby nie mieć SIGSEV nie należy używać elementów tablicy z poza jej zakresu :slight_smile:

czyli np. dla:

int tabela[10];

wolno użyć tabela[0], tabela[1], ..., tabela[9] ale nie tabela[-1], czy tabela[10]

Człowieku, naucz się najpierw pisać i mówić, a dopiero potem zajmij się programowaniem. "Mam taki problem nie bardzo rozumie..." Sorry za upierdliowść ale niezmiernie mnie denerwuje powszechny analfabetyzm...

Chętnie zniosę dysleksję, dysgrafię, niegramatyczne i nieortograficzne pytania.

Tylko niech one mają sens, a nie, że sugerują, że zadający pytanie skończył czytanie podręcznika C/C++
na okładce, ale już wstęp był dla niego za trudny

3 months later

może po prostu przetestuj dla przykładowych danych z zadania twoje rozwiązanie na ideone.com17, a sam zobaczysz co jest nie tak

równie dobrze możesz przetestować na swoim komputerze przekierowując wejście i wyjście do pliku

2 months later
import re
def remove_duplicates(values):
    output = []
    seen = set()
    for value in values:
        if value not in seen:
            output.append(value)
            seen.add(value)
    return output

for i in range(0, int(input())):
    num = str(input())

    pattern = re.compile(r'[0-9-]{1,}')
    matches = pattern.finditer(num)

    tab = []
    for match in matches:
        tab.insert(0, match.group())
    tab = remove_duplicates(tab)
    print(*tab)

Powie mi ktoś, gdzie tu ten sędzia widzi “Błędną odpowiedź”?
Input/Output taki sam jak w przykładzie http://pl.spoj.com/problems/PP0502B/1.
Testowane tutaj: https://ideone.com/neYMOG4 oraz w IDE.
Ktoś ma jakieś sugestie? (Od razu mówię że wykluczona jest niespójność kodu między wersją środowiska, w której został napisany a tą, w której jest sprawdzany)

To ma bardzo małe znaczenie, żeby nie powiedzieć, że bez znaczenia. To tylko malutki przykład, jak powinien działać program.

BTW
Skąd wziąłeś pomysł na usuwanie duplikatów? Nic o tym w zadaniu nie napisano.
Dla takiego np testu:
5 1 2 2 2 3

Poprawny out to:
3 2 2 2 1

bez zbędnego dodatkowego kombinowania, usuwania [i udziwniania :wink: ]

Jaki ja jestem teeeeeeeepyyyyy.
Zapamiętam, czytać ze zrozumieniem.
Dzięki wielkie.

6 months later

Czy ktoś mógłby rzucić okiem na wytwór mojej wyobraźni i stwierdzić czemu działa poprawnie dopiero po przekroczeniu pierwszej połowy tablicy. Chciałem ogarnąć to na wskaźnikach.

#include
//dynamiczne alokowanie
using namespace std;
int n;
int main()
{ cout<<"podaj ilosc danych ";
cin>> n;

int *wskaznik;
wskaznik= new int [n];
int *wskaznik2;
wskaznik2= new int [n];

for (int i=0; i<n; i++)
{cin>>wskaznik[i];}

for (int i=0; i<n; i++)
{cout<<wskaznik[i]<<" ";}
cout<<endl;

for (int i=0; i<n; i++)
{wskaznik2[(n-1)-i]=wskaznik[i];
 cout<<wskaznik2[i]<<" ";   }

delete [] wskaznik, wskaznik2;

return 0;

}

dziękuję