我是靠谱客的博主 高大大船,最近开发中收集的这篇文章主要介绍C++ Primer Plus 第六版第八章编程练习答案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include <iostream>
#include <cstring>
#include <cctype>

using namespace std;

void q1();
void print(char * a, int b = 0);

const int Len = 40;
struct CandyBar
{
    char maker[Len];
    double weight;
    int calo;
};
void q2();
void setnum(CandyBar & a, char * m = "Millennium Munch", double w = 2.85, int c = 350);
void show(const CandyBar & a);

void q3();
void Upper(string & a);

struct stringy{
    char * str;
    int ct;
};
void q4();
void set(stringy & a, char * b);
void show(const stringy & a, int i = 1);
void show(const char a[], int i = 1);

void q5();
template<typename T> 
T max5(const T a[]);

void q6();
template<typename T>
T maxn(const T a[], int n);

typedef char * charptr; 
/*
若写为  
template<> 
char * maxn(const char * a[], int n);
会报错:template-id 'maxn<>' for 'char* maxn(const char**, int' does not match any template declaration 

在模板的定义中, const T 所代表的是一个常量。那么 const char* 是一个常量吗?
不是,它是一个非常量指针(编译器允许改变它的值,让它指向别处),指向一个常量(编译器不允许修改它所指向的内容)。
所以,编译器判定显式特化与函数模板定义不匹配。

正确的写法是:

typedef char* char_ptr;

template<> char_ptr max_e (const char_ptr ar[], int n)

或者写为

template<> char* max_e(char* const arr[],int len)

注意只有char* const 才能对应原来的模板中的const T

而不是const char* 对应 const T !

*/
template<> 
charptr maxn(const charptr a[], int n);

void q7();
template <typename T>
T SumArray(T arr[], int n);

template <typename T>
T SumArray(T * arr[], int n);

struct debts
{
    char name[50];
    double amount;
};

int main()
{
    q7();
    return 0;
}

void q1()
{
    char a[50] = "Hello";
    cout << "print(a):" << endl;
    print(a);
    cout << "print(a,2):" << endl;
    print(a, 2);
}

void print(char * a, int b)
{
    if (b)
    {
        while(b--)
            print(a, b);
    }
    else
        cout << a << endl;
}

void q2()
{
    CandyBar num1, num2;
    setnum(num1, "xy", 1.2, 230);
    setnum(num2);
    show(num1);
    show(num2);
}

void setnum(CandyBar & a, char * m, double w, int c)
{
    int i = 0;
    for (; strlen(m) < (Len - 1) && i < strlen(m); i++)
        a.maker[i] = m[i];
    a.maker[i] = '';
    a.weight = w;
    a.calo = c;
}

void show(const CandyBar & a)
{
    cout << "CandyBar maker:  " << a.maker << endl;
    cout << "         weight: " << a.weight << endl;
    cout << "         calo:   " << a.calo << endl;
}

void q3()
{
    cout << "Enter a string (q to quit): " ;
    string a;
    getline(cin, a);
    while (a != "q")
    {
        Upper(a);
        cout << a << endl;
        cout << "Enter a string (q to quit): ";
        getline(cin, a);
    }
    cout << "Bye." << endl;
}

void Upper(string & a)
{
    for (int i = 0; i < a.length(); i++)
    {
        if(!isupper(a[i]))
            a[i] = toupper(a[i]);
    }
}

void q4()
{
    stringy beany;
    char testing[] = "Reality isn't what it used to be.";
    
    set(beany, testing);
    show(beany);
    show(beany, 2);
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing);
    show(testing, 3);
    show("Done!");
    delete [] beany.str;
}

void set(stringy & a, char * b)
{
    a.ct = strlen(b);
    a.str = new char[a.ct+1];
    strcpy(a.str, b);
}

void show(const stringy & a, int i)
{
    for (int j = 0; j < i; j++)
        cout << a.str << endl;
}

void show(const char a[], int i)
{
    for (int j = 0; j < i; j++)
        cout << a << endl;
}

void q5()
{
    int a[5] = {1, 3, 5, 2, 4};
    double b[5] = {1.3, 3.2, 2, 4.3, 2.1};
    cout << max5(a) << endl;
    cout << max5(b) << endl;
}

template<typename T>
T max5(const T a[])
{
    T c = a[0];
    for (int i = 0; i < 5; i++)
    {
        if(c < a[i])
            c = a[i];
    }
    return c;
}

void q6()
{
    int a[6] = {1, 2, 5, 7, 2, 1};
    double b[4] = {1.2, 4.3, 2.1, 5.3};
    cout << maxn(a, 6) << endl;
    cout << maxn(b, 4) << endl;
    const charptr c[5] = 
        {
            "hello",
            "world",
            "name",
            "bye",
            "puppy"
        };
    cout << maxn(c, 5) << endl;
}

template<typename T> T maxn(const T *a, int n)
{
    T c = a[0];
    for (int i = 0; i < n; i++)
    {
        if (c < a[i])
            c = a[i];
    }
    return c;
}

template<> charptr maxn(const charptr a[], int n)
{
    int len = strlen(a[0]);
    charptr pd = &a[0][0];
    for (int i = 0; i < n; i++)
    {
        if (strlen(a[i]) > len)
        {
            pd = &a[i][0];
            len = strlen(a[i]);
        }
    }
    return pd;
}

void q7()
{
    int things[6] = {13, 31, 103, 301, 310, 130};
    struct debts mr_E[3] = 
    {
        {"Ima Wolfe", 2400.0},
        {"Ura Foxe", 1300.0},
        {"Iby Stout", 1800.0}
    };
    double * pd[3];
    for (int i = 0; i < 3; i++)
        pd[i] = &mr_E[i].amount;
    cout << "The sum of things:" << SumArray(things, 6) << endl;
    cout << "The sum of debts: " << SumArray(pd, 3) << endl;
}

template <typename T>
T SumArray(T arr[], int n)
{
    T sum = 0;
    for (int i = 0; i < n; i++)
        sum += arr[i];
    return sum;
}

template <typename T>
T SumArray(T * arr[], int n)
{
    T sum = 0;
    for (int i = 0; i < n; i++)
        sum += *arr[i];
    return sum;
}

最后

以上就是高大大船为你收集整理的C++ Primer Plus 第六版第八章编程练习答案的全部内容,希望文章能够帮你解决C++ Primer Plus 第六版第八章编程练习答案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部