当前位置:C++技术网 > 精选软件 > C++ Primer Plus 6th 6.11 编程练习题 第4题 菜单选择显示BOP的成员

C++ Primer Plus 6th 6.11 编程练习题 第4题 菜单选择显示BOP的成员

更新时间:2019-05-10 15:47:24浏览次数:1+次

题目:

4.加入Benevolent Order of Programmer后,在BOP大会上,人们便可以通过加入者的真实姓名、头衔或秘密BOP姓名来了解他(她)。请编写一个程序,可以使用真实姓名、头衔、秘密姓名或成员偏好来列出成员。编写该程序时,请使用下面的结构:

// Benevolent Order of Programmers name structure
struct bop{
    char fullname[strsize]; // real name
    char title [strsize];   // job title
    char bopname[strsize];  // secret BOP name
    int preference;         // 0=fullname, 1=title,2=bopname
};

该程序创建一个由上述结构组成的小型数组,并将其初始化为适当的值。另外,该程序使用一个循环,让用户在下面的选项中进行选择:

a. display by nameb.  display by title
c. display by bopname  d. display by preference
q. quit
注意,"display by preference" 并不意味着显示成员的偏好,而是意味着根据成员的偏好来列出成员。
例如,如果偏好号为1,则选择d将显示程序员的头衔。该程序的运行情况如下:
Benevolent Order of Programmers Report
a. display by name        b. display by title
c. display by bopname  d. display by preference
q. quit
Enter  your  choice:a
Wimp Macho
Raki Rhodes
Celia Laiter
Hoppy Hipman
Pat Hand
Next  choice:d
Wimp Macho
Junior Programmer
MIPS
Analyst Trainee
LOOPY
Next choice:q
Bye!


答案:  书上无答案。

C++技术网辅导详解解答:
    参考代码:

#include <iostream>
struct bop {
    char fullname[50]; // real name
    char title[50];    // job title
    char bopname[50];  // secret BOP name
    int preference;    // 0=fullname, 1=title ,2=bopname
};
using namespace std;
int main()
{
    struct  bop arr_bop[5] = { 
        {"Wimp Macho","T-Wimp","Bop-Wimp",0},
        {"Raki Rhodes","Junior Programmer","Bop-Raki",1},
        {"Celia Laiter","T-Celia","MIPS",2},
        {"Hoppy Hipman","Analyst Trainee","Bop-Hoppy",1},
        {"Pat Hand","LOOPY","Bop-Pat",1 } 
    };
    int ch;
    cout << "a.display by name     b.display by title\n";
    cout << "c.display by bopname  d.display by preference\n";
    cout << "q.quit\nEnter  your  choice:";
    
    while (ch = cin.get())
    {
        if (ch == '\n')continue;
        switch (ch)
        {
        case 'a':
            for (int i = 0; i < 5; i++)
            {
                cout << arr_bop[i].fullname << endl;
            }
            break;
        case 'b':
            for (int i = 0; i < 5; i++)
            {
                cout << arr_bop[i].title << endl;
            }
            break;
        case 'c':
            for (int i = 0; i < 5; i++)
            {
                cout << arr_bop[i].bopname << endl;
            }
            break;
        case 'd':
            for (int i = 0; i < 5; i++)
            {
                switch (arr_bop[i].preference)
                {
                case 0:
                    cout << arr_bop[i].fullname << endl;
                    break;
                case 1:
                    cout << arr_bop[i].title << endl;
                    break;
                case 2:
                    cout << arr_bop[i].bopname << endl;
                    break;
                default:
                    break;
                }
            }
            break;
        case 'q':
            cout << "Bye!\n";
            exit(0);
        default:
            break;
        }
        cout << "Next  choice:";
    }
    return 0;
}


    这题在选择d上有点绕。选择d依然要显示所有成员的信息,只是显示的信息是根据每一个成员的偏好来显示成员显示的信息的。另外,在初始化合适的值又要确保输出的结果如示例那样,那么我们要根据输出的信息对初始化的内容进行还原。输入a输出了所有成员的名字,那么可以确定数组的长度和名称。输入d显示的内容各不相同,根据内容的性质,可以推断出每一个成员的偏好号。那么其他不会显示的内容则可以自行设定了。输入q的时候,如果我们想退出循环,靠一个break是不够的,所以我们使用exit函数来结束了程序。

    本题涉及到两个循环的使用,还有两个switch的使用,还是将他们进行嵌套实现的。所以本题是比较综合的。但是解答的方法是一步步的去分析题目的信息,先将能够确定的信息先写出来,然后一步步就水到渠成了。