C++ Primer Plus(第六版)第七章 函数--C++的编程模块复习题

1、使用函数的 3 个步骤是什么?
答:提供原型,定义函数和调用函数
2 .请创建与下面的描述匹配的函数原型。
a igor( ) 没有参数,且没有返回值。
void igor();
b tofu( ) 接受一个 int 参数,并返回一个 float
float tofu(int arg);
c mpg( ) 接受两个 double 参数,并返回一个 double
double mpg(double x,dpuble y);
d summation( ) long 数组名和数组长度作为参数,并返回一个 long值。
long summation(long arr[ ],int length);
e doctor( ) 接受一个字符串参数(不能修改该字符串),并返回一 个double 值。
double doctor(const char *arr);
f ofcourse( ) boss 结构作为参数,不返回值。
void ofcourse(boss dude);
g plot( ) map 结构的指针作为参数,并返回一个字符串。
char * plot(map *pmap);
3、编写一个接受3个参数的函数:int数组名、数组长度和一个int
值,并将数组的所有元素都设置为该 int 值。
void setchar(int arr[],int length,int value );
void setchar(int arr[],int length,int value )
{
        for(int i = 0;i < length;i++)
        {
                arr[i] = value;
        }
}
4、编写一个接受3个参数的函数:指向数组区间中第一个元素的指针、指向数组区间最后一个元素后面的指针以及一个int值,并将数组中的每个元素都设置为该int值。
void setchar(int *arr,int *arr2,int value );
标准答案:
void set_array(int * begin,int *end, int value)
{
        for (int * pt = begin;pt != end; pt++)
                *pt = value;
}
本人答案:
void setchar(int *arr,int *arr2,int value )
{
        while(arr != arr2)
        {
                *arr = value;
                arr++;
        }
}
5、编写将double数组名和数组长度作为参数,并返回该数组中最大值的函数。该函数不应修改数组的内容。
double funMax(const double foot[],int length);
double funMax(const double foot[],int length)
{
        double numMax = 0.00;
        if(length < 1)
        {
                cout << "Invalid array size of " << length <
                return 0;
        }
        else
        {
                numMax = arr[0];
                
                for(int i = 0; i < length; i++)
                {
                        if(arr[i] > numMax)
                        {
                                numMax = arr[i];
                        }
                }
                return numMax;
        }
        
       
}
6、为什么不对类型为基本类型的函数参数使用 const 限定符?
值传递,新生成一个变量,不会改边原始变量值。
7、 C++ 程序可使用哪 3 C- 风格字符串格式?
char型、char *型、string型
8、编写一个函数,其原型如下:
int replace(char * str, char c1, char c2);
该函数将字符串中所有的 c1 都替换为 c2 ,并返回替换次数。
int replace(char * str, char c1, char c2)
{
        int num = 0;
        while(*str)
        {   
                  if(*str == c1)
                  {
                        *str = c2;
                        num++;
                   }
                  str++;
        }     
        return num;
}
9 .表达式 *"pizza" 的含义是什么? "taco" [2] 呢?
由于 C++ “pizza” 解释为其第一个元素的地址,因此使用 * 运算符将得到第一个元素的值,即字符p 。由于 C++ “taco” 解释为第一个元素的地址,因此它将“taco”[2] 解释为第二个元素的值,即字符 c 。换句话来说,字符串常量的行为与数组名相同。
10 C++ 允许按值传递结构,也允许传递结构的地址。如果 glitz 是 一个结构变量,如何按值传递它?如何传递它的地址?这两种方法有何利弊?
答:
要按值传递它,只要传递结构名 glitz 即可。要传递它的地址,请使用地址运算符&glitz 。按值传递将自动保护原始数据,但这是以时间和内存为代价的。按地址传递可节省时间和内存,但不能保护原始数据,除非对函数参数使用了const 限定符。另外,按值传递意味着可以使用常规的结构成员表示法,但传递指针则必须使用间接成员运算符。
11、函数judge()的返回类型为int,它将这样一个函数的地址作为参数:将constchar指针作为参数,并返回一个int值。请编写judge()函数的原型。
int judge (int (*pf)(const char *));
12 
13

7.13 编程练习

1 .编写一个程序,不断要求用户输入两个数,直到其中的一个为 0。对于每两个数,程序将使用一个函数来计算它们的调和平均数,并将结果返回给main( ) ,而后者将报告结果。调和平均数指的是倒数平均 值的倒数,计算公式如下:
调和平均数 =2.0 * x * y / (x + y)
个人答案:
#include
using namespace std;
double funcAvgnum(int x, int y);
int main()
{

    int x, y = 0;
    cout << "请输入两个整数:" << endl;
    while (cin>>x>>y)
    {
        if (x == 0 || y == 0)
        {
            cout << "输入不能为零 " << endl;
            system("pause");
            return 0;
        }
        //调用调和平均数函数
        double avgnum = funcAvgnum(x,y);
        cout << "avgnum = " << avgnum << endl;
    }

    system("pause");
    return 0;
}

转载答案:
// ex1.cpp -- calculate average with function
#include
 
double cal_average(double x1, double x2);
int main()
{
    using namespace std;
    double num1, num2, result;
    cout << "Enter two number(enter 0 to quit): ";
    cin >> num1 >> num2;
    while(num1 * num2 != 0)
    {
        if(!cin)
        {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            cout << "Bad input, process will terminate.\n";
            break;
        }
        result = cal_average(num1, num2);
        cout << "The calculate reuslt is " << result << ".\n";
        cout << "Enter next two number(enter 0 to quit): ";
        cin >> num1 >> num2;
    }
    cout << "Bye\n";
    return 0;
 
}
 
double cal_average(double x, double y)
{
    double aver;
    aver = 2.0 * x * y / (x + y);
    return aver;
}
2 .编写一个程序,要求用户输入最多 10 个高尔夫成绩,并将其存 储在一个数组中。程序允许用户提早结束输入,并在一行上显示所有成 绩,然后报告平均成绩。请使用3 个数组处理函数来分别进行输入、显 示和计算平均成绩。
#include
using namespace std;
int funcInput(double* arr, int size);
void showInfo(const double* arr, int size);
double mathInfo(const double* arr, int size);
#define MAXNUM 10
int main()
{

    cout << "请输入最多10个高尔夫成绩,提前结束请输入-1" << endl;
    //输入函数,地址形式
    //确定数组
    double golfnum[MAXNUM];
    int countnum = funcInput(golfnum, MAXNUM);

    //显示函数
    //此处函数参数可以设置成const,不被修改
    showInfo(golfnum, countnum);

    //计算函数
    double avg = mathInfo(golfnum, countnum);
    cout << countnum << "个平均数为:" << avg << endl;

    system("pause");
    return 0;
}

int funcInput(double *arr,int size)
{
    double num;
    int count = 0;
    for (int i = 0; i < MAXNUM; i++)
    {
        cout << "第" << i+1 << "个成绩:" << endl;
        cin >> num;
        if (num == -1)
        {
            return count;
        }
        arr[i] = num;
        count++;
    }
    return count;
}

void showInfo(const double* arr, int size)
{
    if (0 == size)
    {
        cout << "没有数据进行展示,请验证后再操作,感谢;" << endl;
        return;
    }
    for (int i = 0; i < size; i++)
    {
        cout << "第" << i + 1 << "个成绩为:" << arr[i] << endl;
    }
    return;
}

double mathInfo(const double* arr, int size)
{
    double totalnum = 0;
    double avgnum = 0;
    if (0 == size)
    {
        cout << "没有数据进行计算,请验证后再操作,感谢;" << endl;
        return avgnum;
    }
    for (int i = 0; i < size; i++)
    {
        totalnum += arr[i];
    }
    avgnum = totalnum / size;
    return avgnum;
}

转载答案:

// ex2.cpp -- calculate the average grade of golf
#include
 
const int Max = 10;
 
int input_ar(double *grades, int Max);
void show(double grade[], int n);
double cal_av(double grade[], int n);
 
int main()
{
    using namespace std;
    double grade[Max];
    double average_g;
    
    int len = input_ar(grade,Max);
    show(grade,len);
    average_g = cal_av(grade,len);
    cout << "Average grade = " << average_g << endl;
    return 0;
}
 
int input_ar(double *grades, int n)
{
    using namespace std;
    int count = 0;
    cout << "Enter the grade of golf(enter q to quit): ";
    while(count < n && cin >> grades[count])
    {
        count++;
        if(count == 10)
            break;
        cout <<"Next grade(enter q to quit): ";
    }
    return count;
}
 
void show(double grade[], int n)
{
    using namespace std;
    cout << "All grades: ";
    for(int i = 0; i < n; i++)
        cout << grade[i] << " ";
    cout << endl;
}
 
double cal_av(double grade[], int n)
{
    double sum = 0;
    for(int i = 0; i < n; i++)
        sum += grade[i];
    return sum / n;
}

3 .下面是一个结构声明:
struct box
{
        char make[40];
        float height;
        float width;
        float length;
        float  volume;       
};
a .编写一个函数,按值传递 box 结构,并显示每个成员的值。
b .编写一个函数,传递 box 结构的地址,并将 volume 成员设置为其 他三维长度的乘积。
c .编写一个使用这两个函数的简单程序。
#include
using namespace std;
void showBoxInfo(box mybox);
float showAddrBoxInfo(box *add);
int main()
{
        box mybox = { "basket",10,20,30,6000 };
    //a.编写一个函数,按值传递box结构,并显示每个成员的值。
    showBoxInfo(mybox);
    //b.编写一个函数,传递box结构的地址,并将volume成员设置为其 他三维长度的乘积。
    box yourbox = { "foot",20,20,30 };
    float yourvolume = showAddrBoxInfo(&yourbox);
    cout << "your volume = " << yourvolume << endl;
    cout << "your volume = " << yourbox.volume <
        system("pause");
        return 0;
}

void showBoxInfo(box mybox)
{
    cout << "make:" << mybox.make << endl;
    cout << "height:" << mybox.height << endl;
    cout << "width:" << mybox.width << endl;
    cout << "length:" << mybox.length << endl;
    cout << "volume:" << mybox.volume << endl;
}

float showAddrBoxInfo(box* add)
{
    cout << "your height:" << add->height << endl;
    cout << "your length:" << add->length << endl;
    cout << "your width:" << add->width << endl;
    add->volume = add->height * add->width * add->length;
    return add->volume;
}

转载答案:

// ex3.cpp -- using struct with function
#include
struct box
{
    char maker[40];
    float height;
    float width;
    float length;
    float volume;
};
 
void show(box b);
void set_volume(box *);
 
int main()
{
    using namespace std;
    box b1;
    cout << "Enter the maker: ";
    cin.getline(b1.maker,40);
    cout << "Enter the box of hight: ";
    cin >> b1.height;
    cout << "Enter the box of width: ";
    cin >> b1.width;
    cout << "Enter the box of length: ";
    cin >> b1.length;
    set_volume(&b1);
    show(b1);
    return 0;
}
 
void show(box b)
{
    using namespace std;
    cout << "Maker: " << b.maker << endl;
    cout << "Hight: " << b.height << endl;
    cout << "Width: " << b.width << endl;
    cout << "length: " << b.length << endl;
    cout << "Volume: " << b.volume << endl;
}
void set_volume(box *pb)
{
    pb->volume = pb->height * pb->width * pb->length;
}

4 .许多州的彩票发行机构都使用如程序清单 7.4 所示的简单彩票玩 法的变体。在这些玩法中,玩家从一组被称为域号码(field number)的 号码中选择几个。例如,可以从域号码1 47 中选择 5 个号码;还可以从 第二个区间(如1 27 )选择一个号码(称为特选号码)。要赢得头 奖,必须正确猜中所有的号码。中头奖的几率是选中所有域号码的几率 与选中特选号码几率的乘积。例如,在这个例子中,中头奖的几率是从 47个号码中正确选取 5 个号码的几率与从 27 个号码中正确选择 1 个号码的 几率的乘积。请修改程序清单7.4 ,以计算中得这种彩票头奖的几率。
转载答案:
// ex4.cpp -- cal the property of get number
#include
 
long double cal_property(int r1, int n, int r2);
 
int main()
{
    using namespace std;
    int range1, range2, num;
    cout << "Enter the number of field number: ";
    cin >> range1;
    cout << "Enter the number of choose field number: ";
    cin >> num;
    cout << "Enter the number of specific number: ";
    cin >> range2;
    long double property = cal_property(range1, num, range2);
    cout << "The property of get money is one in " << property << endl;
    return 0;
}
 
long double cal_property(int r1, int n, int r2)
{
    long double result = 1.0;
    for(int i = r1,j = n; j > 0; i--, j--)//conditon write wrongly
        result = result * i / j;
    result *= r2;
    return result;
}
5 .定义一个递归函数,接受一个整数参数,并返回该参数的阶乘。前面讲过,3 的阶乘写作 3! ,等于 3*2! ,依此类推;而 0! 被定义为 1。通用的计算公式是,如果 n 大于零,则 n!=n* (n−1) ! 。在程序中对 该函数进行测试,程序使用循环让用户输入不同的值,程序将报告这些值的阶乘。
#include
using namespace std;
int recursiveFunc(int num);
int total = 1;
int main()
{
    cout << "请输入一个整数:" << endl;
    int cinnum;
    while (cin >> cinnum)
    {
        total = 1;
        int rcuresult = recursiveFunc(cinnum);
        cout << "递归结果为:" << rcuresult << endl;
        if (cinnum == 0)
        {
            system("pause");
            return 0;
        }
    }
        system("pause");
        return 0;
}
int recursiveFunc(int num)
{
    
    if (num > 0)
    {
        total = num * recursiveFunc(num - 1);
    }
    return total;
}
转载答案:
// ex5.cpp -- calculate the n!
#include
 
long long cal_factorial(int n);
 
int main()
{
    using namespace std;
    int num;
    long long factorial;
    cout << "Enter the number(enter q to quit): ";
    while(cin >> num)
    {
        factorial = cal_factorial(num);
        cout << num << "! = " << factorial << endl;
        cout << "Enter next number(enter q to quit): ";
    }
    cout << "Done\n";
    return 0;
}
long long cal_factorial(int n)
{
    long long result = 1;
    if(n > 1)
        result = n * cal_factorial(n-1);
    else if(n == 1 || n ==0)
        result *=1;
    return result;
}

6. 编写一个程序,它使用下列函数:

Fill_array()将一个double数组的名称和长度作为参数。它提示用户输入double值,并将这些值存储到数组中。当数组被填满或者用户输入了非数字时,输入将停止,并返回实际输入了多少个数字。
Show_array()将一个double数组的名称和长度作为参数,并显示该数组的内容。
Reverse_array()将一个double数组的名称和长度作为参数,并将存储在该数组中的值顺序反转。
程序将使用这些函数来填充数组,然后显示数组;反转数组,然后显示数组;反转数组中除第一个和最后一个元素之外的所有元素,然后显示数组。

转载答案:

本题填充函数用while循环和if语句;显示函数用for循环即可;反转函数使用for循环,关键时for(int i = 0, j = len-1; i < j; i++,j--) // the last number of array is array[len-1]

// ex6.cpp -- using function to deal with array
#include
 
const int Size = 5;
int Fill_array(double [], int len);
void Show_array(double arr[], int len);
void Reverse_array(double *, int len);
int main()
{
    using namespace std;
    double grade[Size];
    int len = Fill_array(grade, Size);
    Show_array(grade, len);
    Reverse_array(grade, len);
    cout << "Reverse array:\n";
    Show_array(grade, len);
    Reverse_array(grade + 1, len -2);
    cout << "Reverse part of array:\n";
    Show_array(grade,len);
    return 0;
}
 
int Fill_array(double arr[], int len)
{
    using namespace std;
    int count = 0;
    cout << "Enter a number(enter q to quit): ";
    while(cin >> arr[count])
    {
        count++; // the position of count++ is important
        if(count >= len)
            break;
        cout << "Enter next number(enter q to quit): ";
    }
    return count;
}
 
void Show_array(double arr[], int len)
{
    using namespace std;
    for(int i = 0; i < len; i++)
        cout << arr[i] << " ";
    cout << endl;
}
 
void Reverse_array(double *par, int len)
{
    double temp;
    for(int i = 0, j = len-1; i < j; i++,j--)
    {
        temp = par[i];
        par[i] = par[j];
        par[j] = temp;
    }
}

7. 程序清单7.7中的3个数组处理函数,使之使用两个指针参数来表示区间。fill_array()函数不返回实际读取了多少个数字,而是返回一个指针,该指针指向最后被填充的位置;其他的函数可以将该指针作为第二个参数,以标识数据结尾。

转载答案:

首先从函数声明开始改,改完开始改函数定义,改完函数定义改函数调用。
代码如下:

//ex7.cpp -- array functions and point
#include
const int Max = 5;
 
double * fill_arr(double *, double *);
void show_arr(double *, double *);
void revalue(double r, double *, double *);
 
int main()
{
    using namespace std;
    double property[Max];
 
    double * ptend = fill_arr(property, property + Max);
    show_arr(property, ptend);
    if(ptend - property > 0)
    {
        cout << "Enter the revaluation facctor: ";
        double factor;
        while(!(cin >> factor))
        {
            cin.clear();
            while(cin.get() != '\n')
                continue;
            cout << "Bad input; Please enter a number: ";
        }
        revalue(factor, property, ptend);
        show_arr(property, ptend);
    }
    cout << "Done.\n";
    cin.get();
    cin.get();
    return 0;
}
 
double * fill_arr(double * begin, double * end)
{
    using namespace std;
    double temp;
    double * pt;
    int count = 0;
    for(pt = begin; pt != end; pt++) // for condition is pt != end, not pt == end
    {
        cout << "Enter value #" << (count + 1) << " : ";
        cin >> temp;
        if(!cin)
        {
            cin.clear();
            while(cin.get() != '\n')
                continue;
            cout << "Bad input; input process terminated.\n";
            break;
        }
        else if(temp < 0)
            break;
        *pt = temp;
        count++;
    }
    return pt;
}
 
void show_arr(double * begin, double * end)
{
    double *pt;
    int i = 0;
    for(pt = begin; pt != end; pt++)
        std::cout << "Property #" << (i + 1) 
                  << " : $" << *pt << std::endl;
    i++;
}
 
void revalue(double r, double * begin, double * end)
{
    double *pt;
    for(pt = begin; pt != end; pt++)
        *pt *= r;
}

8. 在不使用array类的情况下完成程序清单7.15的工作。编写两个这样的版本:

a. 使用const char *数组存储表示季度的字符串,并使用double数组存储开支。
b. 使用const char *数组存储表示季度的字符串,并使用一个结构,该结构只有一个成员——一个用于存储开支的double数组。这种设计与使用array类的基本设计类似。

答案转载:

本题编写程序时,使用const char *数组存储表示季度的字符串,刚开始一直编写不出来,想复杂了,以为需要一个二维的字符数组才可以表示,实际上声明一个char *类型的数组,存储四个字符串;该代码:
const char *Sname[4] = {"Spring", "Summer", "Winter"};
调用显示时有两种方法,分别是:
cout << Sname[i];

cout << *(Sname + i)
a的代码如下:

// ex8_a.cpp -- functions with double array(C++11)
#include
#include
 
using namespace std;
 
const int Seasons = 4;
const char* Sname[Seasons] = 
{"Spring", "Summer", "Fall", "Winter"};
 
void fill(double *,int n);
void show(double [], int);
 
int main()
{
    double expense[Seasons];
    fill(expense, Seasons);
    cout << "Your expense list:\n";
    show(expense,Seasons);
    return 0;
}
 
void fill(double *pta, int n)
{
    double temp;
    int count = 0;
    cout << "Enter your expense of every season, enter q to quit.\n";
    while(count < n)
    {
        cout << Sname[count] << ": " ;
        cin >> temp;
        if(!cin)
        {
            cin.clear();
            while(cin.get() != '\n')
                continue;
            cout << "Bad input, process will terminated.";
            break;
        }
        else if(temp < 0)
            break;
        *(pta + count) = temp;
        count ++;
    }
}
 
void show(double arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << Sname[i] << ": " << arr[i] << endl;
    }
}

b.代码如下:

// ex8_b.cpp -- functions with double structure(C++11)
#include
#include
 
const int Seasons = 4;
const char* Sname[Seasons] = 
{"Spring", "Summer", "Fall", "Winter"};
 
struct Expense
{
    double expense[Seasons];
};
 
using namespace std;
 
 
 
 
void fill(double *,int n);
void show(double [], int);
 
int main()
{
    Expense ex;
    fill(ex.expense, Seasons);
    cout << "Your expense list:\n";
    show(ex.expense,Seasons);
    return 0;
}
 
void fill(double *pta, int n)
{
    double temp;
    int count = 0;
    cout << "Enter your expense of every season, enter q to quit.\n";
    while(count < n)
    {
        cout << *(Sname + count) << ": " ;
        cin >> temp;
        if(!cin)
        {
            cin.clear();
            while(cin.get() != '\n')
                continue;
            cout << "Bad input, process will terminated.";
            break;
        }
        else if(temp < 0)
            break;
        *(pta + count) = temp;
        count ++;
    }
}
 
void show(double arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << Sname[i] << ": " << arr[i] << endl;
    }
}

9. 这个练习让您编写处理数组和结构的函数。下面时程序框架,请提供其中描述的函数,完成该程序。

// ex9.cpp -- wirte the function
#include
using namespace std;
const int SLEN = 30;
struct student
{
    char fullname[SLEN];
    char hobby[SLEN];
    int ooplevel;
};
 
// getinfo() has tow arguments: a pointer to the first element of
// an array of student structure and an int representing the
// number og element of the array. The function solicits and 
// stores data about students. It terminates input upon filling
// the array or upon encountering a blank line for the student
// name. The function returns the actual number of array elements
// filled.
int getinfo(student pa[], int n);
 
// display1() takes a student structure as an argument
// and diplay its contents
void display1(student st);
 
// display2() takes the address of student structure as an 
// argument and diplay the structure's contents
void display2(student * ps);
 
// display3() takes the address of the first element of an array
// of student structure as and the number of array elements as 
// arguments and diplay the structure's contents
void display3(const student pa[], int n);
 
int main()
{
    cout << "Enter class size: ";
    int class_size;
    cin >> class_size;
    while (cin.get() != '\n')
        continue;
    
    student * ptr_stu = new student[class_size];
    int entered = getinfo(ptr_stu, class_size);
    for (int i = 0; i < entered; i++)
    {
        display1(ptr_stu[i]);
        display2(&ptr_stu[i]);
    }
    display3(ptr_stu, entered);
    delete [] ptr_stu;
    cout << "Done\n";
    return 0;
}

转载答案:

本题实现几个函数的功能不难,在实现输入姓名为空格跳出程序时,出现了问题,原因是使用char字符串数组用==与空行字符串比较,因此不能实现,后想起应该使用strcmp()函数,于是实现该功能。
代码如下:

// ex9.cpp -- wirte the function
#include
#include
using namespace std;
const int SLEN = 30;
struct student
{
    char fullname[SLEN];
    char hobby[SLEN];
    int ooplevel;
};
 
// getinfo() has tow arguments: a pointer to the first element of
// an array of student structure and an int representing the
// number og element of the array. The function solicits and 
// stores data about students. It terminates input upon filling
// the array or upon encountering a blank line for the student
// name. The function returns the actual number of array elements
// filled.
int getinfo(student pa[], int n);
 
// display1() takes a student structure as an argument
// and diplay its contents
void display1(student st);
 
// display2() takes the address of student structure as an 
// argument and diplay the structure's contents
void display2(student * ps);
 
// display3() takes the address of the first element of an array
// of student structure as and the number of array elements as 
// arguments and diplay the structure's contents
void display3(const student pa[], int n);
 
int main()
{
    cout << "Enter class size: ";
    int class_size;
    cin >> class_size;
    while (cin.get() != '\n')
        continue;
    
    student * ptr_stu = new student[class_size];
    int entered = getinfo(ptr_stu, class_size);
    for (int i = 0; i < entered; i++)
    {
        display1(ptr_stu[i]);
        display2(&ptr_stu[i]);
    }
    display3(ptr_stu, entered);
    delete [] ptr_stu;
    cout << "Done\n";
    return 0;
}
 
int getinfo(student pa[], int n)
{
    int count = 0;
    for(int i = 0; i < n; i ++)
    {
        cout << "Student #" << i+1 << ":\n";
        cout << "Enter the name(enter blank line to quit): ";
        cin.getline(pa[i].fullname, SLEN);
        if(!strcmp(pa[i].fullname," ")) //
            break;
        count++;
        cout << "Enter the hobby: ";
        cin.getline(pa[i].hobby,SLEN);
        cout << "Enter the opplevel: ";
        cin >> pa[i].ooplevel;
        cin.get();
    }
    return count;
}
 
void display1(student st)
{
    cout << "Fullname: " << st.fullname << endl;
    cout << "Hobby: " << st.hobby << endl;
    cout << "Ooplevel: " << st.ooplevel << endl;
}
 
void display2(student *ps)
{
    cout << "Fullname: " << ps->fullname << endl;
    cout << "Hobby: " << ps->hobby << endl;
    cout << "Ooplevel: " << ps->ooplevel << endl;
}
void display3(const student pa[], int n)
{
    for (int i = 0; i < n; i++) 
    {
        cout << "Student #" << i + 1 << ":\n";
        cout << "Fullname: " << pa[i].fullname << endl;
    cout << "Hobby: " << pa[i].hobby << endl;
    cout << "Ooplevel: " << pa[i].ooplevel << endl;
    }
}

10. 设计一个名为calculate()的函数,它接受两个double值和一个指向函数的指针,而被指向的函数接受两个double参数,并返回一个double值。calculate()函数的类型也是double,并返回被指向的函数使用calculate()的两个参数计算得到的值。例如,假设add()函数的定义如下:

double add (double x, double y)
{
    return x + y;
}

则下述代码中的函数调用将导致calculate()把2.5和10.4传递给add()函数,并返回add()的返回值(12.9):
double q = calculate(2.5, 10.4, add);
请编写一个程序,它调用上述两个函数和至少另一个与add()类似的函数。该程序使用循环来让用户成对的输入数字。对于每对数字,程序都是用calculate()来调用add()和至少一个其他函数。如果读者爱冒险,可以尝试创建一个指针数组,其中的指针指向add()样式的函数,并编写一个循环,使用这些指针函数连续让calculate()调用这些函数。提示:下面是声明这种指针数组的方式,其中包含三个指针:
double (*pf[3]) (double, double);

转载答案:

// ex10.cpp -- using point to function
#include
 
double calculate(double , double , double (*p) (double , double ));
double add(double x, double y);
double sub(double x, double y);
double multi(double x, double y);
double div(double x, double y);
 
int main()
{
    using namespace std;
    double (*pf[4]) (double , double) = {add, sub, multi, div};
    char op[4] = {'+','-','*','/'};
    double num1, num2;
    cout << "Enter two number(enter q to quit): ";
    while(cin >> num1 >> num2)
    {
        for(int i = 0; i < 4; i++)
        {
            double result = calculate(num1,num2, pf[i]);
            cout << num1 << " "<< op[i] << " " << num2 << " = " << result << endl;
        }
        cout << "Enter next two number(enter q to quit): ";
    }
    cout << "Done\n";
    return 0;
}
 
double calculate(double x, double y, double (*p) (double , double ))
{
    return (*p)(x,y); // return p(x,y) is right
}
double add(double x, double y)
{
    return x + y;
}
 
double sub(double x, double y)
{
    return x - y;
}
 
double multi(double x, double y)
{
    return x * y;
}
 
double div(double x, double y)
{
    return x / y;
}

写在最后:

为什么最后几道题只有转载答案了,因为实在写不动了,坚持一件事真的好难,一旦放松了警惕,就会变得懒散,不愿意思考,C++技术博大精深,现在才看到第七章,之前每次都没有坚持下来,但愿这次能走的再远一些。

你可能感兴趣的:(C++Primer,c++,开发语言)