一、实验目的
(1) 复习函数的使用;
(2) 复习结构体、指针的使用;
(3) 掌握抽象数据类型的设计方法及实现;
(4) 练习用Visual Studio 2010/2015/2017/2019开发应用程序。
二、实验环境
Windows 7以上版本的操作系统,Visual Studio 2010/2015/2017/2019版本编程环境。
三、实验内容和步骤
- 观察结构体类型的定义形式、结构体成员的访问方式和结构体变量在内存中的数据组织形式,请记住结构体类型变量的数据域的连续排列方式。注意掌握用typedef关键字为已定义的合法类型名增加新名称。
#include <iostream>
using namespace std;
struct StructTest
{
int t1;
int t2;
};
typedef StructTest TEST; //已定义的合法类型名增加新名称
int main()
{
//StructTest my_Var;
TEST my_Var;
cout<<&my_Var<<" "<<&my_Var.t1<<" "<<&my_Var.t2<<endl;
return 0;
}
- 再运行下列程序,比较值传递、指针传递、引用传递三种函数参数的传递方法。用F9设置断点①至⑥,用F5调试程序并在Watch监视窗口中观察下列表格中变量的值。结合断点位置变量的相关数据,分析哪个函数可以交换实参的值,并总结用指针和引用作为函数参数的设计步骤。
#include <iostream>
using namespace std;
void swap1(int x, int y);//值传递
void swap2(int *px, int *py);//指针传递
void swap3(int &x, int &y);//引用传递
int main()
{
int a=1, b=2;
int *pa=&a, *pb=&b;
swap1(a,b); //断点①
cout<<"After calling swap1:a="<<a<<", b="<<b<<endl;
a=1,b=2;
swap2(pa,pb); //断点③
cout<<"After calling swap2:a="<<a<<", b="<<b<<endl;
a=1,b=2;
swap3(a,b); //断点⑤
cout<<"After calling swap3:a="<<a<<", b="<<b<<endl;
return 0;
}
//值传递
void swap1(int x, int y)
{
int t;
t=x; x=y; y=t; //断点②
}
//指针传递
void swap2(int *px, int *py)
{
int t;
t=*px; *px=*py; *py=t; //断点④
}
//引用传递
void swap3(int &x, int &y)
{
int t;
t=x; x=y; y=t; //断点⑥
}
注意:下表中的地址值(即0x开头的16进制值),在每台电脑运行时,具体值不一定和答案相同,但都符合相等或不相等的规律。
断点位置 | 作用域 | 参数类别 | 参数地址 | 参数值 |
---|---|---|---|---|
① | main() | 实参 | &a=0x00b5f964 | a=1 |
&b=0x00b5f958 | b=2 | |||
② | swap1() | 形参 | &x=0x00b5f850 | x=1 |
&y=0x00b5f854 | y=2 | |||
交换x和y的值,不影响a, b | ||||
③ | main() | 实参 | &pa=0x00b5f94c | pa=0x00b5f964 |
&pb=0x00b5f940 | pb=0x00b5f958 | |||
④ | swap2() | 形参 | &px=0x00b5f850 | px=0x00b5f964 |
&py=0x00b5f854 | py=0x00b5f958 | |||
交换px和py<= =>交换pa和pb<= =>交换a和b | ||||
⑤ | main() | 实参 | &a=0x00b5f964 | a=1 |
&b=0x00b5f958 | b=2 | |||
⑥ | swap3() | 形参 | &x=0x00b5f964 | x=1 |
&y=0x00b5f958 | y=2 | |||
交换引用参数x,y<= =>交换a, b |
如函数void swap2(int *px, int *py);所示要通过函数调用来改变主调函数中某个变量的值可以利用指针作为函数的参数:
(1) 在主调函数中,将该变量的地址或者指向该变量的指针作为实参
(2) 在被调函数中,用指针类型形参接受该变量的地址
(3) 在被调函数中,改变形参所指向变量的值
如函数void swap3(int &x, int &y);所示要通过函数调用来改变主调函数中某个变量的值可以利用引用作为函数的参数:
(1) 在主调函数中,将该变量名作为实参
(2) 在被调函数中,用引用的形式设置形参
(3) 在被调函数中,改变形参的值就是改变实参的值
- 在以下矩形抽象数据类型的基础上设计矩形的周长和面积的操作。
#include <iostream>
using namespace std;
struct Rect{
double length;
double width;
};//声明矩形(矩形的类型定义)
void InitRect(Rect &R, double l, double w);//构造矩形
double Circumference(Rect &R);//求矩形周长
double AreaR(Rect &R);//求矩形面积
int main()
{
Rect my_rect;//定义矩形变量my_rect
double Length,Width,Circ,Area;
cout<<"Input length,width:"<<endl;
cin>>Length>>Width;
InitRect(my_rect,Length,Width);//构造矩形my_rect
Circ = Circumference(my_rect);//此处写程序
Area = AreaR(my_rect);
cout<<”此矩阵周长为:”<<Circ<<endl;
cout<<”此矩阵面积为:”<<Area<<endl;
return 0;
}
//初始化矩形
void InitRect(Rect &R, double l, double w)
{
R.length=l;
R.width=w;
}
//求矩形周长
double Circumference(Rect &R)
{
return 2 * (R.length + R.width);
}
//求矩形面积
double AreaR(Rect &R)
{
return R.length * R.width;
}