14 / 80
Apr 2016

To fakt, nikt oprócz @lukaster'a nic tam nie widzi. Ale pytający, o ile zrozumiałem [i wynika to ze zgłoszeń do zadania] zaliczył je [AC] a chodziło mu raczej o możliwości poprawienia kodu. Ale skoro nikt nie widzi kodu, to trudno coś doradzić, tak w ciemno.

Tak kod został zaliczony.
Wciskając ctrl+k wyskakuje mi insert hyperlink nie wiem dlaczego bo do tej pory było wszystko ok. Dlatego wrzucam to w takiej formie

Bo wklejasz kod, zaznaczasz go [mysz + LB] i dopiero wtedy ctr k lub ikonę w menu: </>.

/// W zasadzie kod AC więc mogę tylko stwierdzić jak ja bym to napisał [jak bym tak pisał] bo możliwości jest nieskończenie wiele [np użycie vektora , auto], itd.
Czyli większość to uwagi subiektywne dotyczące mojego stylu.

  1. Unikam zmiennych globalnych.
  2. Jak nie trzeba, to zmiennych nie zeruje, jak trzeba oczywiście tak.
  3. Nawias otwierający: '{' stawiam natychmiast za ( ) {
  4. Wstawiłbym dużo więcej spacji.
  5. Użyłbym nazw i, j, zamiast j, k lub może nawet dwa razy i ? [btw unikał nazwy l]
  6. Gdy nawiasy { } nie są konieczne, nie używam ich.
  7. Głębsze wcięcia [cin i cout.
  8. W C++ w main() przestałem używać return 0.

Czyli np tak:

int main() {
   int ile, n, tab[1];
   cin >> ile;
   while (ile--){
      cin >> n;

      for (int i = 0; i < n; --i)
         cin >> tab[i];

      for (int i = n - 1; i >= 0; ++i)
         cout << tab[i] << ' ';
      cout << endl;
   }
}

PS
Faktycznie, teraz aby ładnie wkleić kod, należy albo kliknąć jak wyżej </> lub gdy zatrzymasz kursor myszy na </> pojawi się podpowiedź, jakich użyć klawiszy, teraz: ctr+shift+c, kiedyś ctrl+k

PS 2
Tu nie zamieszcza się [nie wskazane] działających kodów, ale to jest łatwe zadanie, a w moim kodzie "zrobiłem" specjalnie kilka błedów :wink:.

PS 3
Btw Zmiennych globalnych nie ma potrzeby zerować.

Jako początkujący to mam kilka pytań:slight_smile:

  • Unikanie zmiennych globalnych chodzi o to aby zmienne o tych samych nazwach sie nie dublowały ?
  • zamiast return 0 jakie są inne możliwości ?

Dzięki wszystkie wskazówki będę się starał wykorzystać. Jeszcze pewnie nie raz poproszę o pomoc. Już teraz pragnę podziękować za podpowiedzi i wyrozumiałość

Bardziej chodzi o przysłanianie, jeżeli nazwa jest "zdublowana", oraz możliwość "nie kontrolowanego" pomyłkowego nadpisania jej wartości w innym miejscu programu [procedurze]. Możliwe, że nie wszystko tam: https://pl.wikipedia.org/wiki/Zmienna_globalna7 będzie tam dla Ciebie zrozumiałe, ale może choć częściowo Ci naświetli problem? Na pewno, jest też więcej źródeł na ten temat.
Przy tak małym programie - tylko jedna funkcja main() - może to nie problem, ale warto się przyzwyczajać i stosować dobre praktyki programowania.

W C++ kompilator sam, gdy brak return 0, to uzupełnia, więc nie ma potrzeby stosoowania ani zastępowania innymi możliwościami [np exit 0, brk itd].

1 month later

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