C程序设计设计性实验报告 本文关键词:程序设计,实验,报告,设计
C程序设计设计性实验报告 本文简介:C++程序设计设计性实验C++程序设计设计性实验报告实验项目名称:高级计算器设计与开发专业班级:数学061;姓名:冯凯;学号200612010115实验起止日期:起于2008年11月1日止于2008年12月10日实验目的:1.学会用C++语言和利用数据结构中的堆栈实现表达式的解析与计算。2.学会使用
C程序设计设计性实验报告 本文内容:
C++程序设计设计性实验
C++程序设计设计性实验报告
实验项目名称:高级计算器设计与开发
专业班级:
数学061
;姓名:
冯
凯
;学号
200612010115
实验起止日期:起于
2008
年
11
月1日止于
2008
年
12
月10日
实验目的:
1.学会用C++语言和利用数据结构中的堆栈实现表达式的解析与计算。
2.学会使用动态链接库技术进行编程;学会编辑、编译、运行MFC应用程序的基本
过程,并开发一个可以进行表达式运算的高级计算器。
实验要求:
1.
能处理双精度型数值的加、减、乘、除的表达式计算。
2.编程中使用了动态连接库技术。
开发环境要求:
软件环境:windows98/windowsXP/windows2000,Visual
C++
硬件环境:计算机(Pen4CPU,256MRAM,60G以上硬盘,输入输出设备)
技术文档要求:
按照软件工程技术文档编写要求进行。要求流程图绘制规范,模块功能描述清晰,数据字典齐全。
实验内容:
1
C++语言的顺序结构,分支结构,循环结构,函数,结构体,指针。
2
数据结构中的堆栈存贮结构及其操作的实现。
实验具体方案:
按照系统设计要求,用Visual
C++设计和开发一个MFC应用程序---高级计算器,提交由需求分析;系统设计说明(包括主菜单、子菜单、模块功能简介、数据字典、系统结构图);系统技术文档
(包括系统各模块主要流程图,软件总体测试方案与测试记录、局部测试方案与测试记录、软件调试和修改记录、测试结论、运行情况记录),系统使用说明书,源程序代码为附录构成的实验报告。
需求分析:
普通的功能简单的仅能进行四则运算的计算工具已经不能满足需要,需要一种能进行多种计算工具。而windows自带的计算器不能处理表达式这是一个缺陷,为此开发一个能处理表达式运算的高级计算器是十分必要的,这为计算提高了更大的方便,可以大幅度提高计算效率。
系统设计说明:(包括主菜单、子菜单、模块功能简介、数据字典、系统结构图)
主菜单主要包含:
操作说明、相关主题、退出。
整个程序的模块组成:
(1)
Windows基于对话框的资源文件模块。
(2)
动态链接库模块,主要提供了表达式的解析与计算。
(3)
其他功能模块如开平方,取平方,进制转换等。
数据字典
m_edit1
//编辑框变量,用于显示输入输出
CString
str1,str2,str3
;
//中间临时字符串变量
char
s[70],s2[70],buffer[20];
//用于CString字符串的转换以及将double型数据转
换为CString型字符串。
stack
//结构体类型
ElemTypestack;
//存栈元素
Int
top
//存栈顶元素的下标位置
int
MaxSiz//存stack数组长度。
void
Initiatestack(Stack
#endif
double
x,y,z;
///////判断优先级的函数
extern
int
Precedence(char
op);
///////将中缀表达式转换为后缀表达式,中缀在str1中,后缀在str2中
extern
int
change(char*
str1,char*str2);
///////计算后缀表达式的值///////////////////////
extern
double
compute(charstr);
///////////////////////////进制转换函数//////////////////////////////
extern
double
tranfrom(double
num,int
r);
//
CAboutDlg
dialog
used
for
App
About
class
CAboutDlg
:
public
CDialog
{
public:
CAboutDlg();
//
Dialog
Data
//{{AFX_DATA(CAboutDlg)
enum
{
IDD
=
IDD_ABOUTBOX
};
//}}AFX_DATA
//
ClassWizard
generated
virtual
function
overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual
void
DoDataExchange(CDataExchange*
pDX);
//
DDX/DDV
support
//}}AFX_VIRTUAL
//
Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg()
:
CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void
CAboutDlg::DoDataExchange(CDataExchange*
pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//
No
message
handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
CCalcDlg
dialog
CCalcDlg::CCalcDlg(CWnd*
pParent
/*=NULL*/)
:
CDialog(CCalcDlg::IDD,pParent)
{
//{{AFX_DATA_INIT(CCalcDlg)
m_edit1
=
_T(““);
//}}AFX_DATA_INIT
//
Note
that
LoadIcon
does
not
require
a
subsequent
DestroyIcon
in
Win32
m_hIcon
=
AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void
CCalcDlg::DoDataExchange(CDataExchange*
pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCalcDlg)
DDX_Text(pDX,IDC_EDIT1,m_edit1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCalcDlg,CDialog)
//{{AFX_MSG_MAP(CCalcDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_1,OnNO1)
ON_BN_CLICKED(IDC_2,OnNO2)
ON_BN_CLICKED(IDC_3,OnNO3)
ON_BN_CLICKED(IDC_4,OnNO4)
ON_BN_CLICKED(IDC_5,OnNO5)
ON_BN_CLICKED(IDC_6,OnNO6)
ON_BN_CLICKED(IDC_7,OnNO7)
ON_BN_CLICKED(IDC_8,OnNO8)
ON_BN_CLICKED(IDC_0,OnN0)
ON_BN_CLICKED(IDC_9,OnNO9)
ON_BN_CLICKED(IDC_DIAN,OnDOT)
ON_BN_CLICKED(IDC_ADD,OnADD)
ON_BN_CLICKED(IDC_DENG,OnDENG)
ON_BN_CLICKED(IDC_clear,Onclear)
ON_BN_CLICKED(IDC_SUB,OnSub)
ON_BN_CLICKED(IDC_CHENG,OnCheng)
ON_BN_CLICKED(IDC_CHU,OnChu)
ON_BN_CLICKED(IDC_sqrt,Onsqrt)
ON_BN_CLICKED(IDC_powe,Onpowe)
ON_BN_CLICKED(IDC_DUISHU,OnDuishu)
ON_BN_CLICKED(IDC_BUTTON1,Ondelete)
ON_BN_CLICKED(IDC_BUTTON3,Onyoukuohao)
ON_BN_CLICKED(IDC_BUTTON4,Onzuokuohao)
ON_EN_CHANGE(IDC_EDIT1,OnChangeEdit1)
ON_BN_CLICKED(IDC_BUTTON2,OnER_jin_zhi)
ON_BN_CLICKED(IDC_BUTTON5,Onba_jin_zhi)
ON_BN_CLICKED(IDC_BUTTON6,Onshi_liu_jin_zhi)
ON_BN_CLICKED(IDC_BUTTON7,OnCOS)
ON_BN_CLICKED(IDC_BUTTON8,Onsin)
ON_BN_CLICKED(IDC_BUTTON9,OnOP)
ON_BN_CLICKED(IDC_BUTTON10,OnZhuti)
ON_BN_CLICKED(IDC_BUTTON11,Onexit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
CCalcDlg
message
handlers
BOOL
CCalcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
Add
“About.“menu
item
to
system
menu.
//
IDM_ABOUTBOX
must
be
in
the
system
command
range.
ASSERT((IDM_ABOUTBOX
ASSERT(IDM_ABOUTBOX
AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//
Set
the
icon
for
this
dialog.
The
framework
does
this
automatically
//
when
the
application
s
main
window
is
not
a
dialog
SetIcon(m_hIcon,TRUE);//
Set
big
icon
SetIcon(m_hIcon,FALSE);//
Set
small
icon
//
TODO:
Add
extra
initialization
here
return
TRUE;
//
return
TRUE
unless
you
set
the
focus
to
a
control
}
void
CCalcDlg::OnSysCommand(UINT
nID,LPARAM
lParam)
{
if
((nID
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID,lParam);
}
}
//
If
you
add
a
minimize
button
to
your
dialog,you
will
need
the
code
below
//
to
draw
the
icon.
For
MFC
applications
using
the
document/view
model,//
this
is
automatically
done
for
you
by
the
framework.
void
CCalcDlg::OnPaint()
{
if
(IsIconic())
{
CPaintDC
dc(this);
//
device
context
for
painting
SendMessage(WM_ICONERASEBKGND,(WPARAM)
dc.GetSafeHdc(),0);
//
Center
icon
in
client
rectangle
int
cxIcon
=
GetSystemMetrics(SM_CXICON);
int
cyIcon
=
GetSystemMetrics(SM_CYICON);
CRect
rect;
GetClientRect(
int
x
=
(rect.Width()
-
cxIcon
+
1)
/
2;
int
y
=
(rect.Height()
-
cyIcon
+
1)
/
2;
//
Draw
the
icon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//
The
system
calls
this
to
obtain
the
cursor
to
display
while
the
user
drags
//
the
minimized
window.
HCURSOR
CCalcDlg::OnQueryDragIcon()
{
return
(HCURSOR)
m_hIcon;
}
void
CCalcDlg::OnNO1()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“1“;
UpdateData(false);
}
void
CCalcDlg::OnNO2()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“2“;
UpdateData(false);
}
void
CCalcDlg::OnNO3()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“3“;
UpdateData(false);
}
void
CCalcDlg::OnNO4()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“4“;
UpdateData(false);
}
void
CCalcDlg::OnNO5()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“5“;
UpdateData(false);
}
void
CCalcDlg::OnNO6()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“6“;
UpdateData(false);
}
void
CCalcDlg::OnNO7()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“7“;
UpdateData(false);
}
void
CCalcDlg::OnNO8()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“8“;
UpdateData(false);
}
void
CCalcDlg::OnN0()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“0“;
UpdateData(false);
}
void
CCalcDlg::OnNO9()
{
m_edit1+=“9“;
UpdateData(false);
}
void
CCalcDlg::OnDOT()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“.“;
UpdateData(false);
}
void
CCalcDlg::OnADD()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“+“;
UpdateData(false);
}
void
CCalcDlg::OnDENG()
{
//
TODO:
Add
your
control
notification
handler
code
here
char
s[70],s2[70],buffer1[20];double
r;CString
str1,str2,str3;int
i=0;
str1=m_edit1;
strncpy(s,(LPCTSTR)str1,sizeof(s));
s[sizeof(s)-1]=
/0
;
if(str1.Left(1)==“+“||s[0]==
-
||s[0]==
||s[0]==
/
||s[0]==
.
)
{str2.Format(“/n抱
歉!/n不
能
处
理
输
入
的
表
达
式!
/n请
重
新
输
入“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;
}
for(i=0;s[i]!=
/0
;i++)
{
if((s[i]==
+
||s[i]==
-
||s[i]==
||s[i]==
/
)
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;
}
}
change(s,s2);
if(change(s,s2)==0)
{
str2.Format(“/n输
入
的
表
达
式
错
误
!
/n请
重
新
输
入“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;}
r=compute(s2);
if(r==sqrt(2))
{
str2.Format(“/n输
入
的
表
达
式
错
误
!
/n请
重
新
输
入“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;}
_gcvt(r,8,buffer1);
for(i=1;buffer1[i]!=
/0
;i++)
{
if(buffer1[i]==
.
}
m_edit1=(CString)buffer1;
label:
UpdateData(false);
}
void
CCalcDlg::Onclear()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1=_T(““);
UpdateData(false);
}
void
CCalcDlg::OnSub()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“-“;
UpdateData(false);
}
void
CCalcDlg::OnCheng()
{
m_edit1+=“*“;
UpdateData(false);
}
void
CCalcDlg::OnChu()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“/“;
UpdateData(false);
}
void
CCalcDlg::Onsqrt()
{
//
TODO:
Add
your
control
notification
handler
code
here
chars1,buffer1[20];CString
str1,str2,str3;int
i;
str1=m_edit1;
str2=str1;
str3=str1;
if(str2.Right(1)==“B“||str2.Right(1)==“o“||str2.Right(1)==“H“||str3.Left(1)==“B“||str3.Left(1)==“o“||str3.Left(1)==“H“)
{
{
str2.Format(“/n!
计
算
格
式
错
误
/n请
重
新
输
入“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;}
}
OnDENG();
//调用等号子过程
x=strtod(m_edit1,if(x<0)
{
str2.Format(“/n负
数
不
能
开
方
“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;
}
y=sqrt(x);
_gcvt(y,16,buffer1);
for(i=0;buffer1[i]!=
/0
;i++)
{
if(buffer1[i]==
.
}
m_edit1=(CString)buffer1;
label:UpdateData(false);
}
void
CCalcDlg::Onpowe()
{
//
TODO:
Add
your
control
notification
handler
code
here
chars,buffer1[20];CString
str1,str2,str3;int
i=0;
str1=m_edit1;
str2=str1;
str3=str1;
if(str2.Right(1)==“B“||str2.Right(1)==“o“||str2.Right(1)==“H“||str3.Left(1)==“B“||str3.Left(1)==“o“||str3.Left(1)==“H“)
{
{
str2.Format(“/n!
计
算
格
式
错
误
/n请
重
新
输
入“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;}
}
OnDENG();
//调用等号子过程
x=strtod(m_edit1,y=pow(x,2);
_gcvt(y,16,buffer1);
for(i=0;buffer1[i]!=
/0
;i++)
{
if(buffer1[i]==
.
}
m_edit1=(CString)buffer1;
label:UpdateData(false);
}
void
CCalcDlg::OnDuishu()
{
//
TODO:
Add
your
control
notification
handler
code
here
chars1,buffer1[20];CString
str1,str2,str3;int
i=0;
str1=m_edit1;
str2=str1;
str3=str1;
if(str2.Right(1)==“B“||str2.Right(1)==“o“||str2.Right(1)==“H“||str3.Left(1)==“B“||str3.Left(1)==“o“||str3.Left(1)==“H“)
{
{
str2.Format(“/n!
计
算
格
式
错
误
/n请
重
新
输
入“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
str2=_T(““);
goto
label;}
}
OnDENG();
//调用等号子过程
x=strtod(m_edit1,if(x<0)
{
str2.Format(“/n负
数
不
能
取
对
数
“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;
}
y=log10(x);
_gcvt(y,6,buffer1);
for(i=0;buffer1[i]!=
/0
;i++)
{
if(buffer1[i]==
.
}
m_edit1=(CString)buffer1;
label:UpdateData(false);
}
void
CCalcDlg::Ondelete()
{
//
TODO:
Add
your
control
notification
handler
code
here
CString
str1,str2,str3;
str1=m_edit1;
str1=str1.Left(str1.GetLength()-1);
m_edit1=str1;
UpdateData(false);
}
void
CCalcDlg::Onyoukuohao()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“)“;
UpdateData(false);
}
void
CCalcDlg::Onzuokuohao()
{
//
TODO:
Add
your
control
notification
handler
code
here
m_edit1+=“(“;
UpdateData(false);
}
void
CCalcDlg::OnChangeEdit1()
{
//
TODO:
If
this
is
a
RICHEDIT
control,the
control
will
not
//
send
this
notification
unless
you
override
the
CDialog::OnInitDialog()
//
function
and
call
CRichEditCtrl().SetEventMask()
//
with
the
ENM_CHANGE
flag
ORed
into
the
mask.
//
TODO:
Add
your
control
notification
handler
code
here
}
void
CCalcDlg::OnER_jin_zhi()
{
//
TODO:
Add
your
control
notification
handler
code
here
double
x1,x2,*p;int
i=0,j=0,k=0;CString
str1,str2,str3;
chars1,buffer1[35];
str1=m_edit1;
str2=str1;
str3=str1;
if(str2.Right(1)==“B“||str2.Right(1)==“o“||str2.Right(1)==“H“||str3.Left(1)==“B“||str3.Left(1)==“o“||str3.Left(1)==“H“)
{
{
str2.Format(“/n!
不
能
将
进
制
数
转
换
为
二
进
制
“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;}
}
char
s[100];
strncpy(s,(LPCTSTR)str1,sizeof(s));
s[str1.GetLength()-1]=
/0
;
for(i=0;s[i]!=
/0
;i++)
{
if(s[i]==
.
)
{
str2.Format(“抱歉不能处理带小数点的数!/n
请输入一个整数试试“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;
}
else
if(s[i]==
||s[i]==
/
)
{str2.Format(“抱歉不能处理这类表达式!/n
请输入一个不带任何符号的整数试试“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;
}
}
for(i=0;s[i]!=
/0
;i++)
{
if((s[i]==
+
||s[i]==
-
||s[i]==
||s[i]==
/
)
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;
}
}
m_edit1=_T(““);
x1=strtod(str1,if(x1<0)
x2=-x1;
else
x2=x1;
p=tranfrom(x2,2);
for(i=0;p[i]!=
#
;i++)
{_gcvt(p[i],32,buffer1);
for(j=0;j<35;j++)
if(buffer1[j]==
.
)
{
buffer1[j]=buffer1[j+1];
m_edit1+=(CString)buffer1;
}
}
if(x1<0)
m_edit1=“-“+m_edit1;
m_edit1+=“B“;
label
:UpdateData(false);
}
void
CCalcDlg::Onba_jin_zhi()
{
//
TODO:
Add
your
control
notification
handler
code
here
double
x1,x2,*p;int
i=0,j=0;CString
str1,str2,str3;
chars1,buffer1[35];
str1=m_edit1;
str2=str1;
str3=str1;
if(str2.Right(1)==“B“||str2.Right(1)==“o“||str2.Right(1)==“H“||str3.Left(1)==“B“||str3.Left(1)==“o“||str3.Left(1)==“H“)
{
{
str2.Format(“/n!
不
能
将
进
制
数
转
换
为
八
进
制
“);
MessageBox(str2,“冯凯温馨提示“);
m_edit1=_T(““);
goto
label;}
}
char
s[35];
strncpy(s,(LPCTSTR)str1,sizeof(s));
s[sizeof(s)-1]=
/0
;
for(i=0;s[i]!=
/0
;i++)
{
if(s[i]==
.
)
{
str2.Format(“抱歉不能处理带小数点的数!/n
请输入一个整数试试“);
MessageBox(str2,“冯凯温馨
篇2:C语言程序设计实验报告(6)
C语言程序设计实验报告(6) 本文关键词:实验,语言程序设计,报告
C语言程序设计实验报告(6) 本文简介:贵阳学院机电系实验报告课程名称:指导教师:年级:专业:学生姓名:学号:20——20学年第学期填写要求一、对于演示性实验,要写出心得体会(字数不少于800字)。二、对于验证性实验(操作型,不属于程序设计型),要收集数据,对数据进行处理,并绘制曲线和写出实验总结(不少于50字)。三、对于设计性实验,(操
C语言程序设计实验报告(6) 本文内容:
贵阳学院
机电系实验报告
课程名称:
指导教师:
年
级:
专
业:
学生姓名:
学
号:
20
——20
学年第
学期
填
写
要
求
一、对于演示性实验,要写出心得体会(字数不少于800字)。
二、对于验证性实验(操作型,不属于程序设计型),要收集数据,对数据进行处理,并绘制曲线和写出实验总结(不少于50字)。
三、对于设计性实验,(操作型,不属于程序设计型),要给设计思路,完成“二”中的任务,分析设计的规范性和合理性。
四、对于程序设计型实验,要写出源程序,运行结果和实验总结(不少于50字)。
实验一(预备实验)
一、
实验项目名称:
C语言的运行环境和运行C程序的方法
二、
实验时间:
三、
实验地点:
四、
实验目的:
1.
了解所用的计算机系统的基本操作方法,学会独立使用该系统。
2.
了解在该系统上如何编辑、编译、连接和运行一个C程序。
3.
通过运行简单的C程序,初步了解C源程序的特点。
五、
主要的实验所需仪器、设备:PC机。
六、
实验内容与步骤:
1.
检查所用的计算机系统是否已安装了C编译系统并确定它所在的子目录。
2.
进入所用的集成环境。
3.
熟悉集成环境的界面和有关菜单的使用方法。
4.
输入并运行一个简单的、正确的程序。
i.
输入下面的程序
#include
void
main(
)
{
printf(“This
is
a
program./n”);
}
ii.
编译源程序,观察编译信息,如出现错误,找出原因,继续编译,如无错,进行连接。
iii.
如连接无误,运行程序,分析运行结果。
5.
输入并编辑一个有错误的C程序。
i.
输入以下程序
#include
void
main(
)
{
int
a,b,sum;
a=123;
b=456;
sum=a+b
print(“sum
si
%d/n”,sum);
}
ii.
编译程序,错误信息有:
iii.
编译成功,连接程序,错误信息有:
iv.
连接成功,使程序运行,运行结果:
v.
分析结果正误:
vi.
将调试好的程序保存在自己的用户目录中,文件名自定。
vii.
关闭文件,再将文件读入,检查窗口中的内容是否是刚才存盘的程序。
viii.
关闭所有的集成环境,用Windows中的“我的电脑”找到刚才使用的用户子目录,浏览其中文件,看有无刚才保存的后缀为.c和.exe的文件。
6.
上机运行本章例题1.3。
七、
本次上机实验的心得。
八、
理论支撑:《C语言程序设计》第一章
本次实验成绩
篇3:打字游戏程序设计报告
打字游戏程序设计报告 本文关键词:程序设计,打字,报告,游戏
打字游戏程序设计报告 本文简介:第二章打字游戏程序设计内容要求和设计思想2.1设计内容要求要求设计的程序需包括:在游戏开始后,按回车键进入打字游戏;按ESC键返回主界面;按空格暂停;按大写字母E程序结束。26个字母中的任意一字母从屏幕落下,在下落的过程中键入落下的字母,如果正确,字母消失,分数增加;如果不正确,字母继续下落。接着继
打字游戏程序设计报告 本文内容:
第二章
打字游戏程序设计内容要求和设计思想
2.1
设计内容要求
要求设计的程序需包括:在游戏开始后,按回车键进入打字游戏;按ESC键返回主界面;按空格暂停;按大写字母E程序结束。26个字母中的任意一字母从屏幕落下,在下落的过程中键入落下的字母,如果正确,字母消失,分数增加;如果不正确,字母继续下落。接着继续下落其他字母,如果不正确的字母数大于10个,则游戏结束并返回到成绩界面。进入成绩界面后显示所得游戏分数,
暂停大概2秒后返回到主菜单。
2.2
整体设计思想
程序首先通过宏的定义以及调用宏来画出游戏边框,再通过定义一个函数并调用MOV
AH,09
INT
21H
来显示字符串,DS:DX定义字符串位置。游戏主程序调用BIOS
INT
10
的9号功能实现对目标文本的颜色和定位。游戏主程序可以用MOV
AH,00
INT
16H从键盘读取输入的字符再调用MOV
AH,01
INT
21H
让键盘输入显示在屏幕中
AL=输入的字符,用CMP指令对输入的文本和目标文本进行比较,再利用选择语句在打错字符后对wrong的基数加1,在打对字符后对right的基数加1,并调用清屏函数clear将该字符消除。对于要求柱形图实时显示正确和错误的数目,可以通过利用“*”在竖向上叠加来实现,字符串结束后直接退到dos环境。
2.3
整体设计方案流程图
开始
欢迎界面
结束
速度选择
1,2,3
游戏运行
游戏结束
ESC
E
ENTER
输入字母并进行相关操作后返回
显示成绩
图2.1
第三章
软件设计
3.1
程序流程详细说明
首先运行程序,进入主界面,通过键盘输入字符,先判断是否是“E”,是则直接退出,如果不是“E”,则进入下一步判断是否为数字1,是就按速度1
下落字母,否就进入下一步判断,是否为数字2,是就按速度2下落字母,否就进入下一步判断,是否为数字3,是就按速度3下落字母,否就返回重新输入。
字母随机下落的过程中,检查键盘是否输入ESC,是就返回到主界面,否就继续下落,接着判断玩家输入的字母跟下落的字母是否一样,是就清除该字母,并使RIGHT的基数加1,否就使WRONG的基数加1,接着判断WRONG是否大于10,否就又重新随机下落一字母,是游戏就结束并显示最终成绩,接着就返回到主界面等待新的指令。
3.2程序流程图
开始
主界面
键盘输入
是否E
是否1
速度1
是否2
速度2
是否3
字母随机落下
检查键盘
是否ESC
速度3
输入字符正确
结束
下落字母消失
WRONG+1
WRONG>10
显示最终成绩
RIGHT+1
图3.1
3.3
重点子程序分析
3.3.1
随机产生字母
先初始定义一个由61个无序字母组成的字母列STRD,此字母列包含从A-Z
26个字母,将STRD的偏移地址存在DI中,又将字母列的备份存在SI中,定义一个计数寄存器CX,首先置CX为0,程序每产生一个随机字母后CX自动加1,并且比较每次循环时CX是否已经大于61,如果大于61则对屏幕初始化置0,如果大于则继续随机下落字母。
3.3.2
字母的下落
字母的下落是整个程序的核心部分,实现该功能的原理是让字母在规定的时间间隔内多次显示,字母每次下移1位,同时上一位自动以空格代替,这样在视觉上就起到了字母自动下落的效果,下落的速度由我们自己决定,本程序中设置了三种速度。
3.4
程序中使用的部分重要指令
3.4.1通用数据转送指令MOV
它表示把操作数(SRC),转送给目的操作数(DIST),源操作数不变,目的操作数被源操作数所替代。转送指令每次可以转送一个字节或一个字,可以实现CPU的内部寄存器之间的数据转送、寄存器和内存之间的数据转送,还可以将立即数送给CPU内部的寄存器。本设计中大量的用到了MOV指令,如MOV
AH,0AH
MOV
AL,OP3
MOV
CX,01H
MOV
BH,00H
等等,以实现起数据的传送。
3.4.2
无条件转移指令JMP、CALL、RET
(1)当程序中出现JMP指令时,无条件的跳至JMP后所跟的变量处。其主要有段内短转移、段内直接转移、段间直接转移、段内间接转移、段间间接转移、段内间接转移等操作。
(2)CALL指令为调用子程序,其功能为保护程序断点后,转到子程序处执行。主要包括段内调用和段间调用。
(3)RET返回指令,通常与CALL指令连用,从子程序返回主程序,通常放在子程序之后。也包括段内返回和段间返回。
3.4.3
条件转移指令
条件转移指令是根据执行该指令时CPU标志的状态而决定是否发生控制转移的指令。如果满足条件则程序转移到指定的目标地址;如果不满足则继续执行该条件下的下一条指令。一般与比较指令CMP连用。在本程序设计中主要用到“JE(相等转移)”、“JA(大于转移)”、“JNE(不相等转移)”等。
3.4.4
堆栈操作指令PUSH、POP
PUSH进栈指令的功能是将操作数推入堆栈。它的源操作数可以是16为通用寄存器、段寄存器或存储器中的数据字,打不能是立即数。堆栈是以“先进后出”的方式工作的一个存储区,栈区的段址由SS寄存器的内容确定。堆栈的最大容量可为64K,即一个段的最大容量。堆栈指针SP始终指向栈顶,其值可以从FFFEH(偶地址)开始,向低地址方向发展,最小为0。每次执行PUSH操作时,先修改SP的值,使SP?SP
-
2后,然后把操作数压入堆栈种SP指示的位置上,低位字节放在较低地址单元,高位字节放在交高地址单元中。
POP出栈指令的功能是把当前的SP所指向的堆栈顶部的一个字送到指定的目的操作数中。它的目的操作数可以是16位通用寄存器,段寄存器或存储单元,但CS不能做目的操作数。每执行一次出栈操作,SP?SP+2,即SP向高地址方向移动,指向新的栈顶。
3.4.5
算数运算指令ADD、SUB、DIV、INC
ADD加法指令,它的功能是将源操作数相加,结果送到目的操作数中,即
目的?源+目的。
SUB减法指令,它的功能是将目的操作数减去源操作数,结果送回目的操作数,即目的?目的
–
源。
DIV无符号数除法指令,它的功能是对两个无符号二进制数进行除法操作。
INC增量指令,它的功能是对目的操作数加1,结果送回目的操作数,即目的?目的+1。
ADD,SUB这两条指令的原操作数可以是寄存器、存储器或立即数,目的操作数只能是用寄存器和存储单元。使用时需注意源和目的操作数不能同时为存储器,而且他们的类型必须一致,即都是字节或字。
DIV指令的原操作数可以是字节或字,如果源操作数为字节,16位被除数必须放在AX中,8位除数为原操作数,他可以是寄存器或存储单元,相除之后,8位商在AL中,余数在AH中。要是操作数为字,32位被除数在DX,AX中,其中DX为高位字,16位除数作源操作数,他可以是寄存器或存储单元。相除之后,AX中存16位商,DX存16位余数。要是被除数只有16位,除数也是16位,则必须将16位被除数送到AX中,再将DX寄存器清0,然后相除。
INC指令的目的操作数可以在通用寄存器或内存种,这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改。指令执行后影响AF、OF、PF、SF和ZF,但进位标志CF不受影响。
3.5
源程序及其说明
DIS
MACRO
STRING,X
MOV
AL,3
MOV
AH,0
INT
10H
MOV
BP,SEG
STRING
MOV
ES,BP
MOV
BP,OFFSET
STRING
MOV
CX,15
MOV
DH,X
MOV
DL,29
MOV
BL,74H
MOV
AL,1
MOV
AH,13H
INT
10H
ENDM
DIS4
MACRO
STRING,X,Y
;在指定位置以红底蓝字显示字符串
dis2
MOV
AL,3
MOV
AH,0
INT
10H
MOV
BP,SEG
STRING
MOV
ES,BP
MOV
BP,OFFSET
STRING
MOV
CX,Y
;显示字符串的长度
MOV
DH,X
;行位置
MOV
DL,29
;列位置
MOV
BL,74H
;显示字符串的属性74h
MOV
AL,1
MOV
AH,13H
INT
10H
DIS3
DIS5
ENDM
DIS1
MACRO
STRING1,Y,M
;在指定位置处显示字符串
MOV
AH,2
;置光标位置
MOV
BH,0
MOV
DH,Y
;行标
MOV
DL,M
;列标
INT
10H
MOV
AH,09H
;显示str1
MOV
DX,SEG
STRING1
MOV
DS,DX
MOV
DX,OFFSET
STRING1
INT
21H
ENDM
DIS2
MACRO
;宏进栈
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
DX
ENDM
DIS3
MACRO
;宏出栈
POP
DX
POP
CX
POP
BX
POP
AX
ENDM
DIS5
MACRO
S1,S2
DIS2
MOV
AH,6D
MOV
AL,0
MOV
AL,25D
MOV
BH,10100100B
;01111111b
MOV
CH,0
MOV
CL,0
MOV
DH,0
MOV
DL,80
INT
10H
DIS3
ENDM
DIS6
MACRO
Z1,Z2,Z3,Z4
;画横向边框的宏
LOCAL
C5
DIS2
MOV
CX,Z1
;循环次数
MOV
DL,Z2
;列
C5:
MOV
AH,2
;置光标位置
MOV
BH,Z3
;页号
MOV
DH,Z4
;行
INT
10H
PUSH
DX
MOV
DL,2AH
INT
21H
POP
DX
INC
DL
LOOP
C5
DIS3
ENDM
DIS7
MACRO
Q1,Q2,Q3,Q4
;画竖边框的宏
LOCAL
F1
DIS2
MOV
CX,Q4
MOV
DH,Q1
F1:
MOV
AH,2
;置光标位置
MOV
BH,Q2
MOV
DL,Q3
INT
10H
MOV
DL,2AH
INT
21H
INC
DH
LOOP
F1
DIS3
ENDM
DATAS
SEGMENT
STR1
DB
Welcome
to
play
chars,0AH,0DH,$
STR2
DB
Made
by
Zhou
Liangfeng,0AH,0DH,$
STR3
DB
2010/1/8,0AH,0DH,$
STR4
DB
Please
choose
speeding,0AH,0DH,$
STR5
DB
Please
press
Enter
to
cintinue.,0AH,0DH,$
STR7
DB
speed
1,0AH,0DH,$
STR8
DB
speed
2,0AH,0DH,$
STR9
DB
speed
3,0AH,0DH,$
STR0
DB
Select
the
number
among
1-3,0AH,0DH,$
STRA
DB,0AH,0DH,$
STRB
DB
score:,i,0AH,0DH,$
STRC
DB
You
choose:,0AH,0DH,$
STRD
DB
hqfuvodepfdjygnhtrwgaerjrklubgsnyrsbntrsbngtrdjykuahtrgregfytjgfjytjktru,$
STRE
DB
RIGHT:,$
ST1
DB
RIGHT:
Pause,0AH,0DH,$
ST2
DB
E
:
Quit,0AH,0DH,$
ST8
DB
Esc:
Back,0AH,0DH,$
ST3
DB
Function
Meun,0AH,0DH,$
ST4
DB
please
input.,0AH,0DH,$
ST5
DB
SPACE:
Continue,0AH,0DH,$
ST6
DB
Quitting.,0AH,0DH,$
ST7
DB
Press
any
key
to
continue,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,$
LENTH
EQU
$-STRD
;STRD的长度
R
DB
1
M
DB
0
N
DB
?
A
DB
0
;速度1选择标志
B
DB
0
;速度2选择标志
V
DB
0
;速度3选择标志
DATAS
ENDS
STACK1
SEGMENT
DB
100
DUP
(?)
STACK1
ENDS
CODES
SEGMENT
MAIN
PROC
FAR
ASSUME
CS:CODES,DS:DATAS,SS:STACK1
START:
MOV
AX,DATAS
MOV
DS,AX
CALL
CLEAR
;调用清屏函数,清除dos界面
CALL
DISPLAY1
;显示主欢迎界面
AG:
MOV
A,0
;只相应的速度标志为0
MOV
B,0
MOV
V,0
TH2:
MOV
AH,7
;无回显输入字符
INT
21H
CMP
AL,0DH
;如果是回车,则继续
JNE
TH2
;否则继续输入
TH1:
CALL
CLEAR
;调用清屏函数
DIS6
80,0,0,0
;宏调用画上边框
DIS7
0,0,79,24
;宏调用画右3边框
DIS7
0,0,0,25
;宏调用画左1边框
DIS6
79,0,0,24
;宏调用画下边框
DIS1
STR4,10,25
;宏调用显示欢迎界面及速度选择项
DIS1
STR7,12,30
DIS1
STR8,14,30
DIS1
STR9,16,30
DIS1
STR0,20,16
THD:
MOV
AH,7
;键盘等待输入相应的速度选项
INT
21H
CMP
AL,31H
;判断是否为1
JNE
MODIFYA
JMP
THB
;是则转,JMP实现间接跳转
MODIFYA:
CMP
AL,32H
;判断是否为2
JNE
MODIFYB
JMP
THC
;是则转
MODIFYB:
CMP
AL,33H
;判断是否为3
JNE
THD
;不是则转
DIS4
STR9,12,10
;速度3高亮度显示
DIS1
STRC,12,14
MOV
V,1
;速度3被选中的标志
JMP
THA
THB:
DIS4
STR7,12,10
;速度1高亮度显示
DIS1
STRC,12,14
MOV
A,1
;速度1被选中的标志
JMP
THA
THC:
DIS4
STR8,12,10
;速度2高亮度显示
DIS1
STRC,12,14
MOV
B,1
;速度2被选中的标志
THA:
DIS6
80,0,0,0
;宏调用画上边框
DIS7
0,0,79,24
;宏调用画右3边框
DIS7
0,0,0,25
;宏调用画左1边框
DIS6
79,0,0,24
;宏调用画下边框
MOV
AH,7
;键盘等待确定输入
INT
21H
CMP
AL,0DH
;判断是否是回车确定
JNE
THA
;不是则继续等待
CALL
SLEEP2
;屏幕暂停缓冲
CALL
CLEAR
;调用清屏函数
CALL
PAINT
;调用函数画游戏边框
CALL
GOAL
;调用函数显示得分
CALL
FALL
;调用下落函数
CMP
N,1
;是否确定退出
JE
TH9
;是则转
JMP
AG
;不是继续
TH9:
MOV
AH,4CH
;返回dos界面
INT
21H
MAIN
ENDP
;显示功能菜单函数
DISPLAY1
PROC
NEAR
DIS1
STR1,10,25
DIS1
STR2,13,29
DIS1
STR3,16,31
DIS1
STR5,21,19
DIS6
80,0,0,0
DIS6
79,0,0,24
DIS7
0,0,0,25
DIS7
0,0,79,24
RET
DISPLAY1
ENDP
;清屏函数,清除整个屏幕
CLEAR
PROC
NEAR
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
DX
MOV
AH,6
MOV
AL,0
MOV
BH,7
MOV
CH,0
MOV
CL,0
MOV
DH,24
MOV
DL,79
INT
10H
MOV
DX,0
MOV
AH,2
INT
10H
DIS5
25D,10100100B
DIS3
RET
CLEAR
ENDP
;下落函数,核心子函数
FALL
PROC
NEAR
LEA
SI,STRD
;传递将要下落的字母子串
T1:
INC
SI
;加1以便寻找下一个字母
DIS2
MOV
AH,6D
;置主游戏屏界面颜色
MOV
AL,0
MOV
AL,23D
MOV
BH,01101110B
MOV
CH,1
;从左上第1行
MOV
CL,26
;从左上第26列
MOV
DH,1
;从右上第1行
MOV
DL,54
;从右上第54列
INT
10H
DIS3
CALL
RANDOM
MOV
DL,AH
;获得随机数,保存至dl中
dl
为字母下落的y坐标
ADD
DL,26
;基数为26,使其在范围之内
MOV
DH,R
MOV
CX,23
AGA:
MOV
AH,2
;置光标位置
MOV
BH,0
INT
10H
MOV
AL,[SI]
;取下落字符
PUSH
DX
MOV
DL,AL
MOV
AH,02H
INT
21H
POP
DX
PUSH
AX
;AX,CX进栈,以防干扰
PUSH
CX
MOV
CX,0
;隐藏字母后面的光标
MOV
AH,1
OR
CH,00010000B
INT
10H
POP
CX
POP
AX
CALL
SP_ADJ
MOV
AH,2
;置光标位置
MOV
BH,0
INT
10H
PUSH
DX
MOV
DL,;显示空格
MOV
AH,02H
INT
21H
INT
10H
POP
DX
SUB
AL,AL
PUSH
CX
MOV
CX,50000
DL2:
LOOP
DL2
POP
CX
PUSH
DX
MOV
AH,6
MOV
DL,0FFH
INT
21H
POP
DX
CMP
AL,0
;判断是否输入
JZ
T0
;没有
CMP
AL,[SI]
;判断是否等于下落的字母
JE
T7
;等于下落的字母,则下落下一个字母
JNE
X1
T7:
INC
M
CALL
POINT
CALL
BELL
JMP
T1
X1:
CMP
AL,20H
JE
TA
JNE
T3
TA:
CALL
PAUSE
T3:
CMP
AL,45H
JNE
T0
CALL
EXIT
CMP
N,1
JE
T4
T0:
CMP
AL,1BH
JNE
T12
CALL
CLEAR
CALL
DISPLAY1
JMP
T4
T12:
INC
DH
SUB
CX,1
JZ
MODIFYC
JMP
AGA
MODIFYC:
JMP
T1
T4:
RET
FALL
ENDP
;时间延迟函数及速度1函数
SLEEP1
PROC
PUSH
CX
MOV
CX,550D
LOOP1:
PUSH
CX
MOV
CX,550D
LOOP2:
PUSH
CX
MOV
CX,550D
LOOP3:
NOP
NOP
LOOP
LOOP3
POP
CX
LOOP
LOOP2
POP
CX
LOOP
LOOP1
POP
CX
RET
SLEEP1
ENDP
;时间延迟函数及速度2函数
SLEEP2
PROC
PUSH
CX
MOV
CX,400D
LOOP4:
PUSH
CX
MOV
CX,400D
LOOP5:
PUSH
CX
MOV
CX,400D
LOOP6:
NOP
NOP
LOOP
LOOP6
POP
CX
LOOP
LOOP5
POP
CX
LOOP
LOOP4
POP
CX
RET
SLEEP2
ENDP
;时间延迟函数及速度3函数
SLEEP3
PROC
PUSH
CX
MOV
CX,280D
LOOP7:
PUSH
CX
MOV
CX,280D
LOOP8:
PUSH
CX
MOV
CX,280D
LOOP9:
NOP
NOP
LOOP
LOOP9
POP
CX
LOOP
LOOP8
POP
CX
LOOP
LOOP7
POP
CX
RET
SLEEP3
ENDP
;时间延迟函数及速度3函数
SP_ADJ
PROC
CMP
A,1
JE
S1
CMP
B,1
JE
S2
CMP
V,1
CALL
SLEEP3
JMP
S3
S1:
CALL
SLEEP1
JMP
S3
S2:
CALL
SLEEP2
S3:
RET
SP_ADJ
ENDP
;画游戏边框
PAINT
PROC
NEAR
DIS2
DIS6
80,0,0,0
;宏调用画上边框
DIS7
0,0,55,25
;宏调用画右1边框
DIS7
0,0,56,25
;宏调用画右2边框
DIS7
0,0,79,24
;宏调用画右3边框
DIS7
0,0,0,25
;宏调用画左1边框
DIS7
0,0,24,25
;宏调用画左2边框
DIS7
0,0,25,25
;宏调用画左3边框
DIS6
79,0,0,24
;宏调用画下边框
DIS1
ST3,6,3
DIS1
ST1,9,5
DIS1
ST5,11,5
DIS1
ST2,13,5
DIS1
ST4,17,3
DIS1
ST8,15,5
DIS3
RET
PAINT
ENDP
;分数字符串显示函数
GOAL
PROC
NEAR
DIS2
MOV
AH,2
;置光标位置
MOV
BH,0
MOV
DH,11
MOV
DL,60
INT
10H
MOV
AH,09H
;显示str1
MOV
DX,SEG
STRE
MOV
DS,DX
MOV
DX,OFFSET
STRE
INT
21H
DIS3
RET
GOAL
ENDP
;打印实际得分
POINT
PROC
NEAR
DIS2
MOV
AH,2
;置光标位置
MOV
BH,0
MOV
DH,11
MOV
DL,67
INT
10H
MOV
AL,M
CMP
AL,10
JAE
X9
ADD
AL,30H
MOV
DL,AL
MOV
AH,02H
;显示得分
INT
21H
JMP
X10
X9:
MOV
AL,M
MOV
AH,0
MOV
DL,10
DIV
DL
PUSH
AX
MOV
AH,2
MOV
BH,0
MOV
DH,11
MOV
DL,67
INT
10H
;打印十位
ADD
AL,0
MOV
DL,AL
INT
21H
POP
AX
MOV
AL,AH
MOV
AH,2
MOV
DH,11
MOV
DL,68
INT
10H
ADD
AL,0
MOV
DL,AL
INT
21H
X10:
DIS3
RET
POINT
ENDP
;暂停函数
PAUSE
PROC
NEAR
DIS2
P1:
MOV
AH,07H
;无显示输入
INT
21H
CMP
AL,20H
;判断是否是继续的空格
JNE
P1
;不是则跳转
DIS3
RET
PAUSE
ENDP
;退出函数
EXIT
PROC
NEAR
DIS2
CALL
CLEAR
;调用清屏函数
DIS1
ST6,12,28
DIS1
ST7,14,20
MOV
AH,4CH
INT
21H
DIS3
RET
EXIT
ENDP
;表示击中的函数
BELL
PROC
NEAR
PUSH
DX
PUSH
AX
PUSH
CX
MOV
DX,60000D
;turn
on/of
60000d
times
IN
AL,61H
AND
AL,11111100B
SOUND:
XOR