《C++primerplus》第7章练习题

1.用户不断输入两个数,计算调和平均数,直到其中一个数为0。

#include<iostream>
using namespace std;

double harm_mean(double x, double y)
{
    double result;
    result = 2 * x*y / (x + y);
    return result;
}

int main()
{
    double num1, num2;
    int flag = 1;
    
    while (flag)
    {
        cout << "Enter two numbers:\n";
        cin >> num1;
        cin >> num2;
        if ((num1 == 0) || (num2 == 0))
            flag = 0;
        else
            cout << "Harmonic mean:" << harm_mean(num1, num2) << endl;

    }
    
    cout << "done.\n";
    system("pause");
}

 

2.要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。使用3个数组处理函数分别进行输入、显示和计算平均成绩。

#include<iostream>
using namespace std;

void score_in(int si[]);
void score_out(int so[]);
void score_mean(int sm[]);

static int counts = 0;

int main()
{
    int score[10];

    cout << "(enter any letter to stop input)\nEnter the score:\n";
    score_in(score);
    score_out(score);
    score_mean(score);

    cout << "done.\n";
    system("pause");
}

void score_in(int si[])
{
    for (int i = 0; i < 10; i++)
    {
        if (cin >> si[i])
        {
            counts++;
        }
        else
        {
            cout << "Input stopped." << endl;
            break;
        }
    }
}

void score_out(int so[])
{
    cout << "Score:";
    for (int i = 0; i < counts; i++)
    {
        cout << so[i] << "  ";
    }
    cout << "\n";
}

void score_mean(int sm[])
{
    double sum = 0;
    for (int i = 0; i < counts; i++)
    {
        sum += sm[i];
    }
    cout << "Average:" << sum / counts << endl;
}

 

3.定义一个box结构,存储生产者,长高宽和体积的信息。编写两个函数,第一个按值传递box结构,显示所有成员的值。第二个传递box结构的地址,并将volume成员设置为其它三维长度的体积。将两个函数组成一个简单的程序。

#include<iostream>
using namespace std;

struct box
{
    char maker[40];
    float height;
    float width;
    float length;
    float volume;
};

void set_box(box *sptr, float x, float y, float z);
void v_box(box *vptr);

int main()
{
    box box1;
    float l, w, h;

    cout << "Enter the box's l,w and h:\n";
    cin >> l >> w >> h;

    set_box(&box1, l, w, h);
    v_box(&box1);

    cout << "done.\n";
    system("pause");
}

void set_box(box *sptr, float x, float y, float z)
{
    sptr->height = z;
    sptr->length = x;
    sptr->width = y;
    cout << "Length:" << sptr->length << endl;
    cout << "Width:" << sptr->width << endl;
    cout << "Height:" << sptr->height << endl;
}

void v_box(box *vptr)
{
    vptr->volume = vptr->height*vptr->length*vptr->width;
    cout << "The volume of this box is:" << vptr->volume << endl;
}

 

4.修改书中7.4的程序,域号码1~47,中奖条件增加一项从27个数中抽中号码。

#include<iostream>
using namespace std;

long double probability(unsigned numbers, unsigned picks)
{
    long double result = 1.0;
    unsigned n;
    unsigned p;

    for (n = numbers, p = picks; p > 0; n--, p--)
    {
        result = result * n / p;
    }

    return result;
}

unsigned particular(unsigned pn)
{
    return pn;
}

int main()
{
    double total, choices;
    cout << "Enter the total number of choices on the game card and\n";
    cout << "the number of picks allowed:\n";

    while ((cin >> total >> choices) && (choices <= total ))
    {
        cout << "You have one chance in ";
        cout << probability(total, choices)*particular(27);
        cout << " of winning.\n";
        cout << "Next two numbers(q to quit):";
    }
    
    cout << "\ndone.";
    system("pause");
}

*这题没太看懂什么意思,结果再乘个27不就行了?跟着敲了一边代码。

 

5.定义一个递归函数算阶乘。

#include<iostream>
using namespace std;

long long fac(int n)
{
    if (n > 0)
        return n * fac(n - 1);
    else if (n == 0)
        return 1;
}

int main()
{
    int n;

    cout << "Enter a number:\n";
    cin >> n;
    cout << "Its factorial:" << fac(n) << endl;
    
    cout << "done.\n";
    system("pause");
}

 

6.编写三个处理double数组的函数,分别用于提示输入、显示数组内容和翻转数组中值的顺序。程序先填充数组,显示数组,再翻转数组,再显示数组。

#include<iostream>
using namespace std;

static int counts = 0;        //输入数字计数

void fill_array(double fa[], int asize);
void show_array(double sa[], int ssize);
void reverse_array(double ra[], int rsize);

int main()
{
    double input[10];

    fill_array(input, 10);
    show_array(input, 10);
    reverse_array(input, 10);
    show_array(input, 10);

    cout << "done.\n";
    system("pause");
}

void fill_array(double fa[], int asize)
{
    cout << "Enter some numbers:\n";
    for (int i = 0; i < asize; i++)
    {
        if (cin >> fa[i])
        {
            counts++;
            if (counts == asize)
            {
                cout << "Input stopped.\n";
                break;
            }
            else {};
        }
        else
        {
            cout << "Input stopped.\n";
            break;
        }
    }
    cout << counts << " numbers entered.\n";
}

void show_array(double sa[], int ssize)
{
    cout << "Input numbers:";
    for (int i = 0; i < counts; i++)
    {
        cout << sa[i] << " ";
    }
    cout << "\n";
}

void reverse_array(double ra[], int rsize)
{
    double t;
    //如果要翻转除第一位和最后一位的数字,把i改成1
    for (int i = 0; i <= counts / 2; i++)
    {
        t = ra[i];
        ra[i] = ra[counts - i - 1];
        ra[counts - i - 1] = t;
    }
}

 

7.修改书中7.7的程序,使用两个指针参数来表示区间。fill_array()函数返回一个指向最后被填充的位置的指针,其它函数可以将它作为第二个参数标识结尾。

#include<iostream>
using namespace std;

const int Max = 5;

double* fill_array(double ar[], int limit);
void show_array(double *ptl, double *ptr);
double add_array(double *ptl, double *ptr);

int main()
{
    
    double pro[Max];

    cout << "5 numbers to show\n";
    show_array(pro, fill_array(pro, Max));

    cout << "Next 5 numbers to sum\n";
    cout << "Sum:" << add_array(pro, fill_array(pro, Max));
    
    cout << "\ndone.";
    system("pause");
}

double* fill_array(double ar[], int limit)
{
    double *ptr;
    int i = 0;
    for (i = 0; i < limit; i++)
    {
        cout << "Enter value #" << i + 1 << ":";
        cin >> ar[i];
    }
    ptr = &ar[i];
    return ptr;
}

void show_array(double *ptl, double *ptr)
{
    for (int i = 0; ptl[i] != *ptr; i++)
    {
        cout << "Property #" << i + 1 << ":" << ptl[i] << endl;
    }
}

double add_array(double *ptl, double *ptr)
{
    double sum = 0;
    for (int i = 0; ptl[i] != *ptr; i++)
    {
        sum += ptl[i];
    }
    return sum;
}

 

8.修改程序7.15,编写不使用array类两个版本。

#include<iostream>
//#include<array>
//#include<string>

using namespace std;
/*原程序
const int seasons = 4;
const array<string, seasons>Snames =
{ "Spring","Summer","Fall","Winter" };

void fill(array<double, seasons>*pa);
void show(array<double, seasons>da);

int main()
{
    array<double, seasons>expenses;

    fill(&expenses);
    show(expenses);

    cout << "\ndone.";
    system("pause");
}

void fill(array<double, seasons>*pa)
{
    for (int i = 0; i < seasons; i++)
    {
        cout << "Enter " << Snames[i] << " expenses:";
        cin >> (*pa)[i];
    }
}

void show(array<double, seasons>da)
{
    double total = 0.0;
    cout << "\nEXPENSES\n";
    for (int i = 0; i < seasons; i++)
    {
        cout << Snames[i] << ":$" << da[i]<<"\t";
        total += da[i];
    }
    cout << "\nTotal Expenses:$" << total << endl;
}
*/

const char Snames[4][10] = {"Spring","Summer","Fall","Winter"};
const int seasons = 4;
void fill_exp(double fe[]);
void show_exp(double se[]);

struct Expenses
{
    double expenses[seasons];
};

int main()
{
    //double expenses[seasons];        版本a

    Expenses exp;
    fill_exp(exp.expenses);
    show_exp(exp.expenses);

    //fill_exp(expenses);    版本a
    //show_exp(expenses);    版本a

    cout << "done.\n";
    system("pause");
}

void fill_exp(double fe[])
{
    for (int i = 0; i < seasons; i++)
    {
        cout << "Enter " << Snames[i] << " expenses:";
        cin >> fe[i];
    }
}

void show_exp(double se[])
{
    double total = 0;
    for (int i = 0; i < seasons; i++)
    {
        cout << Snames[i] << ":$" << se[i] << "\t";
        total += se[i];
    }
    cout << "\nTotal expenses:" << total << endl;
}

 

9.把程序补充完整。getinfo函数用于输入学生结构的信息,三种display函数显示学生的信息,但使用三种不同的参数传递方式。

#include<iostream>
using namespace std;

const int SLEN = 30;

struct student
{
    char fullname[SLEN];
    char hobby[SLEN];
    int ooplevel;
};

void getinfo(student pa[], int n);

void display1(student st);

void display2(const student *ps);

void display3(const student pa[], int n);

int main()
{
    student students[3];

    getinfo(students, 3);

    display1(students[0]);
    display2(&students[1]);
    display3(students, 3);

    cout << "done.\n";
    system("pause");
}

void getinfo(student pa[], int n)
{
    int i = 0;
    for (i = 0; i < n; i++)
    {
        cout << "Input name of student " << i + 1 << ":\n";
        cin.get(pa[i].fullname, SLEN);
        cin.get();
        cout << "Input hobby of student " << i + 1 << ":\n";
        cin.get(pa[i].hobby, SLEN);
        cout << "Input ooplevel of student " << i + 1 << ":\n";
        cin >> pa->ooplevel;
        cin.get();
    }
}

void display1(student st)
{
    cout << "Student1's name:" << st.fullname << endl;
}

void display2(const student *ps)
{
    cout << "Student2's hobby:" << ps->hobby << endl;
}

void display3(const student pa[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << pa[i].fullname << "  ";
    }
}

 

10.函数指针练习。编写一个calculate()函数,接受三项参数,两个double值和一个函数指针,指针指向计算两数之和(或其它功能)的函数。可尝试使用函数指针数组。

#include<iostream>
using namespace std;

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

double div(double x, double y)
{
    return x / y;
}

double calculate(double x, double y, double (*ptf)(double,double))
{
    return ptf(x, y);
}

int main()
{
    double x1, x2;
    double(*ptf[2])(double, double);
    ptf[0] = add;
    ptf[1] = div;

    cout << "Enter two number:";
    while (cin >> x1 >> x2)
    {
        cout << "Add:" << calculate(x1, x2, ptf[0]) << endl;
        cout << "Div:" << calculate(x1, x2, ptf[1]) << endl;
        cout << "Enter two number:";
    }
    
    cout << "done.\n";
    system("pause");
}

 

posted @ 2019-08-08 20:26  MorpheusDong  阅读(307)  评论(0编辑  收藏  举报