第一题

注意到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 showgolf(const golf & g);

Golf.cpp

#include <iostream>
#include "golf.h"
#include <cstring>
#include <string> int i=0;
int main()
{
golf H;
golf kl[3];
setgolf(H,"whp",12);
showgolf(H);
while(i < 3&&setgolf(kl[i]))
{
setgolf(kl[i]);
showgolf(kl[i]);
i++; }
return 0;
} void setgolf(golf & g,const char * name,int hc)
{ strcpy(g.fullname, name);
g.handicap=hc;
} int setgolf(golf & g)
{
using namespace std;
cout<<"输入name和handcip"<<endl;
cin.getline(g.fullname,Len);
cout<<"输入name和handcip"<<endl;
cin>>g.handicap;
cin.get();
return 1; }
void showgolf(const golf & g)
{
using namespace std;
cout << "Here is the golf contents:\n";
cout << "Name: " << g.fullname<<endl;
cout << "Handicap: " << g.handicap << endl;
}

第二题:

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

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

第三题:

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

#include <iostream>
#include <new>
#include <string>
#include <cstring> using namespace std;
const int BUF=512; struct chaff
{
char dross[20];
int slag;
}; int main()
{ char buffer[BUF];
chaff *p1=new (buffer) chaff[3];
char * p2=new char [BUF];
chaff * p3=new(p2) chaff[3];
char dross[20]={0};
int slag=0,i=0;
while(i<3)
{
cout<<"请输入你的dross和slag"<<endl;
cin.getline(dross,20);
cout<<"请输入你的dross和slag"<<endl;
cin>>slag;
cin.ignore();
strcpy(p1[i].dross,dross);
strcpy(p3[i].dross,dross);
p1[i].slag=p3[i].slag=slag;
i++; }
i=0;
while(i<3)
{
cout<<p1[i].dross<<p1[i].slag<<endl;
cout<<p3[i].dross<<p3[i].slag<<endl;
i++;
}
}

内存模型和名称空间复习题(c++ prime plus )的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题

    一.复习题 2.using声明和using编译指令的区别 using声明: using std::cin; using std::cout; using std::endl; using编译指令:us ...

  10. python基础之函数对象,嵌套,名称空间和作用域

    函数对象: 函数是第一类对象的含义是函数可以被当作数据处理 函数可用于: def func(): print(‘func’) 1.引用  f = func  把内存地址赋值给f 2.当作参数传给一个函 ...

随机推荐

  1. 掌控安全学院SQL注入靶场-布尔盲注(一)

    靶场地址:http://inject2.lab.aqlab.cn/Pass-10/index.php?id=1 判断注入点: http://inject2.lab.aqlab.cn/Pass-10/i ...

  2. zookeeper在关闭服务时报could not find file /opt/module/zookeeper-3.5.10/zkData/zookeeper_server.pid

    遇到了个问题,zookeeper在执行 bin/zkServer.sh stop时 会报题目中的错误,我搜了一下博客,好像是因为第一次启动的不是zkServer.sh中的服务 我先 kill -9 加 ...

  3. word文件打开报错:abnormal program termination

    部分word文件打开后报错 处理方法 1.更改默认打印机 2.调整开机启动项 取消该项:cyberkI guard service的开机自启动 (赛博昆仑安全软件) 3.调整word的COM加载项

  4. usb 2.0的状态跳转图

  5. flink 版本

    从1.10.0开始,flink版本是一个分界线,所以如果用>1.10版本的特性,一些flink引用可以从1.10官网文档中查 后面版本中没有这些说明了. flink代码文档地址:https:// ...

  6. clickhouse不喜欢sql末尾分号

    今天用python连clickhouse查数据,sql语句末尾加了分号,始终报错 Code: 62, e.displayText() = DB::Exception: Syntax error 删掉分 ...

  7. ICPC2021 沈阳站

    B-Bitwise Exclusive-OR Sequence 牛客网 题意:对于\(n(n<=1*10^5)\)个数的序列,给定\(m(m<=2*10^5)\)个限制条件,每个限制条件形 ...

  8. ubuntu iptables 做为路由转发

    实现功能,本地服务器的号段的192.168.8.0/24,而做为路由器的机器有2个ip,192.168.8.x和另一个ip,而另一个ip可以访问 192.168.2.0/24号段, 为了让其它192. ...

  9. composer更新报错

    在用composer安装Yii2的扩展插件时,报错: [UnexpectedValueException] Could not parse version constraint <=2.*: I ...

  10. vue 使用 swiper vue-awesome-swiper

    文档地址 https://github.com/surmon-china/vue-awesome-swiper 演示地址 https://v1.github.surmon.me/vue-awesome ...