9.5复习题

//1
homer将自动成为自动变量
在一个文件中将secret定义为外部变量,并在第二个文件中使用extern声明它
在外部定义前加上关键字static,将topsecret定义为一个有内部链接的静态变量,也可以在一个未命名的名称空间中定义
在函数内beencalled的声明前加关键字static,将beencalled定义为一个无链接性的静态变量//2
using声明使特定的标识符可用,using编译指令使整个名称空间可用//3
#include<iostream>
int main()
{double x;std::cout << "Enter value: ";while (!(std::cin >> x)){std::cout << "Bad intput.Please enter anumber: ";std::cin.clear();while (std::cin.get() != '\n')continue;}std::cout >> "Value = " << x << std::endl;return 0;
}//4
#include<iostream>int main()
{using std::cin;                                            //此处using声明放在main函数里面using std::cout;using std::endl;double x;cout << "Enter value: ";while (!(cin >> x)){cout << "Bad intput.Please enter anumber: ";cin.clear();while (cin.get() != '\n')continue;}cout >> "Value = " << x << endl;return 0;
}//5
分别在两个文件中使用static定义同样的函数,因此这个函数只能在此文件中使用
可以在每个文件中包含单独的静态函数定义,或者每个文件都在未命名的名称空间中定义一个合适的average函数//6
依次输出:
10
4
0
Other: 10,1
another(): 10,-4//7
1
4, 1, 2
2
2
4, 1, 2
2

9.6编程练习(编译运行均已通过)

practice 1

1. 下面是一个头文件:

(……省略……)

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

golf ann;

setgolf(ann, "Ann Birdfree", 24);

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

golf andy;

setgolf(andy);

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

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

//practice 1//golf.h
#pragma once        //这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次
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"golf.h"
#include<iostream>
#include<cstring>using std::cout;
using std::cin;
using std::endl;void setgolf(golf& g, const char* name, int hc)
{strcpy_s(g.fullname, name);g.handicap = hc;
}int setgolf(golf& g)
{char name[Len];int hc = 0;              //定义局部变量时,系统不会自动初始化,定义全局变量会初始化为0,char为'\0',pointer为NULLcout << "Please enter the fullname of struct golf: ";cin.getline(name, Len);if (name[0] == '\0'){cout << "Done!" << endl;return 0;}else{cout << "Next enter the handicap of struct golf: ";cin >> hc;setgolf(g, name, hc);cin.get();     //读取换行符,否则遇见下次getline会读取换行符认为是一个空行return 1;}
}void handicap(golf& g, int hc)
{g.handicap = hc;
}void showgolf(const golf& g)
{cout << "The fullname is: " << g.fullname << endl;cout << "The handicap is: " << g.handicap << endl;
}//main.cpp
#include"golf.h"
#include<iostream>int main()
{golf ann;setgolf(ann, "Ann Birdfree", 24);showgolf(ann);golf andy;while (1){if (setgolf(andy))showgolf(andy);elsebreak;}handicap(andy, 1);showgolf(andy);return 0;
}

practice 2

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

#include<iostream>
#include<string>
using namespace std;void strcount(const string str);int main()
{string str;cout << "Enter a line: ";getline(cin, str);while (cin){strcount(str);cout << "Enter next line(empty line to quit): ";getline(cin, str);if (str == "")break;}cout << "Bye!" << endl;return 0;
}void strcount(const string str)
{static int total = 0;int count = 0;cout << "\"" << str << "\" contains ";for (int i = 0; str[i] != '\0'; i++)count++;total += count;cout << count << " characters\n";cout << total << " characters total\n";
}

practice 3

3. 下面是一个结构声明:

struct chaff

{

       char dross[20];

        int slag;

};

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

#include<iostream>
#include<cstring>
#include<new>struct chaff
{char dross[20];int slag;
};using namespace std;
void show(const chaff*, int n);int main()
{char* pc = new char[512];chaff* pchaff = new (pc)chaff[2];int i = 0;for (; i < 2; i++){cout << "Enter to give chaff a value: " << endl;cout << "Enter the dross: ";char str[20];cin.getline(str, 20);strcpy_s(pchaff[i].dross, str);cout << "Enter the slag: ";cin >> pchaff[i].slag;cin.get();}show(pchaff, i);return 0;
}void show(const chaff* ch, int n)
{for (int i = 0; i < n; i++){cout << "The dorss of chaff: " << ch[i].dross << endl;cout << "The slag of chaff: " << ch[i].slag << endl;}
}

practice 4

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

(……省略……)

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

#pragma once
//tou.hnamespace 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);
}//tou.cpp
#include"tou.h"
#include<iostream>using namespace std;
namespace SALES
{void setSales(Sales& s, const double ar[], int n){double total = 0;double max = ar[0];double min = ar[0];if (n < QUARTERS){for (int i = 0; i < n; i++)s.sales[i] = ar[i];for (int j = n; j < 4; j++)s.sales[j] = 0;}elsefor (int i = 0; i < QUARTERS; i++)s.sales[i] = ar[i];for (int i = 0; i < QUARTERS; i++){total += ar[i];if (ar[i] > max)max = ar[i];if (ar[i] < min)min = ar[i];}s.average = total / QUARTERS;s.max = max;s.min = min;}void setSales(Sales& s){cout << "Enter the sale of quarters: ";for (int i = 0; i < QUARTERS; i++)cin >> s.sales[i];double total = 0;double max = s.sales[0];double min = s.sales[0];for (int i = 0; i < QUARTERS; i++){s.sales[i] = s.sales[i];total += s.sales[i];if (s.sales[i] > max)max = s.sales[i];if (s.sales[i] < min)min = s.sales[i];}s.average = total / QUARTERS;s.max = max;s.min = min;cout << endl;}void showSales(const Sales& s){cout << "The sales of quarters are: ";for (int i = 0; i < QUARTERS; i++)cout << s.sales[i] << endl;cout << "The average of sales is: " << s.average << endl;cout << "The maximum of sales is: " << s.max << endl;cout << "The minimun of sales is: " << s.min << endl;cout << endl;}
}//main.cpp
#include"tou.h"
#include <iostream>using namespace std;
using namespace SALES;
int main()
{Sales s1, s2;double array[] = { 3333.3,2535.1,9532.5,1001.0,5231.0,5555.0 };setSales(s1, array, 4);showSales(s1);setSales(s2);showSales(s2);cin.get();//cin不读取空白字符,因此setSales中cin留下的换行符需要多一个cin.get()读取cin.get();setSales(s1, array, 3);showSales(s1);cin.get();setSales(s1, array, 2);showSales(s1);cin.get();return 0;
}

C++ Primer Plus 第九章答案 内存模型和名称空间相关推荐

  1. static在内存层面的作用_「C++ Primer plus 心得」9.内存模型和名称空间

    本章内容包括: 单独编译 存储持续性.作用域和链接性 定位new运算符 名称空间 C++ 为在内存中存储数据方面提供了多种选择.可以厅数据保留在内存中的时间长度(存储持续性)以及程序的哪一部分可以访问 ...

  2. 2020 我的C++的学习之路 第九章 内存模型与名称空间

    以C++ Primer Plus为参考书籍,自身归纳知识点,加深记忆. 内存模型与名称空间 存储持续性 作用域与链接 自动存储持续性 静态持续变量 静态持续性.外部链接性 静态持续性.内部链接性 静态 ...

  3. 《C++ Primer Plus》读书笔记之七—内存模型和名称空间

    第九章 内存模型和名称空间 1.不要将函数定义或者变量声明放到头文件中. 2.头文件常包含的内容:函数原型.使用#define或者const定义的常量.结构声明.类声明.模板声明.内联函数. 3.避免 ...

  4. C++ Primer Plus学习(九)——内存模型和名称空间

    内存模型和名称空间 单独编译 存储持续性.作用域和链接性 名称空间 单独编译 程序一般可以分为三部分: 头文件:包含结构声明和使用这些结构的函数的原型: 源代码文件:包含与结构有关的函数的代码: 源代 ...

  5. 【C++ Primer Plus】第9章 内存模型和名称空间

    9.1 多文件程序 一个文件(头文件)包含了用户定义类型的定义:另一个文件包含操纵用户定义类型的函数的代码.这两个文件组成了一个软件包,可用于各种程序中. 头文件中常包含的内容: 函数原型. 使用#d ...

  6. 【C++】C++PrimerPlus(第6版)中文版 第9章 内存模型和名称空间 编程练习 参考答案

    自己编写的参考答案,在VS2019中都可以编译通过,不是标准答案,也不是最优答案,仅供参考 1.下面是一个头文件 //golf.h – for pr9-1.cpp const int Len = 40 ...

  7. 第9章 内存模型和名称空间

    待定 本章内容:  单独编译  存储持续性.作用域和链接性  定位(placement)new运算符  名称空间 9.1 单独编译 9.2 存储持续性.作用域和链接性 9.2.4 静态持续性. ...

  8. C++(学习笔记)内存模型和名称空间

    文章目录 前言 一.单独编译 二.存储持续性.作用域.链接性 1.作用域和链接 2.静态持续变量 3.静态持续性.外部链接性 4.静态持续性.内部链接性 5.静态持续性.无链接性 6.const全局变 ...

  9. 《C++Primer》第九章-顺序容器-学习笔记(1)-顺序容器定义与操作

    <C++Primer>第九章-顺序容器-学习笔记(1) 文章目录 <C++Primer>第九章-顺序容器-学习笔记(1) 摘要 顺序容器的定义 容器元素的初始化 将一个容器初始 ...

最新文章

  1. matlab计算斜方差_Matlab求方差,均值,均方差,协方差的函数
  2. 敏捷与DevOps整合之道
  3. TypeScript里的完整函数定义语法
  4. 苹果手机扩容对手机好不好?
  5. tcp/ip协议初识
  6. 基于Angular5和WebAPI的增删改查(一)
  7. ssh-copy-id非22端口的使用方法
  8. 【迁移学习】算法之TrAdaBoost
  9. 物理计算机技术研究生就业前景,物理学就业前景
  10. 破解完全入门篇 第七章-寻找软件的注册码
  11. 计算机里另存桌面不见了,保存文件时桌面选项消失不见怎么办
  12. 程序员面试的注意事项(一):面试的流程
  13. 计算机的作业与程序,网络提交的计算机程序作业出现抄袭现象的对策探索
  14. Kata Container是什么?
  15. banne图怎么设计才会有更多的点击率
  16. 【2018年的最佳固态硬盘】最好的固态硬盘可以增强你的电脑
  17. 【IT女神勋章挑战赛名单公布】:看看谁获奖啦!
  18. 什么是敏捷开发,敏捷开发落地指南之迭代排期
  19. html图片水波浪,css 实现水波纹,波浪动画效果
  20. 测试过程中,遇到开发不认为是bug的bug,该怎么办

热门文章

  1. 假如生活欺骗了你 (普希金诗歌)
  2. mysql同城双活以及主从库方案
  3. 【iOS】Ineligible Devices || “无法下载应用程序”
  4. 【读论文】基于深度学习的铁路道岔转辙机故障诊断(2INTRO)
  5. 奥比3d 摄像头 android,Android系统下如何允许奥比中光3D传感摄像头USB设备访问
  6. Python爬虫面试简历 经验分析
  7. VDI桌面虚拟化和IDV桌面虚拟化你更倾向谁
  8. 精读《图解密码技术》——第十章 证书
  9. 七段数码显示管—设计报告,visio图,Multisim仿真
  10. Python多线程抓取网页图片地址