/** (c) 2015 Michał (Foxbond) Chraniuk */
#define _CRT_SECURE_NO_WARNINGS
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void cls(void) { system("cls"); }
char l2u(char letter) {
if (letter > 96 || letter < 123) {
return (char)letter - 32;
}
return letter;
}
void error(char* msg){
cls();
printf("-------------------------------\n%s\n-------------------------------\n", msg);
getch();
exit(-1);
}
typedef struct elem{
char nazwisko[40];
char imie[40];
char pesel[20];//12
char nrDowodu[20];//13
struct elem *next;
}elem;
elem* db = NULL;
void addPerson(char* nazwisko, char* imie, char* pesel, char* nrDowodu) {
elem* newElem = (elem*)malloc(sizeof(elem));
strcpy(newElem->nazwisko, nazwisko);
strcpy(newElem->imie, imie);
strcpy(newElem->pesel, pesel);
strcpy(newElem->nrDowodu, nrDowodu);
newElem->next = NULL;
if (db == NULL) {
db = newElem;
return;
}
elem *p = db;
for (;;) {
if (p->next == NULL) {
p->next = newElem;
break;
}
p = p->next;
}
}
elem* getSortedList(char field, char method){
//int field = 0; //0 - nazwisko, 1 - imie, 2 - pesel, 3 - nrDow
//int method = 0; //0-asc, 1-desc
int cond = 0;
if (db == NULL) return NULL;
if (db->next == NULL) return NULL;
elem *res = NULL;
elem *temp = NULL;
elem *dbp = db;
for (;;) {
if (res == NULL) {
res = (elem*)malloc(sizeof(elem));
memcpy(res, dbp, sizeof(elem));
res->next = NULL;
}
else {
temp = (elem*)malloc(sizeof(elem));
memcpy(temp, dbp, sizeof(elem));
temp->next = NULL;
if (method == '1') {
if (field == '1') {
cond = (strcmp(temp->nazwisko, res->nazwisko) < 0);
}
else if (field == '2') {
cond = (strcmp(temp->imie, res->imie) < 0);
}
else if (field == '3') {
cond = (strcmp(temp->pesel, res->pesel) < 0);
}
else if (field == '4') {
cond = (strcmp(temp->nrDowodu, res->nrDowodu) < 0);
}
else {
error("Nieznana pole sortowania (Nazwisko/Imie/PESEL/Nr Dowodu)");
}
}
else if (method == '2'){
if (field == '1') {
cond = (strcmp(temp->nazwisko, res->nazwisko) > 0);
}
else if (field == '2') {
cond = (strcmp(temp->imie, res->imie) > 0);
}
else if (field == '3') {
cond = (strcmp(temp->pesel, res->pesel) > 0);
}
else if (field == '4') {
cond = (strcmp(temp->nrDowodu, res->nrDowodu) > 0);
}
else {
error("Nieznana pole sortowania (Nazwisko/Imie/PESEL/Nr Dowodu)");
}
}
else {
error("Nieznana metoda sortowania (ASC/DESC)");
}
if (cond) {
temp->next = res;
res = temp;
}
else {
elem* resp = res;
for (;;) {
if (resp->next == NULL) {
resp->next = temp;
break;
}
if (method == '1') {
if (field == '1') {
cond = (strcmp(temp->nazwisko, resp->next->nazwisko) < 0);
}
else if (field == '2') {
cond = (strcmp(temp->imie, resp->next->imie) < 0);
}
else if (field == '3') {
cond = (strcmp(temp->pesel, resp->next->pesel) < 0);
}
else if (field == '4') {
cond = (strcmp(temp->nrDowodu, resp->next->nrDowodu) < 0);
}
else {
error("Nieznana pole sortowania (Nazwisko/Imie/PESEL/Nr Dowodu)");
}
}
else if (method == '2') {
if (field == '1') {
cond = (strcmp(temp->nazwisko, resp->next->nazwisko) > 0);
}
else if (field == '2') {
cond = (strcmp(temp->imie, resp->next->imie) > 0);
}
else if (field == '3') {
cond = (strcmp(temp->pesel, resp->next->pesel) > 0);
}
else if (field == '4') {
cond = (strcmp(temp->nrDowodu, resp->next->nrDowodu) > 0);
}
else {
error("Nieznana pole sortowania (Nazwisko/Imie/PESEL/Nr Dowodu)");
}
}
else {
error("Nieznana metoda sortowania (ASC/DESC)");
}
if (cond) {
temp->next = resp->next;
resp->next = temp;
break;
}
resp = resp->next;
}
}
}
if (dbp->next == NULL) {
break;
}
dbp = dbp->next;
}
return res;
}
int fileExists(char *fname)
{
FILE *file;
if (file = fopen(fname, "r"))
{
fclose(file);
return 1;
}
return 0;
}
int readFile(const char* name) {
int count = 0;
FILE *dane = fopen(name, "r");
if (dane == NULL) {
error("Nie mozna odczytac pliku \"%s\", program zakonczy dzialanie!", name);
}
char buf[200];
while (fgets(buf, 200, dane)) {
char nazwisko[40];
char imie[40];
char pesel[20];
char nrDowodu[20];
sscanf(buf, "%s %s %s %s", &nazwisko, &imie, &pesel, &nrDowodu);
addPerson(nazwisko, imie, pesel, nrDowodu);
count++;
}
return count;
}
void saveFile(elem* list, const char* filename) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
error("Nie mozna utworzyc pliku \"%s\", program zakonczy dzialanie!", filename);
}
for (;;) {
fprintf(file, "%s %s %s %s\n", list->nazwisko, list->imie, list->pesel, list->nrDowodu);
if (list->next == NULL) {
break;
}
list = list->next;
}
}
char* getSortOpt() {
char res[2];
do {
cls();
printf("Wedlug jakiego pola sortowac?\n1. Nazwisko\n2. Imie\n3. PESEL\n4. Nr Dowodu\n");
res[0] = getch();
} while (res[0] != '1' && res[0] != '2' && res[0] != '3' && res[0] != '4');
do {
cls();
printf("Kolejnosc sortowania?\n1. ASC\n2. DESC\n");
res[1] = getch();
} while (res[1] != '1' && res[1] != '2');
return res;
}
void optReadDB() {
char filename[40];
do {
cls();
printf("Podaj nazwe pliku z ktorego wczytac kierowcow: ");
scanf("%s", &filename);
if (fileExists(filename)) {
break;
}
printf("Podany plik nie istnieje lub nie mozna go otworzyc!\n");
getch();
} while (1);
cls();
int count = readFile(filename);
printf("Wczytano %d kierowcow z %s\n", count, filename);
getch();
}
void optSaveDB() {
if (db == NULL) {
cls();
printf("Baza danych kierowcow nie zostala zaladowana!");
getch();
return;
}
char* sortOpt = getSortOpt();
elem* list = getSortedList(sortOpt[0], sortOpt[1]);
cls();
char filename[40];
printf("Podaj nazwe pliku do ktorego zapisac kierowcow: ");
scanf("%s", &filename);
saveFile(list, filename);
cls();
printf("Zapisano do pliku %s\n", filename);
getch();
}
void optDisplayDB() {
if (db == NULL) {
cls();
printf("Baza danych kierowcow nie zostala zaladowana!");
getch();
return;
}
char* sortOpt = getSortOpt();
elem* list = getSortedList(sortOpt[0], sortOpt[1]);
elem* p = list;
for (;;) {
printf("%s %s %s %s\n", p->nazwisko, p->imie, p->pesel, p->nrDowodu);
if (p->next == NULL) {
break;
}
p = p->next;
}
printf("---------------------------------------\nNacisnij 1 aby zapisac wynik do pliku, dowolny inny klawisz aby kontynuowac\n");
if (getch() == '1') {
cls();
char filename[40];
printf("Podaj nazwe pliku do ktorego zapisac kierowcow: ");
scanf("%s", &filename);
saveFile(list, filename);
cls();
printf("Zapisano do pliku %s\n", filename);
getch();
}
}
int main (){
char opt;
do {
cls();
printf("Wczytana baza kierowcow?: %s\n1. Wczytaj kierowcow\n2. Zapisz kierowcow\n3. Wypisz kierowcow\n0. Wyjscie", (db == NULL ? "NIE" : "TAK"));
opt = getch();
if (opt == '1') {
optReadDB();
}
else if (opt == '2') {
optSaveDB();
}
else if (opt == '3') {
optDisplayDB();
}
//else -> error
} while (opt != '0');
return 0;
}
> Back