33 / 59
Nov 2018

no tak dałem rozmiar tablicy na 12 i już było ok. I to tak zawsze trzeba rezerwować dodatkowo jedno miejsce ?

Tak, w charach na końcu łańcucha znaków jest Null, musi być dla niego miejsce, w innych tablicach nie musi (liczbowe).

1 month later

Hej. Ja zrobiłem to tak. Na moim kopi działa dobrze wyniki są poprawne.
Na SPOJ nie działa. Dlaczego?

#include <iostream>
#include <string>
#include <cstdlib>
#include <math.h>
using namespace std;

int main()
{
	string pesel;
	string pomocnicza="";
	double wynik=0;
	int tab[11];
	short ile;
	cin >> ile;
	for (int k = 0; k < ile; k++)
	{
		cin >> pesel;

		for (int i = 0; i < 11; i++)
		{
			pomocnicza.push_back(pesel[i]);
			tab[i] = atoi(pomocnicza.c_str());
			pomocnicza = "";
		}
		tab[0] = tab[0] * 1;
		tab[1] = tab[1] * 3;
		tab[2] = tab[2] * 7;
		tab[3] = tab[3] * 9;
		tab[4] = tab[4] * 1;
		tab[5] = tab[5] * 3;
		tab[6] = tab[6] * 7;
		tab[7] = tab[7] * 9;
		tab[8] = tab[8] * 1;
		tab[9] = tab[9] * 3;
		tab[10] = tab[10] * 1;
		for (int j = 0; j < 11; j++)
		{
			wynik += tab[j];
		}
		if ((wynik - ((floor(wynik / 10)) * 10)) == 0)
			cout << "D" << endl;
		else
			cout << "N" << endl;
	}

    return 0;
}

prawdopodobnie dlatego, że niedokładnie przeczytałeś treść zadania

To musisz być w błędzie, ponieważ w programie suma wychodzi 121, dla sprawdzenia u mnie na kartce zgodnie z algorytmem podanym w zadaniu też wychodzi 121.
121%10!=0

z tego wniosek, że

  1. przeczytaliśmy treść różnych zadań (co mało prawdopodobne)
  2. przeczytałeś nieuważnie treść zadania - zdecydowanie bardziej prawdopodobne :slight_smile:
23 days later

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