Creative Commons License Foxbond's Repo

/**(c) 2016 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