1、 C语言程序设计项目设计报告项目名称: 学生成绩信息管理系统 2016年 1月 13日目 录1 项目分析11.1 问题描述11.2 功能需求分析12 系统设计22.1 数据结构设计22.3部分功能设计23 系统实现源程序43.1 主函数设计43.2 添加学生信息53.3 姓名学号查询103.4 成绩查询123.5 删除学生成绩信息133.6 修改学生成绩信息144 功能测试164.1 菜单测试164.2 系统功能测试165 系统设计遇到的问题及解决方法216 项目设计总结221 项目分析1.1 问题描述信息储存与查询是计算机处理数据的优势之一,目前,学生信息的管理系统已经完全走进了校园,其中成
2、绩信息的储存是主要部分,本课题使用C语言实现学生成绩的储存,查询,修改,以及删除等操作。程序中涉及到数据块和文件指针的操作,包括结构体数据定义,使用及文件的读写,定位,修改等。1.2 功能需求分析学生成绩信息管理系统的主要功能如下:添加学生信息:录入学生的基本信息,如姓名,学号,成绩。显示所有学生成绩信息:直接显示已经全部录入学生的成绩信息。学号或姓名查询:可以根据学生的姓名和学号直接查询该名学生的成绩。成绩查询:可以根据一个特定的分数来查询学生的信息。删除学生成绩信息:可以直接根据学号确定是否删除对应学生的成绩信息。修改学生成绩信息:直接根据学生学号来修改学生的姓名,学号,成绩。学生成绩信息
3、管理系统添加学生信息显示所有学生成绩信息学号或姓名查询成绩查询删除学生成绩信息修改学生成绩信息重新添加信息继续添加信息图1-1 系统功能模块图2 系统设计2.1 数据结构设计struct stu/定义结构体类型char name10;/姓名char num10;/学号char score10;/成绩if(fp1=fopen(Ca1.txt,w)=NULL)/文件名,使用文件方式printf(信息写入失败);exit(0);char wjm20;/文件名2.2 函数设计表1 函数列表序号函 数 原 型功 能 说 明1void addnew()新增学生姓名,学号,成绩信息2void addold(
4、)在原有基础上继续增加其他同学的信息3void printall()显示所有已经存入学生的成绩等信息4void search()根据姓名或者学号查询学生分数5void jgsearch()根据成绩查询对应的同学6void del()删除学生信息7void modify()修改学生信息8system(“cls”);清屏2.3部分功能设计1.删除学生的信息,输入学生的学号进行删除操作,如果没有此人,系统将会提示无此人,如果找到,系统将会确认你是否需要删除,流程图如1-2所示。输出删除成功结束开始输入学号在文件里查找输出文件无此人确认删除输入1输入0是否找到YesNoYes图1-2 删除学生信息流程
5、图2.输入学号进行查询对应同学的成绩,流程图如图1-3所示。YesNo开始输入学号或姓名在文件中查找是否找到输出姓名,学号,成绩结束输出文件无此人记录图1-3 查询功能流程图3 系统实现源程序3.1 主函数设计void main()int x;system(cls);/*清屏*/doprintf(n 欢迎使用学生成绩信息管理系统nnnnn); printf( 1 -添加学生信息nn); printf( 2 -显示所有学生成绩信息nn); printf( 3 -学号或姓名查询nn);printf( 4 -成绩查询nn); printf( 5 -删除学生成绩信息nn);printf( 6 -修改学
6、生成绩信息nn);printf( 0 -退出);printf( 请您选择:);choice:scanf(%d,&x);switch(x)case 1:add();break;case 2:printall();break;case 3:search();break;case 4:jgsearch();break;case 5:del();break;case 6:modify();break;case 0:break;default:printf(n 错误的选择,请重新选择:);goto choice; while(x!=0);system(cls);printf(nn 欢迎再次使用学生成绩管
7、理系统n); 3.2 添加学生信息/*学生成绩信息管理系统*/#include #include #include int c,j,t;struct stu/*定义结构体类型*/ char name10;char num10;char score10;student100,newstudent100;/*添加学生个人信息*/ void addnew()int a,b,k;FILE *fp,*fp1,*fp2; /*FILE类型指针变量的定义形式*/ for(a=0;a200;a+)system(cls);printf( 欢迎使用学生成绩管理系统nnn);printf( 录入学生信息nn);pr
8、intf(输入学生姓名:);scanf(%s,&studenta.name);printf(输入学生学号:);scanf(%s,&studenta.num);printf(输入学生成绩:);scanf(%s,&studenta.score);printf(输入1继续,0结束n);/*判断输入是否结束*/ scanf(%d,&b);if(b=0)c=a;system(cls);break;if(fp1=fopen(Ca1.txt,w)=NULL)/*文件名,使用文件方式*/ printf(信息写入失败);exit(0);if(fp2=fopen(Ca2.txt,w)=NULL)printf(信息
9、写入失败);exit(0);if(fp=fopen(Ca3.txt,w)=NULL)printf(信息写入失败);exit(0);j=sizeof(struct stu);for(a=0;a=c;a+)if(fwrite(&studenta,j,1,fp)!=1)printf(存入失败!);for(a=0;a=c;a+)if(strcmp(studenta.score,80)=0)fwrite(&studenta,j,1,fp1);elsefwrite(&studenta,j,1,fp2);printf(添加成功!nn);printf(请输入0返回n);scanf(%d,&k);fclose(
10、fp1);fclose(fp2);fclose(fp);if(k=0)system(cls);/*继续添加成员*/void addold()int a,b,k,p,q;char wjm20;FILE *fp;j=sizeof(struct stu);system(cls);printf( 欢迎使用学生成绩信息管理系统nnn);printf( 录入学生信息nn);printf(nn存储文件名有 Ca1.txt Ca2.txt Ca3.txtnn);printf(请输入想继续添加的文件名:);scanf(%s,wjm);for(a=0;a200;a+)printf(输入学生姓名:);scanf(%
11、s,&newstudenta.name);printf(输入学生学号:);scanf(%s,&newstudenta.num);printf(输入学生成绩:);scanf(%s,&newstudenta.score);printf(输入1继续,0结束n);/判断输入是否结束scanf(%d,&b);if(b=0)c=a;system(cls);break;if(fp=fopen(wjm,r)=NULL)printf(文件打开失败!);exit(0);a=0;while(!feof(fp)fread(&studenta,j,1,fp);a+;fclose(fp);t=a-1;for(q=0,p=
12、t;q=c,p=t+c;q+,p+)strcpy(studentp.name,newstudentq.name);strcpy(studentp.num,newstudentq.num);strcpy(studentp.score,newstudentq.score);if(fp=fopen(wjm,w)=NULL)printf(文件打开失败!);exit(0);for(a=0;a=t+c;a+)if(fwrite(&studenta,j,1,fp)!=1)printf(存入失败!);printf(添加成功!nn);printf(请输入0返回n);scanf(%d,&k);fclose(fp)
13、;if(k=0)system(cls);void add()int x;system(cls);printf( 欢迎使用学生成绩信息管理系统nnn);printf( 添加学生信息nn);printf( 1 重新添加信息n);printf( 2 继续添加信息n);printf( 0 返回nnn);printf( 请选择:);scanf(%d,&x);choice:switch(x)case 1:addnew();break;case 2:addold();break;case 0:break;default:printf(n 错误的选择,请重新选择:);goto choice; system(c
14、ls);/*显示所有学生的成绩*/ void printall()int a,b;FILE *fp,*fp1,*fp2;system(cls);printf( 欢迎使用学生成绩信息管理系统nnn);printf( 全部已录入学生信息nn);printf(%-10s%-20s%-50sn,姓名,学号,成绩);j=sizeof(struct stu);if(fp=fopen(Ca1.txt,r)=NULL)printf(n打开失败);exit(0);if(fp1=fopen(Ca2.txt,r)=NULL)printf(信息写入失败);exit(0);if(fp2=fopen(Ca3.txt,r)
15、=NULL)printf(信息写入失败);exit(0);a=0;while(!feof(fp)if(fread(&studenta,j,1,fp)=1)printf(%-10s%-20s%-50sn,studenta.name,studenta.num,studenta.score);a+;a=0;while(!feof(fp1)if(fread(&studenta,j,1,fp1)=1)printf(%-10s%-20s%-50sn,studenta.name,studenta.num,studenta.score);a+;a=0;while(!feof(fp2)if(fread(&stu
16、denta,j,1,fp2)=1)printf(%-10s%-20s%-50sn,studenta.name,studenta.num,studenta.score);a+;fclose(fp);fclose(fp1);fclose(fp2);printf(返回上级请输入0!n:);scanf(%d,&b);if(b=0)system(cls);3.3 姓名学号查询void search()int k,b,a;char cx20;FILE *fp;system(cls);j=sizeof(struct stu);doprintf( 欢迎使用学生成绩信息管理系统nnn);printf( 查找已录
17、入学生成绩信息nn);k=0;if(fp=fopen(Ca1.txt,r)=NULL)printf(n打开失败!);exit(0);printf(请输入学号或姓名:n);scanf(%s,cx);if(cx09)a=0;while(!feof(fp)fread(&studenta,j,1,fp);if(strcmp(studenta.name,cx)=0)printf(nn已查到,该记录为:nn);printf(%-10s%-20s%-50sn,姓名,学号,成绩);printf(%-10s%-20s%-50sn,studenta.name,studenta.num,studenta.score
18、);k=1;a+;if(0=cx0=9)a=0;while(!feof(fp)fread(&studenta,j,1,fp);if(strcmp(studenta.num,cx)=0)printf(nn已查到,该记录为:nn);printf(%-10s%-20s%-50sn,姓名,学号,成绩);printf(%-10s%-20s%-50sn,studenta.name,studenta.num,studenta.score);k=1;a+;if(!k)printf(n文件中无此人的记录。);fclose(fp);printf(n输入“1”继续查找,“0”结束n);scanf(%d,&b);sy
19、stem(cls);while(b!=0);system(cls);3.4 成绩查询void jgsearch()int b,a;char cx20;FILE *fp;system(cls);j=sizeof(struct stu);doprintf( 欢迎使用学生成绩信息管理系统nnn);printf( 查找学生成绩信息nn);if(fp=fopen(Ca1.txt,r)=NULL)printf(n打开失败!);exit(0);printf(请输入学生成绩:n);scanf(%s,cx);a=0;while(!feof(fp)fread(&studenta,j,1,fp);if(strcmp
20、(cx,studenta.score)=0)printf(%-10s%-20s%-50sn,姓名,学号,成绩);printf(%-10s%-20s%-50sn,studenta.name,studenta.num,studenta.score);a+;fclose(fp);printf(n输入“1”继续查找,“0”结束n);scanf(%d,&b);system(cls);while(b!=0);system(cls);3.5 删除学生成绩信息void del()int m=0,k=0,b,a,q,p;char xh20,wjm20;FILE *fp;system(cls);j=sizeof(
21、struct stu);doprintf( 欢迎使用学生成绩信息管理系统nnn);printf( 删除学生成绩信息nn);printf(nn存储文件名有 Ca1.txt Ca2.txt Ca3.txtnn);k=0;printf(n请输入学号:);scanf(%s,xh);printf(n请输入欲删除的文件名:);scanf(%s,wjm);if(fp=fopen(wjm,r)=NULL)printf(n文件打开失败!);exit(0);a=0;while(!feof(fp)fread(&studenta,j,1,fp); /将文件内容输入到数组中a+;fclose(fp);t=a-1;for
22、(a=0;a=t;a+)if(strcmp(xh,studenta.num)=0)k=1;break;if(a=t)printf(nn文件中无此人的记录。);if(k=1)printf(nn已查到,该记录为:nn);printf(%-10s%-20s%-50s,姓名,学号,成绩);printf(%-10s%-20s%-50s,studenta.name,studenta.num,studenta.score);printf(n确实要删除记录,请按1;不删除记录,请按0:n);scanf(%d,&m);if(m)for(p=a,q=a+1;pt,q=t;q+,p+)strcpy(studentp
23、.name,studentq.name);strcpy(studentp.num,studentq.num);strcpy(studentp.score,studentq.score);if(fp=fopen(wjm,w)=NULL)printf(n文件打开失败!);exit(0);for(a=0;at;a+)fwrite(&studenta,j,1,fp);if(m)printf(n删除成功!);fclose(fp);printf(n输入“1”继续,“0”结束n);scanf(%d,&b);system(cls);while(b!=0);system(cls);3.6 修改学生成绩信息voi
24、d modify()int k=0,b,a;char xh20,wjm20;FILE *fp;system(cls);j=sizeof(struct stu);doprintf( 欢迎使用学生成绩信息管理系统nnn);printf( 修改学生成绩信息nn);printf(nn存储文件名有 Ca1.txt Ca2.txt Ca3.txtnn);printf(n请输入学号:);scanf(%s,xh);printf(n请输入欲修改文件名:);scanf(%s,wjm);if(fp=fopen(wjm,r+)=NULL)printf(n打开失败!);exit(0);a=0;while(!feof(f
25、p)fread(&studenta,j,1,fp);a+;fclose(fp);t=a-1;for(a=0;a=t;a+)if(strcmp(xh,studenta.num)=0)k=1;break;if(a=t)printf(nn文件中无此人的记录。);if(k=1)printf(nn已查到,该记录为:nn);printf(%-10s%-20s%-50s,姓名,学号,成绩);printf(%-10s%-20s%-50s,studenta.name,studenta.num,studenta.score);printf(n请输入新的姓名:);scanf(%s,studenta.name);pr
26、intf(n请输入新的学号:);scanf(%s,studenta.num);printf(n请输入新的成绩:);scanf(%s,studenta.score);if(fp=fopen(wjm,w)=NULL)printf(n文件打开失败!);exit(0);for(a=0;at;a+)fwrite(&studenta,j,1,fp);printf(n修改成功!);fclose(fp);printf(n输入“1”继续,“0”结束n);scanf(%d,&b);system(cls);while(b!=0);system(cls);4 功能测试4.1 菜单测试学生成绩管理系统运行后的主菜单界面
27、如图4-1所示。图4-1系统主界面4.2 系统功能测试1 添加学生信息在主菜单按1后,会显示图4-2,再按2添加学生的信息如图4-3所示,如果按1的话那么所有以前的保存的信息都将被清除,接着再重新输入数据。图4-2 学生信息输入界面图4-3 学生信息输入界面2 显示所有学生成绩信息在系统菜单上面按2,则所有的学生成绩都会显示如图4-4所示。图4-4 学生成绩浏览3. 学号或姓名查询在主菜单上输入3,然后在根据姓名或者学号,可以查到该同学的分数,如图4-5和4-6图所示。图4-5 根据学号查询分数图4-6 根据姓名查询分数4. 成绩查询在主菜单上输入4,可以得到图4-7所示,这是根据分数来确定学
28、生。图4-7 根据分数来确定学生5. 删除学生成绩信息在主菜单上按5,选择需要删除的对应文档里的该学生的成绩信息,可以得到图4-8所示。图4-8 删除学生信息6. 修改学生的信息在主菜单上按6,选择需要修改的人的学号,再进行一系列的修改,可以得到图4-9所示。图4-9 修改学生信息5 系统设计遇到的问题及解决方法1.*和 在定义时只是说明作用,不能误解为运算符&、*、 是C语言提供的三种运算符,分别是取地址运算符、指针运算符和下标运算符,其中,&与*互为逆运算。在表达式中它们的意义很明确,但是在定义中*、 只是起说明作用,不能看作运算符。例如:int number=10; Int *pt=&n
29、umber; Int *pt=a;在这里,我们容易被后两个语句迷惑,之所以迷惑,就是把*当作了运算符,其实在这里Int *共同来修饰指针变量pt,定义一个指向整型变量的指针变量,自然会把一个地址&number赋值给pt。因此,上述后面两个赋值语句中,第一个是正确的。2、用整数值直接给指针赋值指针值就是指针所指向的地址,在程序运行中,指针的值其实就是一个整数值,但是决不能在程序语句中把一个整数值当作指针的值直接赋给指针。例如:int num; Int *pt; num=72781; p=num;最后一个语句目的是使指针指向地址72781(十进制),编译时系统就会提示这个语句有错误。3、字符串的读
30、入当要求从键盘读入一字符串时,若选用输入的函数不当,也容易造成错误,而且难以发现。例如:#include main() char str20; scanf(“%s”,str); printf(“%s”,str);运行该程序,从键盘键入“I love China”字符串,结果其程序结果显示单个字符I,而不是字符串“I love China”。这说明scanf函数并没有读入整个字符串,而只读入了单个字符I,这是因为scanf函数读入字符串时,它认为字符串的结束标志为空格而不是回车键。所以scanf函数实际上只能读入一个单词,而不是字符串。正确的读入字符串的程序如下: #include main()
31、 char str20; gets(str); printf(“%s”,str); 6 项目设计总结通过C语言编程系统,让我们对C语言有了更深的了解,而不只是单单的在课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。不过,通过几天的编程,逐渐积攒了一些经验,有些错误可以较快看出来。这次实训有很大的收获,让我们对C语言有了更深的认识,平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。如果是一个程序写完一处错误也没有,会有种成就感,于是兴趣就来了,兴趣来了,
32、自然学的东西也就多了,能把理论变成实际的技能,让我们对C语言有了浓厚的兴趣和更深层的认识。我们总结过此次系统的不足之处,比如,它只能记录一科成绩的分数,还有它不能把所有的人按分数排名排序等,这些都是我们没有做到的,有很大一部分原因是因为我们没有很好的掌握这部分内容,所有导致系统缺少该部分功能,我们以后有时间的话,一定会好好完善这些不足之处的。 参考文献 1 吉顺如C程序设计习题与课程设计指导电子工业出版社,2012.9 2谭浩强c语言程序设计(第二版)清华大学出版社,2002.8 3 张引C程序设计设计基础课程设计浙江大学出版社 2007.8 4 曹哲C程序设计课程设计 机械工业出版社 2010.7