一 问题描述与分析
假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开学学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计学生选修课程系统,使之能提供以下功能:
1.课程信息录入功能(课程信息用文件保存) 2.课程信息浏览功能 3.排序:按总学时排序
4.查询功能:按开学学期查询 5.课程修改,删除(可选项)
二 总体设计
根据题目要求,定义结构体类型如下: struct subjects { char no[10]; char name[20]; char kind[20]; int stime;
/*总学时*/ int ttime;
/*授课学时*/ int etime;
/*实验或上机学时*/ float score; int term; }sub[N];
三 详细设计
1)存储结构的选择
在这个程序中,我们选择用结构体数组来存储课程,即顺序存储结构 Struct subjects sub[N] 2)系统初始化
这个模块的主要功能是得到初始的课程。为了实现“一次输入,多次使用”,我们用文件来保存课程。第一次运行本程序需从键盘输入所有课程并保存到文件中,以后运行就可以从文件中读取数据,直接使用了。这样既可以减少输入的麻烦,更重要的是使本程序可以连续运行,每次运行都可以使用上一次保存的结果。 void newfile() { int i; FILE *fp; if((fp=fopen(\"sub.dat\",\"wb\"))==NULL) {
printf(\"文件建立失败!请重新运行程序。\\n\");
exit(0);
} } printf(\"请输入课程门数\"); scanf(\"%d\",&num); for(i=0;i
3)课程浏览功能 按课程编号进行浏览 void read1() { FILE *fp; num=0; fp=fopen(\"sub.dat\",\"r\"); if(fp==NULL) {
printf(\"文件打开失败!请重新运行程序。\\n\");
exit(0); } while(!feof(fp)) {
fread(&sub[num],1,sizeof(struct subjects),fp);
num++; } num--; fclose(fp); printf(\"现在共有%d门课程,初始数据为:\\n\",num); output(); } 3
4)排序
按总学时排序:使用改进的起泡法排序。 void sortstime() { int i,j,flag; struct subjects temp; for(i=0;i
flag=0;
for(j=0;j
if(sub[j].stime
{
temp=sub[j];
sub[j]=sub[j+1];
sub[j+1]=temp;
flag=1;
}
if(flag==0)
break; }printf(\"排序后的课程为:\\n\"); output(); } 4
5)查找(总学时)
按开学学期查询,查找用顺序查找法。 void find() { int i,cterm; printf(\"请输入要查找课程的开学学期:\\n\"); getchar(); scanf(\"%d\",&cterm); i=findterm(cterm); if(i==-1)
printf(\"要查找的学期不存在:\\n\"); else {
printf(\"查找到的课程信息为:\\n\");
printf(\"课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,总学分,开学学期:\\n\");
printf(\"===================================\\n\");
printf(\"%s\\t%-10s\\t%s\\t%d\\t%d\\t%d\\t%.1f\\t%d\\t\",sub[i].no,sub[i].name,sub[i].kind,sub[i].stime,sub[i].ttime,sub[i].etime,sub[i].score,sub[i].term);
printf(\"\\n\"); } } int findterm(int cterm[]) {
} int i; for(i=0;i
return i; return -1;
6)参考文献
C语言指导书。 7)心得体会
通过对课程精心设计,我从中获得了不少东西:
1.我知道一些自己不太熟悉的知识,比如文件系统中的好多知识; 2.从中懂得了合作的重要性,这是以前没注意的;
3.也锻炼了自己的思维能力,可以把一整块东西分成若干个小块来处理; 4.在锻炼的同时,自己得到了一种满足感。