c++实验指导
| 实验一 | 实验二 | 实验三 | 实验四 | 实验五 | 实验六 | 实验七 | 实验八 |
1. 了解和使用VC集成开发环境
2. 熟悉VC环境的基本命令和功能键,
3. 熟悉常用的功能菜单命令
4. 学习使用VC++环境的帮助
5. 学习完整的C++程序开发过程
6. 理解简单的C++程序结构
7. 了解用Visual C++开发Windows MFC应用程序的过程
本次实验将学习有关Visual C++开发环境的一些知识,并尝试实现一个简单的DOS程序和Windows程序。通过本次实验,可以了解用Visual C++开发C++应用程序的过程。
1.熟悉Visual C++实验环境
[实验步骤]
(1) 启动VC++6.0,看看初始化界面由哪些部分组成
(2) 查看各菜单项,看看都有哪些子菜单和命令
(3) 将鼠标放置于各工具条图标上,系统会自动显示该图标代表的命令含义,了解一下都有哪些命令。
(4) 在任意工具条上单击鼠标右键,弹出式菜单上将显示所有可用的工具条,选择其中没有对号(√)的项,看看有什么效果,再选择有对号的项,又有什么效果?
(5) 将鼠标移动到任意工具条上,将鼠标放到图标间隙,按下鼠标左键不放,移动鼠标到屏幕中间,有什么现象发生?再将它拖回到原来位置,有什么现象发生?
(6) 将鼠标移动到左边的工作区窗口,按下鼠标左键不放,移动鼠标到屏幕中间,有什么现象发生?再将它拖回到原来位置,有什么现象发生?
(8) 选文件|退出退出VC++6.0编译环境。
2. 控制台应用
用AppWizard建立一个控制台应用,在终端上输出"Hello"。
注解:“控制台应用程序”是一个在DOS窗口中运行的基于字符的程序。
[实验步骤]
1) 创建第一个应用
首先创建一个项目(project),项目将代表你的应用,存放你应用的所有信息,包括源文件、资源文件、编译连接设置等。创建项目的步骤为:
(1) 启动VC++
(2) 从主菜单中选择文件|新建,将显示出新建对话框

如下图:
(3) 选择工程标签,并从列表中单击Win32 Console Application
(4) 在“Location”编辑框中输入你的工作目录名称,如c:\student\your_name
(5) 在对话框的右上角的“project name”编辑框内键入项目的名字,如"Hello",系统将自动为你的项目分配一个默认的目录
(6) 单击OK继续
(7) 此时VC 6.0,系统将显示一个询问项目类型的程序向导,选择“an empty project”
(8) 单击Finish或OK结束配置,创建应用程序这时系统为你创建一个新的项目,并且在左边的工作区窗口中将出现你项目的名字。工作区窗口两三个标签:ClassView和FileView、RecourseView。ClassView从类的角度显示项目中建立的各个类,双击某个类名将会在右边的文档显示区显示类的定义文件并把文件的当前位置定位到所选的类;FileView显示构成项目的各个文件,选择某一文件将会在右边的文档显示区显示文件内容;RecourseView显示应用程序的资源包括:图标、菜单、对话框等
2) 编辑第一个C++源程序
用下面的方法在你创建的项目中添加一个文件:
(1) 在主菜单上选择文件|新建
(2) 在新建对话框中选择文件标签,单击“C++ Source File”
(3) 在右边的File name编辑框中为文件指定一个名字,如Hello,系统将自动为你加上后缀.cpp。新的空白文件将自动打开,显示在文档显示区。在文件中输入以下内容(不包括上下两条横线):
#include <iostream.h>
void main()
{
cout << "hello,every student!"<< endl ;
}
仔细检查输入的内容,确保内容正确
3) 保存源文件
单击工具栏中的"save"图标,或者选择文件|保存来保存你的文件。
C++源文件的扩展名为.cpp。扩展名非常重要,vc++根据文件的扩展名来区分文件类型,并且根据文件类型提供相应的编辑帮助(如正确的语法高亮显示)。
4) 编译、连接得到可执行程序
编辑结束后,仔细检查你输入的内容,看有无错误。确认没有错误之后,选择主菜单的编译|编译 Hello.exe来编译你的项目(也可以按功能键F7)。如果你输入的内容没有错误,那么,在屏幕下方的输出窗口将会显示:
hello.exe -0 error(s), 0 warning(s)
如果在编译时得到错误或警告,是你的源文件出现错误,再次检查你的源文件,看是否有错误,改正它。
5) 改正源程序中的错误
编译的错误会在Developer Studio的下方的输出窗口显示出来,逐个查看这些错误的内容,用鼠标双击,光标可以自动移动到发生错误的源程序的相应地点,仔细检查你的源程序,改正发生错误的地方,注意是否否遗留了分号、引号或括号等。改正后,再重复步骤4)的操作,直到编译连接通过为止。
6) 运行第一个程序
在开发环境中运行程序
选择编译|运行 hello.exe(或者Ctrl+F5),在开发环境中执行你的程序。程序运行以后将显示一个类似于DOS的窗口,在窗口中输出一行“hello,every student!",紧接着在下面显示“Press any key to continue",这句话是系统提示你按任意键退出当前运行的程序,回到开发环境中。按任意键,窗口关闭,退回到Visual C++开发环境。
3.Windows应用
用AppWizard建立一个MFC Windows应用,在窗口中输出"Hello,World!"
注解:AppWizard是一个工具,利用该工具,你可以创建一个建立在MFC基础上的窗口应用程序框架,然后在这个框架中加上自己的应用逻辑。你可以选择所创建的应用类型,最常用的是多文档应用(就象你用的文字编辑软件 Word一样,可以同时打开多个文档窗口的应用)、单文档应用(类似于Windows提供的notepad,一次只能打开一个文档)和对话框应用(类似于Windows的时钟程序)。
[实验步骤]
1) 创建一个新项目
利用Developer Studio的AppWizard创建一个新的项目,步骤为:
(1) 选择菜单文件|新建,系统将显示新建对话框
(2) 选择工程标签,在显示的项目类型中选择MFC AppWizard(exe)

(3) 在右边的Project Name编辑框中输入项目名称,如“helloMFC",然后按OK.
(4) MFC AppWizard 将分几步询问你有关要建立的新项目的配置。第一个对话框问你是创建哪种类型的应用(单文档、多文档还是对话框类型),选择创建单文档应用“单个文档",然后按Next按钮,界面如下:

(5) 翻过后面的五个页面(按Next),每个页面可以让你改变项目的不同选项,本例暂时不设置这些选项。
(6) 最后一个MFC AppWizard屏幕告诉你App Wizard为你自动产生的类。单击Finish键,AppWizard显示一个关于该项目的摘要,列出这些类和你所选择的特征。如图所示:

(7) 单击OK,系统自动产生helloMFC所需要的文件。
2) 浏览helloMFC项目
当你用MFC AppWizard创建了helloMFC项目后,这个项目的工作区窗口将会打开,工作区窗口有三个标签(如下图):ClassView、ResourceView和FileView,其中ClassView显示工作区中所有项目的类及类的成员;ResourceView显示项目中包含的资源文件;FileView显示项目中的各种文件资源。
你可以先选择FileView看一下AppWizard为你创建了哪些文件,然后选择ClassView看一下定义了哪些类。ClassView中还可以看到一个Globals文件夹,单击它前面的加号,可以看到,有一个预定义的全局变量theApp,这是你的Windows应用程序类的对象。
3) 编译连接运行
按F7或者选择菜单编译|编译helloMFC.exe,编译连接得到可执行程序,再按Ctrl+F5或者选择编译|运行 helloMFC.exe运行该程序。
4) 用MFC处理输出
我们希望在程序中间的窗口上显示一行文字“你们好,同学们" 。方法如下:
(1) 在工作区窗口中选择ClassView标签,单击helloMFC classes前面的加号(如果已经变成减号则不做此操作)
(2) 单击类CHelloMFCView类前面的加号
(3) 双击OnDraw()函数,在右边的文档将显示窗口显示文件helloMFCView的内容,并且自动将光标定位到函数OnDraw()处。
(4) 修改OnDraw函数的定义,在最后一行加一句:
pDC->TextOut(50,50,"你们好,同学们");
(5) 按Ctrl+s或者选菜单文件|保存来保存所作的修改
5) 编译连接并运行
重新编译连接该项目,运行程序,你可以用Ctrl+F5直接运行程序,系统将询问你是否重新编译该项目,回答“是(Yes)”,如果有编译错误,仔细检查你加的一句话,是否有错。当编译连接通过后,系统会自动运行该程序。
4. 编写简单的计算程序
通过键盘输入球的半径,编程实现计算圆的体积并输出
[思考问题]
(1) 建立控制台应用程序的一般步骤是怎样的?
1. 了解基本数据类型的字节宽度和范围表示
2. 理解并掌握程序的分支、循环结构
3. 提高程序可读性
4. 学习过程化程序设计方法
5. 进一步学习掌握查找与修改编译错误的方法
6. 初步学习调试方法
1、编写一个程序,输出基本数据类型char, short, int, long, float, double和指针类型void *, char *, short *, int *, long *, float *, double *的数据类型的长度。
[实现提示]:
利用函数sizeof(数据类型名)来得到各个数据类型的长度
2、分析下列程序的运行结果,然后上机检验
#include<iostream.h>
void main()
{
int a=2;
a+=a-=a*a;
cout<<”a=”<<a<<endl;
int b,c;
c=(b=1,b++,b+1,b++);
cout<<”b=”<<b<<endl<<”c=”<<c<<endl;
}
[要求]
判断程序的输出结果,然后实际运行程序验证判断的正确性
3、编写一个程序,循环从标准输入设备读入某班学生的英语成绩,计算出平均成绩
[要求]
Ø 分别用三种循环(for, while, do while)完成
Ø 为程序加上注释,使得其清晰可读。
Ø 尝试利用调试程序来修改你程序的逻辑错误。
[思考问题]
Ø 哪种循环语句最适合本应用?如果已经知道要学生的数目(如25个),用哪种循环方便?
Ø 本实验能否用switch语句完成对输入值的合法性进行判断?
4、分析下列程序的运行结果,然后上机检验
#include<iostream.h>
void main()
{
for(int I=0;++I;I<5)
{
if(I==3)
{
cout<<++I<<endl;
break;}
cout<<++I<<endl;
}
5、分析下列程序的运行结果,然后上机检验
#include<iostream.h>
#include<math.h>
void main()
{
const int MIN=10;
const int MAX=30;
int I,j,k,n=0;
for(I=MIN;I<MAX;I++)
{
k=(int)sqrt(double (I));
for(j=2;j<=k;j++)
if(I%j==0)
break;
if(j>=k+1)
{
if(n%6==0)
cout<<endl;
n++;
cout<<” “<<I;
}
}
cout<<endl;
}
1. 掌握函数声明、定义和使用的方法
2. 掌握函数递归调用的方法
3. 掌握全局变量、局部变量、静态变量的使用方法
4. 掌握内联函数、重载函数及默认函数参数的使用方法
5. 掌握自定义头文件的方法,学会建立和调试多文件程
1、分析程序运行结果
输入下列程序并运行它,分析得到的结果。
#include <iostream.h>
int n = 0;
int func(int x);
void main()
{
int a,b;
a = 5;
b = func(a);
cout << "\nlocal a=" << a<< endl
<< "local b=" << b<<endl
<< "global n=" << n<<endl;
a++;
b = func(a);
cout << "\nlocal a=" << a<< endl
<< "local b=" << b<<endl
<< "global n=" << n<<endl;
}
int func(int x)
{
int a=1;
static int b=10;
a++;
b++;
x++;
n++;
cout << "\nlocal a=" << a<< endl
<< "local b=" << b<<endl
<< "parameter x=" << x << endl;
return a+b;
}
[要求]:
Ø 运行该程序,得到运行结果
Ø 分析得到的结果,说明为什么得到这样的结果
2、分析程序运行结果,输入下列程序并运行它,分析得到的结果、
#include<iostream.h>
void print(int);
void print(char);
void print(char *)
void main()
{
int u(1998);
print(‘u’);
print(u);
print(“123’);
}
void print(char x)
{
cout<<x<<endl;}
void print(chat *x)
{
cout<<x<<endl;
}
void print(int x)
{
cout<<x<<endl;
}
3、编写一个函数,求从从n个不同的数中取r个数的所有选择的个数。
[要求]:
I. 分别用递归和非递归两种方式完成程序设计;
II. 主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入0,0时,程序结束;
III. 能检查输入数据的合法性,要求n>=1并且n>=r;
[实验步骤]
I. 利用一个非递归函数fn(int n)计算n!,利用另一个函数Cnr(int n, int r)计算Cnr,在该函数中调用fn(),
问题:用什么样的变量类型来存放n!函数返回的值?注意各种数据类型的内存字长不同 。
II. 利用一个递归函数实现,实现时利用公式:
C(n,r) = C(n, r-1) * (n – r + 1) / r
递归实现.
[提示]:
Ø 可以用double数据类型来存放函数的计算结果
Ø 注意递归结束条件如下:
如果 r = 0 ,则C(n, r) = 1
如果 r = 1, 则C(n, r) = n
[要求]
将上面用非递归方式写成的程序改成用多文件结构表示。要求将main()函数放在一个文件中,将另外两个函数放在另一个文件中,将函数原型说明放在一个头文件中。建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。
[实验步骤]
1) 新建一个项目,命名为“multifile”
2) 用文件|新建,创建一个新的”C++ Source File”,命名为main.cpp
如下图:

用文件|新建,创建一个新的”C++ Source File”,命名为func.cpp
用文件|新建,创建一个新的”C/C++ Header File”,命名为func.h
用文件|打开,打开你前面实验中用非递归方式求C(n,r)的C++源程序文件,将其中的主函数部分拷贝到main.cpp中,将其中的两个函数实现放到func.cpp中,再将两个函数的原型写到func.h中 ,在main.cpp 中包含进头文件:#include “func.h”
编译连接该项目,运行它。
注:得到的结果应该和上一个实验一样。
4、使用函数重载的方法定义两个重名函数,分别实现求出int型的两个数平方差和float型的两个数的平方差
[要求]
编写程序,并上机调试,且写出测试函数
1. 学习数组的定义、初始化、赋值和使用的方法
2. 学习给函数传递数组的方法
3. 学习指针和引用的定义和使用方法
4. 学习字符串的使用方法
5. 学习用指针和引用给函数传递参数
1、下面程序 重新安排数组a中的元素
#include<iostream.h>
void main()
{
int a[]={2,3,-3,-5,-6,-1,9,8,7}’
const int SIZE=sizeof(a)/sizeof(a[0]);
int i=-1,j=SIZE;
while(++i< --j)
{
while(i<j&&a[i]>0)i++;
while(i<j)&&a[j]<0)j--;
if(i<j)
{
int d=a[i];
a[i]=a[j];
a[j]=d;
}
for(int k=0;k<SIZE;k++)
cout<<a[k]<<” “;
}
[要求]
I. 读懂程序,判断程序的输出,并计下你的分析结果
II. 实际运行程序,记录实际运行结果
III. 修改程序,重新安排数组a的元素,所有的偶数在数组的前部,所有的奇数位于数组的后部
2、编程从键盘读入若干整数,将它们按由低到高排序输出。
[要求]:
1) 用一个数组存放各个整数;
在主函数main()中实现数据的输入和输出操作,并用一个函数实现对数组元素的排序操作。排序可以使用选择法排序,在排序函数中调用另一个函数swap(),实现两个数组元素的交换。
[提示]:
选择排序法(步骤如下):
Ø 从n个数中选择最小的一个,把它和第一个数组元素交换;
Ø 从剩下的n-1个数中选择最小的一个,把它和第二个数组元素交换;
Ø 依此类推,直到从最后两个元素中选出倒数第二小的元素并把它和倒数第二个元素交换为止。
如要按选择排序法对数组30 50 21 39 20排序,则各趟排序后的结果如下所示(带下划线的数表示参加交换的数):
开始: 30 50 21 39 20
第一趟排序:20 50 21 39 30
第二趟排序:20 21 50 39 30
第三趟排序:20 21 30 39 50
第四趟排序:20 21 30 39 50
3、修改上面的程序,将数组的操作改为对字符串操作,即从键盘输入一串字符,将它们存放在字符数组中(形成一个字符串),然后对字符数组中的各个字符排序。
[要求]:
Ø 用字符数组代替上一个实验的整数数组
Ø 不要先输入字符串的长度,在程序中自动计算出字符串的长度。
[提示]:
² 字符串的输入输出操作可以简化,不用一个字符一个字符的输入输出
² 字符的长度可以借助于预定义的函数strlen()求出,该函数所在的库函数名为 string.h
²
4、分析下列程序,并实际调试运行
#include<iostream.h>
int &f1(int n,int s[])
{
int &m=s[n];
return m;
}
void main()
{
int s[]={8,9,1,2,4};
f1(2,s)=1;
cout<<f1(3,s);
}
[实验要求]
读懂程序,判断程序的输出,并计下你的分析结果
1. 学习结构的定义和使用
2. 学习使用结构构建链表式数据结构
3. 理解结构与指针的关系
4. 学习类的定义、实例化的方法
5. 学习使用构造函数和析构函数
6. 学习类成员访问控制的运用
7. 学习使用静态成员、内联成员函数
8. 学习堆对象的分配、使用与释放
9. 体会面向对象程序设计方法
10. 进一步熟悉Visual C++的编译连接错误,掌握Visual C++调试工具
1、下面的程序输入4个职工的记录并保存在一个数组中,然后显示输出数组中的刚输入的职工记录
#include<iostream.h>
#include<string.h>
class Date
{
int year;
int month;
int day;
public:
Date();
Date(int y,int m,int d)
{
year=y,month=m,day=d;}
void show()
{
cout<<year<<”.”<<month<<”.”<<day;
};
class Staff
{
char staffNo[5];
char name[10];
char sex;
Date birthday;
public:
Staff();
Staff(char stno[],char stname[],char stsex,Date &stdate):birthday(stdate),sex(stsex)
{
strcpy(staffNo,srno);
strcpy(name,stname);
}
void show()
{
cout<<endl<<sew(5)<<staffNo<<sew(10)<<name<<sew(3)<<sex;
birthday.show();
}};
Date::Date()
{
cout<<”请输入年月日“<<endl;
cin>>year>>month>>day;
}
Staff::Staff()
{
cout.sef(ios::left,ios::adjustfield);
cout<<”请输入职工号”<<endl;
cin.getline(staffNo,5);
cin.ignore(80,’\n’);//去掉行尾多余的字符
cout<<”请输入姓名”<<endl;
cin.getline(name,5);
cin.ignore(80,’\n’);
cout<<”请输入性别(M/F)”<<endl;
cin>>sex;
cin.ignore(80,’\n’);
}
void main()
{
Staff ss[4];
for(int I=0;I<4;I++)
ss[I].show;
}
[实验要求]
读懂上面的程序,然后回答以下问题
(1)、输入职工记录的过程中包括输入出生日期,这是在哪个函数中完成的,该函数被哪个函数调用?
(2)、职工姓名的输入是由语句cin.getline(name,10);完成的,若改为cin>.name;会出现问题 吗?
2、设计一个单向链表。从标准输入设备键盘读取若干整数,建立链表,每次读入的数放入链表结尾。当用户输入 0时,结束链表的建立工作。然后从前往后依次输出链表节点中的内容。
[要求]
1) 用链表存放输入的整数。链表节点空间动态申请。链表节点结构和链表数据类型的参考定义为:
//定义链表节点类型
typedef struct node{
int elem;
struct node *next;
} Node;
//定义链表类型
typedef Node * Link;
2) 在链表建立结束后,输出链表节点内容的同时释放节点空间。
3) 处理申请不到空间的情况。
[提示]
1) 因为每次插入节点是在链表尾,而输出链表是从链表头,所以可以用两个指针记录链表。一个为头指针,一个为尾指针。
2) 第一次插入节点时需要考虑链表为空的情况。
(a)建立一个新节点的过程为: // 建立一个新的节点 Node * pNode = new Node;
if (pNode == NULL)
{
cout << "Memory insufficient!";
break;
}
pNode->elem = k;
pNode->next = NULL;
(b)顺序遍历链表的过程为:
Node *pNode = head;
while (pNode != NULL)
{
访问pNode所指节点的内容;
pNode = pNode->Next;
}