1 / 43
Aug 2019

Czy ktoś mógłby wskazać błąd w moim kodzie w zadaniu Obżarciuchy. Poniższy kod napisałem i sprawdziłem w programie Codeblocks. Mimo tego że po odpaleniu go w Codeblocks-ie wszystko działa poprawnie “sędzia” zwraca komunikat błąd wykonania (SIGSEGV). Kod:
#include

using namespace std;
int x;

int main()
{
cin>>x;
for (int i=0; i<x; i++)
{
int pud, l_ob, *czas, cias, sum_cias=0;
float l_pud;
int *w;
w=&czas[0];
cin>>l_ob>>pud;
czas=new int [l_ob];

    for(int m=0; m<l_ob; m++)
    {
        cin>>*w;
        w++;
    }
    for(int m=0; m<l_ob; m++)
    {
        w--;
    }
    for(int m=0; m<l_ob; m++)
    {
        cias=86400/ *w;
        w++;
        sum_cias+=cias;
    }
    l_pud=sum_cias/pud;
    if (sum_cias%pud!=0)
    {
        l_pud-(sum_cias%pud);
        l_pud++;
    }
    cout<<l_pud<<endl;


    delete[]czas;
}

return 0;

}

  • created

    Aug '19
  • last reply

    Mar '24
  • 42

    replies

  • 2.1k

    views

  • 15

    users

  • 30

    likes

  • 10

    links

Uwagi dla początkujących na forum

Próbujesz dereferencji przed dynamiczną alokacją - stąd naruszenie pamięci (segmentation fault). Tylko tyle wystarczy poprawić. Chociaż nie rozumiem czemu używasz wskaźnika w tak okrutny sposób. Po co jak można korzystać z normalnego dostępu do tablicy przez operator[]?

PS. Ta linia kodu nic nie robi:

l_pud-(sum_cias%pud);

Wyskakuje mi podobny błąd
W code blocksie wszystko działa poprawnie

#include

using namespace std;

int ile; //liczba testow
int zaproszeni; //liczba zaproszonych
int ciastka; //liczba ciastek w pudelku
int *czas=new int [zaproszeni];
int suma=0; //wszystkie ciastka
int paczki;

int main()
{
cin>>ile;
for(int j=1; j<=ile; j++)
{
cin>>zaproszeni>>ciastka;
for(int i=0; i<zaproszeni; i++)
{
cin>>czas[i];
suma+=(24*3600)/czas[i];
}
paczki=suma/ciastka;
if(suma%paczki!=0) paczki++;
cout<<paczki<<endl;
}
return 0;
}

Nie zwalniasz pamięci zaalokowanej do czas, to jest co tak na szybko zauważyłem

int ciastka; //liczba ciastek w pudelku
int *czas=new int [zaproszeni];

Tablica czas ma rozmiar 0. Musisz ją alokować i dealokować(delete) w pętli gdy wczytasz liczbę zaproszonych smakoszy.

Przeczytaj uwagi dla początkujących. Następnym razem wstaw poprawnie kod.

1 year later

Witajcie,
czy ktoś może mi wskazać gdzie tu występuje błąd w tym kodzie, w kompilatorze kod jest poprawny, a jednak sędzia wskazuje błąd …

#include
#include
using namespace std;

int testy, obzartuch, czas, pudelka;
long long int ciastka;
double wynik=0;
double ile_ciastek (double);

int main()
{
cin>>testy;
for (int i=0; i<testy; i++)
{
{
cin>>obzartuch;
cin>>ciastka;
}
for (int j=0; j<obzartuch; j++)
{
cin>>czas;
}
cout<<ile_ciastek<<endl;
}

return 0;

}
double ile_ciastek (double wynik=0)
{
for (int k=0; k<obzartuch; k++)
{
wynik+= floor(86400/czas);
}
wynik= ceil(wynik/ciastka);
return wynik;
}

  1. Jeśli zaczynasz, przeczytaj koniecznie! <--kliknij w to proszę!
  2. Z moich testow na tym kodzie wyniki nie sa poprawne.
  3. Powinno byc obliczenie ile ciastek zjadl kazdy obżrtuch zaraz po pobraniu czasu w jakim zjada ciastka. W kodzie wartosc jest nadpisywana.
    Funkcja ile_ciastek niby powinna robic wszystko, ale nie dostaje wszystkich informacji. Program jest dosc krotki, moze udaloby sie obliczyc bez funkcji.

co do pkt 3 to ja mam to wyliczone w tym miejscu, chyba, że czegoś tu nie rozumiem

for (int k=0; k<obzartuch; k++)
{
wynik+= floor(86400/czas);
}

tylko ze zmienna czas moze przechowac jedna liczbe, a kazdy obzartuch moze jesc w roznym tempie.

Poprawiłem kod, teraz już wszystko niby dobrze zlicza i wypisuje, ale jest jakiś problem z zaokrągleniami bo czasami przeskakuje wynik o 1 jednostkę - ma ktoś jakiś pomysł co może być błędnego w tym kodzie?

#include
#include
using namespace std;

int main()
{
int testy, obzartuch, czas, ciastka;
long double zjedli=0, paczki=0;

cin>>testy;
cin.ignore();
for (int i=0; i<testy; ++i)
{
 cin>>obzartuch;
 cin.ignore ();
 cin>>ciastka;
 cin.ignore ();
   {for (int j=0; j<obzartuch; ++j)
      {
       cin>>czas;
       cin.ignore ();
       zjedli+=floor(86400/czas);
      }
    paczki= ceil(zjedli/ciastka);
    cout<<paczki<<endl;
   }
}
return 0;

Cały czas dodajesz do zmiennej zjedli, powinna ona być zerowana przy każdej iteracji pętli.

W swoim króciutkim kodzie 4 razy wywołujesz funkcję cin.ignore(). Możesz mi zdradzić jaka jest idea tego działania?

A dlaczego powinna być zerowana? Wyliczam ile ciastek w ciągu doby zjada każdy obżartuch i to sumuje a następnie już za pętla ten zsumowany wynik przykładam do liczby ciastek w pudełku i powinna wyjść ilość paczek. I z grubsza wychodzi ale przy liczbach z zakończeniem kilka miejsc po przecinku coś nie zaokrągla jak powinien pomimo że dałem typ long double …

i naprawdę dobrze ci liczy dla kilku testów ?? To ciekawe…
Bo to co widzę wyżej to jest coś takiego :
zjedli=0;
pętla:
zjedli rośnie kila razy
koniec petli, zjedli = 10;
paczki…
znow piętla
zjedli=10 + costam…

Dałeś typ Long doble - bez sensu. Wiesz jak wygląda wynik/wydruk cout << long double ?
Chodzi o format. A tak w ogóle jak testujesz jak testujesz swoje programy?

Myślę, ze Twój problem polega na tym, że nie przemyślałeś dokładnie podanych wskazówek i źle testujesz swój kod. Przecież Twój program nie daje poprawnego wyniku dla danych testowych. Zobacz jaki ciekawy wynik uzyskasz, gdy w danych testowych zmienisz kolejność podawanych danych na:
2
3 356
123
32999
10101
2 10
3600
1800
Wynik jest ko(s)miczny… :slight_smile:
Przemyślałeś to co Ci napisała Yula?
Do każdego testu zmienna zjedli wchodzi z wartością z poprzedniego testu.
Tak więc Twój algorytm, może poprawnie liczyć tylko dla takiej sytuacji, gdy masz jeden przypadek testowy.

Dzięki wszystkim, faktycznie źle to obmyslilem z tymi pętlami. A co do innych kwestii to:

  1. testuję w Code blocks
  2. dałem long double bo myślałem że będzie dokładniej zaokraglal iloraz ale widzę że nie ma takiej potrzeby
  3. Cin ignore używam bo tak polecał w swoim kursie Drzewniak - czyli nie ma takiej potrzeby?

Drzewniak poleca ja nie. Poczytaj w dokumentacji-referencji co to jest i do czego i sam decyduj.
Czyli testujesz w konsoli, a to czesto za słabo

4 months later

Cześć.

Jestem “mocno początkujący”, proszę o pomoc.
W Code::Blocks oraz ideone.com6 kod działa natomiast sędzia w spoj wyrzuca błąd wykonania (SIGSEGV).

#include

using namespace std;

int ile;

int main()
{
cin>>ile;
for(int i=1; i<=ile; i++)
{
float n,m;
cin>>n>>m;
int suma=0;
float t[3];
for (int i=0; i<n; i++)
{
cin>>t[i];
}
for (int i=0; i<n; i++)
{
suma+=(86400/t[i]);
}

int ip2;
float ip,ip3;
ip=suma/m;
ip2=ip;
ip3=ip-ip2;

if (ip3!=0)
{
    ip2++;
}
cout<<ip2<<endl;
}
return 0;

}