C++ Primer Plus 第九章编程题练习

C++ Primer Plus 第九章编程题练习

第一题

题目描述

下面是一个头文件:

const int Len = 40;

struct golf
{
    char fullname[Len];
    int handicap;
};

int setgolf(golf &g);
void handicap(golf &g, int hc);
void showgolf(const golf &g);
函数说明

函数说明

注意到setgolf( )被重载,可以这样使用其第一个版本:
golf ann;
setgolf (ann,"Ann Birdfree", 24);
上述函数调用提供了存储在ann结构中的信息。可以这样使用其第二个版本:
golf andy;
setgolf (andy);
上述函数将提示用户输入姓名和等级,并将它们存储在andy结构中。这个函数可以(但是不一定必须) 在内部使用第一个版本。
根据这个头文件,创建一个多文件程序。其中的一个文件名为golf.cpp,它提供了与头文件中的 原型匹配的函数定义;另一个文件应包含main(),并演示原型化函数的所有特性。例如,包含一个 让用户输入的循环,并使用输入的数据来填充一个由golf结构组成的数组,数组被填满或用户将高 尔夫选手的姓名设置为空字符串时,循环将结束。main( )函数只使用头文件中原型化的函数来访问 golf结构。

代码片段
//golf.h
const int Len = 40;
struct golf
{
    char fullname[Len];
    int handicap;
};
void setgolf(golf &g, const char *name, int hc);
int setgolf(golf &g);
void handicap(golf &g, int hc);
void showgolf(const golf &g);
//golf.cpp
#include<iostream>
#include<cstring>
#include"golf.h"
 
void setgolf(golf &g, const char *name, int hc)
{
    strcpy(g.fullname,name);
    handicap(g,hc);
    return ;
}
int setgolf(golf &g)
{
    using namespace std;
    cin.clear();
    cin.sync();
    cout<<"Fullname: ";
    cin.getline(g.fullname,Len);
    if(!strcmp(g.fullname,""))
        return 0;
    else
    {
        cout<<"Handicap: ";(cin>>g.handicap).get();
        return 1;
    }
}
void handicap(golf &g, int hc)
{
    g.handicap=hc;
}
void showgolf(const golf &g)
{
    using std::cout;
    cout<<"Fullname: "<<g.fullname<<"\nHandicap: "<<g.handicap<<'\n';
    return;
}
//main.cpp
#include <iostream>
#include "golf.h"

int m = 0;
int main(void)
{
    using namespace std;
    cout << "Please enter how many persons will you enter? " << endl;
    while (!(cin >> m))
    {
        cout << "Invalid input! Please enter ahain!\n";

        cin.clear();
        cin.sync();
    }
    cin.clear();
    cin.sync();
    golf *pr = new golf[m];
    cout << "Now, you can input your data in the formal of below data: \n";
    setgolf(pr[0], "fullname1", 1);
    showgolf(pr[0]);
    cout << "Below are your inputs: \n";
    for (int i = 0; i < m&&setgolf(pr[i]); i++)
        cout << "\nThe next input: \n\n";
    cout << "\nThe input has finished!\nBye!\n";
    cout << "Below are your input: \n";
    for (int i = 0; i < m && pr[i].fullname[0] != '\0'; i++)
        showgolf(pr[i]);
    while (cin.get() != EOF)
        ;
    return 0;
}


第二题

题目描述

修改程序清单9.9,用string 对象代替字符数组。这样,该程序将不再需要检查输入的字符串是否 过长,同时可以将输入字符串同字符串“” 进行比较,以判断是否为空行。

代码片段
#include <iostream>
#include<string>
#include<cstring>

using namespace std;

const int Size = 10;
void strcount(const string str)
{
    static int total = 0;
    int count = 0;
    cout << "\"" << str << "\" contains ";
    for(int i=0;str[i]!='\0';i++)
        if(str[i]!=' ')
            count++;
    total += count;
    cout << count << " characters\n";
    cout << total << " characters total!\n";
}

int main()
{
    string input;
    cout << "Enter a line:" << endl;
    while (getline(cin,input))
    {
       if(input=="")
        break;
       cin.clear();
       cin.sync();
       strcount(input);
       cout<<"Enter next line( empty line to quit): "<<endl;
       
    }
    cout << "Bye!" << endl;
    while(cin.get()!=EOF);
    return 0;
}


第三题

题目描述

下面是一个结构声明

struct chaff{
    char dross[20];
    int slag;
}

编写一个程序,使用定位new运算符将一个包含两个这种结构的数组放在一个缓冲区中。然后,给结构的成员赋值(对于char数组,使用函数strcpy()),并使用一个循环来显示内容。一种方法是像程序清单9.10那样将一个静态数组用作缓冲区;另一种方法是使用常规new运算符来分配缓冲区。

代码片段
#include <iostream>
#include<cstring>
using namespace std;
struct chaff
{
    char dross[20];
    int slag;
};
char zeon[512];
int main(void)
{
    chaff *pr = new (zeon) chaff[2];
    chaff *ps = new chaff[2];
    cout<<"Please enter your data:\n";
    for(int i=0;i<2;i++)
    {
        cout<<"Dross: ";
        char name[20];
        cin.getline(name,20);
        cin.clear();
        cin.sync();
        strcpy((pr+i)->dross,name);
        strcpy((ps+i)->dross,name);
        cout<<"\nSlag: ";
        cin>>(pr+i)->slag;
        cin.get();
        (ps+i)->slag=(pr+i)->slag;
    }
    for(int i=0;i<2;i++)
    {
        cout<<"\n#"<<i<<':'<<endl;
        cout<<"Dross: "<<(pr+i)->dross<<endl<<(ps+i)->dross;
        cout<<"\nSlag: "<<(ps+i)->dross<<endl<<(ps+i)->slag<<endl;
    }
    while (cin.get() != EOF)
        ;
    return 0;
}


第四题

题目描述

请基于下面这个名称空间编写一个由3个文件组成的程序:

namespace SALES
{
    const int QUARTERS = 4;
    
    struct Sales
    {
        double sales[QUARTERS];
        double average;
        double max;
        double min;
    };

    void setSales(Sales &S, const double ar[], int n);
    void setSales(Sales &s);
    void showSales(const Sales &s);
}

第一个文件是一个头文件,其中包含名称空间;第二个文件是一个源代码文件,它对这个名称空间进行扩展,以提供这三个函数的定义;第三个文件声明两个Sales对象,并使用setSales( )的交互式版本为一个结构提供值,然后使用setSales( )的非交互式版本为另一个结构提供值。另外它还使用showSales( )来显示这两个结构的内容。

代码片段
//4.h
namespace sALEs
{
    const int QUARTERs = 4;

    struct sales
    {
        double sales[QUARTERs];
        double average;
        double max;
        double min;
    };

    void setsales(sales &s, const double ar[], int n);
    void setsales(sales &s);
    void showsales(const sales &s);
}
//4.cpp
#include <iostream>
#include "4.h"
namespace sALEs
{

    void setsales(sales &s, const double ar[], int n)
    {
        double sum = 0;
        double min = ar[0], max = ar[0];
        for (int i = 0; i < QUARTERs && i < n; i++)
        {
            s.sales[i] = ar[i];
            sum += ar[i];
            if (min > ar[i])
                min = ar[i];
            if (max < ar[i])
                max = ar[i];
        }
        s.average = sum / (n > QUARTERs ? QUARTERs : n);
        s.min = min;
        s.max = max;
    }
    void setsales(sales &s)
    {
        using std::cout, std::cin;
        cout << "Please enter the sales(lesser than 0 to quit and no more than four numbers): \n";
        double min, max, sum = 0;
        int i;
        for (i = 0; i < 4; i++)
        {
            cout << "#" << i+1 << "\n";
            cin >> s.sales[i];
            if (s.sales[i] < 0)
                break;
            if (i == 0)
                max = min = s.sales[0];
            sum += s.sales[i];
            if (min > s.sales[i])
                min = s.sales[i];
            if (max < s.sales[i])
                max = s.sales[i];
        }
        cout << "Bye!\n";
        s.average=sum/i;     s.min = min;
		        s.max = max;
		    }
    void showsales(const sales &s)
    {
        using namespace std;
        cout<<"sales:\n";
        for(int i=0;i<4;i++)
        {
            if(s.sales[i]>1e-6)
            cout<<s.sales[i]<<' ';
            else
            {
                cout<<endl;
                break;
            }
            cout<<endl;
        }
        cout<<"\nAverage :"<<s.average<<endl<<"Max: "<<s.max<<endl<<"Min: "<<s.min<<endl;
    }
}
//main.cpp
#include<iostream>
#include"4.h"

int main(void)
{
    using namespace sALEs;
    sales exam1,exam2;
    double temp[3]={1.1,2.2,3.3};
    setsales(exam1,temp,3);
    showsales(exam1);
    setsales(exam2);
    showsales(exam2);
    while(std::cin.get()!=EOF);
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_南明_离火_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值