0
点赞
收藏
分享

微信扫一扫

第三章 函数 课后题

hoohack 2022-04-13 阅读 40

本专栏为C++学习笔记,参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉
B站视频:https://space.bilibili.com/702528832/video
PPT与代码已上传:https://download.csdn.net/download/weixin_45755332/75626784
版权归原作者所有如有侵权请立即与我联系,必将及时处理。
本想考东软的,结果今年缩招,直接改隔壁科软,当时的学习笔记发出来供大家参考指正。科软23分肯定会升,但肯定不会到380,撑死350。冲就完了!!!

简答题

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

一个较为复杂的系统往往需要划分为若干子系统,高级语言中的子程序就是用来实现这种模块划分的。C++语言中的子程序就体现为函数。调用其它函数的函数被称为主调函数,被其它函数调用的函数称为被调函数。

一个函数很可能既调用别的函数又被另外的函数调用,这样它可能在某一个调用与被调用关系中充当主调函数,而在另一个调用与被调用关系中充当被调函数。

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

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

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

2. 比较值调用和引用调用的相同点与不同点。

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

引用调用将引用作为形参,在执行主调函数中的调用语句时,系统自动用实参来初始化形参。

这样形参就成为实参的一个别名,对形参的任何操作也就直接作用于实参。

具体可看程序分析题1

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

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

  • 编译器在编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销;

  • 内联函数体内不能有循环语句和 switch 语句;内联函数的定义必须出现在内联函数第一次被调用之前;

  • 对内联函数不能进行异常接口声明;

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

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

5. 重载函数时通过什么来区分?

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

6. 什么叫作嵌套调用?什么叫作递归调用?

函数允许嵌套调用,如果函数 1 调用了函数 2,函数 2 再调用函数 3,便形成了函数的嵌套调用。

函数可以直接或间接地调用自身,称为递归调用。

程序分析题

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

#include <iostream>
using namespace std;
int main()
{
    int intOne;
    int &rSomeRef = intOne;
    intOne = 5;
    cout << "intOne:\t\t" << intOne << endl;
    cout << "rSomeRef:\t" << rSomeRef << endl;
    cout << "intOne:\t\t" << &intOne << endl;
    cout << "rSomeRef:\t" << &rSomeRef << endl;

    int intTwo = 8;
    rSomeRef = intTwo; // not what you think!
    cout << "\nintOne:\t\t" << intOne << endl;
    cout << "intTwo:\t\t" << intTwo << endl;
    cout << "rSomeRef:\t" << rSomeRef << endl;
    cout << "\nintOne:\t\t" << &intOne << endl;
    cout << "intTwo:\t\t" << &intTwo << endl;
    cout << "rSomeRef:\t" << &rSomeRef << endl;
    return 0;
}

// --------------------------------------------------------
intOne:         5
rSomeRef:       5
intOne:         0x61fe14
rSomeRef:       0x61fe14

intOne:         8
intTwo:         8
rSomeRef:       8

intOne:         0x61fe14
intTwo:         0x61fe10
rSomeRef:       0x61fe14

引用相当于给变量起个别名。一开始intOne 初始化为5,然后rSomeRef引用intOne,这时rSomeRef就是intOne,后面将intTwo = 8传给rSomeRef,也就传值给了intOne,所以后面输出的都是8.

编程题

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


# include<iostream>
using namespace std;
int fun_r(unsigned short int a,unsigned short int b){
    short int r;
    if (b==0)
        return -1;
    else
        return a/b;
}
int main(){
    unsigned short int a=8;
    unsigned short int b=2;
    cout<< fun_r(a,b);
}

2. 编写函数判断一个数是否是质数,在主程序中实现输入、输出

质数就是除了1和自身没有其他因数的自然数。


#include<iostream>
#include<cmath>
using namespace std;

int zhishu(int a){
    int c=0;
    int k=sqrt(a);
    for (int i=2;i<=k;i++){
        if (k%i==0){
            cout<<a<<" is not prime number"<<endl;
            return 0;
        }     
   }
   cout<<a<<"is prime number"<<endl;
   return 1;
}
int main(){
    int a;
    cout << "Please enter an integer: ";
    cin>>a;
    zhishu(a);
}

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

先求最大公约数,找出两个数中比较小的数m,从m开始递减寻找,如果从1到m递增寻找则会增加寻找时间。

最小公倍数=m*n/最大公约数。

// 编写函数判断一个数是否是质数,在主程序中实现输入、输出
#include<iostream>
#include<cmath>
using namespace std;

int fun1(int a,int b){
    int flag;
    int p;
    if (a<b)
        flag =a;
    else
        flag =b;
    for (int i=flag;i>=1;i--){
        if (a%i==0 && b%i==0){
            p = i;
            return i;
        }
    }
}

int main(){
    int a,b;
    cout << "Please enter an integer: ";
    cin>>a >>b;
    int p = fun1(a,b);
    cout<<" "<<p<<" "<<a*b/p<<endl;
}

4. 在主程序中提示输入整数 n,编写函数用递归的方法求 1 + 2 + … + n 的值。

int fun1(int n){
    if (n==1)
        return 1;
    else
        return n+fun1(n-1);
}
int main(){
   cout<< fun1(30);
}

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

int GetPower(int x,int y){
    if (y==1)
        return x;
    else
        return x*GetPower(x,y-1);
}
int main(){
   cout<< GetPower(2,10);
}

6. 用递归的方法编写函数求 Fibonacci 级数,公式为
f i b ( n ) = f i b ( n − 1 ) + f i b ( n − 2 ) n > 2 f i b ( 1 ) = f i b ( 2 ) = 1 fib(n) = fib(n-1) + fib(n-2)n>2\\ fib(1) = fib(2) = 1 fib(n)=fib(n1)+fib(n2)n>2fib(1)=fib(2)=1
7. 观察递归调用的过程

//Fibonacci数列的第一项为0,第二项为1,后续的每一项是前两项的和
//该数列的前两项的比例趋于一个常量:1.168...,成为黄金分割 数列形如:0 1 1 2 3 5 8 13 21 34...
#include <iostream>
using namespace std;
long int Leo(long int n);
int main()
{
    long n;
    cin>>n; //求Fibonacci数列的第n项
    cout<<Leo(n)<<endl;
    return 0;
}
long int Leo(long int n)
{
  if(n==0 || n==1)
    return n;
  else
    return Leo(n-1)+Leo(n-2);
}

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

#include <iostream>
using namespace std;
double fun1(double x, double n) {
    if (n==0)
        return 1;
    else if (n==1)
        return x;
    else
        return  ((2*n-1)*x*fun1(x,n-1)-(n-1)*fun1(x,n-2))/n;
    
}
int main() {
	double x, n;
	cout << "please enter x and n:" << endl;
	cin >> x >> n;
	cout <<"P(x, n)=" << fun1(x, n) << endl;
	return 0;
}

使用模板函数实现 Swap( x, y ),函数功能为交换 x、y 的值。

以后再做。

举报

相关推荐

0 条评论