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

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

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

代码用.c文件存储

功能模块图



函数调用图



不足与改进

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<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];
  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';
        }
      }
  } 
}
相关文章
|
18天前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
14天前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
1月前
|
存储 编译器 C语言
【C语言】学生管理系统:完整模拟与实现(一)
【C语言】学生管理系统:完整模拟与实现
|
1月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
1月前
|
测试技术 C语言
【C语言】学生管理系统:完整模拟与实现(三)
【C语言】学生管理系统:完整模拟与实现
|
1月前
|
C语言
【C语言】学生管理系统:完整模拟与实现(二)
【C语言】学生管理系统:完整模拟与实现
|
3月前
|
存储 C语言
【C语言】C语言-宾馆客房管理系统(源码+论文)【独一无二】
【C语言】C语言-宾馆客房管理系统(源码+论文)【独一无二】
【C语言】C语言-宾馆客房管理系统(源码+论文)【独一无二】
|
3月前
|
存储 C语言
学生管理系统(C语言简单实现)
这篇文章是关于使用C语言实现一个简单的学生管理系统,包括文件的基本应用、数据结构设计、函数实现以及用户界面交互。
学生管理系统(C语言简单实现)
|
3月前
|
存储 数据可视化 数据安全/隐私保护
【C语言】C语言-成绩管理系统(管理员+教师+学生 源码)【独一无二】
【C语言】C语言-成绩管理系统(管理员+教师+学生 源码)【独一无二】
110 2
|
3月前
|
存储 数据可视化 C语言
【C语言】C语言-身份证管理系统(源码+注释)【独一无二】
【C语言】C语言-身份证管理系统(源码+注释)【独一无二】