软件工程导论实验报告
实验项目:选修课管理系统
姓名:张景东 学号:129074282 学院:计算机学院
班级:软124
实验一:项目计划、分析和设计
[ 实验日期 ] 2013 年 4月 23 日 [ 实验目的 ]
初步了解结构化分析、设计方法的原理、步骤以及各阶段的文档,练 习撰写简要的需求文档、设计文档。 [ 实验内容 ] 选择选修课管理系统这个小的C语言程序,依据项目可行性研究的结 果,进行需求分析和设计,编写简要的需求文档、设计文档。 [ 实验原理和步骤 ]
浏览 删除 录入 修改
4.程序处理流程 选修课管理系统处理流程图:
主菜单界面 结束
主菜单界面 开始
6修改学生记录 5学生成绩录入 4删除学生记录 3查询选课学生 2插入选课学生 1浏览选课情况 9 系统初始化 0退出 8保存选课情况 7导入选课情况
系统的执行应从系统菜单的选择开始,允许用户输入0~9之间的数值 来选择要进行的操作,输入其他的字符都是无效的,系统会给出错误的 提示信息。
输入平时成绩在总评成绩中所占的百分比;
while(p!=NULL)
{
printf("%2d%10s %8s %10s\n",++th,p->num,p->name,p->class);
printf("平时成绩期末成绩:");
输入平时成绩与期末成绩;
计算出总评成绩;
输出平时成绩、期末成绩与总评成绩;
p=p->next;
}
查找函数模块伪码:
stud *search(stud * head,int * th)
{
int xz;
/*xz表示以后的选择的查找方式代号*/
char xuehao[10],xingming[9];
stud *p;
/*工作指针*/
使P指向首结点;
*th=1;
选择按姓名还是按学号查找;
if(选择按姓名查找)
删除函数模块伪码: void deletel(struct student * head) {
int th,xz,n; char c,xingming[9],xuehao[10]; struct student *p,*q; p=head; if(p->next!=NULL) {
选择删除方式; switch(xz) { case 1: 输入学生学号;
if(tolower(c)=='y')
{
把结点从链表中删除
释放P内
}
成绩录入函数模块伪码:
void input(stud * head)
{
int th=0,ps,qm; /*ps为平时成绩的比重,qm为期末成绩的比重*/
stud *p;
/*工作指针*/
p=head->next;
要求的基本功能已经全部具备了。在伪码部分,没有急于求成,一 次性写出整个程序的伪码,而是采取分步攻克的方法,我觉得这样 做还是比较的合理的,可以在一定程度上提高编程时所花费的时间 与精力。另外,部分函数模块可能写的比较粗糙,不容易看懂,这 里仍然有进步的空间。我认为,可以在函数模块伪码下画出函数模 块的流程图,这样把伪码和流程图组合起来看,清楚明白,使人一
详细设计 这个阶段的任务主要是确定每个模块的处理过程,包括(1)确定 每个模块的算法。(2)确定每一个模块的数据组织。(3)为每个模块 设计一组测试用例。(4)编写详细设计说明书。 [ 实验结果 ] 1.主要功能陈述:在这个选修课管理系统中,每个学生的信息由:学 号、姓名、班级、成绩等几项数据构成。因为选修课的学生人数不能预 知,故采用链表来进行数据管理,要求实现以下基本功能:插入、删 除、查询、浏览、初始化、导入、导出等。 2.选修课管理系统主要由以下几个模块组成: menu():选单函数,显示菜单并接受选择; show();浏览函数,将链表中各结点的数据依次输出; insert();插入函数,向链表中插入新结点,并使链表的各结点按学号 升序排列; search();查找函数,在链表中按姓名或学号进行查找; deletel();删除函数,在链表按学号、姓名或序号删除结点; input();成绩录入函数,依次给链表中各结点的数据录入成绩;
/*删除*/
目了然。 3. 收获与体会:别看流程图与功能模块图比较小,实际上在这个上我
花了很多的时间与精力。每次画的时候,都要注意画的图形的大小 与位置,而且线条要笔直,画线条的时候,手不能有一点点的抖 动,这个是非常困难的。后来,我发现,我们在一开始画各个部分 的时候不需要去过度在意每个图形的大小与位置,仅需画个大概即 可。等到把所有模块都画好之后,再慢慢调整各个图形的大小与位 置。这样做的话,会方便很多。
change();修改函数,对链表中指定结点的数据进行修改; load();读入函数,从文件中将选课情况导入到链表; save();保存函数,将链表中的选课情况保存到文件。
3.选修课管理系统的功能模块如图所示: 选修课管理系统
改姓名 按学号 按序号 按姓名 按学号 按姓名 改班级 改学号 插入 查找 保存 读入
查找输入学号在链表中的位置; break; case 2: 输入学生姓名; 查找输入姓名在链表中的位置; break; case 3: 输入学生学号; 查找输入学号在链表中的位置; break; default: 选择错误; } q指向p的直接后继; if(q等于NULL) { 则未找到结点; } 输出学号与姓名; c=getchar(); getchar();
/*指向首结点*/
输出“序号 学号 姓名 班级 平时成绩期末成绩总评成绩”;
while(若P不为空)
{
输出学号、姓名、班级;
输出平时成绩、期末成绩与总评成绩;
使P移动到链表下一个位置;
}
}
插入函数模块伪码:
void insert(stud * stud)
{
char an,xuehao[10],xingming[9],banji[11];
实验二:编码
[ 实验日期 ]
2013 年
[ 实验目的 ]
培养良好的编码风格。
4月
26 日
[ 实验内容 ] 根据详细设计的结果,按结构化思想编写代码,并对程序进行注释。 [ 实验原理和步骤 ]
注意变量或函数的名字要有意义,表达式和语句要一目了然,排版风 格、循环语句风格要保持一致,函数宏的定义,常数的定义,注释要全
}
gecthar();
}
修改函数模块伪码: void change(stud * head) {
int th=0,xz; float x,y; /*x,y分别代表平时成绩和期末成绩占最终成绩的比重*/ stud *p; do {
p=search(head,&th); if(p)
{ 输出学号、姓名与班级; 输出平时成绩、期末成绩与总评成绩;
break; case 5: 输入修改后的平时成绩并计算总评成绩;
break; } 输出学号、班级、姓名; 输出平时成绩、期末成绩与总评成绩; }
[ 实验总结 ]
1.在写程序伪码的时候,我们并不需要写的多么合理,只要符合要求, 自己可以看得懂就可以了的。在写这个选修课管理之前首先要清楚这个 管理系统所需要的功能,再根据这个设计不同的模块来满足此管理系统 要求的功能。通过写管理系统的伪码,我们能对写此管理系统的代码有 了更加深刻的认识与了解,为我们写选修课管理系统这个程序作了一定 的铺垫,起到了很好的指导作用。 2. 实验中的问题和提高:我觉得自己的设计仍然有不足之处,但系统
{
char num[10];
char name[10];
char class[10];
float commonscore;
float finalscore;
float score;
struct student *next;
}stud;
/*typedef来定义struct student*/
char menu();
{
输入学生姓名;
while(p!=NULL&&strcmp(xingming,p->name)!=0)
{
p=p->next;
(*th)++;
}
}
else
{
输入学生学号;
while(p!=NULL&&strcmp(xuehao,p->num)!=0)
{
p=p->next;
(*th)++; } } 返回要查找的学生信息所在结构体的地址; }
} Else 未找到!!!! }while(!p); 选择要修改部分的信息; switch(xz) { case 1: 输入修改后的学号;
break; case 2: 输入修改后的姓名;
break; case 3: 输入修改后的班级;
break; case 4: 输入修改后的平时成绩并计算总评成绩;
*
* 时间:2013.4.30
*
***********************************************
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NULL 0
/*定义结构体类型*/
typedef struct student
/*选单*/
stud * load();
/*导入*/
stud * search(stud *,int *);
/*查询*/
void save(stud *);
/*导出*/
void input(stud *);