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

 本来前面五题都做完了,写博客时没保存好草稿= =,写了个整合版的程序,实现前五题的关键部分。

 

1.定义一个叫jojo的结构,存储姓名、替身和力量值,使用动态结构数组初始化二乔、承太郎和乔鲁诺乔巴纳等人的信息。循环地用菜单化的选项提示用户输入,选项1:显示所有人的替身;选项2:按一定比率强化白金之星的力量值,并输出当前所有人力量的平均值;选项3:要求用户输入一系列字符,然后返回相同的字符,其中转换字母大小写,遇到“@”就停止;选项4:退出。如果输入1-4以外的数字,提示用户重新输入,如果输入的不是数字,则提示失败退出程序。

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

const double ratio = 0.1;
const int strsize = 100;

struct jojos
{
    char name[20];
    char stand[20];
    double power;
};

int main()
{
    jojos *joptr = new jojos[4];

    joptr[0] =
    {
        "Joseph",
        "Hermit Purple",
        6
    };

    joptr[1] = { "Jotaro","Star Platinum",9 };

    joptr[2] =
    {
        "Giorno Giovanna",
        "Gold Experience",
        8
    };

    joptr[3] = { "me","Repeater",1 };

    int choice;
    int flag = 1;
    char store[strsize];

    char prmt[] =
    {
        "Make your choice:\n1)show the stand \t 2)power up \n3)my stand \t 4)quit\n"
    };

    while (flag)
    {
        cout << prmt;
        if (cin >> choice)
        {
            switch (choice)
            {
            case 1:
            {
                for (int i = 0; i < 4; i++)
                {
                    cout << joptr[i].name << ":" << joptr[i].stand << endl;
                }
                cout << "\n";
                break;
            }
            case 2:
            {
                cout << "Power up!\n";
                joptr[1].power = joptr[1].power*(1 + ratio);
                double sum = 0;
                for (int i = 0; i < 4; i++)
                {
                    sum += joptr[i].power;
                }
                cout << "Jotaro's star platinum:" << joptr[1].power << endl;
                cout << "Power average:" << sum / 4 << endl;
                cout << "\n";
                break;
            }
            case 3:
            {
                cin.get();
                cout << "Enter some characters: ";
                cin.get(store, strsize);
                for (int i = 0; store[i] != '\0'; i++)
                {
                    if (isdigit(store[i]))
                        continue;
                    else if (store[i] != '@')
                    {
                        if (isupper(store[i]))
                            store[i] = tolower(store[i]);
                        else if (islower(store[i]))
                            store[i] = toupper(store[i]);
                        cout << store[i];
                    }
                    else if (store[i] == '@')
                    {
                        break;
                    }
                    else {};
                }
                cout << "\n\n";
                break;
            }
            case 4:
            {
                flag = 0;
                break;
            }
            default:
            {
                cout << "Please select from 1 to 4.\n\n";
            }
            }
        }
        else
        {
            cout << "Bad Input!\n";
            flag = 0;
        }
    }

    delete []joptr;
    cout << "Bye.\n";
    system("pause");
}

 

 2.编写程序记录一系列捐款者和捐款数目,将所有信息存储在动态结构数组中。首先要求用户输入有几个捐款者,然后循环读取捐款者姓名和捐款数目。读取完数据后,输出所有捐款额超过10000的人的姓名和捐款额,并标记为重要捐款人“Grand Patrons”,然后再输出其它捐款者的姓名,标记为“Patrons”。如果对应标记没有捐款人,则输出“none”。

#include<iostream>
using namespace std;

struct donator
{
    char name[20];
    int donation;
};

int main()
{
    int counts, counts_temp = 0;

    cout << "How many donators: ";
    cin >> counts;

    donator *ptr = new donator[counts];

    for (int i = 0; i < counts; i++)
    {
        cout << "#donator " << i + 1 << "#\n";
        cout << "name:";
        cin.get();
        cin.get(ptr[i].name, 20);
        cin.get();
        cout << "donation:";
        cin >> ptr[i].donation;
    }

    cout << "*Grand Patrons:";
    for (int i = 0; i < counts; i++)
    {
        if (ptr[i].donation >= 10000)
        {
            cout << ptr[i].name << " $" << ptr[i].donation << "  ";
            counts_temp++;
        }
        else {};
    }

    if (counts_temp == 0)
        cout << "none.\n";
    else
        counts_temp = 0;

    cout << "\nPatrons:";
    for (int i = 0; i < counts; i++)
    {
        if (ptr[i].donation < 10000)
        {
            cout << ptr[i].name<<";";
            counts_temp++;
        }
        else {};
    }

    if (counts_temp == 0)
        cout << "none.\n";
    else {}

    delete[]ptr;
    system("pause");
}

 

3.编写程序,打开一个文件,逐个字符读取该文件,直到文件末尾,然后指出其中包含的字符数。

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

const int MAXSIZE = 100;

int main()
{
    char store[MAXSIZE] ;
    int counts_all = 0, counts_space = 0;

    ifstream infile;
    infile.open("test.txt");    //打开文件

    infile.get(store, MAXSIZE);        //infile此时可以当cin用

    for (int i = 0; store[i]!='\0'; i++)
    {
        counts_all++;
        if (store[i] == ' ')
            counts_space++;
        else {}
    }

    cout << "Total characters(include spaces):" << counts_all << endl;
    cout << "Total characters(without spaces):" << counts_all - counts_space << endl;

    infile.close();

    system("pause");
}

 

4.修改程序2,这次使用文件存储所有信息,从文件里读取。

文件的格式:

4
Sam Stone
2000
Freida Flass
100500
...

第一行为捐款人数量,从第二行开始,一行写姓名,一行写捐款额。

程序如下。

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

struct donator
{
    char name[20];
    int donation;
};

int main()
{
    int counts, counts_temp = 0; int test;

    ifstream infile;
    infile.open("test.txt");

    cout << "How many donators: ";
    infile >> counts;    
    cout << counts << endl;        //每次读入以后输出一下,查看是否正确

    donator *ptr = new donator[counts];

    //infile会逐行读入,遇到换行符结束,且换行符不会留在缓冲区
    for (int i = 0; i < counts; i++)
    {
        cout << "#donator " << i + 1 << "#\n";
        cout << "name:";
        infile >> ptr[i].name;
        cout << ptr[i].name << endl;
        cout << "donation:";
        infile >> ptr[i].donation;
        cout << ptr[i].donation << endl;
    }

    cout << "*Grand Patrons:";
    for (int i = 0; i < counts; i++)
    {
        if (ptr[i].donation >= 10000)
        {
            cout << ptr[i].name << " $" << ptr[i].donation << "  ";
            counts_temp++;
        }
        else {};
    }

    if (counts_temp == 0)
        cout << "none.\n";
    else
        counts_temp = 0;

    cout << "\nPatrons:";
    for (int i = 0; i < counts; i++)
    {
        if (ptr[i].donation < 10000)
        {
            cout << ptr[i].name << ";";
            counts_temp++;
        }
        else {};
    }

    if (counts_temp == 0)
        cout << "none.\n";
    else {}

    delete[]ptr;
    infile.close();
    system("pause");
}

*经测试,infile对象是逐行读入的,每次遇到换行符(回车)就停止一次输入,并且不会在缓冲区留下换行符,所以不用像原先代码那样用cin.get()来清除。

 

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