77范文网 - 专业文章范例文档资料分享平台

C++程序设计实践样例(5)

来源:网络收集 时间:2019-06-11 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

C++程序设计实践教材

二、实验内容

1. 函数嵌套调用是在被调用的函数内再调用其它函数,而递归调用是在被 调函数内调用自身。嵌套调用的层数没有限制,而递归调用函数必须包含使递归 终止的语句。

m

范例:求组合数,C n??? n!/(m!(n?? m)!)

[分析] 求组合数要用到求阶乘,将求阶乘定义为一个函数,在求组合数的 函数中嵌套调用阶乘函数。由于 n!=n*(n-1)!,求阶乘是一个典型的递归算法,在 此用递归方法实现。 #include using namespace std;

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 #include using namespace std; #define PI 3.14159

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 using namespace std; int a = 300, b = 400, c = 500; void funa( int c){

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 using namespace std;

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)在线全文阅读。

C++程序设计实践样例(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/657211.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: