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/fuihProszę o jakieś wskazówki. Głównie chodzi mi o tę funkcję z sortowaniem. Z góry dzięki :) |
|
ison |
» 2010-06-12 22:28:31 do sortowania możesz uzyć sorta z STL'a. przykład użycia: int a[ 100 ]; ... sort( a, a + X );
funkcja jest w nie zapomij o |
|
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 ^^ |
|
Elaine |
» 2010-06-12 23:07:36 vector |
|
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?
|
|
malan |
» 2010-06-13 13:06:05 Zainteresował mnie trochę Twój problem i trochę nad nim posiedziałem :). Wykombinowałem coś takiego: #include <iostream> #include <vector>
struct BirthDate { int Day; int Mounth; int Year; };
class PESEL { public: BirthDate * date; public: 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() { 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; };
bool GetFromFile( std::vector < 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 ) { 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 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; for( i = 0; i < vSize; i++ ) for( j = 0; j < vSize; j++ ) if( vNumbers[ i ].GetBirthYear() == vNumbers[ j ].GetBirthYear() ) Counter[ i ] = Counter[ i ] + 1; Max = Counter[ 0 ]; for( i = 0; i < vSize; i++ ) if( Counter[ i ] > Max ) { Max = Counter[ i ]; index = i; } Max = vNumbers[ index ].GetBirthYear(); index = 0; 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 :). |
|
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ć? |
|
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 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) 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 int indeks = 0; int max = rok[ 0 ]; for( int q = 1; q <= 100; q++ ) if( rok[ q - 1 ] > max ) { max = rok[ q - 1 ]; indeks = q - 1; } printf( "%d\n", indeks );
|
|
« 1 » 2 |