43 / 43
Mar 2024

Cześć
Mam ten sam problem co u reszty, czyli w codeblocksie działa ale sędzia daje błędną odpowiedź. Jeśli ma ktoś wolną chwilę to proszę o pomoc

cout<<"wczt2"<<endl;
cout<<"wczt1"<<endl;
Oto przyczyna. Na wyjściu ma się znależć dokładnie to, czego chce autor. Wypisanie nawet jednej litery a w jakimkolwiek miejscu (albo np. “TAK” zamiast “tak”) spowoduje błędną odpowiedź. Pewną swobodę masz jedynie, jeśli chcesz dodać więcej białych znaków niż jest wymagane (albo zamiast spacji wypisywać ‘\n’ i vice versa), ale i to nie we wszystkich zadaniach (jak w treści napisane jest, że włączony jest sędzia dokładny, wyjście musi być IDEALNIE zgodne z tym, czego chce autor. Brak jednej spacji albo nadmiarowy ‘\n’ na końcu spowoduje błędną odpowiedź).

A, no i jak usuniesz powyższe wypisywanie to okaże się, że całe wyjście twojego programu jest sklejone bez żadnych białych znaków. Dodaj w odpowiednim miejscu wypisywanie spacji albo newline i powinno śmigać.

Dzieki bardzo; zarówno tu na formum jak i do sprawdzenia przez sędziego załączyłem nie zaktualizowany kod. Te wczyty miały mi tylko pomóc sprawdzić gdzie mój kod dochodzi i gdzie się kończy. Jeszcze raz dziękuje i przepraszam.

Kolega już napisał co trzeba zrobic

8 months later

fragment tresci zadania nie obslugiwny w powyzszym programie:
W pierwszej linii wejścia znajduje się jedna dodatnia liczba całkowita, oznaczająca liczbę zestawów testowych

1 year later

nie potrafię znaleźdź błędu

i jeśli nie zastosowałam sie do regulaminu prosze mi powiedzieć jak inaczej powinnam udostepnic kod

Cześć,

błędy:

1: [linia:5] Podczas definicji zmiennych poza funkcją, zmienne mają ustaloną wartość na początku. W przypadku, gdy nie ma inicjalizacji, domyślnie przyjmują wartość 0, czyli taki zapis:

   int ile, N, M, *czas=new int[N], suma=0, paczki;

powoduje, że tworzonych jest 6 zmiennych, one się tworzą po kolei, na samym początku programu, jeszcze przed tym, jak zostanie uruchomiona funkcja main, czyli:
ile ma wartosc 0
N ma wartość 0
M ma wartość 0
czas jest wskaźnikiem i po inicjalizacji wskazuje na obszar pamięci zaalokowany dla N elementów, czyli dla 0 elementów.
suma po inicjalizacji ma wartośc 0
paczki ma wartość 0

Dopiero po tym jest uruchamiana funkcja main, która to tak na prawdę jest w stanie wczytać wartośc N i innych danych.

2: [linia:13] Gdy tworzysz tablicę dla N elementów, to indeksy w tablicy zaczynają się od 0, czyli od 0 do N-1.
Czy w tej pętli czasami i z j sie nie pokiełbasiły?

3: W jednym odpaleniu programu może być wykonwanych wiele zestawów testowych, co oznacza, że N może się zmieniać pomiędzy testami.

4: Gdy alokujesz dane za pomocą new to musisz zadbać o to, aby na końcu zwolnić pamięć:

...
czas = new int [N];

// kod uzywający tablicę czas

delete [] czas;
...

Próbuj dalej :slight_smile:

Hej,
dzięki wielkie za odpowiedź i za uświadomienie mi błędów zamiast pisania rozwiązania.
Tutaj poprawiony kod:

kod działa, ale po wysłaniu odpowiedzi pojawia się błąd wykonania (SIGFPE)
o co chodzi i jak mogłabym to naprawić?

W tej pętli:

for(int i=0;i<=ile;i++)

wykonujesz więcej kroków niż wynosi wartość zmiennej ile.
Po co nadużywasz zmiennych globalnych? Nie ma tutaj takiej potrzeby.

Te linie są ciekawe:

13: czas=new int[N];

16: cin>>czas[i];

18: suma+=86400/czas[i];

W lini 13 alokujesz obszar, który może pomieścić N liczb,
czyli można przyjąc umownie, że w tablicy czas jest dostęp do komórek od 0 do N-1.

W liniach 16 i 18 używasz komórki o indeksie i, pytanie, czy i jest w tym zakresie od 0 do N-1 ?
Z lini 10 kodu wynika, że i jest w zakresie od 0 do ile:

10: for(int i=0;i<=ile;i++)

Co w przypadku, gdy ile jest większe lub równe N ?


Dobrze sobie przetestować program w ideone3, to znaczy, przed wybraniem “Uruchom” wkleić testowe dane wejściowe do pola “enter input (stdin)”. Czy wynik działania programu jest na pewno poprawny?

Linijkę 15 zgubiłeś , tam jest pętla do N więc cały czas wczytuje do jednej komórki

czas=new int[N]; zdecydowanie nie lubę takic konstrukcji, szczególnie że w tym przypadku tablica do niczego nie jest potrzebna…
błąd SIGFPE wywala linijka
if(suma%paczki!=0) paczki++;
Nie wiem dlaczego i chętnie sie dowiem…

no własnie, też gdzies czytałam że to problem z tym dzieleniem przez zero i tez ktoś mówił żę tablica nie jest nawet potrzebna, te właśnie 2 rzeczy wziełam z kodu kogoś innego, więc wsumie nadal nie wiem jak to naprawić

Ale czy ktoś napisał, że nie można używać tablicy?
Jeżeli wiesz, że nie wolno dzielić przez zero? I masz podejrzenie, że tak się może stać, to nie rób tego.
np:

if (dzielnik == 0) {
   // zrób coś innego
  }
else {
   wynik = dzielna / dzielnik; // % <-- czy to nie jest też dzielenie
  }

Jak to naprawić?

  • Zrozumieć sens zadania.
  • Rozpisać sobie rozwiązanie na kartce.
  • WŁASNE rozwiązanie zaimplementować we WŁASNYM kodzie

Gdy coś nie będzie dobrze działać, zdecydowanie lepiej jest poprawiać własne pomysły niż cudze. Bo Ty wiesz co chciałaś osiągnąć.