第一题

注意到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. Gitblit的windows安装(java编写)

    准备工作: 1.jdk(大于等于1.8版本)2.GitBlit压缩包:jdk下载地址:https://www.java.com/zh-CN/Gitblit下载地址:http://www.gitblit ...

  2. Linux上的I2C基础知识

    Linux上的I2C基础知识 什么是I2C I2C(Inter-Integrated Circuit,eye-squared-C),也称为 I2C 或 IIC,是一种同步.多控制器/多目标(主/从). ...

  3. qt creator 在ubuntu22.04下显示不正常处理

    打开:sudo vim /etc/gdm3/custom.conf 找到:#WaylandEnable=false 去掉注释,问题解决

  4. 生成虚拟mac地址通过dhcp获取ip,耗尽dhco地址池

    平台:kali 软件:dhcpstarv 命令 dhcpstarv  -i 网卡名称 -e 本机IP 查看dhcp服务器已经分发的地址 cat /tmp/dhcp.leases

  5. 配置Centos8网络绑定

    配置Centos8网络绑定 原理: 在物理网卡两块之上创建一块虚拟主卡, 逻辑上是一主双从, 按不同的模式负载运行,常用模式如主备或并行提供双倍带宽等.模式:   可选参数"mode=act ...

  6. everything 基本功能是本地搜索 高级功能 可以建立 HTTP服务器

    局域网,可以查看,播放,等操作

  7. python retry装饰器

    from functools import wraps import time # def retry(retry_time, retry_on_result, time_wait): # def t ...

  8. mapper动态代理

    Dao接口的实现类仅仅是通过sqlsession的相关api定位到映射文件mapper中的相应id的sql语句,真正对DB进行操作的工作是由框架通过mapper中的sql完成的. mybatis框架抛 ...

  9. 阿里云部署OSS对接TP项目

    1.配置文件写入参数 domain为阿里云oss存储实例要绑定的域名 2.获取accesskeyId和secret 注册用户 出现下图,选择"开始使用子用户Access Key" ...

  10. docker镜像原理(一)

    在理解什么是docker镜像之前我们需要搞懂虚拟机系统到底是怎么组成的如何实现的,docker中又是如何安装和使用虚拟机系统的,怎样可以高效灵活的切换系统发行版等问题 一.centos7系统长什么样 ...