C++程序设计实践教材
二、实验内容
1. 函数嵌套调用是在被调用的函数内再调用其它函数,而递归调用是在被 调函数内调用自身。嵌套调用的层数没有限制,而递归调用函数必须包含使递归 终止的语句。
m
范例:求组合数,C n??? n!/(m!(n?? m)!)
[分析] 求组合数要用到求阶乘,将求阶乘定义为一个函数,在求组合数的 函数中嵌套调用阶乘函数。由于 n!=n*(n-1)!,求阶乘是一个典型的递归算法,在 此用递归方法实现。 #include
long com(int ,int), fac(int); int main(){
int m,n;
cout<<\ cin>>m>>n;
if(m<=n) cout<<\ else cout<<\ return 0;
//函数声明
}
com(int i,int j){ long
long cmb;
cmb= fac(j)/(fac(i)*fac(j-i)); return cmb; }
long fac(int i){
long fcl;
if(i==0||i==1) fcl =1; else fcl = i*fac(i-1); return fcl; }
// att:B
//使递归结束的语句 //递归调用 // att: A
//在com函数内嵌套调用fac函数
这里因阶乘极易溢出,n 最大取 12,否则运算中溢出。
[注意] 在函数内定义局部变量时,变量名不应与函数名相同,在 A 行处, 不可定义变量名为 com,在 B 处,不可为 fac;还有一种常见错误如下:
long fac(int i){
if(i==0||i==1) fac(i) =1; else fac(i) = i*fac(i-1); return fac(i); }
编译这样的程序,会出现\的错误,这是为什么?
2. 用欧几里德算法计算两个数的最大公约数,分别用递推(while 循环实现) 和递归两种方法实现。并计算两个数的最小公倍数。
[提示] 欧几里德算法参见教材【例 2.21】
21
第一章 控制台应用程序
C ? n!/(m!(n?? m)!) =(n*(n-1)*?*(n-m+1))/m!
m n
3. 修改第一题,使其不易溢出。考虑到:
=(n/1)*(n-1)/2* ?*(n-(m-2))/(m-1)* (n-(m-1))/m= C 可以用递归的方法计算。
这里 n 可以用到 40。
m-1
n*(n-(m-1))/m
实验九 函数的重载和变量的作用域
一、实验目的 1. 了解内联函数、重载函数、带缺省参数函数的定义及使用。
2. 作用域概念,变量的存储类型及它们之间的差别。 3. 掌握程序的多文件组织。
4. 掌握编译预处理内容,理解带参数宏定义与函数的区别。(可选)
二、实验内容
1. 重载函数允许不同的函数使用相同的名字,这使得完成类似任务可以使 用相同函数名。
范例:编写几个计算面积的函数,分别计算圆、矩形、梯形和三角形的面积, 计算边长为 1 的正方形及其内切圆、内接等腰三角形和等腰梯形面积。 函数原型如下:
double area(double radius=0);
//圆面积,参数为半径,缺省参数 0,表示点面积 double area(double a, double b); //计算矩形面积,参数为长和宽
double area(double a, double b, double h); //计算梯形面积,参数为两底和高
double area(double a, double b, double c, int);
//三角形,参数为三边长,int 型参数起标示作用,以区别于梯形, 不参加计算
图 1.8 计算不同
图形面积
程序如下:
#include
double area(double radius=0); double area(double a, double b); double area(double a, double b, double h); double area(double a, double b, double c, int); int main(){
cout<<\ cout<<\ cout<<\
22
C++程序设计实践教材
cout<<\
cout<<\ return 0;
}
double area(double radius) {//带缺省参数的函数
return PI*radius*radius;
}
double area(double a, double b){
return a*b;
}
double area(double a, double b, double h){
return (0.5*(a+b)*h); }
double area(double a, double b, double c, int){
double s=0.5*(a+b+c); return sqrt(s*(s-a)*(s-b)*(s-c)); }
2. 编程:将上题以多文件方式组织,在 area.h 中声明各个 area 函数原型, 在 area.cpp 中定义函数,然后在 Exp9_2.cpp 中包含 area.h,定义 main 函数并执 行。
注意:using namespace std; 只能说明一次,或者说只能在一个文件中说明。
3. 范例:作用域:全局变量、局部变量和静态局部变量的应用。 分析并 写出下列程序的执行结果,然后输入计算机执行,比较分析结果与执行结果。
#include
static int a = 5; a+=c;
cout<
void funb(int a){
a= b; cout<
void func(){
int c=0;
cout<
funa(a); funb(b); funa(b); func();
23
第一章 控制台应用程序
cout<
4. 编程:分别以宏和函数形式求某个数的绝对值,并编程调用它们。内联 (inline)函数虽然以函数形式定义,但在调用时相当于宏,将代码直接替换函 数调用表达式,不需调用栈操作,可以节省栈空间和函数调用的时间开销;但要 求函数代码简单,没有复杂语句。(可选)
[思考] 这两种方法各有什么特点,当考虑到不同数据类型时,哪种方法更合适?
为什么 C++不提倡用宏?
5. 希望对不同类型的数据完成相似功能时往往采用函数重载的方法。例如 要在程序中用不同的格式输出不同类型的数据,可以编制多个同名的 output() 函数,这些函数的参数类型互不相同,对不同的参数设计不同的输出格式。
编程:使用函数重载技术编程实现自动适应字符串、整数和实数的输出。
实验十 类与对象的基本概念
一、实验目的
类是 C++扩展数据类型,可以封装不同类型的数据成员和函数成员,类是面 向对象程序设计的基础。本次实验内容包括面向对象的基本概念、构造函数与析 构函数,从实际问题抽象出类等,通过实验要求:
1. 掌握面向对象的基本概念,类的定义方法。 2. 掌握类成员的访问权限及访问类成员的方法。 3. 掌握内联函数和缺省函数。
4. 掌握构造函数与析构函数的意义及使用方法。
二、实验内容
1. 范例:集合是具有同一属性(共性)而又能互相区别(个性)的多个成 员汇集起来的整体,构成集合的每个成员称为集合的元素,元素间没有顺序关系。 例如,所有的大写英文字母是一个集合,它包括 26 个元素:A、B、?、Z。不 包含任何元素的集合称为空集合。
[实验要求] 自定义一个集合类 set,采用数组存放集合的元素。自定义集合运算 包括:
1) 判断元素 elem 是否为集合 set 的元素。 2) 为集合添加一个元素 elem。 3) 从集合中删除一个元素 elem。
4) 复制一个集合,其元素与原集合完全一样。 5) 显示集合中的所有元素。
6) 求两个集合中相同的元素,即求两个集合的交集。 7) 求两个集合中所有的元素,即求两个集合的并集。 8) 判断两集合包含的元素是否完全相同。
9) 判断一个集合是否被包含在另一个集合之中,即是否为另一个集合的子集。
24
C++程序设计实践教材
[程序]
#include
const int maxnum=20; enum ErrCode{noErr,overflow};
class set{
char elements[maxnum]; int num; public:
set(){num=0;} bool Member(char); ErrCode AddElem(char); void RmvElem(char); void Copy(set); bool Equal(set); void print(); void Intersect(set,set);
//求本集合与第一参数所指出的集合的交,并存入第二参数所指出的集合中 ErrCode Union(set,set);
//求本集合与第一参数所指出的集合的并,并存入第二参数所指出的集合中 bool Contain(set);
//判断本集合是否包涵实参指出的集合中所有的元素 //判断元素elem是否为本集合的成员 //将新元素elem加入本集合 //将元素elem从该集合中删去
//将本集合中的所有元素拷贝到实参指出的集合中去 //判断两集合各自包涵的元素是否完全相同 //显示本集合的所有元素
};
bool set::Member(char elem){
int i;
for(i=0;i if(elements[i]==elem) return true; return false; } ErrCode set::AddElem(char elem){ int i; for(i=0;i if(elements[i]==elem) return noErr;//集合中已有elem,不重复加入 if(num elements[num++]=elem; return noErr; } else return overflow; } void set::RmvElem(char elem){ int i; for(i=0;i if(elements[i]==elem){ //数组已满 25 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C++程序设计实践样例(5)在线全文阅读。
相关推荐: