当前位置:范文大全 > 调查报告 > C程序设计设计性实验报告

C程序设计设计性实验报告

发布时间:2021-10-30 10:01:48

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

版权所有:蓬勃范文网 2010-2024 未经授权禁止复制或建立镜像[蓬勃范文网]所有资源完全免费共享

Powered by 蓬勃范文网 © All Rights Reserved.。蜀ICP备20021444号