android-nuc / 18-C-Train

18级Android实验室(人工智能+移动互联) C语言培训
16 stars 10 forks source link

梁钰涵 (宿舍管理系统) #44

Closed woshiayu closed 5 years ago

woshiayu commented 5 years ago

题目名称

//头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//存储学生信息的结构体
typedef struct employee         
{
    int num;                    //学生号
    int rnum[5];                //学生房间号
    int bnum[3];                //学生床号 
    char name[10];              //学生姓名
    char sex[3];                //学生性别
    unsigned char age;          //学生年龄
    struct employee *next;
}EMP;

//全局变量
EMP *emp_first,*emp_end;        //定义指向链表的头结点和尾节点的指针
char gsave,gfirst;              //判断标示

//自定义函数声明
void addemp(void);                //添加学生信息的函数
void findemp(void);              //查找学生信息的函数
void delemp(void);              //删除学生信息的函数
EMP *findnum(int num);         //按学生学号查找学生信息

/**
*  学生信息添加
*/
void addemp()
{
    FILE *fp;               //声明一个文件型指针
    EMP *emp1;              //声明一个结构型指针
    int i=0;
    char choice='y';

    if((fp=fopen("employee.dat","ab"))==NULL)       //判断信息文件中是否有信息
    {
        printf("打开文件employee.dat出错!\n");
        getch();
        return;                                         
    }     

    do{
         i++;
         emp1=(EMP *)malloc(sizeof(EMP));           //申请一段内存
         if(emp1==NULL)                             //判断内存是否分配成功
         {
             printf("内存分配失败,按任意键退出!\n");
             getch();
             return;              
         }
         printf("请输入第%d个学生的信息,\n",i);
         printf("学号:");
         scanf("%d",&emp1->num);

         printf("姓名:");
         scanf("%s",&emp1->name);

         printf("性别:");
         scanf("%s",&emp1->sex);

         printf("年龄:");
         scanf("%s",&emp1->age);

         printf("房间号:");
         scanf("%s",&emp1->rnum);

         printf("床号:");
         scanf("%s",&emp1->bnum);

         emp1->next=NULL;
         if(emp_first==NULL)            //判断链表头指针是否为空
         {
             emp_first=emp1;
             emp_end=emp1;                   
         }else {
             emp_end->next=emp1;
             emp_end=emp1;      
         }

         fwrite(emp_end,sizeof(EMP),1,fp);  //对数据流添加数据项

         gfirst=0;
         printf("\n");
         printf("\n是否继续输入?(y/n)");
         fflush(stdin);                     //清除缓冲区
         choice=getch();

         if(toupper(choice)!='Y')           //把小写字母转换成大写字母
         {
             fclose(fp);                    //关闭文件流
             printf("\n输入完毕,按任意键返回\n");
             getch();
             return;                        
         }
         system("cls");      
    }while(1);
}

//删除 
void delemp()
{
    int findok=0;
    EMP *emp1,*emp2;
    char name[10],choice;
    system("cls");              //对屏幕清屏
    printf("\n输入要删除的学生姓名:");
    scanf("%s",name);

    emp1=emp_first;
    emp2=emp1;
    while(emp1)
    {
        if(strcmp(emp1->name,name)==0)
        {
            findok=1;
            system("cls");

            printf("学生:%s的信息如下:\n",emp1->name);
            printf("学号:%d\n",emp1->num);
            printf("姓名:%s\n",emp1->name);
            printf("性别:%s\n",emp1->sex);
            printf("年龄:%d\n",emp1->age);
            printf("房间号:%d\n",emp1->rnum);
            printf("床号:%d\n",emp1->bnum);
            printf("您真的要删除该学生吗?(y/n)");

            fflush(stdin);          //清除缓冲区
            choice=getchar();

            if(choice!='y' && choice!='Y')
            {
                return;
            }
            if(emp1==emp_first)
            {
                emp_first=emp1->next;
            }
            else
            {
                emp2->next=emp1->next;
            }
            printf("学生%s已被删除",emp1->name);
            getch();
            free(emp1);
            gsave=1;
            return;                           
        }  else{        
            emp2=emp1;
            emp1=emp1->next;
        }
    }    
    if(!findok)
    {
        printf("\n没有找到姓名是:%s的信息!\n",name);  //没找到信息后的提示
        getch();           
    } 
    return;
}

void displayemp(EMP *emp,char *field,char *name)
{
    if(emp)
    {
        printf("\n%s:%s信息如下:\n",field,name);
        printf("学号:%d\n",emp->num);
        printf("姓名:%s\n",emp->name);
        printf("性别:%s\n",emp->sex);
        printf("年龄:%d\n",emp->age); 
        printf("房间号:%d\n",emp->rnum);
        printf("床号:%d\n",emp->bnum);

    }else {
    printf("资料库中没有%s为:%s的学生!请重新确认!",field,name);
    }
    return;
}

/**
* 按照学生号查询
*/
EMP *findnum(int num)                   //声明一个结构体指针
{
   EMP *emp1;

   emp1=emp_first;
   while(emp1)
   {
       if(num==emp1->num)  return emp1;
       emp1=emp1->next;           
   }  
   return NULL;  
}

void menu()
{
    char choice;
    system("cls");
    do{
        printf("\n\t\t\t\t 学生管理系统\n\n");
        printf("\t\t\t-------------------------------------\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t1、输入学生信息\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t2、查询学生信息\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t3、显示学生信息\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t4、修改学生信息\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t5、删除学生信息\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t6、统计学生信息\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t7、重置系统密码\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t|  \t0、退出系统\t\t    |\n");
        printf("\t\t\t|\t\t\t\t    |\n");
        printf("\t\t\t-------------------------------------\n");
        printf("\n\t\t\t请选择您需要的操作:");

        do{
            fflush(stdin);
            choice=getchar();
            system("cls");
            switch(choice)
            {
                case '1':
                   addemp();        //调用学生信息添加函数
                   break;
                case '2':
                   if(gfirst)
                   {
                       printf("系统信息中无学生信息,请先添加学生信息!\n");
                       getch();
                       break;          
                   }  
                   findemp();       //调用学生信息查找函数
                   break;
                case '3':
                   if(gfirst)
                   {
                       printf("系统信息中无学生信息,请先添加学生信息!\n");
                       getch();
                       break;       
                   }
                   break;
               case '4':
                   if(gfirst)
                   {
                       printf("系统信息中无学生信息,请先添加学生信息!\n");
                       getch();
                       break;       
                   }
                   modifyemp();     //学生信息修改函数
                   break;
               case '5':
                    if(gfirst)
                   {
                       printf("系统信息中无学生信息,请先添加学生信息!\n");
                       getch();
                       break;       
                   }
                   delemp();        //删除学生信息的函数
                   break;
               case '6':
                    if(gfirst)
                   {
                       printf("系统信息中无学生信息,请先添加学生信息!\n");
                       getch();
                       break;       
                   }
                   break; 
                default:
                    printf("请输入0~7之间的数字");
                    getch();
                    menu();
            }                             
        } while(choice<'0'||choice>'7');  
        system("cls");
    }while(1);    
}

char *modi_field(char *field,char *content,int len)
{
     char *str;
     str=malloc(sizeof(char)*len);
     if(str==NULL)
     {
         printf("内存分配失败,按任意键退出!");
         getch();
         return NULL;             
     }
     printf("原来%s为:%s\n",field,content);
     printf("修改为(内容不要超过%d个字符!):",len);
     scanf("%s",str);     
     return str;
}

/*读取数据*/ 
void readdata(void)
{
    FILE *fp;
    EMP *emp1;

    if((fp=fopen("employee.dat","rb"))==NULL)
    {
        gfirst=1;
        return;                                        
    }     

    while(!feof(fp))
    {
        emp1=(EMP *)malloc(sizeof(EMP));
        if(emp1==NULL)
        {
            printf("内存分配失败!\n");
            getch();
            return;              
        }          

        fread(emp1,sizeof(EMP),1,fp);
        if(feof(fp))  break;

        if(emp_first==NULL)
        {
           emp_first=emp1;
           emp_end=emp1;                   
        }else{
            emp_end->next=emp1;
            emp_end=emp1;   
        }
        emp_end->next=NULL;
    }
    gfirst=0;
    fclose(fp);
}