Creative Commons License Foxbond's Repo

/** (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