一、复习题

    

2.using声明和using编译指令的区别

using声明:  using std::cin;  using std::cout;  using std::endl;

using编译指令:using namespace std;

二、编程练习

    

头文件golf.h

const int Len = ;
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<string>
#include "golf.h"
//using std::cin;
//using std::cout;
//using std::endl;
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 << "Enter name:";
cin >> g.fullname;
if (g.fullname[] == '\0')
return ;
cout << "Enter handicap value: ";
while (!(cin >> g.handicap)) //如果输入错误
{
cin.clear();
cout << "请输入整数:";
}
while (cin.get() != '\n')
continue;
return ;
}
void handicap(golf &g, int hc) {
g.handicap = hc;
}
void showgolf(const golf &g) {
cout << "Golfer: " << g.fullname <<endl;
cout << "Handicap: " << g.handicap <<endl;
}

main.cpp

#include<iostream>
#include<string>
#include "golf.h"
using namespace std; const int Mems = ;
void main()
{
golf team[Mems];
cout << "输入 " << Mems << " 球队成员:\n";
int i;
for (i = ; i<Mems; i++)
if (setgolf(team[i]) == )
break;
cout << endl;
for (int j = ; j<i; j++)
showgolf(team[j]);
setgolf(team[], "Fred Norman", );
showgolf(team[]);
handicap(team[], );
showgolf(team[]);
system("pause");
}

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

修改前

#include<iostream>
using namespace std; const int Size=;
void strcount(const char *str){//const表示str指针不能修改指向的内容(不过可以指向另外一块内容)
static int total=;//static静态变量,首次初始化后,其值一直存在(即第二次调用strcount函数时,total的值不会再次初始化)
int count=;
cout<<"\""<<str<<"\" contains ";
while (*str++)//先判断*str是否为NULL,然后再str++
count++;
total+=count;
cout<<count<<" characters\n";
cout<<total<<" characters total!\n";
} void main() {
char in[Size];
char next;
cout<<"Enter a line:"<<endl;
cin.get(in,Size);//最多接收Size-1个字符+1个'\0'
while (cin) // ==while(!cin.fail()),即读入流成功
{
cin.get(next);
while(next!='\n') //若next不是换行符
cin.get(next);
strcount(in);
cout<<"Enter next line (empty line to quit):\n";
cin.get(in,Size);
}
cout<<"Bye!"<<endl;
system("pause");
}

修改后

#include<iostream>
#include<string>
using namespace std; void strcount(const string &str){
static int total=;//static静态变量,首次初始化后,其值一直存在(即第二次调用strcount函数时,total的值不会再次初始化)
int count=str.length();
cout<<"\""<<str<<"\" contains ";
total+=count;
cout<<count<<" characters\n";
cout<<total<<" characters total!\n";
} void main() {
string input;
cout<<"Enter a line:"<<endl;
getline(cin,input);
while (""!=input)
{
strcount(input);
cout<<"Enter next line (empty line to quit):\n";
getline(cin, input);
}
cout<<"Bye!"<<endl;
system("pause");
}

3.下面是一个结构声明

#include<iostream>
#include<cstring>
using namespace std; const int BUF = ;
const int N = ;
char buffer[BUF];
struct chaff
{
char dross[];
int slag;
}; void main()
{
//使用静态数组作为缓冲区
chaff *cf = new(buffer)chaff[N]; //定位new运算符:将数组cf放在了数组buffer中
for (int i = ; i < N; i ++)
{
cout << "Please enter dross: ";
char dross[];
cin.getline(dross,);
strcpy_s(cf[i].dross, dross);
cout << "Please enter slag:";
cin >> cf[i].slag;
cin.get();
}
for (int i = ; i < N; i++)
cout << cf[i].dross << " : " << cf[i].slag << endl; //使用动态数组作为缓冲区
char* buffer2 = new char[BUF];
chaff* cf2 = new(buffer2)chaff[N];
for (int i = ; i < N; i++)
{
cout << "Please enter dross: ";
char dross[];
cin.getline(dross, );
strcpy_s(cf2[i].dross, dross);
cout << "Please enter slag:";
cin >> cf2[i].slag;
cin.get();
}
for (int i = ; i < N; i++)
cout << cf2[i].dross << " : " << cf2[i].slag << endl;
cf2 = NULL;//把这个置为空指针
delete[] buffer2;//把缓冲区删除了 system("pause");
}

sale.h头文件

namespace SALES
{
const int QUARTERS = ;
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);
}

sale.cpp函数定义

#include <iostream>
#include "sale.h"
using namespace std; void SALES::setSales(Sales & s, const double ar[], int n)//使用命名空间SALES后就可不必添加SALES::
{
double total = ;
for (int i = ; i < QUARTERS; i++)
{
if (i >= n)
s.sales[i] = ;
else
s.sales[i] = ar[i];
if (i == )
{
s.max = s.sales[i];
s.min = s.sales[i];
}
else
{
if (s.sales[i] > s.max)
s.max = s.sales[i];
if (s.sales[i] < s.min)
s.min = s.sales[i];
}
total += s.sales[i];
}
s.average = total / QUARTERS;
} void SALES::setSales(Sales & s)
{
double d[QUARTERS];
for (int i = ; i < QUARTERS; i++)
{
cout << "Enter the sales:";
cin >> d[i];
}
setSales(s, d, QUARTERS);
} void SALES::showSales(const Sales& s)
{
cout << "Sales:";
for (int i = ; i < QUARTERS; i++)
{
cout << s.sales[i];
cout << "\t\t";
}
cout << "\nMin:" << s.min << " \tMax:" << s.max << " \taverage:" << s.average << endl;
}

main.cpp主函数

#include<iostream>
#include "sale.h"
using namespace std; void main() {
double d[] = { 123.3, , 342.333, };
SALES::Sales s1, s2;
setSales(s1, d, );
setSales(s2);
showSales(s1);
showSales(s2);
system("pause");
}

[C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题的更多相关文章

  1. C++ primer plus读书笔记——第9章 内存模型和名称空间

    第9章 内存模型和名称空间 1. 头文件常包含的内容: 函数原型. 使用#define或const定义的符号常量. 结构声明. 类声明. 模板声明. 内联函数. 2. 如果文件名被包含在尖括号中,则C ...

  2. 《C++ Primer Plus》第9章 内存模型和名称空间 学习笔记

    C++鼓励程序员在开发程序时使用多个文件.一种有效的组织策略是,使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型,并将函数定义放在一个独立的源代码文件中.头文件和源代码文件一起定义和实现了用 ...

  3. 《C++ Primer Plus 6th》读书笔记 - 第九章 内存模型和名称空间

    1. 单独编译 1.1 头文件中常包含的内容: 函数原型 使用#define或const定义的符号常量 结构声明 类声明 模板声明 内联声明 1.2 只需将源代码文件加入到项目中,而不用加入头文件.这 ...

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

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

  5. [C++ Primer Plus] 第9章、内存模型和名称空间(一)程序清单

    程序清单9.9(静态存储连续性.无链接性) #include<iostream> using namespace std; ; void strcount(const char *str) ...

  6. (8)C++ 内存模型与名称空间

    一.单独编译 头文件 不要将函数定义或者变量声明放到头文件中,引入多个文件时可能会造成同一个函数定义多次 引入头文件 #include "文件名" File1.h #ifndef ...

  7. C++ Primer Plus读书笔记(九)内存模型和名称空间

    1.作用域和链接 int num3; static int num4; int main() { } void func1() { static int num1; int num2; } 上边的代码 ...

  8. C++学习 内存模型和名称空间

    1.单独编译 C++鼓励程序员将组件函数放在独立的文件中,如果只修改了一个文件,则可以只重新编译该文件,然后将它与其他文件的编译版本链接. 一般非常有用的组织程序的策略是把程序分成三部分: 头文件:包 ...

  9. Java内存模型解惑--观深入理解Java内存模型系列文章有感(二)

    1.volatile关键字修饰的域的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用 ...

随机推荐

  1. centos安装make

    CentOS 中无法使用make,make install 命令 提示错误:make: command not found make是gcc的编译器,一定要安装 1.安装: yum -y instal ...

  2. 关于python字符串基本操作

    python字符串基本操作,比如字符串的替换.删除.截取.复制.连接.分割等.都是一些关于字符串的一些方法.下面来列举一些,相信对学习python还是有些帮助的. 1.去除空格--strp(): &g ...

  3. linux /proc/sys/vm/中各个文件含义

    1)      /proc/sys/vm/block_dump该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作. 缺省设置:0,禁用Block Debu ...

  4. 【Mac】-NO.161.Mac.1 -【MacOS Error running 'Tomcat 8.5.371': Cannot run program Permission denied】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  5. 浅析MySQL InnoDB的隔离级别

    MySQL InnoDB存储引擎中事务的隔离级别有哪些?对应隔离级别的实现机制是什么? 本文就将对上面这两个问题进行解答,分析事务的隔离级别以及相关锁机制. 隔离性简介 隔离性主要是指数据库系统提供一 ...

  6. Cpython解释器GIL-多线程执行流程

  7. 读C#图解教程的笔记

    第一章记录: 格式化字符串 Console.WriteLine("{0:D}", 123456789);//表示十进制字符串 Console.WriteLine("{0: ...

  8. NetBeans远程调试Linux c++ 11项目

    NetBeans远程调试Linux c++ 11项目 由于好多原因,好久没有写博客了,随着c++ 11的普及率越来越高,开发c++ 项目的人也越来越多,可以说c++ 11 给了c++ 这门语言第二次生 ...

  9. [BZ4923][Lydsy1706月赛]K小值查询

    K小值查询 题面 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. Input ...

  10. Jenkins官方社区携手灵雀云成功举办Jenkins Meetup

    10月27日,由 Jenkins 官方社区和灵雀云主办的 Jenkins 插件开发 Meetup 在北京中科曙光大厦成功举办.这是Hacktoberfest(即 Hack October Festiv ...