(以我的课设进行讲解,我的课设)
一、你得想好自己要写什么系统,操作对象要有哪些属性。
我写的新冠疫情管理系统,操作对象就是人,属性都有以下
struct Data{ //信息 char name[20]; //姓名 int number; //学号 double temperature; //体温 (35-42) long long int id; //身份证号(18位) long long int phone;//电话号 (11位) char address[20]; //地址 };
二、还得考虑非法输入
例如,学号大于0,体温 (35-42),身份证号(18位),电话号 (11位)
你可以特别写个方法函数来考虑这些输入
行数 函数名 描述 129 readInt 用于从键盘中获取指定范围的整数,用于选择操作 142 readLong 用于从键盘中获取指定范围的长整数,用于输入操作 155 readDouble 用于从键盘中获取指定范围的实数,用于输入操作 168 readConfirmSelection用于从键盘中获取'y'或'n'
三、操作这些对象的功能方法
一般有添加、修改、插入、删除、查询、(功能(统计、排序))、打印报表、(文件操作),括号中依自己能力添加。
四、就是设计功能方法的代码
行数 功能 787 ~ 844 输入 846 ~ 904 修改 906 ~ 944 插入 945 ~ 985 删除 988 ~ 1101 查询 1107 viewSearch 查询界面 1171 ~ 1227 统计 1228 ~ 1299 排序 1340 Fuction 功能界面 1351 ~ 1385 输出 文件读取功能有点bug此处不罗列
五、考虑操作对象分几类,一般两类(普通用户,管理员)
我的操作对象分为 要接种的人User 和 管理这些信息的人Admin
六、然后就是考虑这两类人特有的功能方法
用户只能添加、修改、插入、打印报表 管理员可以添加、修改、插入、删除、查询、功能(统计、排序)、打印报表、文件操作
七、设计菜单界面
多个界面一环套一环 233 userview 用户界面 291 adminview 管理员界面 366 systemmain 系统界面
八、另外,你可以添加特有的功能
密码登录功能 187 mi 用于密码输入 214 daojishi 倒计时 403 help 帮助 介绍说明 416 User用户登录界面 605 Admin 管理员登录界面
九、根据你的需求进行修改
由于操作对象的属性不尽相同,方法类似,只需要改有关于属性数据的方法
43 数据结构体 属性不同引起 改属性(名字、类型) 784 数据输入 属性名字、类型不同引起 846 修改 属性名字、类型不同引起 1353 数据输出 属性名字、类型不同引起 查询、统计、排序功能需要依据某几个属性来修改 不同需求引起
十、 完整代码(后缀.c)
其余代码自行理解
/** 用户只能添加、修改、插入、打印报表 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<stdio.h> #include<stdlib.h> #include<string.h> #include <conio.h> #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]={0,0,0,0,0,0,0,0,0,0}; char word[10]={0,0,0,0,0,0,0,0,0,0}; 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]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 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]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 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]={0,0,0,0,0,0,0,0,0,0}; char word[10]={0,0,0,0,0,0,0,0,0,0}; 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]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 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]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 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'; } } } }