成绩管理信息系统设计与开发.docx
《成绩管理信息系统设计与开发.docx》由会员分享,可在线阅读,更多相关《成绩管理信息系统设计与开发.docx(27页珍藏版)》请在冰点文库上搜索。
![成绩管理信息系统设计与开发.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/38f5965d-1e67-46ce-971c-bd5144ff8e4f/38f5965d-1e67-46ce-971c-bd5144ff8e4f1.gif)
成绩管理信息系统设计与开发
(此文档为word格式,下载后您可任意编辑修改!
)
C++程序设计设计性实验报告
实验项目名称:
中学生成绩管理信息系统设计与开发
专业班级:
信息XX;姓名:
XX;学号XX
实验起止日期:
起于XX年11月1日止于XX年12月10日
实验目的:
学会用C++语言和数据结构二叉树后序遍历算法实现表达式的解析与计算;学会使用动态链接库技术进行编程;学会编辑、编译、运行MFC应用程序的基本过程.
实验要求:
包括系统设计要求,开发环境要求,技术文档要求三部分。
系统设计要求:
1.最低要求:
能完成双精度型数值的加、减、乘、除计算;编程中使用了动态连接库技术.
2.较高要求:
能完成双精度型数值的加、减、乘、除计算;编程中使用了动态连接库技术;能实现表达式的输入,解析与计算
开发环境要求:
软件环境:
windows98/windowsXP/windows2000,VisualC++
硬件环境:
计算机(Pen4CPU,256MRAM,60G以上硬盘,输入输出设备)
技术文档要求:
按照软件工程技术文档编写要求进行。
要求流程图绘制规范,模块功能描述清晰,数据字典齐全。
实验内容:
1C++语言的顺序结构,分支结构,循环结构,函数,结构体,指针。
2数据结构中的二叉树数据组织、存贮、后序遍历及其操作
实验具体方案:
按照系统设计要求,用VisualC++设计和开发一个MFC应用程序---高级计算器,提交由需求分析;系统设计说明(包括主菜单、子菜单、模块功能简介、数据字典、系统结构图);系统技术文档(包括系统各模块主要流程图,软件总体测试方案与测试记录、局部测试方案与测试记录、软件调试和修改记录、测试结论、运行情况记录),系统使用说明书,源程序代码为附录构成的实验报告。
需求分析:
1.需求获取:
本实验要求编写一个高级计算器。
能完成双精度型数值的加、减、乘、除计算,编程中使用了动态连接库技术,能实现表达式的输入,解析与计算。
2.需求分析:
实验要求实现表达式的输入,这在MFC上通过连加不难实现,但要实现最终求解却很困难。
要解决这个问题需要把输入的操作数放进一个字符数组中,而且为了计算方便需要通过栈把这个字符数组中存放的中序表达式转化成后序表达式(后序表达式中不含左右括号,这可以大大简化结果的求解)。
而且为了继续运算,应该在每次计算完清空栈。
逻辑模型:
计算器输入的字符存放在字符数组中,将字符数组传入动态链接库已申明的函数中,将中序表达式转化成后序表达式(将后序表达式也存进一个字符数组中),将这个数组传入动态链接库中已申明的函数中,返回一结果输出在编辑框中。
3.需求规格说明书:
1)设计一个基于对话框的软件运行界面,在上面添加0——9的操作数键位。
在上面添加+、-、*、/、(、)、=、清零键位。
添加编辑框键位,并要在其上输出表达式。
2)编写算法阶段:
首先要声明一个字符数组用于存放中缀表达式(为了后面算法的编写方便和有效控制,要输入一个结束字符)。
声明一个字符类型的栈用于中缀转后缀,并把后缀表达式存放进一个字符数组。
声明一个实型栈用于计算结果。
4.需求评审:
对需求分析阶段的工作复查,可以看到需求文档满足一致性、可行性、完整性和有效性。
系统设计说明(包括主菜单、子菜单、模块功能简介、数据字典、系统结构图);
1.系统结构图
2.由上面的系统图可看出本系统有三大模块:
(1)输入表达式模块:
该模块的功能主要是将输入的表达式放入一个字符数组中,当然还要将表达式输入到编辑框中(这是MFC中的相关内容,主要是在输入+、-、*、/操作符后不要刷新,这样可将一个完整的表达式输入到编辑框。
)
(2)中序变后序模块:
该模块的功能主要是把中序表达式转化为后序表达式,在后序表达式将不存在左右括号,这样可大大简化计算结果算法的编写。
(3)计算结果模块:
该模块功能是通过后序表达式得到结果。
其主要思想是:
设置一个栈存放操作数,从左到右依次扫描后缀表达式,每读到一个操作数就将其入栈;每读到一个运算符就从栈顶取出两个操作数施以该运算符所代表的运算操作,并把运算结果入栈;此过程一直进行到后缀表达式读完,最后栈顶的操作数就是该后缀表达式的运算结果。
3数据词典:
看后面的软件运行图,该界面主要有以下键组成:
1——9键位:
用于输出数据。
运算符键位:
用于控制运算。
编辑框:
用于输出表达式和结果。
清零键:
用于清除编辑框中的表达式和结果。
确定键:
用于退出软件运行界面。
系统技术文档(包括系统各模块主要流程图,软件总体测试方案与测试记录、局部测试方案与测试记录、软件调试和修改记录、测试结论):
1.输入表达式模块流程图:
2.中缀转后缀模块表达式:
说明:
当遇到左右括号是算法将在此时去掉括号,当遇到结束标记时,算法在此结束处理。
3.计算结果模块:
系统技术文档(包括系统各模块主要流程图,软件总体测试方案与测试记录、局部测试方案与测试记录、软件调试和修改记录、测试结论):
注释:
当输入表达式错误是出现上面的运行界面。
系统运行结果和记录(软件运行界面图、软件运行数据输入界面图、软件运行结果界面图、运行记录)
1.软件运行界面图:
2.软件运行数据输入界面图:
3.软件运行结果界面图:
系统使用说明书:
本系统设计的是一个高级计算器,使用者可利用软件运行界面上的键位,依照合法的运算规则输入即可,按‘=’号键即可得到结果。
按‘确定’键退出运行界面。
实验讨论
该实验可用多种做法来完成:
如用头文件调运函数,用动态链接库技术。
采用不同的方法,在程序设计方面大同小异,但在细节处理方面会有所不同。
所以采用不同的方法会有不同的收获。
该实验的发挥空间比较大,如果时间充足,可多加一些键位,增加计算器的功能。
当然若时间不够,这些方面可留待以后做,这也可以实践所学知识和提高实际编程能力。
C++程序设计设计性实验收获与总结
通过本系统的设计,我掌握了很多MFC的相关知识,这对我以后的学习大有帮助。
但我同时也发现了自己知识面的狭窄,以至解决问题是捉襟见肘。
而且我发现通过对这种小规模软件的编写,可以让自己学到的知识得到很好的实践和巩固,也可以大大扩展自己的知识面,让自己学到很多有用的知识。
参考文献
数据结构(C++版):
李根强主编,中国水利水电出版社出版。
数据结构(C版):
朱站立编著,西安交通大学出版社出版。
附录:
源程序代码
1.表达式存储及转化代码:
#include
#include
#include
#defineelemtypechar
constmaxsize=1000;
elemtypes1[maxsize],s2[maxsize];//分别存放中缀表达式,后缀表达式
classseqstact
{
public:
elemtypestact[maxsize];
inttop;
voidinistact()
{
top=-1;
}
voidpush(elemtypex)
{
top++;
stact[top]=x;
}
voidpop()
{
top--;
}
elemtypegettop()
{
returnstact[top];
}
boolempty()
{
if(top==-1)returntrue;
elsereturnfalse;
}
intoper(elemtypeop)
{
switch(op)
{
case'+':
case'-':
return1;
case'*':
case'/':
return2;
case'(':
return0;
default:
return0;
}
}
voidchange()
{
elemtypey,ch;top=0;
inistact();push('=');
inti=0,j=0;
ch=s1[i];
while(ch!
='=')
{
if(ch=='')ch=s1[++i];
elseif(ch=='(')
{
push(ch);ch=s1[++i];//进栈
}
elseif(ch==')')
{
y=gettop();
while(y!
='(')
{
s2[j++]=y;
s2[j++]='';
pop();
y=gettop();
}
pop();
ch=s1[++i];
}
elseif((ch=='+')||(ch=='-')||(ch=='*')||(ch=='/'))
{
y=gettop();
if(oper(ch)>oper(y))
{
push(ch);
ch=s1[++i];
}
else
{
y=gettop();
s2[j++]=y;
s2[j++]='';
pop();
}
}
else
{
while(((ch>='0')&&(ch<='9'))||(ch=='.'))
{
s2[j++]=ch;
ch=s1[++i];
}
s2[j++]='';
}
}
y=gettop();
while(y!
='=')
{
s2[j++]=y;
s2[j++]='';
pop();
y=gettop();
}
s2[j]='=';
}
};//类定义结束
classSeqstact
{
public:
doublestact[maxsize];
inttop;
voidinistact()
{
top=-1;
}
voidpush(doublex)
{
top++;
stact[top]=x;
}
voidpop()
{
top--;
}
doublegettop()
{
returnstact[top];
}
};
doublecalculate(chars1[])
{
seqstacts;
elemtypech;
//inti=0;
//cout<<"请输入中缀表达式('='结束):
"</*cin>>ch;
while(ch!
='=')
{
s1[i++]=ch;
cin>>ch;
}*/
//s1[i]='=';
/*cout<<"中缀表达式:
"<for(intj=0;j
cout<cout<s.change();
/*cout<<"后缀表达式为:
"<j=0;
cout<cout<cout<<"计算结果"<Seqstactq;
q.inistact();
doublex,y,z;
intk=0;
ch=s2[k];
while(ch!
='=')
{
if((ch>='0')&&(ch<='9'))
{
x=ch-48;
ch=s2[++k];
while(ch!
='')
{
if(ch!
='.')
{
y=ch-48;
x=x*10+y;
ch=s2[++k];
}
elseif(ch=='.')
{
ch=s2[++k];
intt=1;
do
{
y=ch-48;
x=x+y/pow(10,t);
t++;
ch=s2[++k];
}while(ch!
='');
}
}
q.push(x);
ch=s2[++k];
}
elseif((ch=='+')||(ch=='-')||(ch=='*')||(ch=='/'))
{
x=q.gettop();q.pop();
y=q.gettop();q.pop();
if(ch=='+')z=x+y;
elseif(ch=='-')z=y-x;
elseif(ch=='*')z=y*x;
elseif(ch=='/')
{
if(x!
=0.0)z=y/x;
elsecout<<"error!
"<}
q.push(z);
ch=s2[++k];
ch=s2[++k];
}
}
returnq.gettop();
}
//清零函数
voidclear()
{
inti=0;
for(i=0;is1[i]='\0';
s.top=-1;
q.top=-1;
}
char*trans(char*bb,doublex)
{
inti;
sprintf(bb,"%f",x);
i=int(strlen(bb))-1;
while(i&&bb[i]=='0')
{
bb[i]='\0';
i--;
}
if(bb[i]=='.')
bb[i]='\0';
returnbb;
}
2.MFC界面程序:
//文亮Dlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"文亮.h"
#include"文亮Dlg.h"
#include"表达式计算》.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
#include
intdecimal,sign;
inti=0;
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgdialog
CMyDlg:
:
CMyDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMyDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
m_edit1=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMyDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Text(pDX,IDC_EDIT1,m_edit1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg,CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON10,OnButton10)
ON_BN_CLICKED(IDC_BUTTON7,OnButton7)
ON_BN_CLICKED(IDC_BUTTON8,OnButton8)
ON_BN_CLICKED(IDC_BUTTON9,OnButton9)
ON_BN_CLICKED(IDC_BUTTON4,OnButton4)
ON_BN_CLICKED(IDC_BUTTON5,OnButton5)
ON_BN_CLICKED(IDC_BUTTON6,OnButton6)
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_BN_CLICKED(IDC_BUTTON3,OnButton3)
ON_BN_CLICKED(IDC_BUTTON11,OnButton11)
ON_BN_CLICKED(IDC_BUTTON13,OnButton13)
ON_BN_CLICKED(IDC_BUTTON14,OnButton14)
ON_BN_CLICKED(IDC_BUTTON15,OnButton15)
ON_BN_CLICKED(IDC_BUTTON16,OnButton16)
ON_BN_CLICKED(IDC_BUTTON12,OnButton12)
ON_BN_CLICKED(IDC_BUTTON17,OnButton17)
ON_BN_CLICKED(IDC_BUTTON18,OnButton18)
ON_BN_CLICKED(IDC_BUTTON19,OnButton19)
ON_EN_CHANGE(IDC_EDIT1,OnChangeEdit1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgmessagehandlers
BOOLCMyDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMyDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecode