57 / 59
Jan 2021

Witam, ciągle wyrzuca mi błąd. Pdejrzewam, że ma to coś wspólnego z wczyywaniem danych za pomocą scanf (białe znaki) ponieważ gdy wpisze ciąg 11 cyfr program uważa, że to jedna wprowadzona (muszą być odzielone enterem).
Bardzo prosze o rade i z góry dziekuje :slight_smile:
Link do kodu: https://ideone.com/b7VPaa8

scanf("%d", &pesel[i]);

wczytuje Ci całą liczbę, jeśli nie jest rozdzielona białym znakiem, a nie pojedynczą cyfrę. Możesz użyć czegoś w stylu

scanf(" %c ", &pesel[i]);
pesel[i] -= '0';

Wtedy wczyta jeden znak. Spacja przed i po %c jest po to, żeby zjadało line feed (enter) po ostatniej cyfrze i nie wczytywało go w następnym obiegu jako znak. ‘0’ odejmujemy, gdyż komputer wczytuje jedną cyfrę jako jej kod ASCII i trzeba odjąć kod zera, żeby otrzymać tę cyfrę.

Wtedy też będziesz musiał wyzerować tablicę pesel przed pierwszym użyciem:

memset(pesel, 0, sizeof(pesel));

Lub zadeklarować ją jako tablicę charów:

char pesel[12];

Dlaczego zwiększyłem rozmiar tablicy o 1? Gdyż wtedy będzie miejsce na ostatni znak ‘\0’, co pozwoli ci wczytywać pesel w następujący sposób:

scanf("%s", pesel);

Potem jednak w pętli będziesz musiał poodejmować kody zera.

I mała uwaga na koniec: w konsoli być może nie będzie chciało ci “ogarnąć”, że wpisałeś ostatni pesel, w takim wypadku trzeba wcisnąć CTRL-Z i potwierdzić enterem (wysyła to znak końca pliku do programu).

Powodzenia :slight_smile:

BTW: Linijka

if(sprawdzenie(pesel)<=0) return 0;

pewnie nie spowoduje błędnej odpowiedzi w tym zadaniu, ale w takim wypadku powinieneś zgodnie ze specyfikacją zadania wypisać, że pesel jest błędny, a nie wychodzić z programu.

Witam, sędzia odrzuca a porgram działa jak powinien (prawie). Problem polega na tym, że potrzebuje wczytać liczby pesel jako char a nie int (wtedy lapie mi ciag 11 znakow jako jedna liczbe).
Prosze o pomoc,z gory dziekuje!

Dobrym pomysłem byłoby czytanie odpowiedzi w tematach, w których prosiłeś o pomoc… Post wyżej masz wszystko dokładnie opisane…

1 month later

Czesc! Ja tez wstawiam swoj kod, bo na codeBlock’sie mi dziala, a sedzia na przyjmuje i nie wiem sama, co jest nie tak. WYDAJE sie logiczny :slight_smile: Prosze o jakas wskazowke! Dzieki!! https://ideone.com/3UxOap14

program nie musi być logiczny, sędziego to nie interesuje, sędzia natomiast oczekuje poprawnych odpowiedzi :slight_smile:

a twój program daje przecież niewłaściwą odpowiedź dla danych testowych

11 months later

Dzień dobry

Nie chcę zakładać nowego tematu, aby nie zaśmiecać forum. Próbowałem się zmierzyć z tym zadaniem i coś mi się udało urodzić, ale poległem :(. Oto mój kod:

#include
using namespace std;
int main()
{
int pesel[10];
int wynik;
int i,k = 0;
int ile = 0;
cout << "Ile numerow pesel chcesz sprawdzic? ";
cin >> ile;

for (k; k <ile; k++)
{

for (i = 0; i <= pesel[10]; i++)
{
    cout << i + 1 ;
    cin >> pesel[i];

}
wynik = pesel[0]*1 + (pesel[1]*3) + (pesel[2]*7) + (pesel[3]*9) + (pesel[4]*1) + (pesel[5]*3) + (pesel[6]*7) + (pesel[7]*9) + (pesel[8]*1) + (pesel[9]*3) + (pesel[10]*1);


   cout << wynik << endl;
    if (wynik = 0 || wynik % 10 == 0)
         {
             cout << "D" << endl;
         }
         else
         {
             cout << "N" << endl;
         }

}

return 0;

}

Pierwszy mój problem - jak sprawić, aby podawać pesel nie jedna literka po jednej tylko cały naraz?
Drugi mój problem - o ile pierwszy pesel program sprawdzi poprawnie, o tyle każdy kolejny już się wysypuje (po podaniu pierwszej liczby od razu przechodzi do jakiegoś dziwnego wyniku). Nie rozumiem tego :(. Ktoś potrafiłby wytłumaczyć, dlaczego?

  1. Naucz się korzystać z Ideone. Korzyści są dwie:
    - możesz podawać swój kod przez link do Ideone
    - możesz wygodnie testować swój kod.
  2. Twój program może wypisywać TYLKO takie komunikaty jakich oczkuje autor. W przypadku tego zadania jest to “D” lub “N” i nic innego. Wypisanie "Ile numerów pesel chcesz sprawdzić? " od razu uwala zadanie.
  3. Pisząc cin >> pesel[i] wczytujesz od razu cały pesel a nie jak się zapewne spodziewałeś cyfra po cyfrze. Zresztą w pętli for jest błąd nawet gdyby Twój sposób był poprawny bo wczytujesz do i <= pesel[10], który nie jest znany. Zapewne chciałeś wczytywać do i<=10. Ponadto wczytana liczba ma 11 cyfr i nie mieści się w typie int
  4. Wykonanie instrukcji if powinno być dokładnie odwrotnie (zmienić “N” z “D”).
  5. Jeśli chcesz cały pesel wczytać za jednym razem to możesz po prostu zrobić to np. tak:
    long long pesel;
    cin >> pesel;
    a później wyłuskiwać poszczególne cyfry
    Łatwiej będzie wczytać to jako string a później z niego wyłuskać poszczególne cyfry
17 days later

Witam wszystkich obecnych, dopiero zaczynam przygodę z c++, mój kod - choć output i input jest identyczny, nie zostaje zaakceptowany - czy ktoś mógłby mi przybliżyć dlaczego ?

#include <iostream>

using namespace std;

string pesel1,pesel2;
int test;

int main ()

{
    cin >> test;
    for (int i=2; i<=test;i++)

    {cin >> pesel1;

    cin >> pesel2;}
    {

    }
    if (((pesel1[0]*1)+(pesel1[1]*3)+(pesel1[2]*7)+(pesel1[3]*9)+(pesel1[4]*1)+(pesel1[5]*3)+(pesel1[6]*7)+(pesel1[7]*9)+(pesel1[8]*1)+(pesel1[9]*3)+(pesel1[10]*1))%10==0)

    {
        cout <<  "D" << endl;
    }
    else
    {
         cout << "N"<<  endl;
    }

    {

     if (((pesel2[0]*1)+(pesel2[1]*3)+(pesel2[2]*7)+(pesel2[3]*9)+(pesel2[4]*1)+(pesel2[5]*3)+(pesel2[6]*7)+(pesel2[7]*9)+(pesel2[8]*1)+(pesel2[9]*3)+(pesel2[10]*1))%10==0)

    {
        cout <<  "D"<<endl;
    }
    else
    {
         cout << "N" << endl;
    }
    }



    return 0;
}

Podejrzewam ze caly czas testujesz na przypadku z zadania.
ile razy wykona sie petla for? dlaczego masz zmienne pesel1 i pesel2?
co sie stanie w takim przypadku testowym jak nizej?

wejscie
1
44051401458
wyjscie
D

To wszystko co wyzej to pierwsza sprawa.

Druga sprawa:
Nie jestem pewien czy to obliczenie zadziala w kazdym przypadku(na moim peselu zadzialalo) Do obliczen program bierze wartosc znaku ascii a nie wartosc cyfry. np zamiast 7 bierze 55.

3 months later

Proszę o pomoc. W ideone sukces, a spoj odrzuca. Nie mam pojecia dlaczego tak jest i co poprawić.

Rzeczywiście na starym kompilatorze nie działa. Spróbuj na nowym. Po AC. Link do Twojego kodu można skasować bo jest dużą pokusą dla początkujących.

Twoje zadanie przeszło i to jest pozytywne ale jedenaście if-ów w bardzo prostym zadaniu nie wygląda dobrze.

8 months later

Cześć, Spojowicze! Kod - https://ideone.com/jox1cv6

Liczbę testów wczytuję do zmiennej liczba_testow i rozumiem, że enter musi się gdzieś podziać. Jeśli zostanie tak, jak jest w linku, to wpada on do pierwszego getc i powoduje niepoprawne wyniki. I tu pojawia się problem - jak wyłapać tego entera? Próbowałem przez getchar, getc, snacf("%d\n"), zmienną po %d, ale wtedy znowu przekracza limit czasu - zapewne czeka no kolejny input. Ktoś mi pomoże? Odpłacam w uśmiechu i życzeniach pomyślności w Nowym Roku :smiley:

A może właśnie tego entera na końcu nie ma(tak jak w Twoim kodzie).
Zamiast entera można wyłapać EOF.
Mozna też wylapywac 11 cyfr dla ostatniego przebiegu i nie łapać potem niczego.
Co do wyjścia sędzia oczekuje tylko D lub N.
Inne dodatki to błąd.
PS. Ja też polecam Fraktal :smile:

11 months later

Nie wiem czemu ale pętla nie wykonuje się podaną ilość razy, czy ktoś może pomóc ?


ideone oblicza 2 razy, ale kiedy w codeblocksie uruchamiam program działa tylko raz i się kończy