/** (c) 2012 Michał (Foxbond) Chraniuk */
#include <stdlib.h>
#include <stdio.h>
#include <cstring> //strlen
#include <conio.h> //_getch
#include <time.h>
//czyszczenie ekranu
void cls () { system("cls"); }
//zamiana liczby w formacie char do int-a
int charToInt (char znak){
return (int)znak-48;
}
//funkcja do wyświetlenia błędu
void printErr(char *_msg){
printf("\nBlad: %s\n", _msg);
}
bool generate (char *_buf, char plec, int ile){
//sprawdzenie dlugości daty (czy poprawna)
if (strlen(_buf) != 10){
printErr("Zla data urodzenia.");
return false;
}
//nie da się wygenerować więcej unikalnych numerów pesel (dla danej daty i płci)
if (ile < 1 || ile > 1000){
printErr("Zla ilosc nr PESEL do wygenerowania.");
return false;
}
//seed dla generatora
srand (time(NULL));
do {
//odczytanie daty urodzenia
int day = charToInt(_buf[0])*10 + charToInt(_buf[1])*1;
int month = charToInt(_buf[3])*10 + charToInt(_buf[4]);
int year = charToInt(_buf[6])*1000 + charToInt(_buf[7])*100 + charToInt(_buf[8])*10 + charToInt(_buf[9]);
int sex = 0;
int checksum = 0;
//wygenerowanie losowej liczby dla danej płci
if (plec == 'k' || plec == 'K'){
do {
sex = rand() % 5;
}while(sex % 2 == 1);
}else if (plec == 'm' || plec == 'M'){
do {
sex = rand() % 5;
}while(sex % 2 != 1);
}else{
printErr("Zla plec.");
return false;
}
//wygenerowanie 3 losowych liczb
//int other = a + int((b-a+1) * rand()/(RAND_MAX+1.0));
int other = int(1000 * rand()/(RAND_MAX+1.0));
//sprawdzenie dnia
if (day < 1 || day > 31){
printErr("Zly dzien urodzenia.");
return false;
}
//sprawdzenie miesiąca
if (month < 1 || month > 12){
printErr("Zly miesiac urodzenia.");
return false;
}
//sprawdzenie roku i zakodowanie stulecia w liczbie miesiąca
if (year < 1800 || year > 2299){
printErr("Zly rok urodzenia.");
return false;
}else if (year > 1799 && year < 1900){
month += 80;
}else if (year > 1899 && year < 2000){
//
}else if (year > 1999 && year < 2100){
month += 20;
}else if (year > 2099 && year < 2200){
month += 40;
}else if (year > 2199 && year < 2300){
month += 60;
}else{
printErr("500 Internal error.");
}
//wyświetlanie
if (ile <= 11){
printf("\n%i -> ", (ile-21)*-1);
}else{
printf("\n0%i -> ", (ile-21)*-1);
}
// wyświetlanie rrmmdd (rok)(miesiąc)(dzień)
printf("%i%i%i%i", (int(year / 10) % 10), (year % 10), month, day);
//liczenie sumy kontrolnej z roku, miesiąca i dnia
checksum += 1*(int(year / 10) % 10)+3*(year % 10)+7*(int(month / 10) % 10)+9*(month % 10)+1*(int(day / 10) % 10)+3*(day % 10);
//poniewaz other jest z zakresu 1-999 trzeba dopełnić zerami z przodu
//liczenie sumy kontrolnej z 3 porządkowych (tu losowych) liczb
if (other < 10){
printf("00");
checksum += 0 + 1*(other % 10);
}else if (other > 9 && other < 100){
printf("0");
checksum += 0 + 9*(int(other / 10) % 10)+1*(other % 10);
}else if (other > 99 && other < 1000){
checksum += 7*(int(other / 100) % 10)+9*(int(other / 10) % 10)+1*(other % 10);
}else{
printErr("500 Internal error.");
}
//liczenie sumy kontrolnej z płci
checksum += 3*sex;
//ostateczne wygenerowanie sumy kontrolnej
checksum %= 10;
//wyświetlenie (oo)ops (porządkowa)(płeć)(s. kontrolna)
printf("%i%i%i", other, sex, checksum);
//test
printf("\nother: %i\nchecksum: %i\n", other, checksum);
}while(--ile > 0);
return true;
}
int main (){
char _buf[200];
char _plec = 'k';
int _ile = 20;
char cont = 't';
do {
printf("Podaj date (dd-mm-rrrr):");
scanf("%s", _buf);
printf("\nPodaj plec (m/k):");
_plec = _getch();
printf("%c", _plec);
cls();
if (!generate(_buf, _plec, _ile)){
printf("\nNie udalo sie wygenerowac numerow pesel!");
}
printf("\nJeszcze raz? (t/n):");
cont = _getch();
cls();
}while(cont == 't' || cont == 'T');
//system("PAUSE");
return 0;
}
> Back