《学生成绩管理系统》
课程设计报告
2010—7-9
一、程序整体规划:
1.系统的基本功能
✧数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息;
✧数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息;
✧数据的插入:插入某个学生信息;
✧数据的查询:如按学号查询、按姓名查询等;
✧数据的删除:如删除指定学号、或者指定姓名的学生及其选修课程信息;
✧平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息;
✧考虑用文件把数据保存起来
2、首先是结构体的定义:
typedef struct message_student
char number[6];
char name[20];
char sex[4];
float subject[numsubs];
float score;
float average;
int index;
}student;
int numstus; 定义学生数目
student *pointer; 指向结构体数组
int lens; 次迟到时候分配内存
3、部分重要函数声明:
int menu_select(); 决定主界面的函数
int openfile(student stu[]); 打开文件的函数
int findrecord(student stud[]); 查信息的函数
int writetotext(student stud[]); 保存文件的函数
void sort(student stu[]); 查信息的函数
void deleterecord(student stu[],int i); 删除信息的函数
void addrecord(student stud[]); 增加学生信息的函数
void display(student stud[],int n1,int n2); 数据的显示函数
void sortnum(student stud[]); 以下几个均为排序函数
void sortnum2(student stud[]);
void sortname(student stud[]);
void sortname2(student stud[]);
void sortcount(student stud[]);
void sortcount2(student stud[]);
4、设计思路
c++课程设计报告1、主函数以switch和case语句引出其他子函数.然后进行其他子函数的调用。
2、定义结构体student,让其包含如姓名性别等基本信息。同时定义结构体指针,以便后面子函数对某一项排序后输出该学生的全部信息。LENS给结构体数组分配内存。
3、各个函数运行并相互调用其他子函数,例如几个排序函数全部被其它函数调用并输出结果。具体各子函数之间的关系见源代码。
4、student stu[i]表示的是一个结构体,[]内填大于等于0的数,这可以解释各个子函数中出现此类情况:例如strcmp(str,stud[i]。name)==0是该结构体内的第i+1个学生满足上述条件。由Stud[i]。变量来引用各结构体中的变量,然后用输出函数相应输出该结构体内的信息。
二.程序模板细致分析:
1。程序涉及的模板:
主程序模板。 查询模块。删除模板。 将所有记录写入文件。输出模板。修改信息模板.录入信息模板。 和排序模板。
排序模板可按如下进行分类:
按学号:按学号降序排序模块.按学号升序排序模块。
按姓名:按姓名降序排序模块。 按姓名升序排序模块。
按名次:按名次降序排序模块. 按名次升序排序模块.
2。功能结构联系图如下图所示:
现对各个功能的实现及个人认为每个功能中所用到的程序的闪光点和难点:
1。增加学生记录
2.已有记录是否覆盖:
if(numstus!=0)
{
printf(”已有记录存在是否覆盖?(y/n)\n”);
fflush(stdin);
gets(str);
if(str[0]=='Y’||str[0]=='y’)
i=0;
当输入数据过多时内存的扩展: (通过定义LENS开辟增加内存)
if(numstus>lens)
{
lens+=50;
pointer=(student *)realloc(pointer,lens*LEN);
输入数字为1.0,但是结果输出为男.女:
printf("请输入性别(男/女 1/0):”);
gets(stud[i].sex);
if(stud[i]。sex[0]=='0') strcpy(stud[i]。sex,”女");
else strcpy(stud[i].sex,"男”);
2. 查询学生记录
例: 按学号查:
if(str[0]=='1')
{
printf(”请输入学号:”);
fflush(stdin); 亮点:清除数据缓冲区间
gets(str);
for(i=0;i〈=numstus;i++)
{
if(strcmp(str,stud[i]。number)==0) 亮点:利用该函数将结构体数组中相应相同项联系在一起,确定其相应位置,便于输出。
{
display(stud,i,i); 子函数又调用了其他子函数
break;
}
else continue;
3.修改学生记录
例:int i=—1,j;
if(numstus==0) /*没有记录返回*/
printf(”没有可供修改的记录!");
while(i〈0)
{
i=findrecord(stud);
if(i〉=0)
{
printf("要删除这个学生的信息吗?(y/n)");
此处有一个难点就是while函数和调用其他子函数findrecord,以及解释为什么一开始要定义i为-1
4.学生纪录排序
按学号:按学号降序排序模块.按学号升序排序模块.
按姓名:按姓名降序排序模块。 按姓名升序排序模块。
按名次:按名次降序排序模块. 按名次升序排序模块。
在排序过程中比较名次,成绩大小是不难的事情,名字通过STRCMPY函数来解决排序问题,但排序中的难点在于指针,结构体变量,结构体数组的综合应用,通过比较你的一组数据要输出所有该成员相应的信息,几个排序中指针既指明了变量的地址,也指明了结构体数组的地址.此处感觉很棘手
详细如下一条典型的例子:(其余的大致相同)
student temp;
student *p;
p=stud;
for(i=0;i<numstus;i++)
for(j=0;j<numstus-i-1;j++)
{
if(strcmp(stud[j]。name,stud[j+1]。name)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
5.打开文件和保存文件
fgetc(fp);
while(i<numstus)
{
fscanf(fp,"%s",stu[i]。number);
fscanf(fp,”%s”,stu[i].name);
fscanf(fp,"%s",stu[i]。sex);
for(j=0;j〈numsubs;j++)
fscanf(fp,"%f",&stu[i].subject[j]);
fscanf(fp,”%f",&stu[i].score);
fscanf(fp,"%f",&stu[i]。average);
fscanf(fp,”%d",&stu[i].index);
i++;
}
打开文件用函数fopen,fclose实现文件的打开,文件的关闭。其中按格式将内存中的数据转换成对应的ASCII字符,并以码形式输出到文本文件中
保存文件先给所要保存的文件一个内存地址fp,然后将数据输入,数据存储过程中所用到的 fscanf将数据通过一个文件指针指向一个已打开的文本文件。
此处的难点见函数的整体规划的详细说明。
三、部分运行的图像
主界面:
纪录排序:
信息查和修改
文件保存和显示
数据统计
四.程序主要代码
include ”stdio.h"
#include ”string。h”
#include "malloc。h"
#define H_STUDENT_HH
#define LEN sizeof(struct message_student) /*一个结构体数组元素的长度*/
#define numsubs 4 /*学科数目*/
typedef struct message_student /*结构体定义*/
{
char number[6];
char name[20];
char sex[4];
float subject[numsubs];
float score;
float average;
int index;
}student;
int numstus; /*学生数目*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论