1 / 80
Feb 2016

Witam

Mam taki problem nie bardzo rozumie dlaczego na wejściu raz liczby rosną a drugi raz maleją. I dlaczego jak podana jest 3 to wypisuje 3 2 11 ?

Przykład

Wejście:
2
7 1 2 3 4 5 6 7
3 3 2 11

  • created

    Feb '16
  • last reply

    Aug '23
  • 79

    replies

  • 5.3k

    views

  • 27

    users

  • 17

    likes

  • 15

    links

Frequent Posters

There are 79 replies with an estimated read time of 8 minutes.

liczby mogą być dowolne, to że w przykładzie tworzą ciąg jest czystym przypadkiem.
1 liczba z każdego zestawu to jego długość, nie wypisujesz jej.

15 days later

Mam taki problem w zadaniu

cin>>ile_prob;
    {
    for(int i=0; i<ile_prob; i++)
    {
        cin>>ile_liczb;
        for(int i=0; i<ile_liczb; i++)
        {
            cin>>tab[i];
        }

        for(int i=ile_liczb-1; i>=0; i--)
        {
            cout<<tab[i];

        }

        cout<<endl;
        ile_liczb=0;
        tab[i]=0;

To znaczy jaki masz problem? Masz niezgodne z treścią zadania wejście więc wyszły bzdury. Inaczej być nie może.

cout << tab[i] << " ";

O to Ci chodzi? A jak nie to napisz jaki masz problem w zadaniu.

2 to liczba prób
3 to liczba cyfr do odwrócenia i kiedy zamiast 3 cyfr podaje 5 to w pierwszej probie odwraca tylko 3 i jest ok ale kiedy w drugiej probie podaje ze chce odwrócić 4 cyfry a podaje 5 do odwraca mi je w cały świat jakby zapamiętywał wartości wpisane z próby pierwszej

Nie mam całego kodu, ale z tej części co jest trzeba usunąć tab[i]=0; żeby zadziałało (w tym miejscu i ma wartość z ile_prob, przez co możesz "wyjść" poza tablicę). Jak u ciebie dalej nie pójdzie, to wklej cały kod, zaznacz go i wciśnij ctrl + k, albo linkuj do ideone.
Jak widać wyżej niebezpieczne jest też użycie i w obu if-ach, zamiast pierwszego lepiej dać while(ile_prob--)

Wklejam tu swój kod i proszę o wskazówki w jaki sposób można go uprościć. Jestem początkujący i bardzo cenna jest dla mnie każda rada ponieważ w przyszłości chce stawiać na jakość swoich kodów

enter link description here195

Obawiam się że tylko ty go widzisz, dla mnie to biała strona. Skorzystaj z rad z mojego postu nad twoim i powinno czy zaliczyć ten program.

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.