zmiana tablicy char na tablice int - sprawdzenie PESEL

0

Czesc wszystkim,
mam problem - jak w temacie - ze zmiana tablicy char na tab. int. Szukalem w google ale podane rozwiazania jakos nie dzialaja u mnie w programie - 1 z nich jest zawarte w kodzie.
Wiem ze tutaj jest caly skrypt do sprawdzenia poprawnosci numeru, ale jaki ma sens bezmyslne kopiowanie kodu (poza tym kompilator zglasza mi blad...)?
Moglibyscie zerknac na moj program? Po wpisaniu numeru PESEL program wisi, wnioskuje ze to przez bledna zmiane typu...

 
#include <iostream>

 
using namespace std;

class PESEL {

public:

	int NrPESEL [11]; // nr PESEL po zmianie z typu char
	int KontrolaPESEL [10]; // 10 liczb kontrolnych do sprawdzenia poprawnosci wyliczen
	char PodanyPESEL [11]; // PESEL podany przez uzytkownika
	int W; // zmienna do wylczen poprawnosci


	PESEL();

	int ObliczSume();


	void PobierzPESEL ();

	void SprawdzPESEL ();

};

PESEL ::PESEL () // narzedzia potrzebne do kontroli
{
			KontrolaPESEL[0] = 1;
			KontrolaPESEL[1] = 3;
			KontrolaPESEL[2] = 7;
			KontrolaPESEL[3] = 9;
			KontrolaPESEL[4] = 1;
			KontrolaPESEL[5] = 3;
			KontrolaPESEL[6] = 7;
			KontrolaPESEL[7] = 9;
			KontrolaPESEL[8] = 1;
			KontrolaPESEL[9] = 3;
		};

int PESEL :: ObliczSume() // 1 wyliczenia do kontroli numeru
	{
		int Suma = 0;
		int i=0;
		while (i <=10)
			Suma = Suma + NrPESEL[i] * KontrolaPESEL[i];
		i++;
		return Suma;


	};

void PESEL :: PobierzPESEL() // zmiana [] char na [] int
	{

			char PodanyPESEL[11];
			cout << "Podaj pesel" << endl;
			cin >> PodanyPESEL;
			int a=0;
			while (a <=11)
			NrPESEL[a] = static_cast<int>(PodanyPESEL[a]); // Moim zdaniem tutaj sie program sypeie...
			a++;
};

void PESEL :: SprawdzPESEL() // wyliczenie i komunikat
{
	W = ObliczSume() % 10;
	if (W ==11)
		W = 0;
		if(NrPESEL[11] == W) {
				cout << "Pesel jest prawidlowy" << endl;
			} else {
				cout << "Pesel jest nieprawidlowy" << endl;
			}
};

int main() { 
	PESEL oPesel;
	oPesel.PobierzPESEL();
	oPesel.SprawdzPESEL();

	system ("PAUSE");
	
};
0

W PobierzPESEL(): "while (a <=11)" powinno być "while (a <11)", bo wychodzisz poza tablicę

0

Ponownie PESEL :: PobierzPESEL():
while (a <=11)
NrPESEL[a] = static_cast<int>(PodanyPESEL[a]); // Moim zdaniem tutaj sie program sypeie...
a++;

powinno być
while (a <11)
{
NrPESEL[a] = static_cast<int>(PodanyPESEL[a]); // Moim zdaniem tutaj sie program sypeie...
a++;
}

bo inaczej w while wywołujesz tylko tą pierwszą linię, a "a++" już nie jest wywoływane i program kręci się cały czas w pętli while.

0

No i kilka uwag ogólnych:

  1. klasa PESEL nie powinna mieć metody pobierzPESEL(), bo to ją sztucznie wiąże z aplikacją konsolową. Wprowadzenie danych od użytkownika powinno być osobno, a klasę PESEL inicjowałbyś już pobraną i zweryfikowaną wartością (np. wcześniej sprawdzić, czy użytkownik rzeczywiście wprowadził 11 znaków).
  2. Jesli twój program ma tylko weryfikować poprawność peselu, to twoja klasa mogłaby mieć tylko jedną statyczną metodę typu "bool checkPesel(char*)" i kilka przeciążonych pobierających na wejściu tablicę intów lub std::string.
  3. PESEL :: PobierzPESEL(): char PodanyPESEL [11] jest polem twojej klasy i ponownie zadeklarowany z samej metodzie. W związku z tym, że używasz go tylko w tej jednej metodzie, to można usunąć deklarację pola klasy.
0

Niestety, nie bardzo dziala nawet jak zmienilem <= na samo <. Podaje na konsoli PESEL i w tym momencie moge czekac nawet do konca swiata:/
Moze da sie w jakis sposob od razu wprowadzic PESEL jako tablice int? I nie mowi tu o opcji wklepywania kazdej cyferki po kolei w nowym "oknie"...

Dopiero sie ucze C++ - nie bardzo rozumiem punkt 2.

0

W PESEL :: ObliczSume() masz ten sam błąd -czyli brak klamry
while (i <=10)
Suma = Suma + NrPESEL[i] * KontrolaPESEL[i];
i++;

powinno być
while (i <=10)
{
Suma = Suma + NrPESEL[i] * KontrolaPESEL[i];
i++;
}

Co do punktu drugiego, to proponuję poczytać o przeciążaniu metod i o metodach statycznych i wszystko stanie się jasne.

0

Jeśli nadal nie będzie działać, to proponuję, żebyś wkleił swój kod po zmianach, żeby było jasne jak on teraz wygląda.

0

Moim zdaniem za bardzo kombinujesz. Nie potrzebujesz konwertować całej tablicy, spokojnie możesz to robić na bieżąco:

bool verifyPesel(const char* pesel)
{
     static const int checkSumFactors[11] = {1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1};

     int checkSum = 0;
     int i=0;
     for(i=0; pesel[i]!=0 && i<11; ++i) {
         if (!isdigit(pesel[i]))
             return false;
         checkSum += checkSumFactors[i] * (pesel[i]-'0');
     }
     if (i!=11)
         return false;
     return (checkSum%10)==0;
}
0

Dzieki MarekR22 za pomoc. Niestety musze to zrobic na zasadzie zmiany tablic.
Zrobilem jak poradzil kolega i dodalem klamry i... zaczelo dzialac, ale nie do konca;), tzn pokazuje mi ze kazdy numer jaki wpisze jest zly...
Mozecie jeszcze raz zerknac?

 
#include <iostream>

 
using namespace std;

class PESEL {

public:

	int NrPESEL [11]; // nr PESEL po zmianie z typu char
	int KontrolaPESEL [10]; // 10 liczb kontrolnych do sprawdzenia poprawnosci wyliczen
	char PodanyPESEL [11]; // PESEL podany przez uzytkownika
	int W; // zmienna do wylczen poprawnosci


	PESEL();

	int ObliczSume();


	void PobierzPESEL ();

	void SprawdzPESEL ();

};

PESEL ::PESEL () // narzedzia potrzebne do kontroli
{
			KontrolaPESEL[0] = 1;
			KontrolaPESEL[1] = 3;
			KontrolaPESEL[2] = 7;
			KontrolaPESEL[3] = 9;
			KontrolaPESEL[4] = 1;
			KontrolaPESEL[5] = 3;
			KontrolaPESEL[6] = 7;
			KontrolaPESEL[7] = 9;
			KontrolaPESEL[8] = 1;
			KontrolaPESEL[9] = 3;
		};

int PESEL :: ObliczSume()  // Obliczenie sumy kontrolnej 
	{
		int Suma = 0;
		int i=0;
		while (i <=10)
		{
			Suma = Suma + PodanyPESEL[i] * KontrolaPESEL[i];
		i++;
		}
		return Suma;


	};

void PESEL :: PobierzPESEL() 
	{

			cout << "Podaj pesel" << endl;
			cin >> PodanyPESEL;
	
};

void PESEL :: SprawdzPESEL()  // sprawdzenie numeru i wyswietlenie na ekranie
{
	int a=0;
    while (a <=11)
	{
    NrPESEL[a] = static_cast<int>(PodanyPESEL[a]); 
    a++;
	}


	W = ObliczSume() % 10;
	if (W ==10)
	{
		W = 0;
	}
		else 
		{
			if(NrPESEL[11] == W) 
				cout << "Pesel jest prawidlowy" << endl;
			 else 
			 {
				cout << "Pesel jest nieprawidlowy" << endl;
			}
	}
};

int main() { 
	PESEL oPesel;
	oPesel.PobierzPESEL();
	oPesel.SprawdzPESEL();

	system ("PAUSE");
	
};

			


0

Hejka raz jeszcze,

przysiadlem do kodu, pokombinowalem i wyszlo.... no prawie;P

kod mi sie sypie na etapie PESEL::Oblicz sume... tam mi jakies niestworzone liczby wychodza... mozecie zerknac?

#include <iostream>

 
using namespace std;

class PESEL {

public:

	int NrPESEL [10]; 
	int KontrolaPESEL [9]; 
	char PodanyPESEL [10]; 
	int W; 


	PESEL();

	int ObliczSume();


	void PobierzPESEL ();

	void SprawdzPESEL ();

};

PESEL ::PESEL () 
{
			KontrolaPESEL[0] = 1;
			KontrolaPESEL[1] = 3;
			KontrolaPESEL[2] = 7;
			KontrolaPESEL[3] = 9;
			KontrolaPESEL[4] = 1;
			KontrolaPESEL[5] = 3;
			KontrolaPESEL[6] = 7;
			KontrolaPESEL[7] = 9;
			KontrolaPESEL[8] = 1;
			KontrolaPESEL[9] = 3;
		};

int PESEL :: ObliczSume() 
	{
		int Suma = 0;
		int i=0;
		while (i<10)
		{

			Suma = Suma + NrPESEL[i] * KontrolaPESEL[i];
			cout << Suma << endl;
			i ++;
		}
		cout << "To bylo obliczenie" << endl;

		return Suma % 10;


	};

void PESEL :: PobierzPESEL() 
	{

			cout << "Podaj pesel" << endl;
			cin >> PodanyPESEL;
	
};

void PESEL :: SprawdzPESEL() 
	
{
	


	int a=0;
    while (a <11)
	{
    NrPESEL[a] = static_cast<int>(PodanyPESEL[a] - '0'); 
	cout << NrPESEL[a] << endl;
    a++;
	}
	cout << "To byl numer PESEL" << endl;

	W = 10 - ObliczSume() ;
		if (W ==10)
	W = 0;

	cout << W << endl;

	
		if(NrPESEL[10] == W) 
			
				cout << "Pesel jest prawidlowy" << endl;
			 else 
				cout << "Pesel jest nieprawidlowy" << endl;
			
			

}


int main() { 
	PESEL oPesel;
	oPesel.PobierzPESEL();
	oPesel.SprawdzPESEL();

	system ("PAUSE");
	
};

			
 
0

Wychodzisz poza każdą tablicę - tablice są indeksowane od 0 do rozmiar - 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1