1、学生课程设计 设计案例 编写程序实现对学生四门课程的考试成绩进行管理的功能。 其功能包括: 1. 增加学生成绩记录 2. 修改学生成绩记录 3. 删除学生成绩记录 4. 学生成绩记录列表 5. 成绩记录写入文件 6. 学生成绩记录文件读取 7. 按学号排序和按名称搜索。 程序界面要求:仿 windows 窗口风格以菜单方式驱动,并每个功能都在字符窗口中实现。 题目分析: 程序的几个需要考虑的问题: 1 、一个实用的应用程序必须提供一个相对比较简单、清晰的操作界面。目前大多数在 windows 中实现的 应用系统都可以借助其开发接口很简单的产生标准的窗口界面。然而这样的界面风格在 Dos 中实现
2、并非一件简单的任务,我们必须清晰的规划出屏幕和窗口的规格以及和应用结合的接口。 2 、我们面临的应用程序不是简单的实现一个算法的程序,是一个针对学生成绩记录的多功能的小型系统,而且扩充的可能性非常大,需要我们按照自顶向下,逐步求精的设计思想先从功能上将系统划分为多个模块,再从模块细节来把握和分解系统,降低其复杂度直至可以编写程序。 3 、程序完成的是对学生成绩记录的多种独立的操作,需要进行功能规划。总体上划分为三个功能部分:( 1 )文件接口功能部分:完成学生成绩记录的文件读取和写入。( 2 )学生记录的操作功能:完成向记录集添加成绩记录、删除成绩记录、修改成绩记录等功能。( 3 )察看学生记
3、录,完成学生成绩记录集的排序、搜索、列表等功能。 4 、界面组成设计分析:( 1 )整个屏幕用背景覆盖,称为桌面( 2 )屏幕最顶一行用于显示主菜单行。( 3 )最底一行用于显示提示行。( 4 )子菜单由菜单盒显示。( 5 )单一的输入,使用单行输入框。( 6 )提示信息使用信息提示框显示。( 7 )记录信息的输入使用录入框 实现。 结构分析 1 、功能模块的划分:划分的情况见下图 2 、软件运行模式:软件的运行采用菜单驱动,选取菜单项后,启动相关功能,进入每个功能后,都通过独立的窗口执行相应流程。功能执行退出后,由主菜单继续获得控制权。 3 、程序单元结构设计: 序号 单元名称 单元头文件
4、单元实现文件 单元说明 1 stmain stmain.h stmain.c 全局变量的定义和 main 主控函数,菜单及模块调度执行函数 2 student student.h student.c 学生成绩结构定义和记录基本运算函数 3 basefile basefile.h basefile.c 学生成绩结构的文件接口函数 4 basemenu basemenu.h basemenu.c 菜单的构造、控制基础功能函数 5 basewin basewin.h basewin.c 所有类型界面及其窗口绘制控制函数 6 menudo menudo.h menudo.c 对应菜单项直接驱动的功能模
5、块函数 4 、各单元主要数据结构、全局变量与处理函数: (1)stmain 单元 名称 类型 原型 说明 studentcount 全局变量 int studentcount=0 ; 当前学生记录的个数 studentarr 全局变量 STUDENT studentarr200 ; 存储当前学生成绩记录的总缓冲区,实际记录的个数在变量 studentcount 中 winbuf 全局变量 char winbuf4096 ; 保存在桌面中的画面区域的缓冲区 menuareabuf 全局变量 char menuareabuf34096 ; 保存子菜单画面区域的缓冲区 menu 全局变量 MENUI
6、TEMNODE *menu ; 第一项菜单结构节点的指针 pcurrent 全局变量 MENUITEMNODE *pcurrent ; 当前菜单结构节点的指针 selectedid 全局变量 int selectedid ; 当前菜单项选取后的返回 id initmenu 函数 int initmenu(void) ; 构造系统菜单结构的函数 dealselect 函数 int dealselect(void); 依据 selectedid,执行模块调度的函数 (2)student 单元 名称 类型 原型 说明 STUDENT 学生成绩结构类型 typedef struct _student
7、char stid20; char name20; float mathscore; float englishscore; float computerscore; float politicsscore; STUDENT ; 学生成绩的结构类型,是系统数据处理的基础 addstudent 函数 void addstudent( STUDENT *pliststudent , int stcount , STUDENT *pstudent ) ; 向 pliststudent 结构数组中添加一个学生记录pstudent,结构数组中有效记录个数通过 stcount传递 findstudent
8、函数 STUDENT *findstudent( STUDENT *pliststudent , int stcount , char *stid ) ; 在 pliststudent 结构数组中查找学号为 stid的记录,结构数组有效记录个数通过 stcount 传递。返回查找的结果,成功返回找到记录的指针,失败返回 NULL modifystudent 函数 void modifystudent( STUDENT *pliststudent , int stcount , char *stid , STUDENT *newpstudent 将 pliststudent 结构数组中学号为 s
9、tid的记录,替换为新记录 newpstudent 。 结构数组有效记录个数通过 stcount 传递。 ) ; deletestudent 函数 void deletestudent( STUDENT *pliststudent , int stcount , char *stid ) ; 将 pliststudent 结构数组中学号为 stid的记录删除掉。结构数组有效记录个数通过 stcount 传递。 (3)basefile 单元 名称 类型 原 型 说明 readfiletobuf 函数 int readfiletobuf( char *readfilename , STUDENT
10、*pliststudent , int *readcount ) ; 从结构文件 readfilename中读取学生成绩结构到结构数组 pliststudent 中,读取的记录个数通过变量readcount 输出 writebuftofile 函数 int writebuftofile( char *writefilename , STUDENT *pliststudent , int stcount ) ; 将结构数组 pliststudent中的学生成绩记录写入结构文件 writefilename ,写入记录的个数在变量 stcount 中 (4) basemenu 单元 名称 类型 原型
11、 说明 MENUITEMREC 菜单项结构类型 typedef struct menuitemrec int itemid; char itemtext20; int level; MENUITEMREC; itemid 菜单项 标识号 itemtext 菜单项显示文本 level 菜单项级别 MENUITEMNODE PMENUITEMNODE 菜单项节点结构类型 菜单项节点结构指针类typedef struct menuitemnode MENUITEMREC item ; int x , y , w ; struct menuitemnode *pprev ; struct menuit
12、emnode *pnext ; struct menuitemnode *pchild ; struct menuitemnode item 菜单项信息 x,y菜单项屏幕位置 w菜单项宽度 pprev 前项指针 pnext 后项指针 pchild 子菜首项指针 pparent 父级菜单项指针 型 *pparent ; MENUITEMNODE, *PMENUITEMNODE ; makemenuitem 函数 MENUITEMNODE *makemenuitem( int id , char *text , int level ); 构造菜单项记录并返回其指针 id:设置的菜单项标号 text
13、:设置的菜单项文字 level:菜单项级别 addnext 函数 MENUITEMNODE *addnext( MENUITEMNODE *current , MENUITEMNODE *next ) ; 向当前菜单节点 current 中加入同级别相邻下一个节点 next addchild 函数 MENUITEMNODE *addchild( MENUITEMNODE *current , MENUITEMNODE *child ); 向当前菜单节点 current中加入下一级第一节点 child initmenuposition 函数 void initmenuposition( MENU
14、ITEMNODE *menu ) ; 初始化菜单中 menu 所有节点菜单项的屏幕位置和宽度 showmenu 函数 void showmenu( MENUITEMNODE *menuptr ) ; 显示主菜单条 menuptr 在屏幕顶行,并激活第一项菜单 menuselect 函数 int menuselect(void); 激活菜单控制,返回 选择的菜单项的标识号 (5) basewin 单元 名称 类型 原型 说明 editbox 编辑框结构类型 typedef struct _EDITBOX char *label ; int x,y ; int labelwidth ; int e
15、ditwidth ; editstyle edittype ; char *strptr ; float *floatptr ; 自定义控制编辑框输入文本,转换存到字符串或实数中的结构 label:显 示的提示信息 x,y:编辑框的屏幕位置 labelwidth:提示显示的宽度 editwidth:编辑框的宽度 edittype:编辑目标的类editbox ; 型 strptr:编辑字符串存入的目标 floatptr:编辑实数存入的目标 pusharea 函数 void pusharea( int left , int top , int w , int h , char *buf ) ; 保
16、存一个矩形屏幕区域到缓冲区 buf中,保存区域的左上角为( left,top),宽高为 w,h, poparea 函数 void poparea( int left , int top , int w , int h , char *buf ) ; 恢复保存的缓冲区 buf到一个矩形屏幕区域,恢复左上角为( left,top),宽高为 w,h drawdesktop 函数 void drawdesktop(void); 绘制桌面区域 msg 函数 int messagebox( char *msg ) ; 在屏幕中显示一个消息框 msg:要显示的消息字符串 inputbox 函数 int in
17、putbox( char *lable , char *savestr ) ; 输入单行字符串的输入窗口 label:提示字符串 savestr:输入后保存的目标字符串 inputeditbox 函数 int inputeditbox( editbox *ebptr , int inputcount ) ; 用于在编辑窗口中控制多栏编辑输入 ebptr:多栏编辑结构指针 inputcount:输入栏位的数量 getkey 函数 int getkey(void) ; 得到键盘的输入,包括功能键及组合键 返回按键的键值 inputstudent 函数 int inputstudent( STUDE
18、NT *ptrst ) ; 在多栏输入框中编辑学生成绩记录 ptrst:学生成绩记录指针 (6)menudo 单元 名称 类型 原型 说明 loadstudent 函数 void loadstudent(void) ; 执行从输入的文件名中调入学生成绩记录到全局数组的模块函数 writestudent 函数 void writestudent(void) ; 执行将学生成绩记录全局数组写入输入的文件名的模块函数 liststudent 函数 void liststudent(void) ; 执行将学生成绩记录全局数组进行窗口列表显示的控制模块函数 appendstudent 函数 void a
19、ppendstudent(void) ; 执行添加学生成绩并编辑和记录到全局数组的模块函数 editstudent 函数 void editstudent(void) ; 执 行编辑修改指定学号的学生成绩记录的模块函数 erasestudent 函数 void erasestudent(void); 执行删除指定学号的学生成绩记录的模块函数 5 、工程文件: 建立工程文件 STMAN.PRJ ,该文件支持对单元的集成编译和连接。下图显示了工程文件窗口的主要的屏幕画面。 STMAN 工程文件同各个单元源文件之间的关系如下: 源程序: 1 、 stmain 单元头文件 stmain.h 源程序 #
20、ifndef _STMAIN_H #define _STMAIN_H #include “student.h“ #include “basemenu.h“ STUDENT studentarr200; int studentcount=0; char winbuf4096; char menuareabuf34096; MENUITEMNODE *menu,*pcurrent; int selectedid; int initmenu(void); int dealselect(void); #endif 2 、 stmain 单元实现文件 stmain.c 源程序 #include “bas
21、emenu.h“ #include “basewin.h“ #include “menudo.h“ #include “stmain.h“ #include #include #include void main() int key; clrscr(); drawdesktop(); initmenu(); showmenu(menu); while (selectedid=menuselect()!=QUITID) dealselect(); setdefaultcolor(); clrscr(); int initmenu(void) menu = addnext( addchild(ma
22、kemenuitem(1,“File“,0), addnext(makemenuitem(101,“Load“,1), addnext(makemenuitem(102,“Save“,1), makemenuitem(0,“Quit“,1) ) ), addnext( addchild(makemenuitem(2,“Edit“,0), addnext(makemenuitem(201,“Add“,1), addnext(makemenuitem(202,“Edit“,1), makemenuitem(203,“Delete“,1) ) ), addchild(makemenuitem(3,“
23、View“,0), addnext(makemenuitem(301,“Sort“,1), addnext(makemenuitem(302,“Search“,1), makemenuitem(303,“List“,1) ) ) ) ); initmenuposition(menu); pcurrent = menu; return 0; int dealselect(void) switch (selectedid) case 101: /Load loadstudent(); break; case 102: /Save writestudent(); break; case 201: /
24、Add appendstudent(); break; case 202: /Edit editstudent(); break; case 203: /Delete erasestudent(); break; case 301: /Sort break; case 302: /Search break; case 303: /List liststudent(); break; return 0; 3 、 student 单元头文件 student.h 源程序 #ifndef _STUDENT_H #define _STUDENT_H typedef struct _student cha
25、r stid20; char name20; float mathscore; float englishscore; float computerscore; float politicsscore; STUDENT; void addstudent(STUDENT *pliststudent,int stcount,STUDENT *pstudent); STUDENT *findstudent(STUDENT *pliststudent,int stcount,char *stid); void modifystudent(STUDENT *pliststudent,int stcount, char *stid,STUDENT *newpstudent); void deletestudent(STUDENT *pliststudent,int stcount,char *stid); #endif 4 、 student 单元实现文件 student.c 源程序 #include “student.h“ #include #include void addstudent(STUDENT *pliststudent,int stcount,STUDENT *pstudent)