高级语言程序综合课程设计实验报告

  • 格式:docx
  • 大小:288.04 KB
  • 文档页数:41

高级语言程序设计课题名称:学生信息管理系统实验报告1设计目的为了方便学校对学生的管理,处理好每个学生的个人信息,加强学校对学生的管理2总体设计组成框架:流程图:a)查询模块b)添加模块c)修改模块d)录入模块e)打印模块f)排序模块g)删除模块3详细设计(1)头文件,结构体定义及主函数#include<stdio.h>#include<stdlib.h>#include<string.h>#define M 100 //数组元素的个数struct stu //定义结构体类型{char num[15]; //学号char name[18]; //姓名int old; //年龄char sex[10]; //性别char birthday[10]; //出生日期char addr[20]; //居住地址char tele[15]; //联系电话char email[20]; //邮箱地址char nation[10]; //民族};int input(struct stu s[]);//输入学生信息void print(struct stu s[],int n);//显示所有信息void searchbynum(struct stu s[],int n);//按学号查询学生信息void searchbyname(struct stu s[],int n);//按姓名查询学生信息void search(struct stu s[],int n);//学生信息查询方式显示界面int insert(struct stu s[],int n);//插入新学生信息void save(struct stu s[],int n);//将输入的学生信息进行保存int load(struct stu s[]);//从文件中读取学生信息void modify(struct stu s[],int n);//按学号修改学生信息int del(struct stu s[],int n );//按学号删除学生信息void sort(struct stu s[],int n);//学生信息排序方式显示界面void sortbynum(struct stu s[],int n);//按学号对学生信息进行排序void sortbyold(struct stu s[],int n);//按年龄对学生信息进行排序int menu();//菜单函数void main(){struct stu student[M];//定义结构体数组int length;//保存学生个数for(;;)//无限循环switch(menu())//调用主菜单函数,返回值为整数,作为语句的条件{case 1: length=input(student);break;//输入case 2: print(student,length);break;//显示信息case 3: search(student,length);break;//查找case 4: length=insert(student,length);break;//插入case 5: modify(student,length);break;//修改case 6: length=del(student,length);break;//删除case 7: sort(student,length);break;//排序case 8: save(student,length);break;//保存case 9: length=load(student);break;//读文件case 10: printf("退出登录!");return;//如果菜单返回值为10,则结束程序default : printf("输入有误,请输入1-10的数字!\n");}}int menu(){int choice;printf(" \n 学生信息管理系统\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(" 10 退出\n");printf("***********************************************\n");do{printf("\n请输入您要选择的操作:");scanf("%d",&choice);}while(choice>10||choice<1);//选择项不在1-10之间重新选择return choice;//返回选择项,主程序根据返回值调用相应的函数}(2)输入函数int input(struct stu s[]){int i,n;printf("\n输入信息的学生个数:");scanf("%d",&n);printf("请输入学生各信息\n");for(i=0;i<n;i++){do{printf("请输入学号:");scanf("%s",s[i].num);if(strlen(s[i].num)>15)printf("input too long");}while(strlen(s[i].num)>15);do{printf("请输入姓名:");scanf("%s",s[i].name);if(strlen(s[i].name)>18)printf("input too long");}while(strlen(s[i].num)>18);printf("输入年龄:");scanf("%d",&s[i].old);printf("输入性别(girl/boy):");scanf("%s",s[i].sex);printf("出生日期输入按年/月/日(97/10/01)格式输入:");scanf("%s",s[i].birthday);printf("输入民族:");scanf("%s",s[i].nation);printf("输入居住地址:");scanf("%s",s[i].addr);do{printf("请输入联系电话:");scanf("%s",s[i].tele);if(strlen(s[i].tele)>15)printf("input too long");}while(strlen(s[i].tele)>15);do{printf("请输入邮箱地址:");scanf("%s",s[i].email);if(strlen(s[i].email)>20)printf("input too long");}while(strlen(s[i].email)>20);printf("\n");}return n;}(3)输出函数void print(struct stu s[],int n){int i;printf("学生信息如下:\n");printf("----------------------------------------------------------------------------------------------------------------------------\n");printf("学号姓名年龄性别出生日期民族居住地址联系电话邮箱地址\n");printf("----------------------------------------------------------------------------------------------------------------------------\n");for(i=0;i<n;i++){printf("%-16s%-10s%-10d%-10s%-16s%-10s%-11s%-17s%-16s\n",s[i].num,s[i].name,s[i].old,s[i].sex,s[i].birthday,s[i].nation,s[i].addr,s[i].tele,s[i].e mail);printf("----------------------------------------------------------------------------------------------------------------------------\n");}getchar();}(4)按学号查询函数void searchbynum(struct stu s[],int n){char num[15]; //存放学号的字符数组int i;printf("请输入学号");scanf("%s",num); //输入待查找的学号for(i=0;i<n;i++) //查找从第一条记录开始,直到最后一条记录为止if(strcmp(num,s[i].num)==0)//待查找的学号与数组中的记录学号比较,相等则显示找到的记录信息{printf("%s的学生信息如下\n",s[i].num);printf("----------------------------------------------------------------------------------------------------------------------------\n");printf("学号姓名年龄性别出生日期民族居住地址联系电话邮箱地址\n");printf("----------------------------------------------------------------------------------------------------------------------------\n");printf("%-16s%-10s%-10d%-10s%-16s%-10s%-11s%-17s%-16s\n",s[i].num,s[i].name,s[i].old,s[i].sex,s[i].birthday,s[i].nation,s[i].addr,s[i].tele,s[i].e mail);printf("----------------------------------------------------------------------------------------------------------------------------\n");}printf("\n查询成功\n");}(5)按姓名查询函数void searchbyname(struct stu s[],int n){char name[18]; //存放姓名的字符数组int i;printf("请输入姓名");scanf("%s",name); //输入待查找的姓名for(i=0;i<n;i++) //查找从第一条记录开始,直到最后一条记录为止if(strcmp(name,s[i].name)==0)//待查找的姓名与数组中的记录姓名比较,相等则显示找到的记录信息{printf("%s的学生信息如下\n",s[i].name);printf("----------------------------------------------------------------------------------------------------------------------------\n");printf("学号姓名年龄性别出生日期民族居住地址联系电话邮箱地址\n");printf("----------------------------------------------------------------------------------------------------------------------------\n");printf("%-16s%-10s%-10d%-10s%-16s%-10s%-11s%-17s%-16s\n",s[i].num,s[i].name,s[i].old,s[i].sex,s[i].birthday,s[i].nation,s[i].addr,s[i].tele,s[i].e mail);printf("----------------------------------------------------------------------------------------------------------------------------\n");}printf("\n查询成功\n");(6)查询方式选择函数void search(struct stu s[],int n) //查询方式显示界面{int m;printf("请选择查询方式\n");printf("**************************************\n");printf("1 按学号查询\n");printf("2 按姓名查询\n");printf("**************************************\n");printf("\n请输入您的选择:");scanf("%d",&m);switch(m){case 1:searchbynum(s,n);break;case 2:searchbyname(s,n);break;default : printf("输入有误,请输入1-2的选项!\n");}}(7)插入函数int insert(struct stu s[],int n){struct stu temp; //新插入记录信息char no[10]; //保存插入点位置的学号int i,j;printf("请输入插入点位置(1-%d)",n-1); //输入插入点学号scanf("%s",no);do{ //输入插入点各信息printf("请输入学号:");scanf("%s",temp.num);if(strlen(temp.num)>15)printf("input too long");}while(strlen(temp.num)>15);do{printf("请输入姓名:");scanf("%s",);if(strlen()>18)printf("input too long");}while(strlen(temp.num)>18);printf("输入年龄:");scanf("%d",&temp.old);printf("输入性别(girl/boy):");scanf("%s",temp.sex);printf("出生日期输入按年/月/日(97/10/01)格式输入:");scanf("%s",temp.birthday);printf("输入民族:");scanf("%s",temp.nation);printf("输入居住地址:");scanf("%s",temp.addr);do{printf("请输入联系电话:");scanf("%s",temp.tele);if(strlen(temp.tele)>15)printf("input too long");}while(strlen(temp.tele)>15);do{printf("请输入邮箱地址:");scanf("%s",temp.email);if(strlen(temp.email)>20)printf("input too long");}while(strlen(temp.email)>20);for(i=0;i<n;i++){if(strcmp(no,s[i].num)==0){for(j=n-1;j>=i;j--){strcpy(s[j+1].num,s[j].num);strcpy(s[j+1].name,s[j].name);strcpy(s[j+1].sex,s[j].sex);strcpy(s[j+1].addr,s[j].addr);strcpy(s[j+1].birthday,s[j].birthday);strcpy(s[j+1].tele,s[j].tele);strcpy(s[j+1].email,s[j].email);strcpy(s[j+1].nation,s[j].nation);s[j+1].old=s[j].old;}strcpy(s[i].num,temp.num);strcpy(s[i].name,);strcpy(s[i].sex,temp.sex);strcpy(s[i].addr,temp.addr);strcpy(s[i].birthday,temp.birthday);strcpy(s[i].tele,temp.tele);strcpy(s[i].email,temp.email);strcpy(s[i].nation,temp.nation);s[i].old=temp.old;break;//新记录已插入,结束循环}}printf("%s的学生信息已被插入\n",s[i].num);printf("------------------------------------------------------------存盘------------------------------------------------------------\n");//提示存盘n++;//记录数加1return n;//返回记录数}(8)删除函数int del(struct stu s[],int n ){char no[10]; //存放要删除记录的学号int i,j;printf("请输入要删除学生的学号");scanf("%s",no); //输入要删除记录的学号for(i=0;i<n;i++){if(strcmp(no,s[i].num)==0){for(j=i+1;j<n;j++){strcpy(s[j-1].num,s[j].num);strcpy(s[j-1].name,s[j].name);strcpy(s[j-1].sex,s[j].sex);strcpy(s[j-1].addr,s[j].addr);strcpy(s[j-1].birthday,s[j].birthday);strcpy(s[j-1].tele,s[j].tele);strcpy(s[j-1].email,s[j].email);strcpy(s[j-1].nation,s[j].nation);s[j-1].old=s[j].old;}break;}}n--;return n; //记录数减一}(9)修改函数void modify(struct stu s[],int n){char no[15],ch;int i;printf("请输入要修改学生的学号");scanf("%s",no);getchar(); //用getchar函数接收回车符,否则,回车将作为下一个字符或字符串变量的输入值for(i=0;i<n;i++)if(strcmp(s[i].num,no)==0)break;if(i>=n)printf("\n没有找到信息\n");else{printf("修改学号(y/n)?");ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入学号:");scanf("%s",s[i].num);getchar();}printf("修改姓名(y/n)?"); ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入姓名:");scanf("%s",s[i].name);getchar();}printf("修改年龄(y/n)?"); ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入年龄:");scanf("%d",&s[i].old);getchar();}printf("修改性别(y/n)?"); ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入性别:");scanf("%s",s[i].sex);getchar();}printf("修改民族(y/n)?");ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入民族:");scanf("%s",s[i].nation);getchar();}printf("修改出生日期(y/n)?"); ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入出生日期:");scanf("%s",s[i].birthday);getchar();}printf("修改居住地址(y/n)?"); ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入居住地址:");scanf("%s",s[i].addr);getchar();}printf("修改联系电话(y/n)?");ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入联系电话:");scanf("%s",s[i].tele);getchar();}printf("修改邮箱地址(y/n)?");ch=getchar();getchar();if(ch=='y'||ch=='Y'){printf("输入邮箱地址:");scanf("%s",s[i].email);getchar();}}printf("\n");return;}(10)排序函数void sort(struct stu s[],int n){int m;printf("请选择查询方式\n");printf("**************************************\n");printf("1 按学号排序\n");printf("2 按年龄排序\n");printf("**************************************\n");printf("\n请输入您的选择:");scanf("%d",&m);switch(m){case 1:sortbynum(s,n);break;case 2:sortbyold(s,n);break;default : printf("输入有误,请输入1-2的选项!\n"); }}a)按年龄排序;void sortbyold(struct stu s[],int n){int i,j;struct stu temp;for(i=1;i<n;i++){for(j=0;j<n-i;j++)if(s[j].old>s[j+1].old){strcpy(temp.num,s[j].num);strcpy(,s[j].name);strcpy(temp.sex,s[j].sex);strcpy(temp.addr,s[j].addr);strcpy(temp.birthday,s[j].birthday);strcpy(temp.tele,s[j].tele);strcpy(temp.email,s[j].email);strcpy(temp.nation,s[j].nation);temp.old=s[j].old;strcpy(s[j].num,s[j+1].num);strcpy(s[j].name,s[j+1].name);strcpy(s[j].sex,s[j+1].sex);strcpy(s[j].addr,s[j+1].addr);strcpy(s[j].birthday,s[j+1].birthday);strcpy(s[j].tele,s[j+1].tele);strcpy(s[j].email,s[j+1].email);strcpy(s[j].nation,s[j+1].nation);s[j].old=s[j+1].old;strcpy(s[j+1].num,temp.num);strcpy(s[j+1].name,);strcpy(s[j+1].sex,temp.sex);strcpy(s[j+1].addr,temp.addr);strcpy(s[j+1].birthday,temp.birthday);strcpy(s[j+1].tele,temp.tele);strcpy(s[j+1].email,temp.email);strcpy(s[j+1].nation,temp.nation);s[j+1].old=temp.old;}}printf("排序成功!");return;}b)按学号排序void sortbynum(struct stu s[],int n){int i,j;struct stu temp;for(i=1;i<n;i++){for(j=0;j<n-i;j++)if(strcmp(s[j].num,s[j+1].num)>0){strcpy(temp.num,s[j].num);strcpy(,s[j].name);strcpy(temp.sex,s[j].sex);strcpy(temp.addr,s[j].addr);strcpy(temp.birthday,s[j].birthday);strcpy(temp.tele,s[j].tele);strcpy(temp.email,s[j].email);strcpy(temp.nation,s[j].nation);temp.old=s[j].old;strcpy(s[j].num,s[j+1].num);strcpy(s[j].name,s[j+1].name);strcpy(s[j].sex,s[j+1].sex);strcpy(s[j].addr,s[j+1].addr);strcpy(s[j].birthday,s[j+1].birthday);strcpy(s[j].tele,s[j+1].tele);strcpy(s[j].email,s[j+1].email);strcpy(s[j].nation,s[j+1].nation);s[j].old=s[j+1].old;strcpy(s[j+1].num,temp.num);strcpy(s[j+1].name,);strcpy(s[j+1].sex,temp.sex);strcpy(s[j+1].addr,temp.addr);strcpy(s[j+1].birthday,temp.birthday);strcpy(s[j+1].tele,temp.tele);strcpy(s[j+1].email,temp.email);strcpy(s[j+1].nation,temp.nation);s[j+1].old=temp.old;}}printf("排序成功!");return;}(11)写入文件函数void save(struct stu s[],int n){FILE*fp; //定义指向文件的指针int i;if((fp=fopen("stu.txt","wb"))==NULL){printf("cannot open file \n");return;}else{for(i=0;i<n;i++)fwrite(&s[i],sizeof(struct stu),1,fp);//写入一条记录fclose(fp);//关闭文件printf ("保存成功\n");//显示保存成功}}(12)从文件读取信息函数int load(struct stu s[]) //将磁盘文件中的信息读入到内存中{FILE *fp;int n=0;if((fp=fopen("stu.txt","rb"))==NULL){printf("cannot open file \n");return 0;}else{if(fp!=NULL)while(!feof(fp)){fread(&s[n],sizeof(struct stu),1,fp);n++;}fclose(fp);printf ("成功读入文件中的信息\n");}return --n;}4调试与测试(1)输入学生信息输入需要输入的个数,然后输入学生各信息(2)查询学生信息按学号查询:输入学号201525503012按姓名查询,输入申卓(3)插入学生信息(4)修改学生信息输入学生学号201525503009,修改信息不准确的几项(5)删除学生信息删除结果显示:(6)学生信息排序排序前从文件中读取的信息表:(为对比明显,学生信息除学号及年龄外其他都填*)选择排序方式:按学号排序浏览:按年龄排序:(7)学生信息写入文件在进行学生信息插入,删除,修改,操作后都需进行文件保存,这样才能保证学生信息随时可以变更(8)从文件读取学生信息:可保证随时查看输入了多少学生的信息,哪些学生信息输入过,方便新学生信息的插入从文件中读取出的信息:(9)退出登录:41。