C语言实习:学生成绩管理系统

更新时间:2023-06-01 03:20:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言程序设计报告

班 号 : 054073 姓 名 :曹震

学 号 : 20071001865

中国地质大学工程学院

2008年12月~2009年1月

目录

———学生成绩管理程系

题目要求 ·············· 3

需求分析

总体设计

详细设计

上机操作

源程序

总结 ·············· ·············· ·············· ·············· ·············· ·············· 3 4 4 11 13 19

学生成绩管理程序

一. 题目要求

1. 问题描述:

对在校学生几门课程的考试成绩进行统一管理.每个学生记录包括学号,姓名,年龄,数学,英语,物理成绩,默认以学号为序存放. 2. 要求:

(1):一个文件按以班为单位存储学生记录.

(2)将允许的操作分为四种,以A,B ,C,D,E,F为标志: A:插入一个学生记录; B:修改学生记录; C:删除一个学生记录; D:查找一个学生记录; E:浏览学生成绩: F:退出

3. 计算学生的总成绩.

4. 按学号排序输出全班学生成绩表.

二. 需求分析

根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入,输出等操作;在程序中需要浏览学生的信息,应提供显示,查找,排序等操作;另外还应提供键盘式选择菜单实现功能选择.

三. 总体设计

根据上面的需求分析,可以将这个系统分为以下模块:输入模块,修改模块,删除模块,查找模块,显示模块.

四. 详细设计

1. 主函数:

主函数一般设计得比较简单,只提供输入,处理和输出部分的函数调用,其中各功能模块用菜单方式选择.

流程图:

[程序]: main() {

while(1) {

clrscr();

printf("*************welcome to use student manage******************\n"); printf("*************************menu********************************\n"); printf("* ========================================================= * \n"); printf("* A>shuru B>xiugai * \n");

printf("* C>shanchu D>chazhao * \n"); printf("*E>xianshi F>exit * \n"); printf("* * \n");

printf("* --------------------------------------------------------- * \n"); printf(" Please input which you want(A-F):"); ch=getch(); switch(ch) {

case 'A':shuru();break; case 'B':xiugai(); break; case 'C':shanchu(); break; case 'D':chazhao(); break; case 'E':xianshi(); break; case 'F':exit(0); default: continue; } } }

2. 输入模块: [分析]:

单独看各数据信息,学号,姓名是字符型,可以采用字符型数组;分数为整数,采用整数;数据信息存放在文件中,一条记录对应一个学生,既符合习惯又方便信息管理.

如果要存放若干学生信息就用结构体数组:

struct score /*结构体score*/ {

int mingci; char xuehao[8]; char mingzi[20]; char nianling[3]; float score[6]; }data,info[1000]; int i,j,k=0;

char temp[20],ch; FILE *fp,*fp1; [程序]:

void shuru() {

if((fp=fopen("s_score.txt","ab+"))==NULL) /*以读写方式打开名为s_score的文件*/ {

printf("cannot open this file.\n"); getch();exit(0); }

for(i=0;i<=1000;i++) {

printf("\nPlease shuru xuehao:"); gets(data.xuehao);

printf("Please shuru mingzi:"); gets(data.mingzi);

printf("please shuru nianling:"); gets(data.nianling);

printf("Please shuru shuxue score:"); gets(temp);data.score[0]=atof(temp); printf("Please input yingyu score:"); gets(temp);data.score[1]=atof(temp); printf("Please shuru wuli score:"); gets(temp);data.score[2]=atof(temp);

data.score[3]=data.score[0]+data.score[1]+data.score[2]; fwrite(&data,sizeof(data),1,fp); printf("another?y/n"); ch=getch();

if(ch=='n'||ch=='N') break;

} fclose(fp); }

3. 修改模块:

[分析]:用户输入要修改学生的学号,根据学生的学号查找学生记录,并提示用户修改该记录的哪部分信息.根据用户选择修改相应的信息. [流程图]:

Y N

[程序]:

{

if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) /*检查是否出错*/ {

printf("Cannot open this file.\n"); exit(0); }

printf("\nPLease shuru xiugai xuehao:"); scanf("%d",&i); getchar();

while((fread(&data,sizeof(data),1,fp))==1) {

j=atoi(data.xuehao); if(j==i) {

printf("xuehao:%s\nmingzi:%s\nnianling:%s\n",data.xuehao,data.mingzi,data.nianling);

printf("Please shuru mingzi:"); gets(data.mingzi);

printf("Please shuru shuxue score:"); gets(temp);data.score[0]=atof(temp); printf("Please input yingyu score:"); gets(temp);data.score[1]=atof(temp); printf("Please input wuli score:"); gets(temp);data.score[2]=atof(temp);

data.score[3]=data.score[0]+data.score[1]+data.score[2];

} fwrite(&data,sizeof(data),1,fp1); }

fseek(fp,0L,0); /*将位置指针移到离头文件0个字节处*/ fseek(fp1,0L,0);

while((fread(&data,sizeof(data),1,fp1))==1) {

fwrite(&data,sizeof(data),1,fp); }

fclose(fp); fclose(fp1); }

4. 删除模块: [分析]:

该模块的功能是,用户输入要删除的学生的学号,根据学生学号查找记录并删除. [流程图]:

[程序]:

{

if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) {

printf("\nopen score.txt was failed!"); getch(); exit(0); }

printf("\nPlease input ID which you want to del:"); scanf("%d",&i);getchar();

while((fread(&data,sizeof(data),1,fp))==1) {

j=atoi(data.xuehao); if(j==i) {

printf("Anykey will delet it.\n"); getch(); continue; }

fwrite(&data,sizeof(data),1,fp1); }

fclose(fp); fclose(fp1);

remove("s_score.txt");

rename("temp.txt","s_score.txt");

printf("Data delet was succesful!\n"); printf("Anykey will return to main."); getch(); }

5. 查找模块:

[需求分析]:

该模块的功能是根据输入的学生的姓名查找对应的记录,找到以后,显示相应的学生信息. [流程图]:

[void chazhao() {

if((fp=fopen("s_score.txt","rb"))==NULL) {

printf("\nCannot open this file.\n"); exit(0); }

printf("\nPLease shuru xuehao chakan:"); scanf("%d",&i);

while(fread(&data,sizeof(data),1,fp)==1) {

j=atoi(data.xuehao); if(i==j) {

printf("xuehao:%s mingzi:%s\n nianling:%s\n shuxue:%f\n yingyu:%f\n wuli:%f\n zongfen:%f\n",data.xuehao,data.mingzi,data.nianling,data.score[0],data.score[1],data.score[2],data.score[3]);

}getch(); } }

6. 显示模块:

[需求分析]:

该模块的功能是显示所有学生记录信息. [程序]:

void xianshi() {

float s;int n;

if((fp=fopen("s_score.txt","rb+"))==NULL) /*以读写方式打开名为s_score的文件*/ {

printf("Cannot reading this file.\n"); /*先检查打开的操作是否出错*/ exit(0); }

for(i=0;i<=1000;i++) {

if((fread(&info[i],sizeof(info[i]),1,fp))!=1) /*检查是否出错*/

break; /*指针 要读写字节数 要读写size字节的数据项 文件型指针*/ }

printf("\nxuehao mingzi nianling shuxue yingyu wuli zongfen\n"); for(j=0,k=1;j<i;j++,k++) {

info[j].mingci=k; printf("%6s %8s %3s %3.1f %3.1f %3.1f %3.1f \n",info[j].xuehao,info[j].mingzi,info[j].nianling,info[j].score[0],info[j].score[1],info[j].score[2],info[j].score[3]); }

getch(); fclose(fp); }

五. 上机操作

下面是各个模块的界面图:

(1): 主菜单函数

:

(2): 输入模块:

(3): 显示模块:(包含了按学号排序功能

)

(4): 删除模块:

(5): 查找模块:

(6): 修改模块

:

六. 源程序

#include "stdio.h" /*I/O函数*/ #include "stdlib.h" /*其它说明*/ #include "string.h" /*字符串函数*/ #include "conio.h" /*屏幕操作函数*/ #include "mem.h" /*内存操作函数*/ #include "ctype.h" /*字符操作函数*/ #include "alloc.h" /*动态地址分配函数*/

struct score /*结构体score*/ {

int mingci; char xuehao[8];

char mingzi[20]; char nianling[3]; float score[6]; }data,info[1000]; int i,j,k=0;

char temp[20],ch; FILE *fp,*fp1;

void shuru() {

if((fp=fopen("s_score.txt","ab+"))==NULL) /*以读写方式打开名为s_score的文件*/ {

printf("cannot open this file.\n"); getch();exit(0); }

for(i=0;i<=1000;i++) {

printf("\nPlease shuru xuehao:"); gets(data.xuehao);

printf("Please shuru mingzi:"); gets(data.mingzi);

printf("please shuru nianling:"); gets(data.nianling);

printf("Please shuru shuxue score:"); gets(temp);data.score[0]=atof(temp); printf("Please input yingyu score:"); gets(temp);data.score[1]=atof(temp); printf("Please shuru wuli score:"); gets(temp);data.score[2]=atof(temp);

data.score[3]=data.score[0]+data.score[1]+data.score[2]; fwrite(&data,sizeof(data),1,fp); printf("another?y/n"); ch=getch();

if(ch=='n'||ch=='N') break;

} fclose(fp); /*读文件结束*/ }

void xianshi() {

float s;int n;

if((fp=fopen("s_score.txt","rb+"))==NULL) /*以读写方式打开名为s_score的文件*/ {

printf("Cannot reading this file.\n"); /*先检查打开的操作是否出错*/

exit(0); }

for(i=0;i<=1000;i++) {

if((fread(&info[i],sizeof(info[i]),1,fp))!=1) /*检查是否出错*/

break; /*指针 要读写字节数 要读写size字节的数据项 文件型指针*/ }

printf("\nxuehao mingzi nianling shuxue yingyu wuli zongfen\n"); for(j=0,k=1;j<i;j++,k++) {

info[j].mingci=k; printf("%6s %8s %3s %3.1f %3.1f %3.1f %3.1f \n",info[j].xuehao,info[j].mingzi,info[j].nianling,info[j].score[0],info[j].score[1],info[j].score[2],info[j].score[3]); }

getch(); fclose(fp); }

void xiugai() {

if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) /*检查是否出错*/ {

printf("Cannot open this file.\n"); exit(0); }

printf("\nPLease shuru xiugai xuehao:"); scanf("%d",&i); getchar();

while((fread(&data,sizeof(data),1,fp))==1) {

j=atoi(data.xuehao); if(j==i) {

printf("xuehao:%s\nmingzi:%s\nnianling:%s\n",data.xuehao,data.mingzi,data.nianling);

printf("Please shuru mingzi:"); gets(data.mingzi);

printf("Please shuru shuxue score:"); gets(temp);data.score[0]=atof(temp); printf("Please input yingyu score:"); gets(temp);data.score[1]=atof(temp); printf("Please input wuli score:");

gets(temp);data.score[2]=atof(temp);

data.score[3]=data.score[0]+data.score[1]+data.score[2];

} fwrite(&data,sizeof(data),1,fp1); }

fseek(fp,0L,0); /*将位置指针移到离头文件0个字节处*/ fseek(fp1,0L,0);

while((fread(&data,sizeof(data),1,fp1))==1) {

fwrite(&data,sizeof(data),1,fp); }

fclose(fp); fclose(fp1); }

void chazhao() {

if((fp=fopen("s_score.txt","rb"))==NULL) {

printf("\nCannot open this file.\n"); exit(0); }

printf("\nPLease shuru xuehao chakan:"); scanf("%d",&i);

while(fread(&data,sizeof(data),1,fp)==1) {

j=atoi(data.xuehao); if(i==j) {

printf("xuehao:%s mingzi:%s\n nianling:%s\n shuxue:%f\n yingyu:%f\n wuli:%f\n zongfen:%f\n",data.xuehao,data.mingzi,data.nianling,data.score[0],data.score[1],data.score[2],data.score[3]); }getch(); } }

void shanchu() {

if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL) {

printf("\nopen score.txt was failed!"); getch(); exit(0);

}

printf("\nPlease input ID which you want to del:"); scanf("%d",&i);getchar();

while((fread(&data,sizeof(data),1,fp))==1) {

j=atoi(data.xuehao); if(j==i) {

printf("Anykey will delet it.\n"); getch(); continue; }

fwrite(&data,sizeof(data),1,fp1); }

fclose(fp); fclose(fp1);

remove("s_score.txt");

rename("temp.txt","s_score.txt");

printf("Data delet was succesful!\n"); printf("Anykey will return to main."); getch(); }

main() {

while(1) {

clrscr();

printf("*************welcome to use student manage******************\n"); printf("*************************menu********************************\n"); printf("* ========================================================= * \n"); printf("* A>shuru B>xiugai * \n"); printf("* C>shanchu D>chazhao * \n"); printf("*E>xianshi F>exit * \n"); printf("* * \n");

printf("* --------------------------------------------------------- * \n"); printf(" Please input which you want(A-F):"); ch=getch(); switch(ch) {

case 'A':shuru();break; case 'B':xiugai(); break; case 'C':shanchu(); break;

case 'D':chazhao(); break; case 'E':xianshi(); break; case 'F':exit(0); default: continue; } } } ···············································································

七.

总结:

因为虽然之前对C语言进行过一定的学习,但 本次C语言课程设计对我来说是一个挑战。

开始接触的无非是变量,函数,条件语句。循环语句等基本概念,要真正能进行编程应用,需要在在深入理解这些概念的基础上应用,不要只简单地学习语法,结构,而要吃透针对这些语法结构的应用例子,做到触类旁通。

此次C语言课程设计,虽说不上一波三折,但过程绝不轻松。VC++课以过去好长一段时间了,前面的知识会遗忘,这对课程设计的开展无疑是一个阻碍。刚开始,上机做小题目感觉还好,可到了真的要自己设计大程系的时候就觉得非常吃力,前面两天基本什么都没做,狂看书啊,找资料,希望能学到些什么,感觉才好一点,这才开始进行设计。都说万事开头难,虽然头是开了,但后面的工作远没有想象中的简单和顺利。因为从来没有接触过这方面的东西,做起来肯定会有一点吃力,很多次都没有勇气继续下去了,自己都对自己没有信心了,一个模块要编好长时间,而且运行起来还是错误百出,急也急死人,幸好在同学和朋友的鼓励之下坚持了下来,好多地方不清楚的,就问一下学计算机的朋友,或者问老师,然后回去自己再进行思考,揣摩,尽量把它消化吸收,变成自己的东西,因为既然付出了时间和努力,就要学到一些东西,不虚度光阴才好。

经过无数次地上机操作,修改,运行以及调节器试,这个C语言课程设计终于渐渐有了眉目,在经过最后几天的冲刺,终于在考核前一天大功告成,测试和运行都比较成功,内心的喜悦之情无法言表,一想到经过了这么几天的艰苦努力,真的做出了属于自己的课程设计,就十分开心,辛苦努力没有白费,付出总算有了小小的回报。

通过此次C语言课程设计,温习了旧的知识,同学又学到了新的东西,比如文件和结构体方面的内容,还学会了一些简单的数据结构和算法,同时也熟练了上机操作,真可谓是收获匪浅!

这次C语言课程设计最大的感受就是:只要真的努力了,没有什么是做不到的.前面的道路曲折而漫长,但我们会走得更远!

我有一种喜悦的成就感!呵呵!谢谢老师同学们

过年回家了!在这里祝老师

☆ ⊙

本文来源:https://www.bwwdw.com/article/9py1.html

Top