《C++ Primer Plus》(第6版)第9章编程练习

news2024/9/25 9:35:36

《C++ Primer Plus》(第6版)第9章编程练习

  • 《C++ Primer Plus》(第6版)第9章编程练习
    • 1. 打印字符串
    • 2. 修改程序清单9.9
    • 3. chaff
    • 4. sales

《C++ Primer Plus》(第6版)第9章编程练习

1. 打印字符串

下面是一个头文件:

//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);

注意到setgolf()被重载,可以这样使用其第一个版本:

golf ann;

setgolf(ann, “Ann Birdfree”, 24);

上述函数调用提供了存储在ann结构中的信息。可以这样使用其第二个版本:

golf andy;

setgolf(andy);

上述函数将提示用户输入姓名和等级,并将它们存储在andy结构中。这个函数可以(但是不一定必须)在内部使用第一个版本。

根据这个头文件,创建一个多文件程序。其中的一个文件名为golf.cpp,它提供了与头文件中的原型匹配的函数定义;另一个文件应包含main(),并演示原型化函数的所有特性。例如,包含一个让用户输入的循环,并使用输入的数据来填充一个由golf结构组成的数组,数组被填满或用户将高尔夫选手的姓名设置为空字符串时,循环将结束。main()函数只使用头文件中原型化的函数来访问golf结构。

代码:

golf.cpp:

#include "golf.h"
#include <iostream>
#include <cstring>
using namespace std;

void setgolf(golf &g, const char *name, int hc)
{
    strcpy_s(g.fullname, name);
    g.handicap = hc;
}
int setgolf(golf &g)
{

    cout << "Please enter the full name of player: ";
    cin.getline(g.fullname, Len);
    if (strcmp(g.fullname, "") == 0)
        return 0;
    cout << "Please enter the handicap of player: ";
    cin >> g.handicap;

    return 1;
}

void handicap(golf &g, int hc)
{
    g.handicap = hc;
}

void showgolf(const golf &g)
{
    cout << "Information:" << endl;
    cout << "Name: " << g.fullname << endl;
    cout << "handicap: " << g.handicap << endl;
}


main.cpp:

#include "golf.h"
#include <iostream>
using namespace std;

int main()
{
    golf ann;
    setgolf(ann, "Ann Birdfree", 24);
    showgolf(ann);

    golf andy;
    setgolf(andy);
    showgolf(andy);
    handicap(andy, 30);
    showgolf(andy);

    system("pause");
    return 0;
}

运行结果:

在这里插入图片描述

2. 修改程序清单9.9

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

代码:

#include <iostream>
#include <cstring>
using namespace std;
// const int ArSize = 10;
void strcount(const string str);
int main()
{
    string input;
    char next;

    cout << "Enter a line:\n";
    getline(cin, input);
    while (cin)
    {
        strcount(input);
        cout << "Enter next line (empty line to quit):\n";
        getline(cin, input);
        if (input == "")
            break;
    }
    cout << "Bye!\n";

    system("pause");
    return 0;
}

void strcount(const string str)
{

    static int total = 0;

    cout << "\"" << str << "\" contains ";
    total += str.size();
    cout << str.size() << " characters\n";
    cout << total << " characters total\n";
}

运行结果:
在这里插入图片描述

3. chaff

代码:

#include <iostream>
#include <cstring>
#include <new>
using namespace std;

const int N = 2;
const int BUF = 512;
char buffer[BUF];

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

int main()
{
    chaff *pc1, *pc2;
    pc1 = new chaff[N];          // use heap
    pc2 = new (buffer) chaff[N]; // use buffer array
    char d[20];

    // test *pc1
    for (int i = 0; i < N; i++)
    {
        cout << "Enter dross of #" << i + 1 << " chaff: ";
        cin.getline(d, 20);
        strcpy_s(pc1[i].dross, d);
        cout << "Enter slag of #" << i + 1 << " chaff: ";
        cin >> pc1[i].slag;
        cin.get();
    }
    for (int i = 0; i < N; i++)
    {
        cout << "chaff #" << i + 1 << ":\n";
        cout << "dross: " << pc1[i].dross << endl;
        cout << "slag: " << pc1[i].slag << endl;
    }
    // test *pc2
    for (int i = 0; i < N; i++)
    {
        cout << "Enter dross of #" << i + 1 << " chaff: ";
        cin.getline(d, 20);
        strcpy_s(pc2[i].dross, d);
        cout << "Enter slag of #" << i + 1 << " chaff: ";
        cin >> pc2[i].slag;
        cin.get();
    }
    for (int i = 0; i < N; i++)
    {
        cout << "chaff #" << i + 1 << ":\n";
        cout << "dross: " << pc2[i].dross << endl;
        cout << "slag: " << pc2[i].slag << endl;
    }

    system("pause");
    return 0;
}

运行结果:

在这里插入图片描述

在这里插入图片描述

4. sales

请基于下面这个名称空间编写一个由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()来显示这两个结构的内容。

代码:

sales.cpp:

#include "sales.h"
#include <iostream>
using namespace std;
namespace SALES
{

    void setSales(Sales &s, const double ar[], int n) // 非交互式版本
    {
        if (n < 4)
        {
            for (int i = 0; i < n; i++)
                s.sales[i] = ar[i];
            for (int j = n; j < 4; j++)
                s.sales[j] = 0;
        }
        else
        {
            for (int i = 0; i < 4; i++)
                s.sales[i] = ar[i];
        }
        s.average = (s.sales[0] + s.sales[1] + s.sales[2] + s.sales[3]) / 4;

        double max = 0.0;
        double min = 1000000;
        for (int i = 0; i < 4; i++)
        {
            if (s.sales[i] > max)
                max = s.sales[i];
            if (s.sales[i] < min)
                min = s.sales[i];
        }
        s.max = max;
        s.min = min;
    }
    void setSales(Sales &s) // 交互式版本
    {
        cout << "Enter sales:\n";
        for (int i = 0; i < 4; i++)
        {
            cout << "The #" << i + 1 << " quarter is: ";
            cin >> s.sales[i];
        }
        s.average = (s.sales[0] + s.sales[1] + s.sales[2] + s.sales[3]) / 4;

        double max = 0.0;
        double min = 1000000;
        for (int i = 0; i < 4; i++)
        {
            if (s.sales[i] > max)
                max = s.sales[i];
            if (s.sales[i] < min)
                min = s.sales[i];
        }
        s.max = max;
        s.min = min;
    }

    void showSales(const Sales &s)
    {
        cout << "The sales of 4 quarters are $" << s.sales[0] << ", $" << s.sales[1] << ", $" << s.sales[2] << ", $" << s.sales[3] << endl;
        cout << "Average:" << s.average << endl;
        cout << "Max:" << s.max << endl;
        cout << "Min:" << s.min << endl;
    }

}

main.cpp:

#include "sales.h"
#include <iostream>
using namespace SALES;
using namespace std;

int main()
{

    Sales s1, s2;

    cout << "#1:" << endl;
    setSales(s1);
    showSales(s1);
    cout << "--------------------------------------------------" << endl;
    cout << "#2:" << endl;
    double ar[3] = {10, 20, 30};
    setSales(s2, ar, 3);
    showSales(s2);

    system("pause");
    return 0;
}

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源工具系列5:DependencyCheck

Dependency-Check 是 OWASP&#xff08;Open Web Application Security Project&#xff09;的一个实用开源程序&#xff0c;用于识别项目依赖项并检查是否存在任何已知的&#xff0c;公开披露的漏洞。 DependencyCheck 是什么 Dependency-Check 是 OWASP&#xff08;Open Web …

宿主机连接virtualbox中网络

背景&#xff1a;宿主机ubuntu&#xff0c;virtualbox中window中有VPN需要在宿主机也能共享到VPN网络。在virtualbox中添加host-only网络&#xff0c;取名vboxnet0这里在菜单栏中: 管理 -> 工具 -> network managervboxnet0在宿主的IP为192.168.56.1宿主机上运行ifconfig…

【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

JavaEE简单示例——依赖注入

简单介绍&#xff1a; 首先我们要知道&#xff0c;依赖注入就是赋值&#xff0c;带着这句话去理解依赖注入就非常的简单了&#xff0c;将文中所有的依赖注入全部脑部替换成给属性赋值&#xff0c;再去理解依赖注入的概念。 依赖注入&#xff08;DI&#xff09;是指IoC容器在运…

混淆矩阵的生成

混淆矩阵简介 混淆矩阵&#xff08;Confusion Matrix&#xff09;是一个二维表格&#xff0c;常用于评价分类模型的性能。在混淆矩阵中&#xff0c;每一列代表了预测值&#xff0c;每一行代表了真实值。因此&#xff0c;混淆矩阵中的每一个元素表示了一个样本被预测为某一类别…

Zabbix对接Prometheus实操——基于Prometheus pattern监控

概述 得益于对云原生和容器监控的友好支持&#xff0c;如今&#xff0c;Prometheus监控受到越来越多企业的青睐。然而&#xff0c;对于已经部署了Zabbix监控系统的企业&#xff0c;想要用Prometheus完全替换Zabbbix&#xff0c;可能既无必要&#xff0c;短期也不现实。实际上&…

Vue组件原理知识(1)

Vue 组件知识整理&#xff08;1&#xff09;文章目录Vue 组件知识整理&#xff08;1&#xff09;一、组件介绍1.1 传统方式与组件方式编写应用对比二、组件使用2.1 非单文件组件的使用**1. 组件的创建****2. 组件的注册****3. 组件的使用****4. Vue中使用组件的三大步骤总结***…

C++基础了解-20-C++类 对象

C 类 & 对象 一、C 类 & 对象 C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;它包含了数据表示法和用于处理数据的方法。类中的数据和方法…

Hadoop学习

1.分布式与集群 hosts文件&#xff1a; 域名映射文件 2.Linux常用命令 ls -a&#xff1a;查看当前目录下所有文件mkdir -p&#xff1a;如果没有对应的父文件夹&#xff0c;会自动创建rm -rf&#xff1a;-f&#xff1a;强制删除 -r&#xff1a;递归删除cp -r&#xff1a;复制文…

《统计学习方法》(李航)——学习笔记

第一章 概论统计学习&#xff0c;又称统计机器学习&#xff08;机器学习&#xff09;&#xff0c;现在提到的 机器学习 往往指的就是 统计机器学习。统计学习研究的对象是数据&#xff0c;其对数据的基本假设是同类数据存在一定的统计规律性&#xff0c;因此可以用概率统计方法…

KDJB-702三相工控微机继电保护测试仪

一、概述 KDJB-702三相继电保护校验仪搭载标准的4相电压3相电流输出&#xff0c;具有4相电压3相电流输出&#xff0c;可方便地进行各种组合输出进行各种类型保护试验。 二、功能特点 控制数字信号处理器微机 KDJB-702三相继电保护校验仪采用高速、高性能数字控制处理器作为控制…

前端基础(十六)_数组对象

数组对象 1、创建数组 // 字面量创建const arr [1, 2, 3, 4, 5, 6]// 构造函数创建const arr2 new Array(1, 2, 3, 4, 5, 6)const arr3 Array(1, 2, 3, 4, 5, 6)2.push (从数组末尾添加元素) a.数组.push(要添加进数组的数组项) b.作用&#xff1a;将要添加的数组项 添加到…

MyBatisX插件

引言MyBatisX一款基于 IDEA 的快速开发插件&#xff0c;为效率而生 1.在idea中下载MyBatisX插件安装重启就下载好了1.1MyBatisX中XML文件与mapper相对应好处&#xff1a;两个小鸽子点的话可以相互对应&#xff0c;方便我们在开发大项目的时候快速找到对应xml文件2.MyBatisX自动…

uniapp项目打包上线流程

平台&#xff1a;h5小程序app &#xff08;安卓&#xff09;小程序打包上线流程第一步&#xff1a;登录小程序公众平台第二步&#xff1a;hbuilderx打包小程序1.在mainfest.json文件中进行相关配置2.需要将项目中的网络请求改为https协议做为生产环境&#xff08;配置项目的环境…

spring cloud stream 自定义binder

背景xxx,关键字 binder stream &#xff0c;解决多中间件通信及切换问题直接主菜&#xff1a;spring cloud stream 架构中间件 --- binder --- channel --- sink --- &#xff08;处理&#xff09;---source ---channel ---binder ---中间件 springcloudstream已自己集成了kafk…

12升400V 升压DC-DC高压脱毛仪解决方案SC3671

ipl(intense pulsed light&#xff0c;强脉冲光)脱毛&#xff0c;也叫光子脱毛&#xff0c;是市场上的一种新型脱毛技术和美容方法&#xff0c;其利用强脉冲光特殊的波长和光热效应实现破坏毛囊并达到永久脱毛的效果&#xff0c;具有速度快&#xff0c;效果好&#xff0c;安全性…

【前端学习】D5:CSS进阶

文章目录前言系列文章目录1 精灵图Sprites1.1 为什么需要精灵图&#xff1f;1.2 精灵图的使用2 字体图标iconfont2.1 字体图标的产生2.2 字体图标的优点2.3 字体文件格式2.4 字体图标的使用2.5 字体图标的引入2.6 字体图标的追加3 CSS三角3.1 普通三角3.2 案例4 CSS用户界面样式…

【学习笔记】Docker(二)

Docker镜像加载原理 UnionFS(联合文件系统) 一种分层、轻量级并且高性能的文件系统&#xff0c;它支持对文件系统的修改作为一次提交来一层层的叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承&a…

音视频开发之IOMX调用端—OMXCodec源码分析

概述 OMX Codec是stagefrightplayer中负责解码的模块。由于遵循openmax接口规范&#xff0c;因此结构稍微有点负责&#xff0c;这里就依照awesomeplayer中的调用顺序来介绍。 主要分如下几步&#xff1a; 1 mClient->connect2 InitAudioDecoder & InitVideoDecoder3 …

C++回顾(十三)—— 运算符重载提高

13.1 为什么不要重载 && 和 || 运算符 1&#xff09;&&和||是C中非常特殊的操作符2&#xff09;&&和||内置实现了短路规则3&#xff09;操作符重载是靠函数重载来完成的4&#xff09;操作数作为函数参数传递5&#xff09;C的函数参数都会被求值&#…