C++3 函数习题及答案

更新时间:2023-11-30 02:30:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第三章 函数

3-1 C++中的函数是什么?什么叫主调函数,什么叫被调函数,二者之间有什么关系?如何调用一个函数?

解: 一个较为复杂的系统往往需要划分为若干子系统,高级语言中的子程序就是用来实现这种模块划分的。C和C++语言中的子程序就体现为函数。调用其它函数的函数被称为主调函数,被其它函数调用的函数称为被调函数。一个函数很可能既调用别的函数又被另外的函数调用,这样它可能在某一个调用与被调用关系中充当主调函数,而在另一个调用与被调用关系中充当被调函数。

调用函数之前先要声明函数原型。按如下形式声明:

类型标识符 被调函数名 (含类型说明的形参表);

声明了函数原型之后,便可以按如下形式调用子函数:

函数名(实参列表)

3-2 观察下面程序的运行输出,与你设想的有何不同?仔细体会引用的用法。

源程序:

#include int main() {

int intOne;

int &rSomeRef = intOne;

intOne = 5;

cout << \

cout << \

int intTwo = 8;

rSomeRef = intTwo; // not what you think! cout << \cout << \cout << \return 0; }

程序运行输出:

intOne: 5 rSomeRef: 5

intOne: 8 intTwo: 8 rSomeRef: 8

3-3 比较值调用和引用调用的相同点与不同点。

解:值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。

引用调用将引用作为形参,在执行主调函数中的调用语句时,系统自动用实参来初始化形参。这样形参就成为实参的一个别名,对形参的任何操作也就直接作用于实参。

3-4 什么叫内联函数?它有哪些特点?

解:定义时使用关键字 inline的函数叫做内联函数;

? 编译器在编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销; ? 内联函数体内不能有循环语句和switch语句;

? 内联函数的定义必须出现在内联函数第一次被调用之前; ? 对内联函数不能进行异常接口声明;

3-5 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?

解: 不必一致,所有的参数是根据位置和类型而不是名字来区分的。

3-6 重载函数时通过什么来区分?

解:重载的函数的函数名是相同的,但它们的参数的个数和数据类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。

★ 3-7 编写函数,参数为两个unsigned short int型数,返回值为第一个参数除以第二个参数的结果,数据类型为short int;如果第二个参数为0,则返回值为-1。在主程序中实现输入输出。

源程序:

#include

short int Divider(unsigned short int a, unsigned short int b) {

if (b = = 0)

return -1; else

return a/b;

}

typedef unsigned short int USHORT; typedef unsigned long int ULONG; int main() {

USHORT one, two; short int answer;

cout << \cin >> one;

cout << \cin >> two;

answer = Divider(one, two); if (answer > -1)

cout << \else

cout << \return 0; }

程序运行输出:

Enter two numbers. Number one:8 Number two:2 Answer: 4

3-8 编写函数把华氏温度转换为摄氏温度,公式为:C = (F - 32) * 5/9; 在主程序中提示用户输入一个华氏温度,转化后输出相应的摄氏温度。(略)

★ 3-9 编写函数判断一个数是否是质数,在主程序中实现输入、输出。

源程序:

#include #include

int prime(int i); // 判一个数是否是质数的函数声明

void main()

{

int i;

cout << \请输入一个整数:\cin >> i;

if (prime(i)) // 函数调用 cout << i << \是质数.\else

cout << i << \不是质数.\

}

int prime(int i) // 判一个数是否是质数的函数实现(定义) {

int j,k,flag; flag = 1; k = sqrt(i);

for (j = 2; j <= k; j++) {

if(i%j == 0) {

flag = 0; break; } }

if (flag) return 1; else return 0; }

程序运行输出:

请输入一个整数:1151 1151是质数.

★ 3-10 编写函数求两个整数的最大公约数和最小公倍数。

源程序:

#include #include

int fn1(int i,int j); // 求最大公约数的函数声明

void main() {

int i,j,x,y;

cout << \请输入一个正整数:\cin >> i ;

cout << \请输入另一个正整数:\

cin >> j ;

x = fn1(i,j); // 函数调用 y = i * j / x;

cout << i << \和\的最大公约数是:\cout << i << \和\的最小公倍数是:\

}

int fn1(int i, int j) // 求最大公约数的函数实现 {

int temp; if (i < j) {

temp = i; i = j; j = i; }

while(j != 0) {

temp = i % j; i = j; j = temp; }

return i; }

程序运行输出:

请输入一个正整数:120 请输入另一个正整数:72

120和72的最大公约数是:24 120和72的最小公倍数是:360

3-11 什么叫作嵌套调用?什么叫作递归调用?

解:函数允许嵌套调用,如果函数1调用了函数2,函数2再调用函数3,便形成了函数的嵌套调用。函数可以直接或间接地调用自身,称为递归调用。

★ 3-12 在主程序中提示输入整数n,编写函数用递归的方法求1 + 2 + ? + n的值。

源程序:

#include

int fn1(int i);

void main() {

int i;

cout << \请输入一个正整数:\cin >> i ;

cout << \从1累加到\的和为:\fn1(i) << endl; }

int fn1(int i) // 递归函数的实现 {

if (i = = 1) return 1;

else return (i + fn1(i -1) ); }

程序运行输出:

请输入一个正整数:100

从1累加到100的和为:5050

★ 3-13 编写递归函数GetPower(int x, int y)计算x的y次幂,主程序中实现输入输出。

源程序:

#include

long GetPower(int x,int y); int main() {

int number, power; long answer;

cout << \cin >> number;

cout << \cin >> power;

answer = GetPower(number,power);

cout << number << \return 0; }

long GetPower(int x,int y) // 递归函数的实现 {

if(y = = 1) return x; else

return (x * GetPower(x,y-1));

在 }

程序运行输出:

Enter a number: 3 To what power? 4

3 to the 4th power is 81

3-14 用递归的方法编写函数求Fibonacci 级数,公式为fib(n) = fib(n-1) + fib(n-2),n>2;

fib(1) = fib(2) = 1;观察递归调用的过程。

(略)

★ 3-15 用递归的方法编写函数求n阶勒让德多项式的值,在主程序中实现输入、输出。

程序代码:

#include

float p(int n, int x);

void main() {

int n,x;

cout << \请输入正整数n:\cin >> n;

cout << \请输入正整数x:\cin >> x;

cout << \cout << \

cout << \p(n,x) << endl; }

float p(int n, int x) // 递归函数的实现 {

if (n = = 0)

return 1; else if (n = = 1)

return x; else

return ((2*n-1)*x*p(n-1,x) - (n-1)*p(n-2,x)) /n ;

}

程序运行输出:

请输入正整数n:1 请输入正整数x:2 n = 1 x = 2 P1(2) = 2

请输入正整数n:3 请输入正整数x:4 n = 3 x = 4

P3(4) = 154

补充:编写4个同名函数Max1,可分别求取2个整数、3个整数、2个单精度数、3个双精度数的最大值,实现函数重载。并在main()函数中测试函数功能。(重载)

源程序:

#include

int Max1 (int a,int b);

int Max1 (int a,int b,int c); float Max1 (float a,float b);

float Max1 (float a,float b,float c); void main() {

int choose,x1,y1,z1; float x2,y2,z2; while(1) {

cout<<“请选择1. 求取2个整数最大值”<>choose; switch(choose) {

case 1: cout << \请输入2个整数x1,y1:\

cin >> x1>>y1;

cout << \最大值为\Max1(x1,y1) <

case 2: cout << \请输入3个整数:\

cin >> x1>>y1>z1;

cout << \最大值为\Max1(x1,y1,z1) <

case 3: cout << \请输入2个浮点数:\

cin >> x2>>y2;

cout << \最大值为\Max1(x2,y2) <

case 4: cout << \请输入3个浮点数:\

cin >> x2>>y2>>z2;

cout << \最大值为\Max1(x2,y2,z2) <

default: exit(0); }

cout << \}

}

int Max1 (int a,int b) {

if (a>b) return a; else return b; }

int Max1 (int a,int b,int c) {

if (a>b)

if(a>c)return a; else return c; else

if(b>c)return b;

else return c; }

float Max1 (float a,float b) {

if (a>b) return a; else return b; }

float Max1 (float a,float b,float c) {

if (a>b)

if(a>c)return a; else return c; else

if(b>c)return b;

else return c;

}

知识点及作业:

① 递归算法:3-14、3-15

② 引用作为形参:P77利用“引用调用”编写函数swap(),实现两个单精度数据的交换。

③ 内联函数:编写内联函数,求圆的周长Circle();并由main函数实现调用(半径由main函数录入) ④ 带默认形参值的函数:读程序,分析结果

#include using namespace std;

int add(int x=1,int y=2); //默认形参值(全局) void main(void) {

void fun(void);

int add(int x=5,int y=8); //默认形参值(main局部) cout<

fun( ); }

void fun(void) {

cout<

int add( int x, int y )

{ return x+y; } ⑤ 函数重载:

编写4个同名函数Max1,可分别求取2个整数、3个整数、2个单精度数、3个双精度数的最大值,实现函数重载。并在main()函数中测试函数功能。

本文来源:https://www.bwwdw.com/article/r6it.html

Top