冠狀病毒患者個人信息管理系統(附源碼)(鏈表、文件、加密解密)

main.c文件:

登錄
用戶名:handsome_boy
密碼:520forever

#include "decoration_list.h" 

void menu();/*數據的設計----->學生信息抽象出來,菜單設計*/

struct Node *list;	

void keyDown();/*用戶的交互*/

int main(int argc, char *argv[]) {	
	/*登錄*/ 
	int frozen = password_system();
	if(frozen == 0){
		return 0;
	}
	else{
		system("cls");
		Sleep (2000);
		printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t");
		printf(" \n\t\t\t\t\t\t\t\t成功登錄!"); 
		Sleep (3000);
		system("cls");
	}
	/*登錄*/ 
	list = createList();
	readInfoFromFile(list, "secret.txt");
	while(1){
		menu(); 
		keyDown();
		system("pause");
		system("cls");
	}

	system("pause");
	return 0;
}

void menu()
{
	/*所有操作都同步到文件*/ 
	printf("\n\n\n"); 
	printf("**********************************************************請按下方引索選擇您所需要的功能**********************************************************"); 
	printf("                                     *                                                                             *\n");
	printf("                                     *                                                                             *\n");                                                        
	printf("                                     *                                                                             *\n");	                                                      
	printf("\t\t\t\t\t       ---------------【冠狀病毒患者管理系統】-------------------\n");                         	
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");
	printf("\t\t\t\t\t       |\t\t    |1. 錄 入 信 息|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");
	printf("\t\t\t\t\t       |\t\t    |2. 瀏 覽 信 息|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");
	printf("\t\t\t\t\t       |\t\t    |3. 修 改 信 息|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");	
	printf("\t\t\t\t\t       |\t\t    |4. 刪 除 信 息|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");	
	printf("\t\t\t\t\t       |\t\t    |5. 查 找 信 息|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");	
	printf("\t\t\t\t\t       |\t\t    |6. 患 者 病 情|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");	
	printf("\t\t\t\t\t       |\t\t    |7. 入 院 時 間 排 序|\t\t|\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");	
	printf("\t\t\t\t\t       |\t\t    |8. 整 體 病 情|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");	
	printf("\t\t\t\t\t       |\t\t    |0. 退 出 系 統|\t\t        |\n");
	printf("\t\t\t\t\t       |\t\t                  \t\t        |\n");	
	printf("\t\t\t\t\t       ----------------------------------------------------------\n");
	printf("                                    *                                                                             *\n");
	printf("                                    *                                                                             *\n");                                                        
	printf("                                    *                                                                             *\n");	
	printf("**************************************************************************************************************************************************");
}


void keyDown()
{ 
	int choice = 0;
	struct patient data;
	struct Node *pMove = NULL;
	printf("\n");
	printf("\t\t\t\t\t\t\t");
	scanf("%d", &choice);
	switch(choice){
		case 0:
			writeInfoToFile(list, "public_patient.txt");
			delate_file("public_patient.txt");
			printf("正常退出\n");
			system("pause");
			exit(0); 
				break;
		case 1:
			system("cls");
			printf("\n\n\n\n\n\n\n\t\t\t\t\t");
			printf("-----------------------------【錄入信息】----------------------------------\n"); 
			/*插入鏈表*/ 
			printf(" \n\t\t\t\t\t\t\t姓名:"); 			 scanf("%s", data.name);
			printf(" \n\t\t\t\t\t\t\t年齡:"); 			 scanf("%d", &data.age);
			printf(" \n\t\t\t\t\t\t\t性別:"); 			 scanf("%s", data.sex);
			printf(" \n\t\t\t\t\t\t\t體溫(攝氏度):"); 	 scanf("%lf", &data.temper);
			data.temper = data.temper*1.0;
			printf(" \n\t\t\t\t\t\t\t入院時間(年月日):");scanf("%d%d%d", &data.period.year, &data.period.month, &data.period.day);
			printf(" \n\t\t\t\t\t\t\t電話:"); 		 	 scanf("%s", data.tel);
			printf(" \n\t\t\t\t\t\t\t家庭住址:"); 		 scanf("%s", data.address);
			printf(" \n\t\t\t\t\t\t\t家庭年收入:");		 scanf("%lf", &data.income);
			fflush(stdin);/*清空緩衝區*/ 
			printf(" \n\t\t\t\t\t\t\talive(T/F/C):");	     scanf("%c", &data.alive);
			fflush(stdin);/*清空緩衝區*/ 
			insertNode(list, data);
				break;
		case 2:
			system("cls");
			printf("\n"); 
			printf("-------------------------------------------------------------------【瀏覽信息】-------------------------------------------------------------------\n\n"); 
			printList(list);/*打印鏈表*/ 
			break;
		case 3:
			system("cls");
			printf("\n\n\n\n\n\n\n\t\t\t\t\t");
			printf("-----------------------------【修改信息】----------------------------------\n\n");
			printf(" \t\t\t\t\t請輸入需要修改的患者姓名:");
			scanf("%s", data.name);
			modification(list, data.name);
			break;
		case 4:
			system("cls");
			printf("\n\n\n\n\n\n\n\t\t\t\t\t");
			printf("-----------------------------【刪除信息】----------------------------------\n\n");
			printf(" \t\t\t\t\t請輸入刪除的患者姓名:");
			scanf("%s", data.name);
			deletedata(list, data.name); 			
			break;
		case 5:
			system("cls");
			printf("\n\n\n\n\n\n\n\t\t\t");
			printf("-----------------------------------------【查找信息】---------------------------------------------\n\n");
			printf(" \t\t\t請輸入要查找患者的姓名:");
			scanf("%s", data.name);
			printf("\n");
			pMove = search(list, data.name);
			if((pMove) == NULL){
				printf(" \t\t\t\t\t\t\t\t未找到相關信息!\n\n");
				system("pause");
			} 
			else{
				printf("\t\t|姓名\t\t年齡\t性別\t體溫\t\t入院時間\t電話\t\t家庭住址\t家庭收入\talive(T/F/C)\n\n");
				printf("\t\t|%s\t\t%d\t%s\t%.1lf\t\t%d年%d月%d日\t%s\t%s\t\t%.2lf\t%c\n\n",
				pMove->data.name, pMove->data.age,  pMove->data.sex, pMove->data.temper,  pMove->data.period.year, pMove->data.period.month, pMove->data.period.day, pMove->data.tel ,pMove->data.address, pMove->data.income, pMove->data.alive);
			}
			break;
		case 6:
			system("cls");
			printf("\n");
			printf("----------------------------------------------------------【患者病情輕重程度排序】----------------------------------------------------------------\n\n");
			sort_temper(list); 
			printList_T(list);/*打印鏈表*/ 
			break;
		case 7:
			system("cls");
			printf("----------------------------------------------------------【患者入院時間排序】----------------------------------------------------------------\n\n");			
			sort_time(list);
			printList_T(list);
			break;
		case 8:
			system("cls");
			printf("\n\n\n\n\n\n\n\t\t\t");
			printf("-----------------------------------------【醫院患者整體病情】---------------------------------------------\n\n");		
			statistics(list);
			break;
		default:
			system("cls");
			printf("選擇錯誤,重新輸入\n");
			system("pause");/*防止閃屏*/ 
			break;
	} 
	writeInfoToFile(list, "public_patient.txt");
}

decoration_list.h

#include <stdio.h>
#include <stdlib.h>		/*防止閃屏*/
#include <string.h>
#include<conio.h>     /*getch()*/
#define KEY 1

struct time{
	int year;
	int month;
	int day;
};

struct patient{
	char   name[50];
	int    age;
	char   sex[5];
	double temper;
	struct time period;
	char   tel[20];
	char   address[100];
	double income;
	char   alive;
};

struct Node{
	/*int data*/
	struct patient data;
	struct Node*next;
};
//結構分結構去寫
//某一種數據結構趨勢線什麼東西的時候,單獨去寫這一種數據結構
//先把數據寫對了再說

int password_system(){
	int account = 0; 
	while(1){
		int  i;
		char user_name[100]={"handsome_boy"};
		char user_password[100]={"520forever"};
		char input_name[100];
		char password[100];
		printf("\n\n\n\n\n\n\n\t\t\t\t\t");
		printf(" \n\t\t\t\t\tThe user name:");	
		scanf("%s", input_name); 
		printf(" \n\t\t\t\t\tPlease enter you password(10位): ");
		for( i=0; i<10; i++){
			password[i] = getch();
			printf("*");
		}
		password[i] = 0;
		if(strcmp(user_name,input_name)==0 && strcmp(user_password,password)==0){
			return -1;
		}
		else{
			account++;
			if(account == 3){
				system("cls");
				printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t");
				printf(" \n\n\n\t\t\t\t\t\tToo many entries, account frozen!\n\n");
				printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
				return 0;
			}			
			system("cls");
			printf("\n\n\n\n\n\n\n\t\t\t\t\t");
			printf(" \n\t\t\t\t\tUsename and password do not match!\n\n\t\t\t\t\tplease enter again.\n\n");			
			Sleep(3000);
			system("cls");
		}
	}	
}

/*打印所有鏈表*/
void printList(struct Node*headNode){
	struct Node*pMove = headNode->next;
	/*設計到數據的處理*/ 
	printf("姓名\t\t年齡\t性別\t體溫\t\t入院時間\t電話\t\t家庭住址\t家庭收入\talive(T/F/C)\n");
	while(pMove){
		pMove->data.temper =  pMove->data.temper*1.0;
		printf("\n%s\t\t%d\t%s\t%.1lf\t\t%d年%d月%d日\t%s\t%s\t\t%.2lf\t%c\n",
				pMove->data.name, pMove->data.age,  pMove->data.sex, pMove->data.temper,  pMove->data.period.year, pMove->data.period.month, pMove->data.period.day, pMove->data.tel ,pMove->data.address, pMove->data.income, pMove->data.alive);
		pMove = pMove->next;
	}
	printf("\n");
} 
/*打印患者*/ 
void printList_T(struct Node*headNode){
	struct Node*pMove = headNode->next;
	/*設計到數據的處理*/ 
	printf("姓名\t\t年齡\t性別\t體溫\t\t入院時間\t電話\t\t家庭住址\t家庭收入\talive(T/F/C)\n");
	while(pMove){
		pMove->data.temper =  pMove->data.temper*1.0;
		if(pMove->data.alive == 'T'){
			printf("\n%s\t\t%d\t%s\t%.1lf\t\t%d年%d月%d日\t%s\t%s\t\t%.2lf\t%c\n",
					pMove->data.name, pMove->data.age,  pMove->data.sex, pMove->data.temper,  pMove->data.period.year, pMove->data.period.month, pMove->data.period.day, pMove->data.tel ,pMove->data.address, pMove->data.income, pMove->data.alive);			
		}
		pMove = pMove->next;
	}
	printf("\n");
} 
/*創建表*/ 
struct Node *createList(){
	/*用結構體變量表示表頭*/ 
	/*指針--->變量  動態內存申請*/ 
	struct Node *headNode = (struct Node *)malloc(sizeof(struct Node));
	/*表頭:做差異化處理  數據域data 不做初始化*/ 
	headNode->next = NULL;

	return headNode;
} 

/*創建節點*/ 
struct Node* createNode(struct patient data){
	struct Node*newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;
	return newNode; 		
} 

/*插入節點*/
void insertNode(struct Node*headNode, struct patient data){
	struct Node*newNode = createNode(data);
	/*表頭法插入*/
	newNode->next = headNode->next;
	headNode->next = newNode; 
} 

/*刪除鏈表*/
void deletedata(struct Node*headNode,  char*name){
	//struct student 
	struct Node*posNode = headNode->next;
	struct Node*posFrontNode = headNode;
	if(posNode == NULL){
		printf(" \n\t\t\t\t\t數據爲空,無法刪除!\n");
		return;
	}
	/*姓名是字符串,字符串:strcmp */ 
	while(strcmp(posNode->data.name, name)){
		posFrontNode = posNode;
		posNode = posFrontNode->next;
		if(posNode ==NULL){
			printf(" \n\t\t\t\t\t未找到指定位置無法刪除!\n");
			return ;
		}
	}
	/*找到了*/
	posFrontNode->next = posNode->next;
	free(posNode);
} 

void code(char *filename){
	char c,t;
	FILE *fp1,*fp2;
	fp1=fopen("public_patient.txt","r");
	fp2=fopen("secret.txt","w");
	do{
		c=fgetc(fp1);
		t = c;
		c = c ^ KEY;
		if(t!=EOF){
		fprintf(fp2,"%c",c);			
		}
	}while(t!=-1);
	fclose(fp1);
	fclose(fp2);
}

char *dcode(char *filename){
	char c,t;
	FILE *fp1,*fp2;
	fp1=fopen("secret.txt","r");
	fp2=fopen("public_patient.txt","w");
	do{
		c=fgetc(fp1);
		t = c;
		c = c ^ KEY;
		if(t!=EOF){
			fprintf(fp2,"%c",c);			
		}
	}while(t!=-1);	
	fclose(fp1);
	fclose(fp2);
	return "public_patient.txt";
}

void delate_file(){
	if( remove("public_patient.txt") != 0 ){
		system("cls");
		Sleep (2000);
		printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t");
		printf("The decrypted file exists! Dangerous! please delate it by hand!");
		printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
	}
}

/*鏈表的存儲:文件讀操作*/
void readInfoFromFile(struct Node*headNode, char *fileName){
	fileName = dcode(fileName);	/*public_patient.txt*/
	/* 1. 打開*/ 
	FILE *fp;
	struct patient data;/*先把文件讀到data中去,在讀到鏈表中去*/ 
	fp = fopen(fileName, "r");/*這個方式是不會創造文件的*/ 
	if(fp == NULL){
		fp = fopen(fileName, "w+");/*這個方式能創造文件的*/
	}
	/*2. 讀文件*/
	/*先把文件讀到data中去,在讀到鏈表中去*/
		/*將文件當作輸入設備*/ 
	while(fscanf(fp, "%s\t%d\t%s\t%lf\t\t%d %d %d\t%s\t%s\t%lf\t%c\n",
	  data.name, &data.age, data.sex, &data.temper, &data.period.year, &data.period.month, &data.period.day, data.tel, data.address, &data.income, &data.alive) != EOF){
						/*製表符\t*/       /*在讀到鏈表裏去*/ 
		insertNode(headNode, data);	
	} 
	/* 3.關閉文件*/
	fclose(fp); 
} 

/*鏈表的讀取:文件寫操作*/
void writeInfoToFile(struct Node*headNode, char*fileName){
	FILE *fp;
	fp = fopen(fileName, "w");/*已清空的方式*/ /*w+是追加的方式*/ 
	if(fp == NULL){
		printf("文件打開失敗!");
		return ; 
	}
	struct Node *pMove = headNode->next;
	while(pMove){
		fprintf(fp, "%s\t%d\t%s\t%lf\t\t%d %d %d\t%s\t%s\t%lf\t%c\n",
					 pMove->data.name, pMove->data.age,  pMove->data.sex, pMove->data.temper,  pMove->data.period.year, pMove->data.period.month, pMove->data.period.day, pMove->data.tel, pMove->data.address, pMove->data.income, pMove->data.alive);
		pMove = pMove->next;
	}
	fclose(fp);
	code(fileName);
//	delate_file(fileName);
}

/*查找功能*/
struct Node *search(struct Node* headNode, char *name){
	struct Node *pMove = headNode->next;
	while(strcmp(pMove->data.name, name)){
		pMove = pMove->next;
		if(pMove == NULL){
			return NULL;
		}
	}
	return pMove;
} 

/*修改功能*/ 	/*方法一*/ 
struct Node *modification (struct Node* headNode, char* name){
	if(search(headNode, name)==NULL){
		char name[50];
		printf(" \n\t\t\t\t\t本院無此病人\n");
		printf(" \n\t\t\t\t\t重新輸入患者姓名: "); 
		scanf("%s", name);
		modification(headNode, name);
	}
	else{
		struct patient data;
		deletedata(headNode, name);
		printf(" \n\t\t\t\t\t請重新輸入患者姓名,年齡,性別,體溫,入院時間, 電話, 家庭住址, alive(T/F/C)\n");
		fflush(stdin);/*清空緩衝區*/ 
		printf(" \n\t\t\t\t\t\t\t姓名:"); 			 scanf("%s", data.name);
		fflush(stdin);/*清空緩衝區*/
		printf(" \n\t\t\t\t\t\t\t年齡:"); 			 scanf("%d", &data.age);
		printf(" \n\t\t\t\t\t\t\t性別:"); 			 scanf("%s", data.sex);
		fflush(stdin);/*清空緩衝區*/
		printf(" \n\t\t\t\t\t\t\t體溫(攝氏度):"); 	 scanf("%lf", &data.temper);
		data.temper =  data.temper*1.0;/*確保溫度爲double型*/ 
		printf(" \n\t\t\t\t\t\t\t入院時間(年月日):");scanf("%d%d%d", &data.period.year, &data.period.month, &data.period.day);	
		printf(" \n\t\t\t\t\t\t\t電話:"); 		 	 scanf("%s", data.tel);
		fflush(stdin);/*清空緩衝區*/
		printf(" \n\t\t\t\t\t\t\t家庭住址:"); 		 scanf("%s", data.address);
		fflush(stdin);/*清空緩衝區*/
		printf(" \n\t\t\t\t\t\t\t家庭收入:");		 scanf("%lf", &data.income);
		fflush(stdin);/*清空緩衝區*/ 
 		printf(" \n\t\t\t\t\t\t\talive(T/F/C):");		 scanf("%c", &data.alive);
		fflush(stdin);/*清空緩衝區*/ 
		insertNode(headNode, data);		
	}
 
}
 


/*排序功能*/
void exchange(struct Node*now, struct Node*stop){
		struct Node*temp = (struct Node*)malloc(sizeof(struct Node));	
		strcpy(temp->data.name, stop->data.name);
		temp->data.age    		= stop->data.age;
		strcpy(temp->data.sex, stop->data.sex);
		temp->data.temper 		= stop->data.temper; 
		temp->data.period.year  = stop->data.period.year; 
		temp->data.period.month = stop->data.period.month; 
		temp->data.period.day   = stop->data.period.day;
		strcpy(temp->data.tel , stop->data.tel); 
		strcpy(temp->data.address , stop->data.address);
		temp->data.income       = stop->data.income;
		temp->data.alive		= stop->data.alive;
				
		strcpy(stop->data.name, now->data.name);
		stop->data.age    		= now->data.age;
		strcpy(stop->data.sex, now->data.sex);
		stop->data.temper 		= now->data.temper; 
		stop->data.period.year  = now->data.period.year; 
		stop->data.period.month = now->data.period.month; 
		stop->data.period.day   = now->data.period.day;
		strcpy(stop->data.tel , now->data.tel); 
		strcpy(stop->data.address , now->data.address);
		stop->data.income       = now->data.income;
		stop->data.alive		= now->data.alive;
		
		strcpy(now->data.name , temp->data.name);
		now->data.age    		= temp->data.age; 
		strcpy(now->data.sex , temp->data.sex);
		now->data.temper 		= temp->data.temper; 
		now->data.period.year   = temp->data.period.year; 
		now->data.period.month  = temp->data.period.month; 
		now->data.period.day    = temp->data.period.day; 
		strcpy(now->data.tel , temp->data.tel);
		strcpy(now->data.address , temp->data.address);
		now->data.income        = temp->data.income;
		now->data.alive		= temp->data.alive;
		free(temp);		
}

/*體溫排序功能*/
void sort_temper(struct Node*headNode){
	struct Node*now = headNode->next->next;
	struct Node*stop = headNode->next;
	while(stop->next){
		now = stop->next;
		while(now){
			if(stop->data.temper < now->data.temper){
				exchange(now, stop);
			}
			now = now->next;  
		}
		stop = stop->next;
	}	 
}
 
/*入院時間排序功能*/
void sort_time(struct Node*headNode){
	struct Node*now = NULL;
	struct Node*stop = headNode->next;
	while(stop->next){
		now = stop->next;
		while(now){
			if(stop->data.period.year > now->data.period.year){
				exchange(now, stop);
			}
			if(stop->data.period.year == now->data.period.year && stop->data.period.month > now->data.period.month ){
				exchange(now, stop);
			}
			if(stop->data.period.year == now->data.period.year && stop->data.period.month == now->data.period.month && stop->data.period.day > now->data.period.day ){
				exchange(now, stop);
			}
			now = now->next;  
		}
		stop = stop->next;
	}	 
} 

/*統計功能*/
void statistics(struct Node*headNode){
	struct Node*p = headNode->next;
	int count_alive  = 0;
	int count_dead   = 0; 
	int count_temper = 0; 
	int count_cure   = 0;
	int all          = 0;
	double alive, dead, cure;
	while(p){
		if(p->data.alive == 'T'){
			count_alive++;
			all++;
		}
		if(p->data.alive == 'F'){
			count_dead++;
			all++;
		}
		if(p->data.alive == 'C'){
			count_cure++;
			all++;
		}
		if(p->data.temper > 38.5){
			count_temper++;
		}
		p = p->next;	
	}
		alive = 1.0*(count_alive+count_cure)/all*100;
		dead  = 1.0*count_dead/all*100;
		cure  = 1.0*count_cure/all*100;
		printf(" \t\t\t\t\t患者人數:%d\n\n", count_alive);
		printf(" \t\t\t\t\t死亡人數:%d\n\n", count_dead);
		printf(" \t\t\t\t\t治癒人數:%d\n\n", count_cure);
		printf(" \t\t\t\t\t死亡率:%.1lf%%\n\n", dead);
		printf(" \t\t\t\t\t治癒率:%.1lf%%\n\n", cure);
		printf(" \t\t\t\t\t存活率:%.1lf%%\n\n", alive);
}

歡迎大佬們的建議呦 !

(贊贊贊)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章