C语言课程设计:新冠疫情管理系统

C语言课程设计:新冠疫情管理系统

代码用.c文件存储

功能模块图

C语言课程设计:新冠疫情管理系统_第1张图片

函数调用图

C语言课程设计:新冠疫情管理系统_第2张图片

不足与改进

1.1不足:密码系统是用二维数组来实现的,导致注册账户是临时的,退出程序时不会保存。
改进:若想账户永久可用,需要把密码功能改为用文件来存username和password
1.2不足:代码没有加密
改进:密码可以用异或运算来进行加密与解密
2.2不足:输入18位身份证号只是用整数存储,若末尾X无法存储。
改进:身份证号需用字符数组存储,之后,判断前17位是否为0至9,最后一位是否为0至9外加X
2.2不足:输入电话号只是用整数存储,只是判断它是否是数字1开始的11位整数,即大于等于10000000000小于等于19999999999
改进:电话号需用字符数组存储,之后,判断第1位是否1,剩余10位是否为0至9
3.不足:添加功能:如再一次使用此功能将会请空先前的数据
改进:需用把原链表复制到新链表,之后进行尾插法
4.不足:修改、插入、删除功能:只是根据结点的添加序号来进行的
改进:可以按照类似简单统计(即对温度查询)的方法来实现对某一关键字类进行修改、插入、删除的功能
5.不足:读取文件有乱码

/**

用户只能添加、修改、插入、打印报表
name 		yonghu1 	yonghu2
password 	yonghu1 	yonghu2
管理员可以添加、修改、插入、删除、查询、功能(统计、排序)、打印报表、文件操作
name 		guanli1 	guanli2
password 	guanli1 	guanli2
*/ 

/**

1.数据录入:录入系统基本数据,用链表组织;//1 添加 

2.数据存储:用文件的形式将录入的数据存储; //8 文件  1
3.数据读写:对文件中的数据可以进行读写操作; //8 文件  2

4.数据修改:可以对已存在的旧数据进行修改操作;//2 修改
5.数据插入:可以将新数据插入到任意指定的位置;//3
6.数据删除:可以对已存在的旧数据进行删除操作;//4
7.数据查询:按要求对数据进行查询,至少含两项//5
            简单查询以及一项组合查询;
8.数据统计:按要求对数据进行统计//6功能 1 
            含简单统计及综合统计;
9.数据排序:按要求对数据进行排序//6功能 1 
            含升序排序及降序排序;
10.数据报表:按要求对数据打印报表,//7 
             依规定的报表格式对数据打印报表;
11.界面:设计总体菜单界面。


*/ 

#include
#include
#include
#include 
#define N 10



/**
数据结构体 
*/ 
struct Data{
     			//信息 
	char name[20];		//姓名 
	int  number;		//学号 
	
	double temperature;	//体温 (35-42)
	long long int  id;	//身份证号(18位)
	long long int phone;//电话号 (11位) 
	char address[20];	//地址
	
	
};

/**
链表 
*/ 
typedef struct node{
     
	struct Data data; 
	struct node *next;
}Node,*LinkList;  

/**
链表初始化 
*/
LinkList InitList(){
     
	LinkList head;
	head=(Node*)malloc(sizeof(Node));
	head->next=NULL;
	return head;
}

int readInt(int n1,int n2);
long long int readLong(long long int n1,long long int n2);
char readConfirmSelection(); 

void systemmain();
void help();
void User ();
void Admin();

void mi(char word[]);

struct Data DataInput();//1.1
void CreatByRear(LinkList head);//1.2
void Modify(LinkList head,int i);//2.1
void viewModify(LinkList head);//2.2
void Insert (LinkList head,int i);//3.1
void viewInsert(LinkList h);//3.2
void Delete (LinkList head,int pos);//4.1
void viewDelete(LinkList h);//4.2
void SearchName(LinkList head,char name[]);//5.1.1
void viewSearchName(LinkList head);//5.1.2
void SearchNum(LinkList head,int number);//5.2.1
void viewSearchNum(LinkList h);//5.2.2
void SearchNameNum(LinkList head,char name[],int num);//5.3.1
void viewSearchNameNum(LinkList head);//5.3.2
void viewSearch(LinkList head);//5
void easycount(LinkList h,double t);//6.1.1
void vieweasycount(LinkList h);//6.1.2
void count(LinkList h,double t1,double t2);//6.2.1
void viewcount(LinkList h);//6.2.2
void viewascendingsort(LinkList h);//6.3
void viewdescendingsort(LinkList h);//6.4
void Fuction(LinkList h);//6
void DataOutput(struct Data data);//7.1
void OutPut(LinkList head);//7.2
void storage(); //8.1 
LinkList read();//8.2.1
LinkList viewread(LinkList h);//8.2.2
void write();//8.3
LinkList file(LinkList h);//8
void adminview(LinkList h); 

/**
main (创建单链表,调用view) 
*/ 
int main(){
     

	LinkList h;
	h=InitList();
	systemmain(h);
	
}

/**
用于从键盘中获取指定范围的整数,用于选择操作 
*/
int readInt(int n1,int n2){
     
	int n;
	scanf("%d",&n);
	while(n<n1||n>n2){
     
		printf("请重新输入:");
		scanf("%d",&n);	
	}
	return n;
}

/**
用于从键盘中获取指定范围的长整数,用于输入操作 
*/
long long int readLong(long long int n1,long long int n2){
     
	long long int n;
	scanf("%lld",&n);
	while(n<n1||n>n2){
     
		printf("请重新输入:");
		scanf("%lld",&n);	
	}
	return n;
}

/**
用于从键盘中获取指定范围的实数,用于输入操作 
*/
double readDouble(double n1,double n2){
     
	double n;
	scanf("%lf",&n);
	while(n<n1||n>n2){
     
		printf("请重新输入:");
		scanf("%lf",&n);	
	}
	return n;
}

/**
用于从键盘中获取'y'或'n' 
*/
char readConfirmSelection(){
     
	char c;
    for(; ;) {
     
    	fflush(stdin);
    	scanf("%c",&c);
        if(c=='y'||c=='n') {
     
            break;
        }else {
     
            printf("选择错误,请重新输入:");
        }
    }
    
	return c;
        
}

//用于密码输入 
void mi(char word[]){
     
	
	int i=0;
	int is_b=0;
	char c;
	while(1){
     
		c=_getch();
		if(c=='\r'){
     
			if(is_b==1){
     
				word[i]=0;
			}
			break;
		}else if(c=='\b'){
     
			is_b=1;
			printf("\b \b");
			--i;
		}else{
     
			word[i++]=c;
			printf("*");
		}
		
	}
	
	printf("\n");
	
}

//倒计时 
void daojishi (int a){
     
//	printf("请在%d秒后执行下一操作",a); 
//	system("color 0a");   //指定倒计时在运行时的颜色
	while(a>=0)
	{
     
//		system("cls");//清屏 
		printf("%d ",a);
		Sleep(1000);
		a=a-1;
	}
//	system("pause");//暂停程序     
	printf("\n");
} 

/**
用户界面 
参数 LinkList h
*/
void userview(LinkList h){
     
	char isFlag='y'; 
	while(isFlag!='n'){
     
				
		printf("****************用户管理系统****************\n"); 
		printf("                 1 添加\n"); 
		printf("                 2 插入\n"); 
		printf("                 3 修改\n"); 
		printf("                 4 列表\n");
		printf("                 5 退出\n");
		printf("请选择(1-5):");
		int selection;
		selection=readInt(1,5);
		
		switch(selection){
     
			
			case 1:
				printf("*************添加*************\n"); 
				CreatByRear(h);
				break;
				
			case 2:
				printf("*************插入*************\n"); 
				viewInsert(h);
				break;	
				
			case 3:
				printf("*************修改*************\n"); 
				viewModify(h);
				break;	
			
			case 4:
				printf("*************列表*************\n"); 
				OutPut(h);
				break;
		
			case 5:{
     
				getchar();
				printf("请确认是否退出(y或n):");
				char isExit;
				isExit=readConfirmSelection();
				if(isExit=='y'){
     
					isFlag='n';
				}
					
			}
		}
		 
	}
}



				
/**
管理员界面 
参数 LinkList h
*/
void adminview(LinkList h){
     
	char isFlag='y'; 
	while(isFlag!='n'){
     
		printf("******************管理员系统******************\n");
		printf("                 1 添加\n"); 
		printf("                 2 修改\n"); 
		printf("                 3 插入\n"); 
		printf("                 4 删除\n"); 
		printf("                 5 查询\n");
		printf("                 6 功能\n");
		printf("                 7 列表\n");
		printf("                 8 文件\n");
		printf("                 9 退出\n");
		printf("请选择(1-9):");
		int selection;
		selection=readInt(1,9);
		
		switch(selection){
     
			
			case 1:
				printf("*************添加*************\n"); 
				CreatByRear(h);
				break;
			case 2:
				printf("*************修改*************\n"); 
				viewModify(h);
				break;	
			case 3:
				printf("*************插入*************\n");
				viewInsert(h); 
				break;
			case 4:
				printf("*************删除*************\n"); 
			  	viewDelete(h);
				break;
			
			case 5:
//				printf("*************查询*************\n"); 
				viewSearch(h);
				break;	
			
			case 6:
//				printf("*************功能*************\n"); 
				Fuction(h);
				break;	
			case 7:
				printf("*************列表*************\n"); 
				OutPut(h);
				break;
			case 8:
//				printf("*************文件*************\n"); 
				h=file(h);
				break;
			case 9:{
     
				getchar();
				printf("请确认是否退出(y或n):");
				char isExit;
				isExit=readConfirmSelection();
				if(isExit=='y'){
     
					isFlag='n';
				}
					
			}
		}
		 
	}
}


/**
系统界面 
*/



void systemmain(LinkList h){
      
	while(1){
     
		printf("*******************新冠疫情管理系统*******************\n");
		printf("		    1用户登录\n");
		printf("		    2管理员登录\n");
		printf("		    3  帮助\n"); 
		printf("	            4  退出\n"); 
		printf("请输入(1-4):"); 
		int selection=0; 
		selection=readInt(1,4); 
		switch(selection){
     
			case 1:	
				User(h);
				break;
			case 2:
				Admin(h); 
				break;
			case 3:
				help(); 
				break;
			case 4:{
     
				
				printf("请确认是否退出(y或n):");
				char isExit;
				isExit=readConfirmSelection();
				if(isExit=='y'){
     
					return;
				} 
				
			}
				
		}
	}
	
}

//帮助 
void help(){
     
	
	printf("帮助\n");
	printf("用户手册:\n");
	printf("用户只能添加、修改、插入、打印报表\n");
	
	printf("管理员手册:\n");
	printf("管理员可以添加、修改、插入、删除、查询、功能(统计、排序)、打印报表、文件操作\n\n");
	
}

//用户登录界面 

void User(LinkList h){
     
	
	char username[10][N] = {
     "yonghu1","yonghu2"}; 
	char password[10][N] = {
     "yonghu1","yonghu2"};
	char name[10];
	char word[10];
	
	int n=2;
	while(1){
     
		
		printf("****************用户登录系统****************\n");
		printf("                   1登录\n");
		printf("                   2注册\n");
		printf("                   3退出\n");
		printf("请选择(1-3):");
		int choice;
		choice=readInt(1,3);
		switch(choice){
     
			case 1:{
     
			
				printf("登录\n");
			
	
				int signin=0; 
				while(1){
     
		
					printf("\t请输入账户名:\n");	
					printf("\t账户名:");
					scanf("%s",name);	
					printf("\n");
			
					int i=0;
					int isThree=1;
					for(i=0;i<n;i++){
     
				
						if( strcmp(username[i] , name) == 0)
						{
     
							printf("\t请输入密码:\n");
							printf("\t密码:");
//							scanf("%s",word);
							
							mi(word); 
							
							
								
							for(isThree=1;isThree<4;isThree++){
     
								
								if( strcmp( password[i] , word) == 0 )
								{
     				
									printf("\n\n");
									printf("\t*******************************\n");
									printf("\t*****  欢迎用户\"%s\"! *****\n",name);
									printf("\t*******************************\n");
									printf("\n\n");
									
									userview(h);
									signin=1;
									break;
		
								}
								else
								{
     
//									puts(word);
									if(isThree==3){
     
										printf("\t密码错误超过3次\n\n"); 
										break;
									}
									printf("\t密码错误,请在5秒后再次输入密码\n");
									printf("\t");
		                            daojishi(5);
									printf("\t请重新输入密码!\n");
									printf("\t密码:");
									mi(word);
									
									if( strcmp( password[i] , word) == 0 ){
     
									
										printf("\n\n");
										printf("\t*******************************\n");
										printf("\t*****  欢迎用户\"%s\"! *****\n",name);
										printf("\t*******************************\n");
										printf("\n\n");
										
										userview(h);
										signin=1;
										break;
									}
								}
							
							}	
						}
				
					}	 
			
			
					if(signin==1){
     
						break;
					}
					
					if(i==n){
     
						printf("\t账户名或密码错误\n");
						
						printf("\t 1重新输入账户名\n");
						printf("\t 2临时注册账户名\n");
						printf("\t 3     退出\n"); 
						printf("\t请输入:"); 
						int selection;
						selection=readInt(1,3);
						if(selection==1){
     
							;
						}else if(selection==2){
     
							while(1){
     
								printf("\t注册\n");
								printf("\t输入账户名:");
								scanf("%s",&username[n]); 
								printf("\t输入密码:"); 
								mi(password[n]);
								printf("\t请再次输入,以确认密码:");
								char twiceword[18];
								mi(twiceword);
								if(strcmp(password[n],twiceword)==0){
     
									printf("\t注册成功\n\n"); 
									n++;
									break;
								}else{
     
									printf("\t确认密码失败,重新注册\n");
								}
								
							}
						
							
						}else{
     
							break;
						}
			
					}
					
				
		
				} 
			
				break;
			}
			
			case 2:{
     
			
				while(1){
     
					printf("\t注册\n");
					printf("\t输入账户名:");
					scanf("%s",&username[n]); 
					printf("\t输入密码:"); 
					mi(password[n]);
					printf("\t请再次输入,以确认密码:");
					char twiceword[18];
					mi(twiceword);
					if(strcmp(password[n],twiceword)==0){
     
						printf("\t注册成功\n\n"); 
						n++;
						break;
					}else{
     
						printf("\t确认密码失败,重新注册\n");
					}
								
				}
				break;
			}
			case 3:{
     
				printf("请确认是否退出(y或n):");
				char isExit;
				isExit=readConfirmSelection();
				if(isExit=='y'){
     
					return;
				}
				
				
			}
				
		 
		
	
	
			
		}
	}		
		
		
}

//管理员登录界面 

void Admin(LinkList h){
     
	
	char name[10];
	char word[10];
	char username[10][N] = {
     "guanli1","guanli2"}; 
	char password[10][N] = {
     "guanli1","guanli2"};
	int n=2;
	while(1){
     
		
		printf("****************管理员登录系统****************\n");
		printf("                   1登录\n");
		printf("                   2注册\n");
		printf("                   3退出\n");
		printf("请选择(1-3):");
		int choice;
		choice=readInt(1,3);
		switch(choice){
     
			case 1:{
     
			
				printf("登录\n");
			
	
				int signin=0; 
				while(1){
     
		
					printf("\t请输入账户名:\n");	
					printf("\t账户名:");
					scanf("%s",name);	
					printf("\n");
			
					int i=0;
					int isThree=1;
					for(i=0;i<n;i++){
     
				
						if( strcmp(username[i] , name) == 0)
						{
     
							printf("\t请输入密码:\n");
							printf("\t密码:");
							mi(word);
							
							for(isThree=1;isThree<4;isThree++){
     
								
								if( strcmp( password[i] , word) == 0 )
								{
     				
									printf("\n\n");
									printf("\t*******************************\n");
									printf("\t*****  欢迎管理员\"%s\"! *****\n",name);
									printf("\t*******************************\n");
									printf("\n\n");
									
									adminview(h);
									signin=1;
									break;
		
								}
								else
								{
     
									if(isThree==3){
     
										printf("\t密码错误超过3次\n\n"); 
										break; 
									}
									printf("\t密码错误,请在10秒后再次输入密码\n");
									printf("\t");
		                            daojishi(10);
									printf("\t请重新输入!\n");
									printf("\t密码:");
									mi(word);
								
									if( strcmp( password[i] , word) == 0 ){
     
									
										printf("\n\n");
										printf("\t*******************************\n");
										printf("\t*****  欢迎管理员\"%s\"! *****\n",name);
										printf("\t*******************************\n");
										printf("\n\n");
										
										adminview(h);
										signin=1;
										break;
									}
								}
						
							}
						
						}	
				
					}	 
			
					if(signin==1){
     
						break;
					}
					
					if(i==n){
     
						printf("\t账户名或密码错误\n");
						
						printf("\t 1重新输入账户名\n");
						printf("\t 2临时注册账户名\n");
						printf("\t 3     退出\n"); 
						printf("\t请输入:"); 
						int selection;
						selection=readInt(1,3);
						if(selection==1){
     
							;
						}else if(selection==2){
     
							while(1){
     
								printf("\t注册\n");
								printf("\t输入账户名:");
								scanf("%s",&username[n]); 
								printf("\t输入密码:"); 
								mi(password[n]);
								printf("\t请再次输入,以确认密码:");
								char twiceword[18];
								mi(twiceword);
								if(strcmp(password[n],twiceword)==0){
     
									printf("\t注册成功\n\n"); 
									n++;
									break;
								}else{
     
									printf("\t确认密码失败,重新注册\n");
								}
							}
								
						}else{
     
							break;
						}
			
					}
					
					
		
				} 
			
				break;
			}
			
			case 2:{
     
				while(1){
     
					printf("\t注册\n");
					printf("\t输入账户名:");
					scanf("%s",&username[n]); 
					printf("\t输入密码:"); 
					mi(password[n]);
					printf("\t请再次输入,以确认密码:");
					char twiceword[18];
					mi(twiceword);
					if(strcmp(password[n],twiceword)==0){
     
						printf("\t注册成功\n\n"); 
						n++;
						break;
					}else{
     
						printf("\t确认密码失败,重新注册\n");
					}
				}
				
				break;
				
			}
			case 3:{
     
				printf("请确认是否退出(y或n):");
				char isExit;
				isExit=readConfirmSelection();
				if(isExit=='y'){
     
					return;
				}
				
				
			}
				
		 
		}
	}		
		
		
}




/**
1.1数据输入
返回类型 struct Data data
*/ 
struct Data DataInput(){
     
	
	struct Data data;
	printf("姓名:"); 
	scanf("%s",data.name);
	
	printf("学号:"); 
	data.number=readInt(1,1000000000);
	
	printf("体温(35-42):");
	double temperature; 
	temperature=readDouble(35,42);
	data.temperature=temperature;
	
	printf("身份证号(18位):"); 
	data.id=readLong(100000000000000000,999999999999999999);
	
	printf("电话号(11位):"); 
	data.phone=readLong(10000000000,19999999999);
	
	printf("地址:"); 
	scanf("%s",data.address);
	return data;
	
}

/**
1.2 尾插法 
参数类型LinkList head
 */
void CreatByRear(LinkList head){
     
	
	Node *r,*s;
	r=head;
	
	printf("**输入**\n");
	char isNext='y';
	int c=0;
	
	while(isNext=='y'){
     
		struct Data data;
		c+=1;
		printf("**%d**\n",c); 
		data=DataInput();
		s=(Node*)malloc(sizeof(Node));
		s->data=data;
		
		r->next=s;
		r=s;
		
		printf("是否下一个(y或n):");
		getchar();
		isNext=readConfirmSelection();
		
	} 
	r->next=NULL;
}

/**
2.1修改 
参数类型 LinkList head,int i
*/
void Modify(LinkList head,int i) {
     

	Node *p=head,*q;
	int j=0;
	while(j<i-1&&p){
     
		p=p->next;
		j++;
	}
	
	if(p==NULL||p->next==NULL){
     
		printf("无\n");
		return; 
	}
	
	q=p->next;
	struct Data olddata,newdata;
	olddata=q->data; 
	
	printf("输入新姓名(%s):",olddata.name); 
	scanf("%s",newdata.name);
	
	printf("输入新学号(%d):",olddata.number); 
	newdata.number=readInt(1,1000000000);
	
	printf("输入新体温(35-42)(%.2f):",olddata.temperature);
	double temperature;
	temperature=readDouble(35,42);
	newdata.temperature=temperature;
	
	printf("身份证号(18位)(%lld):",olddata.id); 
	newdata.id=readLong(100000000000000000,999999999999999999);
	
	printf("电话号(11位)(%lld):",olddata.phone); 
	newdata.phone=readLong(10000000000,19999999999);
	
	printf("地址(%s):",olddata.address); 
	scanf("%s",newdata.address);
	
	q->data=newdata;
}


/**
2.2 view 修改
参数类型 LinkList head

*/
void viewModify(LinkList head){
     
	
	printf("请输入修改第几个用户:");
	int n;
	scanf("%d",&n);
	Modify(head,n);
	 
} 

/**
3.1插入 
参数类型 LinkList head,int i
*/
void Insert (LinkList head,int i){
     
	Node *p=head,*s;
	int j=0;
	while(j<i-1&&p){
     
		p=p->next;
		j++;
	}
	if(p==NULL){
     
		printf("不能插入到第%d个\n",i);
		return;
	}
	if(p){
     
		struct Data data;
		printf("输入:\n");
		s=(Node*)malloc(sizeof(Node));
		data=DataInput();
		s->data=data;
		s->next=p->next;
		p->next=s;
	}
	
}

/**
3.2 view 插入
参数类型 LinkList h
*/
void viewInsert(LinkList h){
     
	
	printf("添加到第几个:"); 
	int i;
	scanf("%d",&i);
	Insert(h,i);
}

/**
4.1删除 
参数类型 LinkList head,int pos
*/
void Delete (LinkList head,int pos){
     
	Node *p=head,*q;
	int j=0;
	while(j<pos-1&&p){
     
		p=p->next;
		j++;
	}
	
	if(p==NULL||p->next==NULL){
     
		printf("无此用户\n");
	}
	else{
     
		q=p->next;
		p->next=q->next;
		free(q);
	}
}

/**
4.2 view删除 
参数类型 LinkList h
*/
void viewDelete(LinkList h){
     

	printf("删除第几个:"); 
	int pos;
	scanf("%d",&pos);
	
	getchar();
	printf("是否删除第%d个(y或n):",pos);
	char isDelete;
	isDelete=readConfirmSelection();
	if(isDelete=='y'){
     
		Delete(h,pos);
	} 
	
}


/**
5.1.1查询 姓名
参数类型 LinkList head,char name[]
*/ 
void SearchName(LinkList head,char name[]){
     
	
	Node *p=head->next;
	int isFound=0; 
	while(p){
     
		if(strcmp(p->data.name,name)!=0){
     
			p=p->next;
		} 
		else{
     
			DataOutput(p->data); 
			isFound=1;
			p=p->next;
		}
	}
	
	if(p==NULL&&isFound==0){
     
		printf("没有找到姓名是%s的人\n",name);
	}
}

/**
5.1.2 view 查询 姓名
参数类型 LinkList h
*/ 
void viewSearchName(LinkList h){
     
	
	printf("请输入查询的名字:"); 
	char name[20];
	scanf("%s",name);
	SearchName(h,name);
}

/**
5.2.1查询 学号 
参数类型 LinkList head,int number
*/ 
void SearchNum(LinkList head,int number){
     
	
	Node *p=head->next;
	int isFound=0; 
	while(p){
     
		if(p->data.number!=number){
     
			p=p->next;
		} 
		else{
     
			DataOutput(p->data); 
			isFound=1;
			p=p->next;
		}
	}
	
	if(p==NULL&&isFound==0){
     
		printf("没有找到学号是%d的人\n",number);
	}
}

/**
5.2.2 view 查询 学号 
参数类型 LinkList h
*/ 
void viewSearchNum(LinkList h){
     
	
	printf("请输入查询的学号:"); 
	int num; 
	scanf("%d",&num);
	SearchNum(h,num);
}


/**
5.3.1 查询 姓名&学号 
参数类型 LinkList head,char name[],int num
*/ 
void SearchNameNum(LinkList head,char name[],int num){
     
	
	Node *p=head->next;
	int isFound=0;
	while(p){
     
		if(strcmp(p->data.name,name)!=0||num!=p->data.number){
     
			p=p->next;
		} 
		else{
     
			DataOutput(p->data); 
			isFound=1;
			p=p->next;
		}
	}
	
	if(p==NULL&&isFound==0){
     
		printf("没有找到姓名是%s并且学号是%d的人\n",name,num);
	}
}

/**
5.3.2 view 查询 姓名&学号 
参数类型 LinkList h
*/ 
void viewSearchNameNum(LinkList h){
     
	
	printf("请输入查询的名字:"); 
	char name[20];
	scanf("%s",name);
	
	printf("请输入查询的学号:"); 
	int num;
	scanf("%d",&num);
	
	SearchNameNum(h,name,num);
	
}

/**
5 查询 姓名 或 学号 
按要求对数据进行查询,至少含两项简单查询以及一项组合查询;
参数类型 LinkList h           
*/
void viewSearch(LinkList h){
     

	char isFlag='y';
	
	while(isFlag!='n'){
     
		printf("*************查询*************\n");
		printf("          1 查询 姓名\n"); 
		printf("          2 查询 学号\n");
		printf("          3 查询 姓名&学号\n"); 
		printf("          4 查询 退出\n"); 
		printf("请选择(1-4):");
		
		int searchSelection;
		searchSelection=readInt(1,4);

		switch(searchSelection){
     
			
			case 1:
				printf("******查询 姓名******\n"); 
					viewSearchName(h); 
				break;
			case 2:
				printf("******查询 学号******\n"); 
					viewSearchNum(h); 
				break;	
			case 3:
				printf("****查询 姓名&学号****\n"); 
					viewSearchNameNum(h);
				break;
			case 4:
				getchar();
				printf("请确认是否退出查询(y或n):");
				char isExit;
				isExit=readConfirmSelection();
				if(isExit=='y'){
     
					isFlag='n';
				}
		}
	}
}
  

/**
6.1.1 数据统计:按要求对温度 进行简单统计  
参数类型 LinkList h,double t            
*/
void easycount(LinkList h,double t){
     
	
	Node *p=h->next;
	char isNull='y';
	
	while(p){
     
		if(p->data.temperature==t){
     
			DataOutput(p->data);
			isNull='n';
		}
		p=p->next;
	}
	
	if(isNull=='y'){
     
		printf("没有温度是%.2f的人\n",t);
	}
}

/**
6.1.2 数据统计:按要求对温度进行简单统计   
参数类型 LinkList h           
*/
void vieweasycount(LinkList h){
     
	
	printf("请输入温度(35-42):");
	double temperature;
	temperature=readDouble(35,42);
	
	easycount(h,temperature);
	
}

/**
6.2.1 数据统计:按要求对温度进行综合统计   
参数类型 LinkList h,double t1,double t2          
*/
void count(LinkList h,double t1,double t2){
     
	
	Node *p=h->next;
	char isNull='y';
	
	while(p){
     
		if(p->data.temperature>=t1&&p->data.temperature<=t2){
     
			DataOutput(p->data);
			isNull='n';
		}
		p=p->next;
	}
	
	if(isNull=='y'){
     
		printf("没有温度是%.2f-%.2f的人\n",t1,t2);
	}
	
}

/**
6.2 数据统计:按要求对温度进行综合统计   
参数类型 LinkList h           
*/
void viewcount(LinkList h){
     
	
	printf("请输入一个温度范围:\n"); 
	
	printf("请输入小温度(35-42):");
	double temperature1;
	temperature1=readDouble(35,42);
	
	printf("请输入大温度(%.2f-42):",temperature1);
	double temperature2;
	temperature2=readDouble(temperature1,42);
	
	count(h,temperature1,temperature2);
	
}

/**
升序(学号) 
*/ 
void viewascendingsort(LinkList head){
     

	Node *pb,*pf,temp;
	pf=head->next;
	if(head->next==NULL){
     
		printf("链表为空\n");
		return;
	} 
	if(head->next->next==NULL){
     
		printf("链表只存在一个结点,无需排序\n");
		OutPut(head);
		return;
	} 
	
	while(pf->next!=NULL){
     
		pb=pf->next;
		while(pb!=NULL){
     
			if(pf->data.number>pb->data.number){
     
				temp=*pf;
				*pf=*pb;
				*pb=temp;
				temp.next=pf->next;
				pf->next=pb->next;
				pb->next=temp.next;
			}
			pb=pb->next;
		}
		pf=pf->next;
	}
	OutPut(head);
	
}

/**
降序(温度) 
*/ 
void viewdescendingsort(LinkList head){
     
	
	Node *pb,*pf,temp;
	pf=head->next;
	if(head->next==NULL){
     
		printf("链表为空\n");
		return;
	} 
	if(head->next->next==NULL){
     
		printf("链表只存在一个结点,无需排序\n");
		OutPut(head);
		return;
	} 
	
	while(pf->next!=NULL){
     
		pb=pf->next;
		while(pb!=NULL){
     
			if(pf->data.temperature<pb->data.temperature){
     
				temp=*pf;
				*pf=*pb;
				*pb=temp;
				temp.next=pf->next;
				pf->next=pb->next;
				pb->next=temp.next;
			}
			pb=pb->next;
		}
		pf=pf->next;
	}
	OutPut(head);
	
}

/**
6 功能
参数 LinkList h
*/
void Fuction(LinkList h){
     
	
	char isFlag='y'; 
	while(isFlag!='n'){
     
		
		printf("*************功能*************\n");
		printf("          1 简单统计\n"); 
		printf("          2 综合统计\n"); 
		printf("          3 升序(学号)\n"); 
		printf("          4 降序(温度)\n"); 
		printf("          5 退出\n");
		
		printf("请选择(1-5):");
		int selection;
		selection=readInt(1,5);
		
		switch(selection){
     
				
			case 1:
				printf("******简单 统计******\n");  
				vieweasycount(h);
				break;
			case 2:
				printf("******综合 统计******\n"); 
				viewcount(h);
				break;
			case 3:
				printf("*********升序********\n"); 
				viewascendingsort(h);
				break;	
			case 4:
				printf("*********降序*********\n"); 
				viewdescendingsort(h);
				break;		
				
			case 5:
					getchar();
					printf("请确认是否退出(y或n):");
					char isExit;
					isExit=readConfirmSelection();
					if(isExit=='y'){
     
						isFlag='n';
					}
		} 
	} 
}


/**
7.1数据输出 
参数 struct Data data
*/
 void DataOutput(struct Data data){
     
	
	printf("姓名\t学号\t体温\t身份证号\t\t电话号\t\t地址\n"); 
	printf("%s  \t%d  \t%.2f\t %lld   \t%lld    \t%s\n",data.name,data.number,data.temperature,data.id,data.phone,data.address);

}

/**
7.2 链表输出 
参数 LinkList head
*/
void OutPut(LinkList head){
     
	
	Node *p;
	p=head->next;
	
	int c=0;
	if(p==NULL){
     
		printf("尚未添加\n"); 
	}
	
	while(p){
     
		c+=1;
		printf("**%d**\n",c);
		DataOutput(p->data); 
		p=p->next;
	}
	
}

/**
8.1数据存储:用文件的形式将录入的数据存储;
参数 LinkList head
*/
void storage(LinkList h){
     
	
	Node* p ;
	FILE* fp;
	char fileName[20];
	printf("请输入文件名:");
	scanf("%s",fileName);
	
	//异常预处理
	if (h->next == NULL)
	{
     
		printf("节点为空,保存失败\n");
		return;
	}
	
	//打开文件
	fp = fopen(fileName, "wt");
	if (fp== NULL)
	{
     
		printf("打开文件失败\n");
		return;
	}
	
	//保存操作	
	for(p=h->next;p!=NULL;p=p->next){
     
//	fwrite(&(p->data), sizeof(struct Data), 1, fp);
	fprintf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",p->data.name,p->data.number,p->data.temperature,p->data.id,p->data.phone,p->data.address);
//	fprintf(fp,"%s %d %.2f %lld %lld %s\n",p->data.name,p->data.number,p->data.temperature,p->data.id,p->data.phone,p->data.address);
	}
	
	//关闭文件 
	fclose(fp);
	printf("已保存\n"); 

}

/**8.2.1 
读取:对文件中的数据可以进行读取操作;读入到链表里 
返回 LinkList head
*/
LinkList read(){
     
	
	LinkList head;
	Node *r,*s;

	FILE *fp;
	
	char fileName[40];
	printf("请输入要读取的文件名:");
	scanf("%s",fileName);
	
	fp=fopen(fileName,"rt");
	if(fp==NULL){
     
		printf("读文件错误");
		return NULL;
	}
	
	head=InitList();
	r=head;
	
//	while(!feof(fp)){
     
	while(1){
     
	
	 	s=(Node*)malloc(sizeof(Node));
//	 	struct Data data;
	 	
	 	struct Data * data;
	 	//存放读取数据  
	 	
//	 	if(fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",data.name,&data.number,&data.temperature,&data.id,&data.phone,data.address)==EOF){
     
//	 		break;
//		 }
		
		if(fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",data->name,&data->number,&data->temperature,&data->id,&data->phone,data->address)==EOF){
     
			free(data);
			break;
		 }

//		fread(&data,sizeof(struct Data),1,fp);// 
	 	
//	 	fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s",data.name,&data.number,&data.temperature,&data.id,&data.phone,data.address);
//	 	fscanf(fp,"%s %d %.2f %lld %lld %s\n",data.name,&data.number,&data.temperature,&data.id,&data.phone,data.address);
//		char name[20];
//	 	int number;
//		double temperature;
//		long long int id;
//		long long int phone;
//		char address[20];
//		fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s",name,&number,&temperature,&id,&phone,address);
//		strcpy(data.name,name);
//		data.number=number;
//		data.temperature=temperature;
//		data.id=id;
//		data.phone=phone;
//		strcpy(data.address,address);
//		

		s->data=*data;
//	 	s->data=data;
	
	 	r->next=s;
	 	r=s;
	} 
	
	r->next=NULL;
	fclose(fp);
	
	return head;  

	
}

/**
8.2.2 view 读取 
参数 LinkList h 
*/
LinkList viewread(LinkList h){
     
	
	h=read();
	
	OutPut(h); 

	return h; 
}

/**
8.3
写入:对文件中的数据可以进行追加操作;
*/
void write(){
     
	
	FILE *fp; 
	char fileName[20];
	printf("请输入要写入的文件名:");
	scanf("%s",fileName);
	
	fp=fopen(fileName,"ab");
	if (fp== NULL)
	{
     
		printf("打开文件失败\n");
		return;
	}
	struct Data data;
	data=DataInput();
//	fwrite(&data,sizeof(struct Data),1,fp);
	fprintf(fp,"%s %d% .2f %lld% lld %s\n",data.name,data.number,data.temperature,data.id,data.phone,data.address);
//	fprintf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",data.name,data.number,data.temperature,data.id,data.phone,data.address);
		
	fclose(fp); 
	printf("已写入\n"); 
	

}

/**
8 文件 
参数 LinkList h
*/ 
LinkList file(LinkList h){
     

	char isFlag='y'; 
	while(isFlag!='n'){
     
		
		printf("*************文件*************\n");
		printf("          1 存储\n"); 
		printf("          2 读取\n"); 
		printf("          3 写入\n"); 
		printf("          4 退出\n"); 
		
		printf("请选择(1-4):");
		int selection;
		selection=readInt(1,5);
		
		switch(selection){
     
			case 1:
				printf("*********存储********\n"); 
				storage(h); 
				break;
			case 2:
				printf("*********读取*********\n"); 
				h=viewread(h);
				return h;
				break;	
			case 3:
				printf("*********写入*********\n");
				write();
				break;	
			case 4:
				getchar();
				printf("请确认是否退出(y或n):");
				char isExit;
				isExit=readConfirmSelection();
				if(isExit=='y'){
     
					isFlag='n';
				}
					
			}
	} 
}



你可能感兴趣的:(C,课程设计)