学生信息管理系统

// 学生信息管理系统.cpp : Defines the entry point for the console application.

/*

 

题目三:学生信息管理系统设计

问题描述:学生的基本个人信息管理,其中个人信息应包含:姓名、性别、年龄、出生年月、家庭住址、班级、电话号码、宿舍号等

实现功能:具有整张信息表的浏览功能、整表输出到文件功能、个人信息的二次修改功能、新人员的基本信息的添加功能、删除实际人员基本信息功能、查询功能等

知 识 点:数组,指针、结构体、文件操作

    明:必须用到结构体和文件操作

 

 

 

 

程序代码如下:

*/

 

// 职工信息管理.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

#include "malloc.h"

#include "string.h"

 

int shouldsave=1;//用于学生信息的保存

 

struct student

{

 

    char name[15];//学生的姓名

 

    char sex[15];//学生的性别

 

    int age;//学生的年龄

 

    char birthday[15];//学生的出生年月

 

    char address[15];//学生的家庭住址

 

    char classes[15];//学生所在班级

 

    char tele[15];//学生的电话号码

 

    char num[15];//学生宿舍号

 

};

 

struct node

{

    struct student  data;

    struct node *next;//结构体指针

};

 

///主菜单

void menu()

{

    printf("/n/n/n");

    printf("************************************欢迎光临************************************/n");

    printf("/n/n");

    printf("/t/t 0  退出管理系统/n");

    printf("/t/t 1  录入学生信息/t/t  2 删除学生信息/n");

    printf("/t/t 3  查询学生信息/t/t  4 修改学生信息/n");

    printf("/t/t 5  保存学生信息/t/t  6 显示学生信息/n");

    printf("/n/n");

printf("********************************************************************************/n");

    printf("                                                      电信10709    tianmo       /n");

    printf("                                                      时候: 2009年7月10       /n");

 

}

 

//

void printstart()

{

printf("--------------------------------------------------------------------------------/n");

}

 

void wrong()

{

    printf("/n======>提示:输入错误!/n");

}

 

void nofind()

{

    printf("/n=====>提示:没有找到相应的学生!/n");

}

 

void printc()//用于输出学生的相关中文信息

{

    printf("姓名  性别 年龄   出生年月    家庭住址        班级       电话号码       宿舍号/n");

}

 

void printe(struct node *p)//用于输出学生信息

{

    printf("%s  %s   %d     %s    %s   %s   %s   %s/n",p->data.name,p->data.sex,p->data.age,p->data.birthday,p->data.address,p->data.classes,p->data.tele,p->data.num);

}

 

查找满足要求的节点

 

struct node *Locate(struct node *head,char findmess[],char nameornum[]) //该函数用于定位连表中符合要求的接点,并返回该指针

{

        struct node *r;

 

        if(strcmp(nameornum,"num")==0) // 按学生电话号码查询

       {

            r=head->next; //r链接在头指针里面

 

            while(r!=NULL)

           {

                         if(strcmp(r->data.tele,findmess)==0)

 

                         return r;//返回结点

 

                         r=r->next; //结点向后移动1

           }

       }

        else if(strcmp(nameornum,"name")==0) //按学生姓名查询

       {

                         r=head->next; //r链接在头指针里面

 

                         while(r!=NULL)

                      {

                                     if(strcmp(r->data.name,findmess)==0)

 

                                     return r; //返回结点

 

                                     r=r->next; //结点向后移动1

                      }

       }

        return 0;

}

录入学生信息/

 

void Add(struct node *head)

{

    struct node *p,*p1,*p2;

 

    char num[20];

 

    p1=head;//把头指针付给p1

 

    p2=p1->next;//p2连接在p1后面

 

    while(p1->next !=NULL)//p1放在最后

    {

       p1=p1->next; //结点向后移动一

    }

    while(1)//利用无穷循环

    {

       printf("/n");

 

       printf("请您输入学生电话号码(0返回上一级菜单):");

 

       scanf("%s",num);

 

       if(strcmp(num,"0")==0)//技术性处理返回主菜单

       {

           break;

       }

       while(p2)//利用循环在记录里面查找,看该学生电话号码是否已经存在

       {

           if(strcmp(p2->data.tele,num)==0)

           {

              printf("/n");

 

              printf("====>提示学生电话号码为'%s'已经存在,若要修改,请选择'4'/n",num);

 

              printf("/n");

 

              printstart();//调用函数

 

              printf("/n");

 

              printc();//调用函数

 

              printf("/n");

 

              printe(p2);//调用函数

 

 

              printstart();//调用函数

 

              printf("/n");

 

           }

 

           p2=p2->next;//结点向后移动1

       }

 

       p=(struct node *)malloc(sizeof(struct node));//申请一个动态存储区域,它的大小为sizeof(struct node)

 

       strcpy(p->data.tele,num);

 

       printf("请您输入学生的姓名:");

 

        scanf("%s",p->data.name); //注意:因为name是首地址,故不用加上'&'

 

        getchar(); //用于接收enter

 

       printf("请你输入学生的性别:");

 

        scanf("%s",p->data.sex);

 

        getchar();  //用于接收enter

 

        printf("请你输入学生的年龄:");

 

        scanf("%d",&p->data.age); //注意:因为age是整型数值,必须用上'&'

 

        getchar();  //用于接收enter

 

        printf("请你输入学生的出生年月:");

 

        scanf("%s",p->data.birthday);

 

        getchar();  //用于接收enter

 

        printf("请输入学生的家庭住址:");

 

        scanf("%s",p->data.address);

 

        getchar();  //用于接收enter

 

        printf("请输入所在的班级:");

 

        scanf("%s",p->data.classes);

 

        getchar(); //用于接收enter

 

        printf("请输入学生所在的宿舍号:");

 

       scanf("%s",p->data.num);

 

        getchar(); //用于接收enter

 

        p->next =NULL;//p后面指空

 

       p1->next =p;//p连接在p1的后面

 

       p1=p;//p赋给p1

 

       shouldsave=1;//用于后面的保存

 

    }

}

 

///

void  Qur(struct node *head) // 查询学生信息

{

     int sel;

 

     char findmess[20];

 

     struct node *p;

 

     if(head->next==NULL) //判断head后面是否连接有内容

     {

                  printf("/n=====>提示:没有学生信息可以查询!/n");

                

     }

 

     printf("/n=====>1按学生电话查找/n=====>2按学生姓名查找/n");

 

     scanf("%d",&sel);

 

     if(sel==1)//按学生电话查询

     {

                  printf("请你输入要查找的书籍的编号:");

 

                  scanf("%s",findmess);

 

                  p=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要查找学生电话的指针

 

                  if(p)

                {

                             printf("/t/t/t/t查找结果/n");

 

                             printstart(); //调用函数

 

                             printc();//调用函数

 

                             printe(p); //调用函数

 

                             printstart(); //调用函数

                }

                  else

                         nofind();

     }

     else if(sel==2) //按学生姓名查询

     {

              printf("请你输入要查找的职工名字:");

 

              scanf("%s",findmess);

 

              p=Locate(head,findmess,"name"); //调用locate函数,并且返回指向要查找学生名字的指针

 

              if(p)

             {

                          printf("/t/t/t/t查找结果/n");

 

                          printstart(); //调用函数

 

                          printc(); //调用函数

 

                          printe(p); //调用函数

 

                          printstart(); //调用函数

             }

              else

                          nofind();

     }

     else

           wrong();

}

///

void  Delete(struct node *head) //删除学生信息

{

          int sel;

 

          struct node *p1,*p2;

 

          char findmess[20];

 

         if(head->next==NULL) //判断head后面是否连接有内容

        {

                       printf("/n提示:没有学生信息可以删除!/n");

                    

        }

         printf("/n=====>1按学生电话删除/n=====>2按学生姓名删除/n");

 

         scanf("%d",&sel);

 

         if(sel==1)

        {

                        printf("请你输入要删除的学生的电话号码:");

 

                        scanf("%s",findmess);

 

                        p1=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要查找学生编号的指针

 

                        if(p1)

                     {

                                     p2=head;

 

                                     while(p2->next!=p1) //利用循环找到要指向删除学生电话的指针p1

                                 {

                                           p2=p2->next;

                                 }

 

                                     p2->next=p1->next; //p1后面的一个指针连接在p2->next,从而删除了p1->data.tele

 

                                     free(p1); //释放p1所占的内存

 

                                     printf("/n提示:该学生信息已经成功删除!/n");

 

                                     shouldsave=1; //用于后面的保存

                     }

                        else

                     {

                                 nofind();

                     }

        }

         else if(sel==2)

        {

                       printf("请你输入要删除的学生姓名:");

 

                       scanf("%s",findmess);

 

                       p1=Locate(head,findmess,"name"); //调用locate函数,并且返回指向要查找学生姓名的指针

 

                       if(p1)

                     {

                                     p2=head;

 

                                     while(p2->next!=p1) //利用循环找到要指向删除的学生的指针p1

                                 {

                                           p2=p2->next;

                                 }

 

                                     p2->next=p1->next; //p1后面的一个指针连接在p2->next,从而删除了p1->data.name

 

                                     free(p1); //释放p1所占的内存

 

                                     printf("/n提示:该学生信息已经成功删除!/n");

 

                                     shouldsave=1;//用于后面的保存

                     }

                       else

                     {

                                     nofind();

                     }

        }

         else

            

            wrong();

}

///

void  Modify(struct node *head) //学生信息的修改

{

           struct node *p;

 

            char findmess[20];

 

            if(head->next==NULL)

           {

                             printf("/n=====>提示:没有资料可以修改!/n");

 

           }

 

            printf("请你输入要修改的学生电话号码:");

 

            scanf("%s",findmess);

 

            p=Locate(head,findmess,"num"); //调用locate函数,并且返回指向要修改学生的指针

 

           if(p)

          {

                          printf("请您输入新的学生电话号码:");

 

                          scanf("%s",p->data.tele); //注意:因为tele是首地址,故不用加上'&'

 

                          getchar(); //用于接收enter

 

                          printf("请您输入新的学生姓名:");

 

                          scanf("%s",p->data.name); //注意:因为name是首地址,故不用加上'&'

 

                          getchar(); //用于接收enter

 

                          printf("请您输入新的学生性别:");

 

                          scanf("%s",p->data.sex); 

 

                          getchar(); //用于接收enter

 

                          printf("请您输入新的学生年龄:");

 

                          scanf("%d",&p->data.age); //注意:因为age是整型数值,必须用上'&'

 

                          getchar(); //用于接收enter

 

                          printf("请您输入新的学生出生年月:");

 

                            scanf("%s",p->data.birthday);

 

                          getchar(); //用于接收enter

 

                          printf("请您输入新的学生家庭住址:");

 

                          scanf("%s",p->data.address);

 

                          printf("请您输入新的学生班级:");

 

                          scanf("%s",p->data.classes);

 

                          printf("请您输入新的学生宿舍号:");

 

                           scanf("%s",p->data.num);

 

                            printf("/n=====>提示:资料修改成功!/n");

 

                          shouldsave=1;

          }

          else

                     nofind();

}

///

void   Save(struct node *head) //保存学生工的相关信息

{

          FILE* fp;

 

          struct node *p;

 

          int flag=1,count=0;

 

          fp=fopen("D://student","wb"); //为输出打开一个二进制的文件

 

          if(fp==NULL)

         {

                    printf("/n=====>提示:重新打开文件时发生错误!/n");

 

                    exit(1); //注意:逃离函数,它在stdlib库里面

         }

 

          p=head->next; //p连接在head的后面

 

          while(p) //判断p是否为空,以便进行循环

         {

                     if(fwrite(p,sizeof(struct node),1,fp)==1) //p中的内容写到fp

                   {

                                   p=p->next; //p向后移动一

 

                                    count++;//用于统计保存学生信息记录的数目

                   }

                   else

                   {

                                   flag=0;

                                   break; //如果fwrite(p,sizeof(struct node),1,fp)返回值不是一,提前跳出循环

                   }

         }

         if(flag==1)

        {

                               printf("/n=====>提示:文件保存成功.(%d条记录已经保存)./n",count);

                               shouldsave=0;

        }

         fclose(fp); //关闭fp文件

}

 

 

///

void   Display(struct node *head) //用于显示保存的学生相关信息

{

             int count=0;

 

             struct node *p;

 

             p=head->next; //p连接在head的后面

 

             if(p==NULL)

            {

                        printf("/n=====>提示:没有资料可以显示!/n");

 

            }

             printf("/t/t/t/t    显示结果/n");

 

             printstart();

 

             printc();

 

             printf("/n");

 

             while(p) //利用循环把学生的所有信息全部显示

            {

                           printe(p);

 

                           p=p->next; //p向后移动一

            }

           printstart();

 

           printf("/n");

 

}

///

 

int main(int argc, char* argv[])

{

    printf("/n/n/t/t/t/t学生信息管理系统/n");

   

    FILE  *fp;

 

    int count=0,n;

 

    char jian,ch;

 

    struct node *head,*p1,*p2;

 

    head=p1=(struct node *)malloc(sizeof(struct node));

 

    p1->next=NULL;

 

    head=p1;

 

    if((fp=fopen("D://student","rb"))==NULL)

    {

       printf("文件还不存在,是否新建?(Y/N):");

 

           scanf("%c",&jian);

 

       if(jian=='Y'||jian=='y')

       {

           fp=fopen("D://student","wb");

       }

       else

       {

           exit(0);

       }

    }

   

    while(!feof(fp))//判断文件是否全部读完

    {

           p2=(struct node *)malloc(sizeof(struct node));

 

           if(fread(p2,sizeof(struct node),1,fp)) //把文件中的内容连接在链表里

           {

              p2->next=NULL;

 

              p1->next=p2;

 

              p1=p2; //关键的技术处理部分,否则会出现覆盖的问题

             

              count++;

           }

 

      

    }

 

    fclose(fp);

 

    while(1)

    {

       menu();

 

       printf("请您选择:");

 

       scanf("%d",&n);

 

       if(n==0)

       {

           getchar();

 

           printf("/n====>提示:资料已改动,是否将改动保存到文件中?(y/n)/n");

 

           scanf("%c",&ch);

 

           if(ch=='y'||ch=='Y')

 

           Save(head); //调用函数

 

           printf("/n=====>提示:您已经推出系统 !/n");

 

           break;

       }

 

           switch(n)

              {

                  case 1:Add(head);break;

 

                  case 2:Delete(head);break;

 

                  case 3:Qur(head);break;

 

                  case 4:Modify(head);break;

 

                  case 5:Save(head);break;

 

                  case 6:Display(head);break;

 

                  default:wrong();break;

              }

 

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值