}
⑵要求
●对于int类型的数据,在输入时,不能超过其最大最小值的范围。
当输入超过其范围时,观察程序运行结果;
●修改程序,求输入的3个整数的大小;
⑶写实验报告
本实验以控制台应用程序为例,简单介绍使用VisualC++6.0的应用程序向导AppWizard开放应用程序的一般过程。
所谓控制台应用程序,是指在Windows操作系统环境下运行的字符用户界面DOS程序。
本教材中介绍的C++程序都是给予控制台的应用程序,基于图形用户界面的应用程序不做介绍,有兴趣的同学,可以查阅相关资料。
在VisualC++6.0集成开放环境中,C++程序的开发过程与其它高级语言的开发过程相仿,都要经过编辑、编译、链接和运行四个步骤。
第一步、编辑
编辑是将C++源程序输入计算机的过程。
在VisualC++6.0主界面下,点击“文件”菜单,选择“新建”菜单项,即可出现“新建”对话框,如图1所示。
图1“新建”对话框
在弹出窗口中的“文件”标签页下,选择“C++Source File”选项,在选项卡右面的“文件名”编辑框里输入文件名如“ex10_1”。
在VisualC++6.0中,由于C++源程序的扩展名为“*.cpp”,所以在输入文件名时可以不用输入扩展名。
在“位置”编辑框里输入文件路径,如“e:
\program”。
点击“确定”按钮。
将出现“编辑”窗口,如图2所示。
图2“编辑”窗口
在图2所示的右端文件编辑区输入C++源程序,例如输入实验内容中的第一个源程序,在编辑过程中,可以单击主窗口工具栏上的“保存“按钮,把编辑修改过的源程序文件保存。
如果要编辑旧文件,选择在VisualC++6.0主窗口菜单栏中的“文件”菜单项,选择下拉菜单中的“打开”菜单选项,在弹出的“打开“对话框中选择扩展名为“*.cpp”的文件,系统会在文件编辑区中打开该源文件,在文件编辑区就可以编辑修改已经打开的文件。
图3“编译”源程序窗口
第二步、编译
编译是使用系统提供的编译器将源程序文件“ex10_1.cpp”生成目标文件“ex10_1.obj”的过程,编译源程序窗口如图3所示。
在图3所示的VisualC++6.0主窗口菜单栏上点击“组建”菜单,在下拉菜单中选择“编译”菜单项,屏幕出现“询问是否创建默认项目工作区”对话框,如图4所示。
图4“询问是否创建默认项目工作区”的对话框
在图4所示的对话框中单击“是”按钮,系统开始对源程序文件开始编译。
编译器如果发现程序中有语法错误,则在输出区窗口(如图3所示主窗口的下端窗口)中显示错误信息,这些信息包括出错位置、错误性质及产生错误的原因等。
若双击某一条错误信息,相应地就会在文件编辑区窗口中的右边出现一个箭头,指向出错的程序行。
用户可以根据错误提示修改程序。
当修改后还需重新编译源程序文件,直到没有错误信息为止,才能编译通过,将源程序文件“ex10_1.cpp”编译成目标文件“ex10_1.obj”。
编译也可以采用快捷方式,即单击主窗口工具栏上的
按钮,系统会自动链编译源程序。
第三步、链接
编译是使用系统提供的编译器将源程序文件(*.cpp)生成机器语言目标文件(*.obj)的过程,由于没有得到系统分配的绝对地址,还不能直接运行。
只有通过链接后,才能将目标文件转换成可执行文件(*.exe),才可以运行。
链接目标文件的窗口如下图5所示。
图5“链接”目标程序
在上图5所示的VisualC++6.0主窗口菜单栏上点击“组建”菜单,在下拉菜单中选择“组建”菜单项,系统对编译好的程序进行链接,如链接标准库函数等。
如果链接成功,系统会自动生成一个扩展名为“*.exe”的可执行文件。
如果链接失败,则应查找原因,如文件的属性、路径等。
链接也可以采用快捷方式,即单击主窗口工具栏上的
按钮,系统会自动链接目标程序。
第四步、运行
运行是执行可执行文件(“*.exe”文件)。
运行可执行程序的窗口如下图6所示。
在VisualC++6.0主窗口菜单栏上点击“组建”菜单,在下拉菜单中选择“执行”菜单项,或者使用主窗口工具栏中
按钮来执行可执行文件。
图6“运行”可执行程序
程序运行后,系统显示如图7所示的DOS形式的“运行结果”窗口。
如果程序要求用户从键盘输入数据,则等待用户操作,程序成功执行并输出结果。
并显示提示信息“Pressanykeytocontinue”,此时,按键盘任何一个键,或点击窗口右上角的
按钮关闭窗口,系统返回到VisualC++6.0主窗口。
。
。
。
。
图7“运行结果”窗口
如果出现运行错误,应该分析产生错误的原因,可能是输入数据错误、代码错误等等。
如果需要修改源程序,还需要重新编译、链接和运行,直到执行结果正确为止。
按上述步骤编辑、编译、链接、运行实验内容中的第1、2、3个程序。
实验2数组(2学时)
一、实验目的:
1.熟练掌握一维数组和二维数组的定义、引用和初始化;
2.掌握字符数组与字符串的关系以及字符串变量的表示,熟练字符串处理函数的应用。
二、实验内容:
1.N个整数的排序。
(1)要求
1)用一个数组存放各个整数
2)在主函数main()中实现数据的输入和输出操作,并用一个函数实现对数组元素的排序操作。
3)排序函数为swap(inta[],intsize);(size为数组的长度)
(2)撰写实验报告。
2.输入一个n×n的矩阵,求出两条对角线元素值之和以及输出矩阵中最大值和最小值的下标。
(1)提示
略
(2)撰写实验报告。
3.编写程序统计一个字符串“C++isbeginer'slanguage”中单词的个数,并将统计的每个单词存入二维数组array[][]中的一行,即数组array中的元素:
array[0]=”C++”,array[1]=”is”,array[2]=”beginer’s”,array[3]=”language”。
最后输出每个单词。
(1)提示
略
(2)撰写实验报告。
实验3函数(2学时)
一、实验目的:
1.掌握函数的定义和使用方法;
2.掌握函数调用的方法;
3.掌握函数参数传递的机制;
4.掌握函数重载的方法。
二、实验内容:
1.求两个自然数m和n的最大公约数和最小公倍数。
⑴提示
最大公约数就是能同时整除m和n的最大正整数,可用如下算法计算两个数的最大公约数:
求两个数(m、n)相除的余数r(r=m/nm>n),当余数不为零时,m取n的值,n取r的值,再求两个数相除的余数,反复进行直到余数为零,除数n是最大公约数。
最小公倍数=m×n/最大公约数。
⑵要求
●按照上面思想,编程实现从键盘上输入的两个自然数的最大公约数和最小公倍数;
●输入两个数m=56,n=12观察程序运行结果;
●用递归调用的方法实现求最大公约数,参考程序如下:
intfun1(intc,intd)
{
intr;
r=c%d;
if(r!
=0){
c=d;
d=r;
fun1(c,d);
}
returnd;
}
●编程实现求三个数的最大公约数和最小公倍数;
⑶写实验报告
2.编程求下式的值:
n1+n2+n3+n4+…+n8其中n=1,2,3…,编写函数时,设置参数n的默认值为2。
⑴提示
上述表达式可以写为:
f(n)=n1+n2+n3+n4+…+n10(n=1,2,3…),注意表达式值的溢出问题。
⑵要求
●定义f(n)函数,实现求上述表达式的值,并设置函数的参数n的默认值为2;
●在主函数中调用f(n)函数,实现输入n值时,求出表达式的值;
⑶写实验报告
3.使用函数重载的方法定义四个同名函数max,分别求取两个整数、三个整数,两个双精度数、三个双精度数的最大值。
⑴提示
C++编译器根据函数参数表中参数类型和个数进行匹配,调用相应的重载函数,函数返回值不能用来识别重载函数。
注意重载函数中使用默认参数时可能产生的二义性。
⑵要求
●在每个重载函数中输出该函数的参数值和求出的最大值;
●在main函数中,当输入不同类型、个数的数据时,调用不同的重载函数,求其最大值;
⑶写出实验报告。
实验4指针和引用(4学时)
一、实验目的:
1、熟练掌握各种类型指针的定义、引用和运算;
2、掌握数组指针和指向数组的指针变量,以及字符串的指针和指向字符串的指针变量;
3、了解指针与链表关系。
二、实验内容:
1.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
⑴提示
把输入的10个整数存入数组中,10个中最小的放与数组的第一个元素对换,最大的数与数组的第10个元素对换。
其他的保持不变。
⑵要求
定义3个函数:
voidinput(int*p);/*此函数向数组输入10个元素*/
voidmax_min_value(int*p); /*此函数交换数组的对应元素*/
voidoutput(int*p); /*此函数输出数组的10个元素*/
在main函数中调用上述3个函数,实现题目要求的功能;
⑶撰写实验报告
2.建立一个学生信息链表,每个结点包括:
学号、姓名、成绩。
实现链表的建立、显示和查询。
查询是指输入一个学号,如果链表中存在该学号的的结点,则显示此结点的数据。
⑴提示
采用动态分配内存,用new分配内存空间,不需要时用delete释放空间。
由于结点结构中包含两三个域,可以采用C++语言中的结构体类型实现。
structstructNode//定义一个结点结构类型
{intnum;
charname[10];
floatscore;
structNode*next;
}stNode;
⑵要求
在程序中定义了三个函数:
voidinitStLink();//初始化链表
voidcreateStLink();//创建学生成绩信息链表
voiddispStLink();//输出链表信息
定义一个查询函数stNode*search(stNode*head,intnumber),其中,第一参数是链表的头结点,第二个参数是学生的学号。
实现当输入一个学生学号,如果链表中存在该学号的的结点,则显示此结点的数据,否则输出没有该学号的结点。
定义一个删除函数booldelete(intnumber),用于删除指定学号的结点。
实现当输入一个学生学号,如果链表中存在该学号的的结点,则删除该结点,否则显示链表中没有该学号的结点。
⑶撰写实验报告
以下选作题目:
3.n个人围成一圈,从第一个人开始报数,报到5的人就退出圈(图中白色的表示退出圈),再从下个人开始报数,问最后剩下的那个人是第几个人。
(1)提示:
1)建立一个结构体:
structNode//定义一个结点结构类型
{intnum;//序号
charname[10];//姓名
structNode*next;
}stNode;
并将头指针设为全局变量stNode*head;
2)要求在程序建立几个函数:
voidinitStLink()//初始化链表
voidCreateStLink()//创建循环链表,
voiddispStLink()//输出链表信息
stNode*find()//报数为5的人出队列
在主函数中调用以上函数,实现程序的要求。
(3)撰写实验报告
实验5类与对象的应用(4学时)
一、实验目的:
1掌握类和对象的概念、定义和使用方法。
2掌握不同特性对象成员的访问方法,以及this指针的概念和使用方法。
3掌握构造函数和析构函数的使用方法。
二、实验内容:
1.写出下列程序的执行结果,然后上机进行验证。
#include
#include
classX
{
intn;
public:
X();
X(inta);
~X();
};
X:
:
X():
n(3)
{
cout<<"调用构造函数X()"<}
X:
:
X(inta):
n(6)
{
n=n+a;
cout<<"调用构造函数X(inta)"<}
X:
:
~X()
{
cout<<"调用析构函数"<}
voidmain()
{
Xa;
cout<<"------a-------"<Xb(7);
cout<<"------b--------"<cout<<"析构函数执行情况:
"<}
⑴提示
通过设置断点,以单步执行的方式跟踪构造函数、析够函数的执行顺序。
所谓断点就是程序运行时需要暂时停止执行的语句。
程序员可以为程序需要观察的语句设置断点,以“单步执行”的方式跟踪和检查程序当前的各种状态值。
在C++程序文件中设置断点,并以“单步执行”的方式跟踪程序执行的过程和检查变量的值的操作步骤是:
●在主窗口中打开源文件“ex10_8”,并对该文件进行编译和链接;
●把光标移动到需要设置断点的语句,单击鼠标右键,弹出如图10-8所示的快捷菜单,单击“Insert/RemoveBreakpoint”菜单项,在语句左边空白处出现一个红色的圆点,再选择一次为为取消断点。
也可以选择工具栏上的
按钮,单击一次设置断点,再单击一次为取消断点。
注意,断点语句应该是有变量的语句。
可以在程序中设置多个断点,但断点不能太多。
图10-8添加断点的快捷菜单
●单击“组建/开始调试/Go”菜单项或按F5功能键,如图10-9所示,或按工具栏上的
按钮,系统开始执行程序。
进入调试状态后,菜单栏上的“组建”菜单项变为“调试”菜单项,主窗口中出现调试工具栏(如果没有出现的化,将鼠标位于工具栏上单击右键,在下拉菜单项中选择“调试”,调试工具栏就会出现)。
执行到断点语句“cout<<"调用构造函数X()"<如图10-10所示。
通过主窗口的菜单“查看/调试窗口”或通过组合键Alt+3~Alt+8打开各个调试窗口,以查看当前程序的执行情况。
●若要停止调试程序,可以单击“调试/StopDebugging”菜单项,或单击工具栏上的
按钮,系统停止调试程序。
图10-9单步调试
图10-10单步调试状态下的主窗口
⑵要求
●在上述程序中设置断点,观察构造函数、析构函数的执行顺序及变量n值的变化;
●对象作为类的数据成员,测试构造函数和析构函数的调用顺序;定义类CTs类,有两个数据成员,分别是类CStudent、类CTeacher的对象。
定义如下:
classCStudent
{
public:
CStudent()//学生类构造函数
{
cout<<"constructingstudent"<}
~CStudent()//学生类析构函数
{
cout<<"denstructingstudent"<}
};
classCTeacher
{
public:
CTeacher()//教师类构造函数
{
cout<<"constructingteacher"<}
~CTeacher()//教师类析构函数
{
cout<<"destructingteacher"<}
};
classCTs
{
CStudentstudent;//学生对象数据成员
CTeacherteacher;//教师对象数据成员
public:
CTs()//教师学生类构造函数
{
cout<<"costructingts"<}
~CTs()//教师学生类析构函数
{
cout<<"destructingts"<}
};
⑶写实验报告
2.定义一个学生通讯录类,数据成员包括:
学号、姓名、院系、通讯地址、电话;成员函数包括:
输出各个数据成员的值,分别设置和获取各个数据成员的值。
⑴提示
由于姓名、院系和通讯地址的数据长度是可变的,可使用动态的数据结构。
电话可以用一个字符数组存放。
将数据成员均定义为私有的。
用一个成员函数输出所有的成员数据,用五个成员函数分别设置学号、姓名、院系、通讯地址和电话,另用五个成员函数分别获取学号、姓名、院系、通讯地址和电话。
classCStudent
{
intnumber;//学号
char*p_name;//姓名
char*p_school;//院系
char*p_address;//通讯地址
chartel[15];//电话
public:
voidshow();//输出数据成员
CStrudent(intun,char*pn,char*ps,char*pa,chart[]);//构造函数
voidsetname(char*name)//设置姓名
{
if(p_name)delete[]p_name;//释放存储空间
p_nam