实验报告
实验题目:使用C编程实现一个学籍管理系统 班级: 姓名:
1.程序设计与分析
要求程序能实现以下基本功能:
(1).提供基本的菜单选项,能根据不同的选项执行不同操作; (2).对学生信息进行录入,修改,删除、查询等操作; (3).对学生信息进行统计、排序等操作。
(4).采用数据类型:整型,浮点型,字符型,指针类型,结构体类型 (5).核心算法: #define MAX 10 //MAX代表学籍管理系统所能处理的最大学生数量,宏定义后,依据实际情况对程序的对应修改更易进行 //实际代码中是将子函数的定义写在了main函数的前面,但此处为了程序结构清晰将main函数写在了前面,因此main函数中没有子函数声明的语句 int main() { 进行各种类型的变量定义以及初始化,以供后续程序使用 定义一个结构体类型,并定义一个该类型的结构体变量用于存储将要录入的学生信息数据: struct Student { char Id[MAX];//学号 char name[50];//姓名 int clas;//班级 float score[4];//三科成绩以及总成绩 } student[MAX];
指导老师:
定义若干指针变量用于将main函数中的变量地址传递给各子函数,使子函数能够改变main函数中的变量的值 定义各种所需变量 定义整型变量mingling 定义一个变量num来记录总人数的变化并将其初始化为零 for(;;) { 输出主菜单选项 输入数字命令并赋值给整型变量mingling 判断 若mingling=1,执行函数input进行学生信息输入操作 若mingling=2,执行函数del进行学生信息删除操作 若mingling=3,执行函数selet进行学生信息选择输出操作 若mingling=4,执行函数order进行学生信息整体排序操作 若mingling=5,执行函数output进行学生信息全体输出操作 若mingling=6,执行break语句跳出for循环 } return 0; } void input(通过指针引用学生信息、当前学生总人数等数据) //我的源代码中每个子函数都是用了许多指针将结构体中的元素一一引用,此处可以改为利用指向结构体变量的指针,代码会简洁许多 { 利用指针来引用主函数中的学生信息变量 定义整型变量i用作循环 定义字符数组panduan[10]用作判断整个学生数据的录入操作是否结束 for(i=0;;i++) { 输出\输入学号 输出\输入班级 输出\输入姓名 输出\输入成绩1 输出\输入成绩2 输出\输入成绩3 将存储总成绩数据的变量赋值为成绩1,成绩2,成绩3的和 利用指针使main函数中记录学生人数的变量num自增1 输出\输入命令并赋值给字符数组panduan 判断字符串panduan与\是否相等 若相等则执行break语句跳出循环 } } void del(通过指针引用学生信息、当前学生总人数等数据) { 定义字符数组panduan[10]用于在已有学生信息中查找需要删除的对应学生信息 定义整型变量h用于判断是否找到了所需删除的学生信息 定义字符数组jueding[10]用于判断用户的删除操作是否全部结束 定义整型变量i用于进行循环查找所需删除的学生 //以下使用num的语句均指通过指针引用main函数中的num变量,为了书写简便,省略了指针引用的过程 for(;;) { h=0; 输入所需删除学生的信息关键字(姓名或学号) for(i=0;i<=num-1;i++) { 判断字符数组panduan中记录的关键字与第i+1个学生的姓名是否相同 若相同 { 则判断当前的学生信息总数是否为1 若为1,则执行break语句跳出循环 若不为1,则将第i+1个学生的所有信息依次与后一个学生的所有信息交换,直到将该学生信息交换至所有学生信息的最后一个记录处 按序输出num-1个学生的信息 利用指针使main函数中记录当前学生总数的变量num自减1 h=h+1; } 若不相同 { 判断字符数组panduan中记录的关键字与第i+1个学生的学号是否相同 若相同 { 则判断当前的学生信息总数是否为1 若为1,则执行break语句跳出循环 若不为1,则将第i+1个学生的所有信息依次与后一个学生的所有信息交换,直到将该学生信息交换至所有学生信息的最后一个记录处 } 判断h是否不等于0 若不等于0 { 则输出\输入命令并将命令赋值给字符数组jueding 判断字符串jueding与\是否相等 若相等则执行break语句跳出循环 } 若等于0 { 则按序输出num个学生的所有信息 执行break语句跳出循环 } } } void selet(通过指针引用学生信息、当前学生总人数等数据) { 按序输出num-1个学生的信息 利用指针使main函数中记录当前学生总数的变量num自减1 h=h+1; } 若不相同,不执行任何语句 }
char panduan1[10],jueding[10]; int panduan2,m; //panduan1用于存储输入的关键字,panduan2用于存储输入的关键字转换成对应整型数的数值,jueding用于判断整个选择过程是否结束,m用于判断是否找到了所需查找的学生 for(;;) { m=0; 输入查找关键字并将其赋值给字符数组panduan1 将panduan1中的数字字符转换为对应的整型数并将数值赋值给panduan2 在当前学生中循环查找学号与panduan1中数字字符串相同的学生,若找到则输出该学生所有信息,并使m++ 每次循环判断时若当前接受判断的学生学号与panduan1中数字字符串不相同,则继续判断其班级与panduan2存储的数值是否相等,若相等则输出该学生,并使m++ 循环查找结束后,判断m是否等于0,若为0,则输出\并执行break语句跳出循环 若不为0,则输出\输入命令并将命令字符赋给jueding[10] 判断字符串jueding是否与\相等,若相等则执行break语句跳出循环 } } void order(通过指针引用学生信息、当前学生总人数等数据) { 对当前存在的所有学生信息按照班级从小到大,同一班级内总成绩从大到小进行冒泡排序,排序结束后按序输出所有学生信息 } void output(通过指针引用学生信息、当前学生总人数等数据) { 将当前存在的所有学生信息按数组顺序循环输出 } 2.程序设计中存在的问题和解决思路
(1).由于为了在进行删除操作时比较方便进行输入数据的识别,我把学号和姓名都存储在字符数组中,结果在编写选择函数时由于要求输入班级或学号,而班级是存储在定义为整型的变量中的,因此出现了编写困难。
解决方法:预处理时包含了头文件stdlib.h,在编写选择函数时调用了atoi()函数,将存储学号信息的字符数组中的数字字符转换为对应的整型数,并将其存储在一个新的整型变量中,以供后续程序判断使用。
(2).这一版学籍管理系统的学生数据交换方式还可以改进,如果定义一个struct Student jiaohuan的结构体变量用来交换学生数据会简便许多
另外程序中指针的使用也不够熟练,只是起到了在主函数与子函数之间传递地址的作用,没有体现指针简化数据处理的作用,定义了太多指针去指向结构体中的各个元素,若定义为指向结构体变量的指针会好很多
(3).学籍管理系统的代码和算法优化仍在进行中,这一版不会是最后一版。。。 3.实验收获
对于程序的设计有了更加清晰的认识,对各种命令和数据类型的使用更加熟练,对于一个完整的学籍管理系统的设计有了清晰的思路。
对指针的运用更加熟练,对指针的作用有了更清晰的认识。(虽然代码中指针的运用比较肤浅,但是程序做完之后的思考和对有关知识的重温使我对指针有了更深的了解) 实际上为了用到所学的全部知识,这一版学籍管理系统用了很多不必要的算法,程序反而复杂了,但相对的因为使用到了这学期的几乎所有知识,所以对知识的掌握也上升了一个层次。
发现实现一定功能的程序其算法的多样性,不同的算法有不同的优点,使用的数据结构也有很大不同。
在编写程序的过程中对本学期的知识进行了系统的整理,巩固了所学的知识,为以后的继续学习打下了一个很好的基础。 4.程序的源代码清单 #include \#include \#include \#define MAX 10 void input(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu) { } void del(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu) int i; char panduan[10]; for(i=*renshu;i } } *renshu=*renshu-1; h=h+1; if(h!=0) { } else { for(m=0;m<=*renshu-1;m++) { printf(\scanf(\if(strcmp(jueding,\ break; printf(\m][1],*fen[m][2],*fen[m][3]); } void selet(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu) { char panduan1[10],jueding[10]; int panduan2,i,m; } } } break; for(;;) { m=0; scanf(\panduan2=atoi(panduan1); for(i=0;i<=*renshu-1;i++) { if(strcmp(hao[i],panduan1)==0) { printf(\i][1],*fen[i][2],*fen[i][3]); } else if(panduan2==*ban[i]) { m=m+1; printf(\i][1],*fen[i][2],*fen[i][3]); } if(m==0) { } printf(\break; } m=m+1; } } printf(\scanf(\if(strcmp(jueding,\ break; void order(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu) { int i,k,q,m; char c[10]; float f; for(k=1;k<=*renshu-1;k++) for(i=0;i<=*renshu-1-k;i++) if(*ban[i]>*ban[i+1]) { } for(k=1;k<=*renshu-1;k++) for(i=0;i<=*renshu-1-k;i++) if(*ban[k]==*ban[k+1]) q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q; strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c); strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c); for(m=0;m<=3;m++) { } f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f; if(*fen[k][3]<*fen[k+1][3]) { q=*ban[i];*ban[i]=*ban[i+1];*ban[i+1]=q; strcpy(c,hao[i]);strcpy(hao[i],hao[i+1]);strcpy(hao[i+1],c); strcpy(c,ming[i]);strcpy(ming[i],ming[i+1]);strcpy(ming[i+1],c); } for(i=0;i<=*renshu-1;i++) { for(m=0;m<=3;m++) { } f=*fen[i][m];*fen[i][m]=*fen[i+1][m];*fen[i+1][m]=f; printf(\i][1],*fen[i][2],*fen[i][3]); } void output(int *ban[MAX],char *ming[MAX],char *hao[MAX],float *fen[MAX][4],int *renshu) { int i; for(i=0;i<=*renshu-1;i++) { } printf(\i][1],*fen[i][2],*fen[i][3]); } } int main() { int *banji[MAX],*number,i,num,mingling; char *xingming[MAX],*xuehao[MAX]; float *chengji[MAX][4]; struct Student { char Id[10]; char name[50]; int clas; float score[4]; } student[MAX]; num=0; for(i=0;i<=MAX-1;i++) { } number=# banji[i]=&student[i].clas; xingming[i]=&student[i].name[0]; xuehao[i]=&student[i].Id[0]; chengji[i][0]=&student[i].score[0]; chengji[i][1]=&student[i].score[1]; chengji[i][2]=&student[i].score[2]; chengji[i][3]=&student[i].score[3]; for(;;) { printf(\your option\\n\ } } return 0; scanf(\if(mingling==1) input(banji,xingming,xuehao,chengji,number); if(mingling==2) del(banji,xingming,xuehao,chengji,number); if(mingling==3) selet(banji,xingming,xuehao,chengji,number); if(mingling==4) order(banji,xingming,xuehao,chengji,number); if(mingling==5) output(banji,xingming,xuehao,chengji,number); if(mingling==6) break; for(;;) { printf(\your option\\n\ } } return 0; scanf(\if(mingling==1) input(banji,xingming,xuehao,chengji,number); if(mingling==2) del(banji,xingming,xuehao,chengji,number); if(mingling==3) selet(banji,xingming,xuehao,chengji,number); if(mingling==4) order(banji,xingming,xuehao,chengji,number); if(mingling==5) output(banji,xingming,xuehao,chengji,number); if(mingling==6) break;