• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd SIGABRT

VPS Starter Arubacloud
0 głosów
324 wizyt
pytanie zadane 21 lutego 2018 w C i C++ przez Admin Cpp Początkujący (350 p.)

Witam, czy mógłby mi ktoś wskazać błąd w programie, którego nie uznaje SPOJ w zadaniu kalkulator. Prosilbym o pomoc i przyczyne tego błędu. Pozdrawiam

#include <iostream>

using namespace std;

int main()
{

    int a,b,zestaw;
    char znak;
    for(int i=1; i<=100; i++)
    {
        cin>>zestaw;
        int *tablica;
        tablica= new int [zestaw];
        for (int u=0; u<zestaw; u++)
        {
            cin>>znak;
            cin>>a;
            cin>>b;
            switch(znak)
            {
            case '+':
            {
                tablica[u]=a+b;
            }
            break;
            case '-':
            {
                tablica[u]=a-b;
            }
            break;
            case '*':
            {
                tablica[u]=a*b;
            }
            break;
            case '/':
            {
                tablica[u]=a/b;
            }
            break;
            case '%':
            {
                tablica[u]=a%b;
            }
            break;
            default:
            {
                continue;
            }
            }

        }
        for (int i=0; i<zestaw; i++)
        {
            cout<<tablica[i]<<endl;
        }
        delete [] tablica;
    }

    return 0;
}

 

komentarz 21 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Kod wygląda w porządku, tylko trochę mnie dziwi że główna pętla działa dokładnie 100 razy. To było podane w zadaniu?
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
" Liczba testów nie przekracza 100 "

tak jest napisane w zadaniu
komentarz 21 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)
na pewno dobrze działa to default? W razie złego znaku ma od nowa wszystko zacząć i nie wypisywać nic?
komentarz 21 lutego 2018 przez excavelty Bywalec (2,480 p.)
Ale moze nie jest potrzebne ich az tyle? Wrzucilbys link do zadania? Na Spoju czesto liczba testow nie jest znana z gory i wtedy trzeba wczytac troche inaczej
komentarz 21 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)
to chyba powinieneś wczytać ile należy tego zrobić, daj linka
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
sprawdzałem i w przypadku innego znaku pętla idzie dalej
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)

2 odpowiedzi

+2 głosów
odpowiedź 21 lutego 2018 przez excavelty Bywalec (2,480 p.)

W zadaniu jest nieokreslona ilosc wiec jak dla mnie trzeba wczytac tak:

while(cin>>a>>b)

Mam nadzieje ze nie palnalem jakiejs gluopoty wyzej. Bylo juz kiedys wspominane na tym forum, ze Spoj rozroznia wejscie od wyjscia wiec nie trzeba chyba zapisywac tych wynikow w tabeli, tylko od razu wynik wyswietlac.

komentarz 21 lutego 2018 przez excavelty Bywalec (2,480 p.)
Po paru zmianach w końcu zaliczyło mi Twój kod.

Wydaje mi się, że default jest niepotrzebny, proszę nie zapomnieć o <<endl(lub "\n"), bo osobiscie na poczatku zapomnialem. Zgodnie z oczekiwaniami nie trzeba wyników zapisywać do tablicy.
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
Czy mogę zobaczyć jak bardzo poprawiłeś mój program?
komentarz 21 lutego 2018 przez excavelty Bywalec (2,480 p.)
Wszystko już zostało napisane w dyskusji: potrzebujemy znaku i 2 liczb całkowitych

-wczytujemy je w pętli while

-we wnętrzu pętli obliczamy wynik zależnie od wybranej operacji (co zresztą już zrobiłeś, chociaż ten default nie jest potrzebny, ale czy przeszkadza to w sumie nie wiem)

Wypisujemy wynik i dajemy endl

Program wymaga tylko jednej pętli, jeśli nadal po tym wszystkich dostaniesz jakiś błąd to przychodzi mi tylko do głowy coś typu wybranie złego języka programowania przed wysłaniem rozwiązania.
1
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
Bardzo dziękuje udało się !
komentarz 21 lutego 2018 przez excavelty Bywalec (2,480 p.)
Nie ma za co, jankustosz1 pierwszy zasugerował, że dane może trzeba inaczej wczytać:). Życzę owocnej nauki.
+1 głos
odpowiedź 21 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Nie wiadomo ile danych dostaniesz. Nie możesz z góry zakładać że będzie ich dokładnie 100(tyle razy wykonujesz pętle w swoim kodzie). musisz zrobić while(true) i sprawdzać czy są na wejściu jeszcze jakieś dane. Chyba getchar może dać takie info ale nie wiem dokładnie. Ewentualnie możesz wczytywać całą linie i wczytywać dane ze stringa.
1
komentarz 21 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Teraz się skapłem że jeszcze jeden błąd masz. Potrzebujesz tylko jedną pętle - while(true) która sobie breakujesz w odpowiednim momencie gdy już nie ma nic na wejściu. I nie potrzebujesz żadnej tablicy jakby co. Na bieżąco wypisujesz wynik.
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
Nie moge zgodzić się z twoją argumentacją, gdyż polecenie do zadnia określa, że :

" podana zostanie pewna nieokreślona liczba zestawów danych"

i te zestawy zostają zapisane w tablicy, po to żeby wyświetlic każdy zestaw osobno.

Poza tym na innym platformach ten program działa tak jak nalezy, tylko w spoju wyrzuca mi ten bład
komentarz 21 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)
nie musisz zapisywać w tablicy. Wystarczy że wypiszesz wynik w pętli w której wczytujesz
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
To w takim razie co powoduje ten błąd, przez który mój program nie jest poprawny?

Spoj pokazuje mi błędne wykonanie "Błąd SIGABRT"
1
komentarz 21 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Najlepiej napisz to od nowa bo masa błędów.

Po 1 skąd pomysł aby zrobić zmienną zestaw i zastanów się co właściwie do niej wczytujesz, bo na wejściu nie dostajesz liczby zestawów.

Po 2 o 1 pętle masz za dużo, która 100 razy wykonuje to co powinno się wykonać raz

Po kolejne to co już mówiłem
komentarz 21 lutego 2018 przez Admin Cpp Początkujący (350 p.)
ok dziękuje za pomoc

Podobne pytania

0 głosów
0 odpowiedzi 257 wizyt
pytanie zadane 16 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 177 wizyt
0 głosów
3 odpowiedzi 748 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez eighty Nowicjusz (190 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...