Błąd NZEC - zadanie PESEL z polskiej strony spoja.

Błąd NZEC - zadanie PESEL z polskiej strony spoja.
Tytanowyy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 86
0

Witam,
Otóż zabrałem się za zadania ze SPOJ'a, ale z takim błędem się jeszcze nie spotkałem, otóż program zwraca dobre wyniki dla przykładów, niestety wyświetla mi się błąd NZEC ( doczytałem się tylko tego, że błąd wyskakuje w języku C gdy ktoś nie zwróci wartości na końcu, na temat pascala nic nie było ).

Treść zadania znajduje się pod tym linkiem: http://pl.spoj.com/problems/JPESEL/
I mój kod programu:

Kopiuj
program pesel;
uses crt;
var tab:array[0..10] of byte;
i,j,test:byte;
suma:longint;

begin
  readln(test);
  for j:=1 to test do
  begin
    suma:=1;
    for i:=0 to 10 do
    begin
      readln(tab[i]);
    end;
    suma:=tab[0]*1+tab[1]*3+tab[2]*7+tab[3]*9+tab[4]*1+tab[5]*3+tab[6]*7+tab[7]*9+tab[8]*1+tab[9]*3+tab[10]*1;
    if(suma mod 10 = 0) then writeln('D') else writeln('N');
   end;
  readln;
end.

Mogę prosić o pomoc? Pozdrawiam

@Edit, spróbowałem to zrobić z dwuwymiarową dynamiczną tablicą, ale błąd nadal ten sam.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Bo odczytujesz bajty.
po odczytaniu znaku '1' dostaniesz liczbę 49

Tytanowyy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 86
0
_13th_Dragon napisał(a):

Bo odczytujesz bajty.
po odczytaniu znaku '1' dostaniesz liczbę 49

Po zmienieniu typów dalej ten sam błąd, chyba, że ja coś źle zrozumiałem, jeżeli tak jest, to jak mógłbym prosić o wytłumaczenie, to byłoby miło.

Dzięki!

Ktos
  • Rejestracja: dni
  • Ostatnio: dni
2

Spróbuj usunąć ten samotny readln z końca. To sprawdza automat, więc może się pogubić, jak potrzeba podać wartość (enter), a on o tym nie wie.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
for i:=0 to 10 do read(tab[i]);

Ale tego samotnego readln; nie usuwaj.

Tytanowyy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 86
0

Zrobiłem tak, jak Panowie powiedzieliście, niestety dalej wywala ten sam błąd -

błąd wykonania (NZEC)

Dzięki za odpowiedzi.

szopenfx
  • Rejestracja: dni
  • Ostatnio: dni
0

Następnie należy odjąć ostatnią cyfrę otrzymanego wyniku od 10

Jeśli otrzymany wynik nie jest równy cyfrze kontrolnej, to znaczy, że numer zawiera błąd[5]. Uwaga implementacyjna - jeśli ostatnią cyfrą otrzymanego wyniku jest 0, w wyniku odejmowania otrzymamy liczbę 10, podczas gdy suma kontrolna jest cyfrą. Oznacza to tyle, że cyfra kontrolna winna być równa 0 (stąd dobrze jest wykonać na wyniku odejmowania operację modulo 10). W wyniku niezbyt precyzyjnego opisu na stronie MSW ten aspekt jest często pomijany i prowadzi do błędów w implementacji sprawdzania poprawności numeru PESEL.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Taki błąd oznacza że program się wysypał. Zgaduje że dlatego że nie umiesz czytać. W poleceniu masz jak byk napisane że modulo sprawdzasz tylko jeśli suma jest dodatnia. Bardzo możliwe że pascal źle reaguje na modulo z liczb ujemnych.

szopenfx
  • Rejestracja: dni
  • Ostatnio: dni
0

spróbuj zamiast +tab[10]*1; zastosować to co zacytowałem z wiki. Do tego dodaj warunek > 0 po suma mnożeń może wynieść zero, ale nie chce mi się myśleć czy ma to wpływ na wynik.

LU
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gdańsk
0

Od niedawna jestem uzytkownikiem spoja, 2 dni temu robilem to zadanie tylko w c++;).

edit
Przeczytaj tutorial spoja.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

To co podałeś w komentarzach http://pastebin.com/NfURwkGB nadal nie jest poprawnym wczytaniem.
To jest poprawne wczytanie: http://ideone.com/Ra5wuF

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.