2014-2015年上学期《数据结构》
——实验一《VC编程工具的灵活使用》
一..实验目的
复习巩固VC编程环境的使用,以及C++模板设计。
1.回顾并掌握VC单文件结构程序设计过程。
2.回顾并掌握VC多文件工程设计过程
3.掌握VC程序调试过程。
4.回顾C++模板和模板的程序设计。
二.实验内容
1. 设计一个单文件结构程序完成从键盘输入两个数,输出二者的“和”和“积”的结果。要求如下:
1)设计函数来计算“和”和“积”,在主函数中调用,并能考虑重载函数,使整数和小数均能计算。
2)分别使用单步调试和断点调试来调试程序。并多次运行力求熟练调试方法。
3.使用一个类来实现上述功能。要求:
1)使用类模板
2)使用多文件:类的声明有头文件中;类的函数定义一个源文件中,在主程序文件中设计主函数程序,在实例化输出结果。
三.源程序和程序调试
1:
(1) 源程序
#include<iostream>
using namespace std;
void f(int m=0,int n=0)
{
int sum,ji;
cout<<"pleaseintput your two number:"<<endl;
cin>>m>>n;
sum=m+n; ji=m*n;
cout<<"sum="<<sum<<endl;
cout<<"ji="<<ji<<endl;
}
void g(float m=0,float n=0)
{
float sum,ji;
cout<<"pleaseintput your two number:"<<endl;
cin>>m>>n;
sum=m+n; ji=m*n;
cout<<"sum="<<sum<<endl;
cout<<"ji="<<ji<<endl;
}
void main()
{ int choice;
do{
cout<<"请选择计算数字类型!"<<endl;
cout<<"| 1:整数 |"<<endl;
cout<<"| 2:小数 |"<<endl;
cout<<"| 0:退出 |"<<endl;
cin>>choice;
switch(choice)
{
case1:f();break;
case2:g();break;
case0:cout<<"EXIT!"<<endl;break;
default:cout<<"没有该选项,请重新选择啊亲~"<<endl;break;
}
}while(choice!=0);
}
程序是从main()主函数进行的,我的本次程序思想是在将“整数运算”和“带小数运算”分开来进行,于是乎就运用了c++语言中基本的switch语句。
当然同时,为了能多次输入,让输入显得更加多元化,也选用了do-while语句,可以循环使用。
算法部分,又重新定义了两个函数,分别对应“整数运算”和“带小数运算”。按照要求,进行键盘输入,屏幕输出的要求,适当的选用cout和cin输入输出流。
(2)、程序调试
编写完代码后,就可以进行调试了,从中可以看到代码是否有编写错误,为了程序的实现,要尽快依据错误进行整改。
图标有反应的分别是Compile(ctrl+F7)、Build(F7)、Go(F5)。如果能顺利地调试,就可以发现“组建”状态一栏会分别出现:
和
当然最重要的是我们的算法有没有错误,接着以上步骤,就要进行真实数据的调试了。例如:
a、选择“1、整数”按钮,输入两个整数(14和2),进行加和乘积的运算:
从简单的计算结果可以得知,该程序整数的算法是正确的。
b、同理,选择“2、小数”按钮,输入两个小数(1.5和1.5),进行加和乘积的运算:
从结果可以得知,该程序小数的算法是正确的。
2:
(1) 源程序
#include<iostream>
using namespace std;
template<typename T>
T num(T m,T n)
{
T sum,ji;
cout<<"pleaseintput your two number:"<<endl;
cin>>m>>n;
sum=m+n; ji=m*n;
cout<<"sum="<<sum<<endl;
cout<<"ji="<<ji<<endl;
return m,n;
}
void main()
{
int m,n,intn; float i,j,floatn; int choice;
do
{
cout<<"请选择计算数字类型!"<<endl;
cout<<"| 1:整数 |"<<endl;
cout<<"| 2:小数 |"<<endl;
cout<<"| 0:退出 |"<<endl;
cin>>choice;
switch(choice)
{
case1:intn=num(m,n);break;
case2:floatn=num(i,j);break;
case0:cout<<"ExIT!"<<endl;
default:cout<<"没有该选项,请重新选择啊亲~"<<endl;break;
}
}while(choice!=0);
}
其实,这第二个实验与第一个实验大同小异,后者按照要求,采用的是函数模版的形式,减少了代码的字数,防止代码冗余。
在其它程序编写中,也可以采用这种形式,按照函数模版,更加直观。但是在另一方面,如果数据输出的权限不同,就要重新架构函数模版,否则就是千遍一律的数据,没有差异了。
(2)、程序调试
第二个实验的调试步骤同上,这里我主要分析调试结果,程序的实现情况。
按照第一个实验的步骤选择按钮“1、整数”和“2、小数”。依次出现的结果如左图所示。
选择“1、整数”按钮时,就会执行case1:intn=num(m,n);break;语句,intn是整型,故返还到函数模版num()时,被赋予的数据就是整型。
选择“2、小数”按钮时同理。
3:
(1)、源程序
//工程lyy1的头文件,s1.h这个头文件只存放有关sl1类的定义说明
#ifndefs1_H
#defines1_H
template<classT>
classls1
{
public:
T a,b;
T add,sum;
T qsum(T m,T n);
}; //ls1类定义结束
#endif
//工程lyy1的源文件&主函数main(),s1.cpp类ls1的实现部分
#include<iostream.h>
#include"s1.h"
template<classT>
Tls1<T>::qsum(T m,T n)
{
a=m;
b=n;
cout<<"Please input your twonumbers:"<<endl;
cin>>m>>n;
sum=m+n;
add=m*n;
cout<<"sum="<<sum<<endl;
cout<<"add="<<add<<endl;
return m,n;
}
void main()
{
int j,i,intsum; float b,c,floadd;
ls1<int>ls1i; ls1<float>ls1f;
int choice;
do{
cout<<"1、整数运算"<<endl;
cout<<"2、小数运算"<<endl;
cout<<"0、安全退出"<<endl;
cout<<"Please give meyour choice!"<<endl;
cin>>choice;
switch(choice)
{
case1:intsum=ls1i.qsum(j,i);break;
case2:floadd=ls1f.qsum(b,c);break;
case0:cout<<"EXIT!"<<endl;break;
default:cout<<"没有该选项,请重新选择啊亲~"<<endl;break;
}
}while(choice!=0);
}
多文件结构中,在头文件中定义类,在程序文件中定义成员函数。一般一个较大的程序可以分为三种文件来保存,
此处的实验内容较少,我就采用了简单地采用了这三者:类的定义、类的实现、类的使用。
模块化是信息隐蔽的重要思想,信息隐蔽对开发大的程序作用比较大。在这里,用户只需要了解类、应用类的外部接口,
对于类的内部不甚了解即可。
当然,我此次多文件实验中主要还是在类的定义的时候采用了类的模版、函数模版。对于模版的应用,以下有讲到。
(2)、程序调试
编写完代码后,按照实验一.1的步骤进行程序调试。
从类的实现,main()主函数开始程序开始运行。弹出选择数据类型的按钮选项,同样采用do-while语句和switch开关语句,
进行数据类型选择和运算操作。例如:选择“1”,则执行intsum=ls1i.qsum(j,i);调用类的对象ls1i的函数qusm()。再根据
模版函数Tls1<T>::qsum(T m,T n),采用相应的数据类型进行运算。其中,int是整型,而float是单精度浮点型。
四、浅说模版和重载
比较遗憾,在此次实验中没有采用重载的算法。但是在这里还是要简单的说说重载,还有总结模版的知识点。
模版是一种使用无类型参数来产生一系列函数或类的机制,是C++语言的一个重要特征,而且增强了其通用性,可以避免程序中多次书写相同的代码。
前面我也有说到,这多用于大规模开发程序软件。模版分为函数模版和类模版。在实验一的2和3中分别主要采用的函数模版和类模版,
更加利于我对模版编程方法的熟悉。
1、函数模版
说明形式:
template<模版参数表>
{ //函数定义体}
函数模版定义不是一个实在的函数,编译系统不为其产生任何执行代码。
2、重载函数
以前有学过相关的知识,当模版函数与重载函数同时出现在一个程序体内时,C++语言编译器的求解次序是先调用重载函数;如果不匹配,则调用模版函数;
如果还不匹配则进行强制类型转换,前几种方法都不对,则最后报告出错!
3、类模版
类模版是类定义的一种模式,是抽象类,让类中的某些数据成员、成员函数的参数、成员函数的返回值,能取任何类型(包括系统预定义的和用户自定义的数据类型)。
类模版有C++语言的关键字template引入,定义的语法如下:
template<class类属参数1,class类属参数2,...>
class name
{ //类定义体}
template<class类属参数1,class类属参数2,...>
<返回类型><类名><类型名表>::<成员函数1>(形参表)
{ //成员函数定义体}