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);
}