学生信息管理系统

问题描述:

     对学生信息进行增删改存等操作。

代码:

/********************************************** *文件名称:11.cpp *内容摘要:实现学生信息的添加,删除,排序,修改,查询,存入文件。 *当前版本:V1.0 *作者:白晓娟 *完成日期:20161229 *************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include "windows.h" #define N 100 typedef struct {     char name[20];//学生姓名     char sex[10];//性别     int id[20];//学号     int birthday[15];//出生日期 }AList; AList t[N];//要添加的新学生 AList e; typedef struct LNode {  AList data;     struct LNode *next; } Address; Address *h;//建立链表储存参数 int num1=0;//添加学生的个数 int num2=0; void Menu(); //主界面 void Input();//输入学生信息函数 void Output();//显示所有学生信息 void Delete();//删除学生信息 void Change();//修改学生信息 void Sort();//按照姓名进行排序操作 void File();//存入文件 void Readfile();//读出文件 void SecondMenu(); //查询选择界面 void NameFound();//通过学生姓名查找 void IdFound();//通过学号进行查找 void InitList(Address *&L);//创建空链表 bool ListInsert(Address *&L,int i,AList e);//向单链表中插入信息 void DispList(Address *L);//显示链表内容 void CreateListR(Address *&L, AList a[],int n); //尾插法建表即建立学生信息库 bool ListEmpty(Address *L);//链表是否为空 void DispName(Address *L);//显示姓名 int ListLength(Address *L);//求线性表的长度即学生个数 bool ListDelete(Address *&L,int i,AList &e);//删除 int LocateElem(Address *L,AList e);//获取元素位置(姓名) bool GetElem(Address *L,int i,AList &e);//获取元素位置 void InsertSort(Address *L,int n);//排序 void DestroyList(Address *&L);//销毁链表 int Name(Address *&L,int i,char newname[]);//修改学生姓名 int Sex(Address *&L,int i,char newsex[]);//修改性别 int Id(Address *&L,int i,int newid[]);//修改学号 int Birthday(Address *&L,int i,int newbirthday[]);//修改出生日期

 

/****************************************************************************************** *功能描述:main函数 ******************************************************************************************/ int main() {  InitList(h);  Menu();  DestroyList(h); return 0; }

/****************************************************************************************** *功能描述:输入学生信息 *输入参数:num1—需添加的联系人个数            name—学生姓名            sex—学生性别            id—学号            birthday—出生日期 ******************************************************************************************/ void Input() {

 if (num1==0)  {   printf("请输入要添加的学生个数: ");   scanf("%d",&num1);   for (int i=0; i < num1; i++)   {    printf("请输入第%d个学生的详细信息\n", i+1);    printf("姓    名: ");    scanf("%s", t[i].name);    printf("性    别: ");    scanf("%s", t[i].sex);    printf("学    号: ");    scanf("%s", t[i].id);    printf("出生日期: ");             scanf("%s", t[i].birthday);   }

    for (int j=0; j<num1; j++)  {   ListInsert(h,j+1,t[j]);  }            system("cls");     printf("**正在添加学生信息,请稍后......\n");     for(int i1=0;i1<15;i1++)     {                 Sleep(100);                 printf("**");     }       system("cls");      printf("添加完成!\n");  }  else  {          num2 = num1;   printf("请输入要添加的学生个数: ");          scanf("%d",&num1);       for (int i=num2; i < num2+num1; i++)    {       printf("请输入第%d个学生的详细信息\n", i+1);    printf("姓    名: ");    scanf("%s", t[i].name);    printf("性    别: ");    scanf("%s", t[i].sex);    printf("学    号: ");    scanf("%s", t[i].id);    printf("出生日期: ");             scanf("%s", t[i].birthday);           for (int j=num2; j<num2+num1;j++)     {               ListInsert(h,j+1,t[j]);     }              }      system("cls");      printf("**正在添加学生信息,请稍后......\n");      for(int i2=0;i2<15;i2++)      {                 Sleep(100);                 printf("**");      }   system("cls");   printf("添加完成!\n");      num1 = num2+num1;  }  Menu();

}

/****************************************************************************************** *功能描述:删除学生信息 *输入参数:m—想删除的联系人序号 ******************************************************************************************/ void Delete() {  int m;  printf("%s\n",(ListEmpty(h)?"输入错误!当前还未储存学生信息!\n":"\n"));  printf("当前共有%d个学生的信息:\n ",ListLength(h));  if(ListLength(h) == 0)  {  system("cls");  Menu();  }  else  {   printf("所有学生姓名如下: \n");   DispName(h);  }  printf("请输入你想删除的学生的序号(1——%d): ",ListLength(h));  scanf("%d",&m);  ListDelete(h,m,e);   printf("**正在删除学生信息,请稍后......\n");     for(int i2=0;i2<15;i2++)     {                 Sleep(100);                 printf("**");     }                 system("cls");              printf("删除成功!\n");              Menu();

}

/****************************************************************************************** *功能描述:按照姓名进行排序操作 ******************************************************************************************/ void Sort() {  printf("%s\n",(ListEmpty(h)?"没有学生信息!\n":"\n"));  printf("共有%d个学生信息!\n ",ListLength(h));  InsertSort(h,ListLength(h));  Menu(); }

 

/****************************************************************************************** *功能描述:修改学生信息 *输入参数:newsex—修改后的性别     newname—修改后的姓名     newid—修改后的学号     newbirthday—修改后的出生日期     change—需要修改的相应代码 ******************************************************************************************/ void Change() {  char newsex[10];  char newname[20];  int newid[15];  int newbirthday[10];  int change;  AList f;  printf("%s\n",(ListEmpty(h)?"输入错误!当前还未储存学生信息!\n":"\n"));  printf("当前共有%d个学生的信息:\n ",ListLength(h));

 if(ListLength(h) == 0)  {    system("cls");   Menu();  }  else  {   printf("所有学生姓名如下: \n");   DispName(h);  }  printf("请输入您需要修改的学生姓名: ");  scanf("%s",f.name);  printf("您要修改的学生的序号是%d\n",LocateElem(h,f));  printf("     ***********************请选择要修改的选项**************************\n");  printf("     *******************************************************************\n");  printf("     *                1.姓    名          2.性  别                      \n");  printf("     *******************************************************************\n");  printf("     *                3.学    号          4.出生日期                   *\n");  printf("     *******************************************************************\n");  printf("请输入要修改的选项代码: ");  scanf("%d",&change);  printf("\n");  if (change == 1)  {   printf("请输入新的姓名: ");   scanf("%s",newname);   Name(h,LocateElem(h,f),newname);

 }  else if (change == 2)  {   printf("请输入新的性别: ");   scanf("%s",newsex);   Sex(h,LocateElem(h,f),newsex);  }  else if (change == 3)  {   printf("请输入新的学号: ");   scanf("%s",newid);   Id(h,LocateElem(h,f),newid);  }  else if (change == 4)  {   printf("请输入新的出生日期: ");   scanf("%s",newbirthday);   Birthday(h,LocateElem(h,f),newbirthday);  }  else  {   printf("请重新输入正确选项!\n");  }

    system("cls");     printf("**正在修改,请稍后......\n");     for(int i=0;i<15;i++)  {        Sleep(100);         printf("**");  }     system("cls");     printf("修改成功!\n");     Menu(); } /****************************************************************************************** *功能描述:显示学生信息 ******************************************************************************************/ void Output() {  printf("%s\n",(ListEmpty(h)?"输入错误!当前还未储存学生信息!\n":"\n"));     DispList(h);     Menu(); }

/****************************************************************************************** *功能描述:存入文件 ******************************************************************************************/ void File() {       int num4;

    printf("请输入要保存的学生个数: ");  scanf("%d",&num4);  for (int i=0; i < num4; i++)  {   char ch ;   char cc='\n';   FILE *fp ;   /*  定义文件指针  */   if ((fp=fopen("student.txt","a+")) == NULL)   { /*  打开文件  */    printf("File open error!\n");    exit(0);   }   while ( (ch=getchar( ))!='\n')    fputc(ch, fp) ;   printf("请输入第%d个学生的详细信息\n", i+1);      printf("姓    名: ");   while ( (ch=getchar( ))!='\n')    fputc(ch, fp) ;   fputc(cc, fp) ;      printf("性    别: ");   while ( (ch=getchar( ))!='\n')    fputc(ch, fp) ;    fputc(cc, fp) ;      printf("学号: ");   while ( (ch=getchar( ))!='\n')    fputc(ch, fp) ;    fputc(cc, fp) ;      printf("出生日期: ");   while ( (ch=getchar( ))!='\n')    fputc(ch, fp) ;  fputc(cc, fp) ;   if (fclose(fp))   {    /*  关闭文件  */    printf ( "Can not close the file!\n" );  exit(0);   }  }  Menu(); }

/****************************************************************************************** *功能描述:读取文件 ******************************************************************************************/ void Readfile() {  char ch ;  FILE *fp ;//定义文件指针  if ((fp=fopen("student.txt","r")) == NULL)  { // 按读方式打开文件   printf("File open error!\n");   exit(0);  }  int num5;      printf("请输入要读取的学生个数: ");  scanf("%d",&num5);  for (int i=0; i < num5; i++)  {

    printf("姓名:\n");     ch= fgetc(fp);     while ( ch!='\n' )     {     //  读到的不是\n的话,继续读文件      putchar(ch) ;      ch=fgetc(fp);     }     printf("\n");    printf("性别:\n");     ch= fgetc(fp);     while ( ch!='\n' )     {     //  读到的不是\n的话,继续读文件      putchar(ch) ;      ch=fgetc(fp);

    }     printf("\n");    printf("学号:\n");     ch= fgetc(fp);     while ( ch!='\n' )     {     //  读到的不是\n的话,继续读文件      putchar(ch) ;      ch=fgetc(fp);

    }     printf("\n");    printf("出生日期:\n");     ch= fgetc(fp);     while ( ch!='\n' )     {     //  读到的不是\n的话,继续读文件      putchar(ch) ;      ch=fgetc(fp);     }     printf("\n");  }  if (fclose(fp))// 关闭文件  {   printf ( "Can not close the file!\n" );  exit(0);  }     Menu(); }

 

/*=================================================================================== *功能描述:创建空的链表 *输入参数:L—指针 *===================================================================================*/ void InitList(Address *&L) {  L=(Address *)malloc(sizeof(Address));  L->next=NULL; } /*=================================================================================== *功能描述:销毁线性表,修改信息 *输入参数:L—指针 *===================================================================================*/ void DestroyList(Address *&L) {  Address *p=L,*q=p->next;  while (q!=NULL)  {   free(p);   p=q;   q=p->next;  }  free(p); } /*=================================================================================== *功能描述:向单链表中插入信息 *输入参数:L—指针 *===================================================================================*/ bool ListInsert(Address *&L,int i,AList e) {  int j=0;  Address *p=L,*s;  while (j<i-1 && p!=NULL)  {   j++;   p=p->next;  }  if (p==NULL) /*未找到第i-1个结点*/   return false;  else   /*找到第i-1个结点*p*/  {   s=(Address *)malloc(sizeof(Address)); /*创建新结点*s*/   s->data=e;   s->next=p->next;      /*将*s插入到*p之后*/   p->next=s;   s->next = NULL;   return true;  } } /*=================================================================================== *功能描述:输出线性表,当线性表不为空时,顺序显示各节点值域 *输入参数:L—指针 *===================================================================================*/ void DispList(Address *L) {  Address *p=L->next;  while (p!=NULL)  {   printf("****************************************\n");   printf("*姓  名*:%s\n",p->data.name);   printf("*性  别*:%s\n",p->data.sex);   printf("*学  号*:%s\n",p->data.id);   printf("*出生日期*:%s\n",p->data.birthday);   printf("*************************************\n");   p=p->next;  }  printf("\n"); }

/*=================================================================================== *功能描述:尾插法建表即建立学生信息库 *输入参数:L—指针            a[]—数组            n—学生个数 *===================================================================================*/ void CreateListR(Address *&L, AList a[],int n) {  Address * s, * r;  int i;  L = (Address *)malloc(sizeof(Address));  r = L;  for (i = 0; i < n; i++)  {   s = (Address *)malloc(sizeof(Address));   s->data=a[i];   r->next = s;   r = s;  }  r->next = NULL; }

/*=================================================================================== *功能描述:判断线性表是否为空,即是是否储存了学生信息 *输入参数:L—指针 *===================================================================================*/ bool ListEmpty(Address *L) {  return(L->next==NULL); }

/*=================================================================================== *功能描述:显示所有学生的姓名 *输入参数:L—指针 *===================================================================================*/ void DispName(Address *L) {  int i=1;  Address *p=L->next;  while (p!=NULL)  {   printf("<%d>.%s\n",i,p->data.name);   p=p->next;   i = i+1;  }  printf("\n"); }

/*=================================================================================== *功能描述:求线性表的长度即学生个数 *输入参数:L—指针 *===================================================================================*/ int ListLength(Address *L) {  Address *p=L;int i=0;  while (p->next!=NULL)  {   i++;   p=p->next;  }  return(i); }

/*=================================================================================== *功能描述:删除单链表中的数据元素,即删除学生及其所有的详细信息。 *输入参数:L—指针            i—学生个数            e—指针 *===================================================================================*/ bool ListDelete(Address *&L,int i,AList &e) {  int j=0;  Address *p=L,*q;  while (j<i-1 && p!=NULL)  {   j++;   p=p->next;  }  if (p==NULL)    /*未找到第i-1个结点*/   return false;  else      /*找到第i-1个结点*p*/  {   q=p->next;    /*q指向要删除的结点*/   if (q==NULL)    return 0;   e=q->data;   p->next=q->next;  /*从单链表中删除*q结点*/   free(q);    /*释放*q结点*/   num1--;                 return true;  } }

/*=================================================================================== *功能描述:按照姓名查找信息 *输入参数:name—输入姓名进行查找 *===================================================================================*/ void NameFound() {  AList r;  AList f;  printf("按照姓名进行查找功能\n");  printf("请输入要查询的学生姓名: ");  scanf("%s",f.name);  system("cls");     printf("**正在查询,请稍后......\n");  for(int i=0;i<15;i++)  {     Sleep(100);     printf("**");  }  system("cls"); int a=LocateElem(h,f);  if (a!=0)  {      printf("你要查找的学生编号为%d\n",LocateElem(h,f));   printf("%s的详细信息如下:\n",f.name);   GetElem(h,LocateElem(h,f),r);  }  else  {   printf("该学生不存在!\n");}      SecondMenu(); }

/*=================================================================================== *功能描述:知道数据元素在单链表中的位置,学生位置 *输入参数:L—指针            e—指针 *===================================================================================*/  int LocateElem(Address *L,AList e) {   Address *p=L->next;   int n=1;   while (p!=NULL && strcmp(p->data.name,e.name) != 0)   {    p=p->next;    n++;   }   if (p==NULL)    return(0);   else    return(n); }

/*=================================================================================== *功能描述:查找某个位置的数据元素 *输入参数:L—指针            i—学生个数            e—指针 *===================================================================================*/ bool GetElem(Address *L,int i,AList &e) {  int j=0;  Address *p=L;  while (j<i && p!=NULL)  {   j++;   p=p->next;  }  if (p==NULL)

  return false;  else  {   e=p->data;   printf("******************************\n");   printf("*姓    名*: %s\n",e.name);   printf("*性    别*: %s\n",e.sex);   printf("*学    号*: %s\n",e.id);   printf("*出生日期*: %s\n",e.birthday);   printf("******************************\n");   return true;  } } /*=================================================================================== *功能描述:按照姓名进行排序 *输入参数:L—指针            n—序号            sort—数组            tmp—数组 *===================================================================================*/ void InsertSort(Address *L,int n) {      AList  sort[10];  char tmp[10]; int i1 = 0; int j;  Address *p=L->next;  while (p!=NULL)  {   for (int j = 0; j < n; j++)   {    strcpy(sort[j].name,p->data.name);   p=p->next;   }  }  printf("\n");  for (i1 = 0; i1 < n-1; i1++)  {       for (j= n-1; j>i1; j--)         if (strcmp(sort[j].name,sort[j-1].name)<0)       {           strcpy(tmp,sort[j].name);           strcpy(sort[j].name,sort[j-1].name);           strcpy(sort[j-1].name,tmp);       }

 }  printf("按姓名进行排序的结果如下: \n");  for (i1 = 0; i1 < n; i1++)  {   printf("<%d>.%s\n",i1,sort[i1].name);  } } /*=================================================================================== *功能描述:修改学生的姓名 *输入参数:L—指针            i—学生个数 *输出参数:newname—修改后的姓名 *===================================================================================*/ int Name(Address *&L,int i,char newname[]) {  int j=0;  Address *p=L,*q;  while (j<i-1 && p!=NULL)  {   j++;   p=p->next;  }  if (p==NULL)    /*未找到第i-1个结点*/   return 0;  else      /*找到第i-1个结点*p*/  {   q=p->next;    /*q指向要删除的结点*/   if (q==NULL)    return 0;   strcpy(q->data.name,newname);   return 1;  } } /*=================================================================================== *功能描述:修改学生的性别 *输入参数:L—指针            i—学生个数 *输出参数:newsex—修改后的姓名 *===================================================================================*/ int Sex(Address *&L,int i,char newsex[]) {  int j=0;  Address *p=L,*q;  while (j<i-1 && p!=NULL)  {   j++;   p=p->next;  }  if (p==NULL)    /*未找到第i-1个结点*/   return 0;  else      /*找到第i-1个结点*p*/  {   q=p->next;    /*q指向要删除的结点*/   if (q==NULL)    return 0;   strcpy(q->data.sex,newsex);   return 1;  } } /*=================================================================================== *功能描述:修改学生的学号 *输入参数:L—指针            i—学生个数 *输出参数:newid—修改后的学号 *===================================================================================*/ int Id(Address *&L,int i,int newid[10]) {  int j=0;  Address *p=L,*q;  while (j<i-1 && p!=NULL)  {   j++;   p=p->next;  }  if (p==NULL)    /*未找到第i-1个结点*/   return 0;  else      /*找到第i-1个结点*p*/  {   q=p->next;    /*q指向要删除的结点*/   if (q==NULL)    return 0;   q->data.id[100]=newid[100];   return 1;  } } /*=================================================================================== *功能描述:修改学生的出生日期 *输入参数:L—指针            i—学生个数 *输出参数:newbirthday—修改后的出生日期 *===================================================================================*/ int Birthday(Address *&L,int i,int newbirthday[15]) {  int j=0;  Address *p=L,*q;  while (j<i-1 && p!=NULL)  {   j++;   p=p->next;  }  if (p==NULL)    /*未找到第i-1个结点*/   return 0;  else      /*找到第i-1个结点*p*/  {   q=p->next;    /*q指向要删除的结点*/   if (q==NULL)    return 0;   q->data.birthday[15]=newbirthday[15];   return 1;  } }

 

/****************************************************************************************** *功能描述:主界面 *输入参数:option1—菜单选择 *输出参数: *返回值: ******************************************************************************************/ void Menu() {    int option1;  printf("\t #####################################################################\n");  printf("\t #                       学生信息管理系统                            #\n");  printf("\t #                                                                   #\n");  printf("\t #       1.添加            2. 删除         3.排序                    #\n");  printf("\t #                                                                   #\n");  printf("\t #       4.修改            5.显示          6.查询                    #\n");  printf("\t #                                                                   #\n");  printf("\t #       7.储存            8.读出          9.退出                    #\n");  printf("\t #####################################################################\n");  printf(" 请输入您的选择(1、2、3、4、5、6,7): ");  scanf("%d",&option1);  system("cls");   if (option1 < 1 || option1 >9)   {   printf("输入错误,请重新输入!/n");  printf("\t #####################################################################\n");  printf("\t #                       学生信息管理系统                            #\n");  printf("\t #                                                                   #\n");  printf("\t #       1.添加            2. 删除         3.排序                    #\n");  printf("\t #                                                                   #\n");  printf("\t #       4.修改            5.显示          6.查询                    #\n");  printf("\t #                                                                   #\n");  printf("\t #       7.储存            8.读出          9.退出                    #\n");  printf("\t #####################################################################\n");   printf(" 请输入 选择(1、2、3、4、5、6): ");   scanf("%d", &option1);   }    switch (option1)    {    case 1: Input();     break;    case 2: Delete();     break;    case 3: Sort();     break;    case 4: Change();     break;    case 5: Output();     break;    case 6: SecondMenu();     break;    case 7: File();     break;        case 8:Readfile();      break;     case 9:      break;    }

}

 

/****************************************************************************************** *功能描述:选择界面 *输入参数:option2—菜单选择 ******************************************************************************************/ void SecondMenu() {   int option2;      printf("\t ┌─────────────────────────────────┐\n");      printf("\t │                                                                  │\n");      printf("\t │    1.姓名查询                               2.返回主菜单         │\n");      printf("\t │                                                                  │\n");      printf("\t └─────────────────────────────────┘\n");   printf("请选择要的查询方式(1、2): ");   scanf("%d", &option2);   system("cls");   if (option2 < 1 || option2 > 2)   {   printf("输入错误,请重新输入!/n");      printf("\t ┌─────────────────────────────────┐\n");      printf("\t │                                                                  │\n");      printf("\t │    1.姓名查询                               2.返回主菜单         │\n");      printf("\t │                                                                  │\n");      printf("\t └─────────────────────────────────┘\n");   printf("请选择要的查询方式(1、2): ");   scanf("%d", &option2);   }    switch (option2)    {      case 1: NameFound();      break;      case 2: Menu();      break;   } }

 

部分运行结果:

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值