德 州 学 院 计 算 机 系 课 程 设 计 报 告 纸
第 - 1 - 页 共 30 页
目录
——学生成绩管理程序
题目要求 ··················· 2
设计目的 ··················· 2
总体设计 ··················· 3
详细设计 ··················· 3
调试与测试 ················· 12
源程序 ··················· 14
总结 ··················· 30
德 州 学 院 计 算 机 系 课 程 设 计 报 告 纸
第 - 2 - 页 共 30 页
学生成绩管理程序
一. 题目要求
1. 问题描述 :
对在校学生几门课程的考试成绩进行统一管理 . 每个学生记录包括学号 ,
姓名, 年龄, 数学 , 英语 , 物理成绩 , 默认以学号为序存放 .
2. 要求:
(1) 一个文件按以班为单位存储学生记录 .
(2) 将允许的操作分为四种 , 以 A,B ,C,D,E,F 为标志 :
A:插入一个学生记录 ;
B:修改学生记录 ;
C:删除一个学生记录 ;
D:查找一个学生记录 ;
E:浏览学生成绩 :
F: 退出
3. 计算学生的总成绩 .
4. 按学号排序输出全班学生成绩表
.
二. 设计目的
根据题目要求 , 由于学生信息是存放在文件中 , 所以应提供文件的输入 , 输出
等操作 ; 在程序中需要浏览学生的信息 , 应提供显示 , 查找 , 排序等操作 ; 另外
还应提供键盘式选择菜单实现功能选择 .
三. 总体设计
根据上面的需求分析 , 可以将这个系统分为以下模块 : 输入模块 , 修改模块 , 删
除模块 , 查找模块 , 显示模块 .
德 州 学 院 计 算 机 系 课 程 设 计 报 告 纸
第 - 3 - 页 共 30 页
学生成绩管理系统
数据输入 数据显示 数据修改 数据删除 数据查找
四. 详细设计
1. 主函数 :
主函数一般设计得比较简单 , 只提供输入 , 处理和输出部分的函数调用 ,
其中各功能模块用菜单方式选择 .
流程图 :
显示一系列功能模块
N
输入 n, 判断 n 是否是 A--F
Y
根据 n 的值调用各功能模块函数
[ 程序 ]:
//#include "head.h"
int menu_select()
{
char c;
printf("\n\n");
printf(" | 1. 增加学生记录 5. 统计信息 |\n");
printf(" | 2. 查询学生记录 6. 打开文件 |\n");
printf(" | 3. 修改学生记录 7. 保存文件 |\n");
printf(" | 4. 学生纪录排序 8. 显示记录 |\n");
printf(" | 0. 退出系统 |\n");
printf("\n\n");
printf(" 请选择 (0-8):");
c=getchar();
getchar();
return (c-'0');
}
德 州 学 院 计 算 机 系 课 程 设 计 报 告 纸
第 - 4 - 页 共 30 页
2. 输入模块 :
[ 分析 ]:
单独看各数据信息 , 学号, 姓名是字符型 , 可以采用字符型数组 ; 分数为整数 ,
采用整数 ; 数据信息存放在文件中 , 一条记录对应一个学生 , 既符合习惯又方
便信息管理 .
如果要存放若干学生信息就用结构体数组 :
void addrecord(student stud[])
{
int i=0,j,num;
char str[5];
if(numstus!=0)
{
printf(" 已有记录存在是否覆盖 ?(y/n)\n");
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
else i=numstus;
}
printf(" 请输入增加的学生信息条目数 :");
scanf("%d",&num);
if(i==0)
numstus=num;
else numstus+=num;
if(numstus>lens)
{
lens+=50;
pointer=(student *)realloc(pointer,lens*LEN);
}
printf(" 请输入学生信息 :\n");
for(;i<numstus;i++)
{
getchar();
printf(" 请输入学号 :");
gets(pointer[i].number);
printf(" 请输入姓名 :");
gets(pointer[i].name);
printf(" 请输入性别 ( 男/ 女 1/0):");
gets(pointer[i].sex);
if(pointer[i].sex[0]=='0') strcpy(pointer[i].sex," 女");
德 州 学 院 计 算 机 系 课 程 设 计 报 告 纸
第 - 5 - 页 共 30 页
else strcpy(pointer[i].sex," 男");
printf(" 请输入各科成绩 :( 按“语文,数学,英语,历史,政治”的顺序 ):");
stud[i].score=0;
for(j=0;j<numsubs;j++)
{
scanf("%f",&stud[i].subject[j]); /* 计算总分 */
stud[i].score+=stud[i].subject[j];
}
stud[i].average=stud[i].score/numsubs; /* 计算平均分 */
}
count(stud); /* 附名次 */
display(stud,0,numstus-1);
getchar();
}
int numstus;
int lens;
student *pointer;
void main()
{
int i=1;
char str[2];
lens=100;
pointer=(student *)malloc(lens*LEN); /* 分配内存 */
numstus=0;
welcome(); /* 欢迎界面 */
while(i>0)
{
i=menu_select(); /* 控制菜单 */
switch(i)
{
case 1:addrecord(pointer);break; /* 增加学生信息 */
case 2:findrecord(pointer);break; /* 查询学生信息 */
case 3:amendrecord(pointer);break; /* 修改学生信息 */
case 4:sort(pointer);break; /* 学生信息排序 */
case 5:statistic(pointer);break; /* 统计信息 */
case 6:openfile(pointer);break; /* 打开文件 */
case 7:writetotext(pointer);break; /* 保存文件 */
case 8:display(pointer,0,numstus-1);break; /* 显示记录 */
case 0:
if(numstus!=0) printf(" 是否保存当前记录 ?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(pointer);
i=-1;break; /* 退出系统 */