学号:0740303104
姓名:雷凤
子程序设计实验报告
一、实验目的:
1、训练子程序;调用程序以及DOS功能调用程序的编制,进一步熟悉和灵活使用系统功能调用,培养根据具体情况合理划分程序模块的能力
2、掌握主、子程序之间的调用关系,联结方法,提高使用各种参数传递方法的正确性和灵活性。
3、掌握调试主、子程序的基本方法,通过调试进一步理解和加深堆栈在子程序设计中的重要意义的认识
4、上机前要求写好被调试程序的程序文本,并进行静态调试,然后拟定好调试计划和上机操作步骤。
二、实验要求:
1、具体了解和掌握call指令,主,子程序之间的调用和在使用时应注意的问题
2、学习子程序设计和调用的一般方法。
三、实验内容
1、实验任务
试编制一程序,分别对NUM字节单元数组中统计出有多少个20,有多少个5,有多少个2,有多少个1.统计的个数分别放在NUM20、num5、num2、num1单元中。
1. 程序要求用主程序-子程序的结构形式编制。
2. 并且传递参数的方式为堆栈方法。
2、实验的原理
在主程序部分,将统计个数的单元分别放在俩个通用寄存器——AH,AL,DH,DL中,数组首址和数组长度都压栈,设置一个循环次数,送给CX,再调用输出语句进行输出。最重要的是子程序JUSUAN,做好保护现场等准备工作后就将数组中的每个元素分别与20,5,2,1比较,根据不同的结果转到不同的分支语句,对应的不同的计数器相应地增1,并修改地址,继续循环比较。
3、程序设计流程图
子程序流程图
四、实验步骤
1、编辑(纪事本)
DATAS SEGMENT
NUM DB 20,1,20,5,2,5,2,2,2,20
COUNT EQU $-NUM
NUM20 DB ?
NUM5 DB ?
NUM2 DB ?
NUM1 DB ?
;此处输入数据段代码
DATAS ENDS
STACK SEGMENT PARA STACK 'STACK'
STAPN DB 100 DUP(?)
;此处输入堆栈段代码
STACK ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACK
MAIN PROC FAR
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATAS
MOV DS,AX
MOV AX,STACK
MOV SS,AX
START:
MOV BX,OFFSET NUM ;取偏移地址
MOV CX,COUNT ;数组长度送给CX
PUSH BX ;数组首地址入栈
PUSH CX ;数组长度进栈
CALL JISUAN ;调用子程序
MOV NUM20,AH ;将统计的个数保存
MOV NUM5,AL
MOV NUM2,DH
MOV NUM1,DL
MOV CX,4 ;设置循环次数
LEA DI,NUM20 ;取偏移地址
COUT:
ADD [DI],30H ;输出
MOV DL,[DI]
MOV AH,02H
INT 21H
INC DI
LOOP COUT
RET
MAIN ENDP
JISUAN PROC
;PUSH Bx ;保护现场
PUSH CX
PUSH BP
MOV BP,SP ;当前栈顶地址送BP
BEGIN:
MOV DI,[BP+10] ;DI<-数组首址
MOV CX,10 ;CX<-数组长度
SUB AX,AX ;计数器清零
SUB DX,DX ;计数器清零
GO:
CMP BYTE PTR [DI],20
JE NEXT1 ;比较,相等就转
CMP BYTE PTR [DI],5
JE NEXT2
CMP BYTE PTR [DI],2
JE NEXT3
CMP BYTE PTR [DI],1
JE NEXT4
DO: INC DI ;修改地址
LOOP GO
JMP A
NEXT1: INC AH ;计数器加1
JMP DO
NEXT2: INC AL
JMP DO
NEXT3: INC DH
JMP DO
NEXT4: INC DL
JMP DO
A: ;POP BX ;恢复现场
POP CX
POP BP
RET 4
;此处输入代码段代码
;
JISUAN ENDP
CODES ENDS
END MAIN
2、汇编(masm/ML)
3、连接(link)
4、调试(debug)
5、运行
3241
Press any key to continue
五、实验中各个步骤遇到的问题及解决方法、
1、汇编(masm/ML)
虽然思路比较清晰,但在用堆栈方式进行参数传递时出现了一些语法错误,不知道该何时进栈,对到底应该哪个寄存器进栈也没弄太明白。遇到的这个问题刚开始看了一下书上的例题,但还是没明白,最后是让学得比较好的同学一步一步的帮我分析,找出错误并改正的。
2、连接(link)
3、调试(debug)
六、总结经验
我认为这个程序最难的部分是堆栈部分和子程序的一些清零工作,因为这个题目思路比较明确,主,子程序的大致方向也比较好把握,难就难在一些细节,所以,以后在写一些稍微繁琐偏难得程序时,每一步都要仔细推敲,不然写完了再回过头来检查时很难找出错在哪的。总之,这个程序在修改上花费了不少时间,以后要吸取教训,要培养更缜密的思想。
第二篇:《C++程序设计》实验报告格式
C++程序设计
实验报告
一、实验目的
(1)学习编写简单的C++程序,并掌握C++程序的基本格式与规范。
(2)理解C++程序结构的特点。
(3)掌握函数的定义和调用方法。
(4)练习重载函数的使用。
(5)练习函数模板的使用。
(6)练习使用系统函数。
(7)学习使用VC ++的debug调试功能,使用step into追踪到函数内部。
二、实验内容与实验步骤
实验内容:
(1)输人并运行所给的参考程1,并将程序中的注释部分也输人计算机,体会和理解程序的基本格式规范。
(2)编写一个函数把华氏温度转换为摄氏温度,转换公式为C= (F一32)*5/9。
(3)编写重载函数Maxl可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。
(4)使用重载函数模板重新实现上小题中的函数Maxl。
(5)使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。
(6)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。
原理分析:
1:int add(int a,int b)
{
int c;
c=a+b;
return c;
}
2:int zhuang(int a)
{
int x;
x=(a-32)*5/9;
return x;
}
3:int Max1(int a,int b)
{
return ((a>b)?a:b);
}
int Max1(int a,int b,int c)
{
return ((c>((a>b)?a:b))?c:((a>b)?a:b));
}
double Max1(double a,double b)
{
return ((a>b)?a:b);
}
double Max1(double a,double b,double c)
{
return ((c>((a>b)?a:b))?c:((a>b)?a:b));
}
4:template <class T>
T Max1(T a,T b)
{
return ((a>b)?a:b);
}
template <class T>
T Max1(T a,T b,T c)
{
return ((c>((a>b)?a:b))?c:((a>b)?a:b));
}
5:int x,y,z;
cout<<"please input two number:\n";
cin>>x>>y;
z=pow(x,y);
cout<<"the result is:"<<z<<endl;
return 0;
6:int fib(int n)
{
int x;
if(n==1)
x=1;
else
if(n==2)
x=1;
else
x=fib(n-1)+fib(n-2);
return x;
}
三、实验环境
操作系统:windows XP
开发平台的名称及版本:Microsoft Visual C++ 6.0
四、实验过程与分析
1:--------------------Configuration: oier - Win32 Debug--------------------
Compiling...
iwedf.cpp
c:\program files\microsoft visual studio\myprojects\oier\iwedf.cpp(8) : error C2065: 'cout' : undeclared identifier
c:\program files\microsoft visual studio\myprojects\oier\iwedf.cpp(8) : error C2297: '<<' : illegal, right operand has type 'char [25]'
c:\program files\microsoft visual studio\myprojects\oier\iwedf.cpp(8) : error C2065: 'endl' : undeclared identifier
c:\program files\microsoft visual studio\myprojects\oier\iwedf.cpp(9) : error C2065: 'cin' : undeclared identifier
c:\program files\microsoft visual studio\myprojects\oier\iwedf.cpp(9) : warning C4552: '>>' : operator has no effect; expected operator with side-effect
c:\program files\microsoft visual studio\myprojects\oier\iwedf.cpp(11) : error C2297: '<<' : illegal, right operand has type 'char [17]'
Error executing cl.exe.
oier.exe - 5 error(s), 1 warning(s)
通过比较书中的范例找到未写using namespace std;写后问题解决。
五、实验结果总结
1
2 3 4 5 6
六、思考题
1. Visual C++ 6.0环境下是如何管理项目和文件的?
2. C++提供的输入输出操作与C语言的输入输出操作的异同点?
3. C++引入的内联函数与其它函数有何不同?
4. 重载函数时通过什么来区分?
七、参考文献
Visual c++面向对象的程序设计
八、附录
1:int main()
{
int x,y,sum;
cout<<"Enter two number:\n";
cin>>x;
cin>>y;
sum=add(x,y);cout<<"the sum is:"<<sum<<endl;
return 0;
}
int add(int a,int b)//求和
{
int c;
c=a+b;
return c;
}
2:int main()
{
int c,f;
cout<<"please input the number:"<<endl;
cin>>f;
c=zhuang(f);
cout<<"temperature is :"<<c<<endl;
return 0;
}
int zhuang(int a)//转换成温度
{
int x;
x=(a-32)*5/9;
return x;
}
3:int main()
{
int a,b,c,d;
double f,x,y,z;
cout<<"please input two int number: \n";
cin>>a>>b;
d=Max1(a,b);
cout<<"the Max is:"<<d<<endl;
cout<<"please input three int number: \n";
cin>>a>>b>>c;
d=Max1(a,b,c);
cout<<"the Max is:"<<d<<endl;
cout<<"please input two double number: \n";
cin>>f>>x;
y=Max1(f,x);
cout<<"the Max is:"<<y<<endl;
cout<<"please input three double number: \n";
cin>>f>>x>>z;
y=Max1(f,x,z);
cout<<"the Max is:"<<y<<endl;
return 0;
}
int Max1(int a,int b)//比较两个整数大小
{
return ((a>b)?a:b);
}
int Max1(int a,int b,int c)//比较三个整数大小
{
return ((c>((a>b)?a:b))?c:((a>b)?a:b));
}
double Max1(double a,double b)//比较两个浮点数大小
{
return ((a>b)?a:b);
}
double Max1(double a,double b,double c)//比较三个浮点数大小
{
return ((c>((a>b)?a:b))?c:((a>b)?a:b));
}
4:T Max1(T a,T b)//比较两个数大小
{
return ((a>b)?a:b);
}
template <class T>
T Max1(T a,T b,T c)//比较三个数大小
{
return ((c>((a>b)?a:b))?c:((a>b)?a:b));
}
int main()
{
int a,b,c,d;
double f,x,y,z;
cout<<"please input two int number: \n";
cin>>a>>b;
d=Max1(a,b);
cout<<"the Max is:"<<d<<endl;
cout<<"please input three int number: \n";
cin>>a>>b>>c;
d=Max1(a,b,c);
cout<<"the Max is:"<<d<<endl;
cout<<"please input two double number: \n";
cin>>f>>x;
y=Max1(f,x);
cout<<"the Max is:"<<y<<endl;
cout<<"please input three double number: \n";
cin>>f>>x>>z;
y=Max1(f,x,z);
cout<<"the Max is:"<<y<<endl;
return 0;
}
5:int main()
{
int x,y,z;
cout<<"please input two number:\n";
cin>>x>>y;
z=pow(x,y);//求幂
cout<<"the result is:"<<z<<endl;
return 0;
}
6:int main()
{
int n,f;
cout<<"please input the number:\n";
cin>>n;
f=fib(n);
cout<<"the Fibonacci is:"<<f<<endl;
return 0;
}
int fib(int n)//递归函数
{
int x;
if(n==1)
x=1;
else
if(n==2)
x=1;
else
x=fib(n-1)+fib(n-2);
return x;
}