Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

PESEL klasy

Ostatnio zmodyfikowano 2017-03-09 05:44
Autor Wiadomość
Mashnar
Temat założony przez niniejszego użytkownika
PESEL klasy
» 2017-03-08 20:51:30
Mam pewien problem.Tworze program ktory bedzie z numeru pesel sprawdzał czy jest odpowiedni , date urodzenia itp itd. Musze zrobic funkcje ( a raczej metode) ktora bedzie ustawiac sie nad odpowiednim miejscu ( czyli jak mamy pesel 4569483399) i potrzebuje odczytac rok to zeby sie na 2 pozycji zatrzymal(wypisal mi 45) Napisałem cos takiego
C/C++
int Pesel::cyfra( int pozycja )
{
   
    long long int x;
    long long int y; //zmienna na przechowywanie pozycji
   
    x = PESEL;
   
    for( int i = 0; i < 11 - pozycja; i++ )
    {
        x = PESEL / 10; //w tej zmiennej juz jest nasza liczba od okreslonej pozycji
    }
    y = x % 10;
    cout << y;
}

I mi nic nie wyrzuca , tzn 1 mi wyrzuca.Prosiłbym o pomoc.Tutaj cały kod
C/C++
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;



class Pesel
{
private:
    char * imie;
    char * nazwisko;
public:
    long long int PESEL;
    Pesel();
    Pesel( char * imie1, char * nazwisko1, long long PESEL );
    ~Pesel();
    void ustaw_imie( char * imie_1 );
    void ustaw_nazwisko( char * nazwisko_1 );
    void ustaw_pesel( long long int PESEL_1 );
public:
   
    int cyfra( int pozycja );
public:
    int rok();
    int miesiac();
    int dzien();
    int CzyKobieta();
    int CzyPoprawny();
    void Wypisz();
   
};
int Pesel::cyfra( int pozycja )
{
   
    long long int x;
    long long int y; //zmienna na przechowywanie pozycji
   
    x = PESEL;
   
    for( int i = 0; i < 11 - pozycja; i++ )
    {
        x = PESEL / 10; //w tej zmiennej juz jest nasza liczba od okreslonej pozycji
    }
    y = x % 10;
    cout << y;
}
void Pesel::ustaw_imie( char * imie_1 )
{ int x; //liczba znakow (liter)
    if( imie != 0 )
    {
        delete[] imie;
    }
    x = strlen( imie_1 ); //poniewaz juz skasowalismy 1
    imie = new char[ x - 1 ];
    strcpy( imie, imie_1 );
   
}
void Pesel::ustaw_nazwisko( char * nazwisko_1 )
{ int x;
    if( imie != 0 )
    {
        delete[] nazwisko;
    } //kasujemy tablice zeby nie byl opsmieci
    x = strlen( nazwisko_1 ); //badamy liczbe literek
    nazwisko = new char[ x - 1 ]; //tworzymy tablice (x-1 zeby nie bylo nulla)
    strcpy( nazwisko, nazwisko_1 ); //kopiujemy do tablicy globalnej ( w klasie zeby byl dostep )
   
}
Pesel::Pesel()
{
    imie = 0;
    ustaw_imie( " " );
    nazwisko = 0;
   
    ustaw_nazwisko( " " );
    PESEL = 0;
}
Pesel::Pesel( char * imie1, char * nazwisko1, long long PESEL1 )
{
    imie = 0;
    ustaw_imie( imie1 );
    nazwisko = 0;
    ustaw_nazwisko( nazwisko1 );
    PESEL = PESEL1;
   
}
Pesel::~Pesel()
{
    delete[] imie;
    delete[] nazwisko;
}




int main()
{
    Pesel pes( "Jan", "Hajzer", 12345678912 );
    pes.cyfra( 2 );
   
}
P-158696
1aam2am1
» 2017-03-08 20:57:08
Dlaczego w pętli ciągle dzielisz PESEL a nie x?
P-158701
Bielan
» 2017-03-08 20:58:55
Zastanów się czy nie będzie ci wygodniej przetrzymywać PESELu w
std::string
 a wyciągać dane za pomocą
std::string::substr
 i konwertować za pomocą
stringstream
?

Dodatkowo
  • funkcja Presel::cyfra nie zwraca wartości int mimo, że taki zamiar deklaruje.
  • imie = new char[ x - 1 ]; czy to na pewno jest to co chcesz zrobić?   

Generalnie kod jest bardzo chaotyczny i użycie
std::string
 chociaż dla imienia i nazwiska bardzo pomogą.
P-158703
Mashnar
Temat założony przez niniejszego użytkownika
» 2017-03-08 21:03:52
Własnie w tym problem , ze prowadzacy cwiczenia nie pozwolil nam korzystac z biblioteki string.. W petli dziele ten PESEL ponieważ jak dziele to przecinek sie przesuwa i dostaje ciag taki jaki potrzebuje.. ale cos mi tutaj nie działa..
P-158706
Mashnar
Temat założony przez niniejszego użytkownika
» 2017-03-08 21:07:52
Co do tego , ze funkcja nie zwraca , to tak ale jak pisze return x%10 , to nic nie wypisuje kompletnie na ekran.
P-158708
Bielan
» 2017-03-08 21:16:06
Pomyśl jak napisać treść dwóch funkcji o takich sygnaturach. Potem pomyśl jak użyć ich w programie.

C/C++
/*
    Uzupelnia tablice cyfry kolejnymi wartoscami z liczby pesel
*/
void PodzielPesel( long long pesel, int cyfry[ 11 ] )
{
   
}


/*
    Zwraca liczbę z zakresu <start, koniec>
*/
int ObliczWartosc( int start, int koniec, int cyfry[ 11 ] )
{
   
}

Pierwsza funkcja pozwoli ci raz napełnić tablicę konkretnymi cyframi (możesz sobie wtedy też zawsze sprawdzić czy dobre liczby się wstawiają). Druga pozwoli pobierać dowolny ciąg (za pomocą mnożenia przez kolejne dziesiątki oraz sumowania).
P-158711
Mashnar
Temat założony przez niniejszego użytkownika
» 2017-03-08 21:20:18
Czyli mam rozumieć , że tamta funkcja co jest napisana jest bez sensu? Wiem o co chodzi ( chyba) , tyle ze mielismy to bez tablic zrobic.
P-158713
carlosmay
» 2017-03-08 21:20:40
Nie prościej od razu wyznaczyć rok, zamiast pętlę angażować?
C/C++
#include <iostream>

int main()
{
    unsigned long long PESEL;
    std::cin >> PESEL; // >> 90090912345
   
    unsigned rok = PESEL / 1000000000;
    std::cout << rok << '\n';
}
P-158714
« 1 » 2
  Strona 1 z 2 Następna strona