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
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
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.
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 Prosze o jakas wskazowke! Dzieki!! https://ideone.com/3UxOap14
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?
- 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. - 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.
- 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
- Wykonanie instrukcji if powinno być dokładnie odwrotnie (zmienić “N” z “D”).
- 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
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.
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
Wszyscy, a jak nie wszyscy, to wiekszosc mogacych Ci pomoc, zajetych jest rozwiazywaniem zadan na FRAKTALU. Wiec uzbroj sie w cierpliwosc, lub najlepiej sam dolacz do FRAKTALA: Fraktal XII .
Strona zadan na konkursie to: https://www.spoj.com/FRAKTAL/problems/afr_12/1
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
MBPROB01 - History version in plaintext pl.spoj.com | Zbiór zadań | 6 | 176 | Jul '24 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 98 | Apr 2 |
PP0504B - StringMerge - w języku C | Zbiór zadań | 5 | 206 | Jun '24 |
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 144 | Feb 1 |
TOPSORTL - Porządek leksykograficzny w grafie | Zbiór zadań | 3 | 148 | Jul '24 |