zoukankan      html  css  js  c++  java
  • 《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:
    ";
            cin >> num1;
            cin >> num2;
            if ((num1 == 0) || (num2 == 0))
                flag = 0;
            else
                cout << "Harmonic mean:" << harm_mean(num1, num2) << endl;
    
        }
        
        cout << "done.
    ";
        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)
    Enter the score:
    ";
        score_in(score);
        score_out(score);
        score_mean(score);
    
        cout << "done.
    ";
        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 << "
    ";
    }
    
    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:
    ";
        cin >> l >> w >> h;
    
        set_box(&box1, l, w, h);
        v_box(&box1);
    
        cout << "done.
    ";
        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
    ";
        cout << "the number of picks allowed:
    ";
    
        while ((cin >> total >> choices) && (choices <= total ))
        {
            cout << "You have one chance in ";
            cout << probability(total, choices)*particular(27);
            cout << " of winning.
    ";
            cout << "Next two numbers(q to quit):";
        }
        
        cout << "
    done.";
        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:
    ";
        cin >> n;
        cout << "Its factorial:" << fac(n) << endl;
        
        cout << "done.
    ";
        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.
    ";
        system("pause");
    }
    
    void fill_array(double fa[], int asize)
    {
        cout << "Enter some numbers:
    ";
        for (int i = 0; i < asize; i++)
        {
            if (cin >> fa[i])
            {
                counts++;
                if (counts == asize)
                {
                    cout << "Input stopped.
    ";
                    break;
                }
                else {};
            }
            else
            {
                cout << "Input stopped.
    ";
                break;
            }
        }
        cout << counts << " numbers entered.
    ";
    }
    
    void show_array(double sa[], int ssize)
    {
        cout << "Input numbers:";
        for (int i = 0; i < counts; i++)
        {
            cout << sa[i] << " ";
        }
        cout << "
    ";
    }
    
    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
    ";
        show_array(pro, fill_array(pro, Max));
    
        cout << "Next 5 numbers to sum
    ";
        cout << "Sum:" << add_array(pro, fill_array(pro, Max));
        
        cout << "
    done.";
        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 << "
    done.";
        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 << "
    EXPENSES
    ";
        for (int i = 0; i < seasons; i++)
        {
            cout << Snames[i] << ":$" << da[i]<<"	";
            total += da[i];
        }
        cout << "
    Total 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.
    ";
        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] << "	";
            total += se[i];
        }
        cout << "
    Total 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.
    ";
        system("pause");
    }
    
    void getinfo(student pa[], int n)
    {
        int i = 0;
        for (i = 0; i < n; i++)
        {
            cout << "Input name of student " << i + 1 << ":
    ";
            cin.get(pa[i].fullname, SLEN);
            cin.get();
            cout << "Input hobby of student " << i + 1 << ":
    ";
            cin.get(pa[i].hobby, SLEN);
            cout << "Input ooplevel of student " << i + 1 << ":
    ";
            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.
    ";
        system("pause");
    }
  • 相关阅读:
    python从可迭代对象中取值
    python中可迭代对象和列表
    python中字典生成式
    Redis源码解析之跳跃表(一)
    Redis高可用集群
    Redis主从&哨兵集群搭建
    Java并发之ThreadPoolExecutor源码解析(三)
    Java并发之ThreadPoolExecutor源码解析(二)
    Java并发之ThreadPoolExecutor源码解析(一)
    并发编程之JMM&Volatile(三)
  • 原文地址:https://www.cnblogs.com/banmei-brandy/p/11314903.html
Copyright © 2011-2022 走看看