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

[C++] Sortowanie numerów PESEL

Ostatnio zmodyfikowano 2010-06-13 22:50
Autor Wiadomość
boleksit
Temat założony przez niniejszego użytkownika
[C++] Sortowanie numerów PESEL
» 2010-06-12 22:25:26
Witam. Mam napisać taki program:

W pliku pesel.txt dane są numery pesel. Napisz program, który:
• zapisze do pliku zle.txt numery pesel, w których niepoprawnie jest wyliczona cyfra
kontrolna
• wypisze na ekranie ile jest błędnych peseli
• wypisze na ekranie rok, w którym urodziło się najwięcej i najmniej osób z zamieszczonych w wykazie
• zapisze do pliku pesel1.txt pesele posortowane rosnąco

Pierwsze dwie funkcje mam zrobione, ale nie wiem jak się zabrać do pozostałych dwóch. To co mam obecnie jest tu: http://wklej.to/fuih
Proszę o jakieś wskazówki. Głównie chodzi mi o tę funkcję z sortowaniem. Z góry dzięki :)
P-17974
ison
» 2010-06-12 22:28:31
do sortowania możesz uzyć sorta z STL'a.
przykład użycia:

C/C++
int a[ 100 ];
...
sort( a, a + X ); //gdzie X to ilosc elementow tablicy, po wywolaniu tej funkcji w tablicy znajdą się liczby posortowane rosnąco

funkcja jest w
C/C++
#include <algorithm>

nie zapomij o
C/C++
using namespace std;
P-17975
boleksit
Temat założony przez niniejszego użytkownika
» 2010-06-12 23:04:08
Ale problem jest w tym, że nie wiem ile tych peseli jest, tzn. program musi być uniwersalny ^^
P-17976
Elaine
» 2010-06-12 23:07:36
vector
P-17977
boleksit
Temat założony przez niniejszego użytkownika
» 2010-06-13 12:56:37
Dzięki wielkie, wsadziłem to w vector i już ładnie sortuje :P ale mam jeszcze problem z 3 funkcją: jak obliczyć w którym roku urodziło się najwięcej i najmniej ludzi, jeśli posortowany wektor wygląda przykładowo tak:

50021011352
50101111305
50102636355
51011153311
51102573842
52101156863
52110446139
53082806059
53122299122

jeśli wiadomo, że rok oznaczają 2 pierwsze cyfry w każdym peselu?

P-17986
malan
» 2010-06-13 13:06:05
Zainteresował mnie trochę Twój problem i trochę nad nim posiedziałem :). Wykombinowałem coś takiego:
C/C++
#include <iostream>
#include <vector>

struct BirthDate
{
    int Day;
    int Mounth;
    int Year;
   
    /*BirthDate(const short&,const short&,const short&);*/
};

/*BirthDate::BirthDate(const short& newDay, const short& newMounth, const short& newYear) :
Day(newDay),
Mounth(newMounth),
Year(newYear)
{
};*/

class PESEL
{
public:
    BirthDate * date;
   
public:
    //PESEL(BirthDate* const);
    PESEL();
    ~PESEL();
   
    void SetDate( const int &, const int &, const int & );
    inline int GetBirthDay( void );
    inline int GetBirthMounth( void );
    inline int GetBirthYear( void );
    void Clear( void );
};

PESEL::PESEL()
    : date( 0 )
{
};

/*PESEL::PESEL(BirthDate* const newDate ) :
date(newDate)
{
};*/

PESEL::~PESEL()
{
    if( date ) delete date;
   
};

void PESEL::SetDate( const int & newDay, const int & newMounth, const int & newYear )
{
    if( !date ) date = new BirthDate;
   
    date->Day = newDay;
    date->Mounth = newMounth;
    date->Year = newYear;
   
    return;
};

inline int PESEL::GetBirthDay( void )
{
    return( date ) ? date->Day
        : 0;
};

inline int PESEL::GetBirthMounth( void )
{
    return( date ) ? date->Mounth
        : 0;
};

inline int PESEL::GetBirthYear( void )
{
    return( date ) ? date->Year
        : 0;
};

void PESEL::Clear( void )
{
    if( date )
    {
        date->Day = 0;
        date->Mounth = 0;
        date->Year = 0;
    }
    return;
};

//Funkcja pobierająca z pliku numbery PESEL
bool GetFromFile( std::vector < PESEL >& );

// (W końcu) funkcja zliczająca numery pesel
void CountNumbers( std::vector < PESEL >&, int &, int & );

int main( int argc, char * argv[] )
{
    std::vector < PESEL > myNumbers;
   
    if( GetFromFile( myNumbers ) )
    {
        int vMax = 0, vMin = 0;
        CountNumbers( myNumbers, vMax, vMin );
        std::cout << vMax << ", " << vMin << std::endl;
       
        for( int i = 0; i < static_cast < int >( myNumbers.size() ); i++ )
             std::cout << myNumbers[ i ].GetBirthDay() << "/" << myNumbers[ i ].GetBirthMounth() << "/" << myNumbers[ i ].GetBirthYear() << std::endl;
       
    }
   
    return 0;
};

bool GetFromFile( std::vector < PESEL >& vNumbers )
{
    //Pobieranie numerów z pliku...
   
    //Wyodrębnianie dokładnej daty urodzin...
   
    // Przykład:
    vNumbers.resize( 36 );
    for( int i = 0; i < 12; i++ ) vNumbers[ i ].SetDate( 15 + i, i + 1, 2000 + i );
   
    for( int i = 12; i < 24; i++ ) vNumbers[ i ].SetDate( 10 + i, i + 1, 1995 + i );
   
    for( int i = 24; i < 36; i++ ) vNumbers[ i ].SetDate( 1 + i, i + 1, 2005 );
   
    return true;
};

void CountNumbers( std::vector < PESEL >& vNumbers, int & Max, int & Min )
{
    //const std::vector<PESEL>::size_type vSize=vNumbers.size();
    //std::vector<PESEL>::size_type i=0, j=0;
    const size_t vSize = vNumbers.size();
    size_t i = 0, j = 0;
   
    int index = 0;
    int * Counter = new int[ vSize ];
    for( i = 0; i < vSize; i++ ) Counter[ i ] = 0;
   
    //Zliczanie
    for( i = 0; i < vSize; i++ )
    for( j = 0; j < vSize; j++ )
         if( vNumbers[ i ].GetBirthYear() == vNumbers[ j ].GetBirthYear() ) Counter[ i ] = Counter[ i ] + 1;
   
    //Największy element
    Max = Counter[ 0 ];
    for( i = 0; i < vSize; i++ ) if( Counter[ i ] > Max ) { Max = Counter[ i ]; index = i; }
    Max = vNumbers[ index ].GetBirthYear();
    index = 0;
    //Najmniejszy element
    Min = Counter[ 0 ];
    for( i = 0; i < vSize; i++ ) if( Counter[ i ] < Min ) { Min = Counter[ i ]; index = i; }
    Min = vNumbers[ index ].GetBirthYear();
   
    delete[] Counter;
    return;
};
Ciebie najbardziej powinna tu zainteresować funkcja CountNumbers. Funkcja znajduje rok, w którym urodziło się najwięcej i najmniej osób. Ten sposób działa poprawnie, ale jest dość wolny, (prawdopodobnie) mało czytelny. Po kilku modyfikacjach myślę, że dałoby radę zrobić z niego coś dobrego :).
Mam nadzieję, że trochę Ci się przyda :).
P-17987
boleksit
Temat założony przez niniejszego użytkownika
» 2010-06-13 14:25:13
Sorki, ale jestem początkującym programistą, i niewiele z tego ogarniam :P Czy jakoś prościej dało by się to zrobić?
P-17988
ison
» 2010-06-13 15:28:50
jeśli nie zależy ci na kilku bajtach pamięci to możesz zrobić sobie tablicę 100-elementową typu int której N-ty element oznaczałby ile osób w roku N się urodziło

rok to chyba umiesz wyciągnąć z peselu
C/C++
int rok_z_peselu = pesel / 1000000000;

potem dla każdego roku N inkrementujesz wartość elementu N w tablicy
(jaki_rok to vector zawierający kolejno lata wyciągnięte z peseli)
C/C++
int rok[ 100 ];
C/C++
for( int q = 1; q <= jaki_rok.size(); q++ ) rok[ jaki_rok[ q - 1 ] ] ++;

i wypisujesz indeks tablicy który odpowiada za element w którym jest największa liczba
C/C++
int indeks = 0;
int max = rok[ 0 ]; //zakładamy że pierwszy element tablicy jest największy
for( int q = 1; q <= 100; q++ ) if( rok[ q - 1 ] > max ) { max = rok[ q - 1 ]; indeks = q - 1; } //lecimy po całej tablicy i sprawdzamy czy któryś element nie jest większy od dotychczas największego
printf( "%d\n", indeks ); //indeks tablicy oznacza rok w którym urodziło się najwięcej osób
P-17989
« 1 » 2
  Strona 1 z 2 Następna strona