c++第三章作业答案,c++第八章课后题答案
文章目录0 编译运行本章程序1 编写一个自我复制程序,该程序没有输入,在运行时复制一份自己的源代码,并将代码写入输入流。
0 编译运行本章程序头文件:
//
//由MacBook Pro于2020-03-09创建。
//
#ifndef ACM_TEST_H
#定义ACM _测试_H
#包括
#包括
#包括
#包括
//选择何时共享数据句柄
模板类T类Ptr{
公共:
Ptr():p(0),refptr(new size_t(1)){}
Ptr(T* t):p(t),refptr(new size_t(1)){}
Ptr(const Ptr h):p(h.p),ref Ptr(h . ref Ptr){ * ref Ptr;}
光电带读数机(photoelectric tape reader)运算符=(常量指针rhs){
* RHS。ref ptr
if( - *refptr==0){
删除(参考指针);
删除(p);
}
ref ptr=RHS。ref ptr
p=rhs.p
返回*这个
}
~Ptr()
if( - *refptr==0){
删除(参考指针);
删除(p);
}
}
运算符bool()常量{
返回p;
}
测试运算符*()常量{
如果(p){
return * p;
}
throw STD:runtime _ error( unbound Ref _ handle );
}
T*运算符-()常量{
如果(p){
返回p;
}
throw STD:runtime _ error( unbound Ref _ handle );
}
私人:
t * p;
STD:size _ t * ref ptr;
};
班级图片;
Pic_base类{
朋友标准:ostream运算符(标准:ostream,常量图片);
友类框架_图片
友类HCat _ Pic
友类VCat _ Pic;
友类字符串_图片
//没有公共接口
typedef STD:vector STD:string:size _ type ht _ SZ;//高
typedef STD:string:size _ type wd _ SZ;//宽
//抽象基类(纯虚拟性可以被继承)
虚拟wd _ SZ width()const=0;//纯虚函数,相等于隐式声明该类没有其相应的对象
虚拟ht _ SZ height()const=0;//编译器会禁止为这个类生成相应的对象
虚拟空的显示(std:ostream,ht_sz,bool)const=0;
受保护:
//这个函数不隶属于类的某个对象
//静态成员:减少定义全局函数或变量
//定义为静态函数,使得在其他地方也可以定义衬垫
静态空焊盘(std:ostream,wd_sz,wd _ SZ);
公共:
virtual ~Pic_base(){}
};
//公有接口类和操作
班级图片{
朋友标准:ostream运算符(标准:ostream,常量图片);
好友画框(常量图片);
好友图片hcat(常量图片,常量图片);
好友图片vcat(常量图片,常量图片);
公共:
图片(const STD:vector STD:string=STD:vector STD:string())。
//由于没有显示声明为明确的
//因此允许出现下面的语句
/*
向量vs;
图片p=vs
*/
私人:
ptr Pic _ base p;
图片(Pic_base* ptr):p(ptr){ }
};
//对画类型对象进行操作
画框(const图片);
图片hcat(常量图片,常量图片);
图片vcat(常量图片,常量图片);
标准:牡蛎运算符(std:ostream,const图片);
//图形数据
类String_Pic:public Pic_base{
好友画框(常量图片);
好友类图片;
标准:矢量标准:字符串数据;
string _ Pic(const STD:vector STD:string v):data(v){ }
ht _ SZ height()const {返回数据。size();}
wd _ SZ width()const;
空的显示(std:ostream,ht_sz,bool)const;
};
//加边框
类帧_图片:公共Pic_base{
好友画框(常量图片);
ptr Pic _ base p;
frame _ Pic(const Ptr Pic _ base Pic):p(Pic){ }
wd _ SZ width()const { return p-width()4;}
ht _ SZ height()const { return p-height()4;}
空的显示(std:ostream,ht_sz,bool)const;
};
//上下连接
VCat _图片类:公共Pic_base{
好友图片vcat(常量图片,常量图片);
Ptr Pic_base顶部、底部
VCat_Pic(常量指针Pic_base t,常量指针Pic_base b):
顶部(t),底部(b){}
wd_sz width() const{
return std:max(顶部宽度()、底部宽度());
}
ht_sz高度()常数{
返回top-height()bottom-height();
}
空的显示(std:ostream,ht_sz,bool)const;
};
HCat_Pic类:公共Pic_base{
好友图片hcat(常量图片,常量图片);
Ptr Pic_base左,右;
HCat_Pic(const Ptr Pic_base l,const Ptr Pic_base r):left(l),right(r){}
wd_sz width() const{
返回left-width()right-width();
}
ht_sz高度()常数{
return std:max(左高()、右高());
}
空的显示(std:ostream,ht_sz,bool)const;
};
#endif //ACM_TEST_H//
//由MacBook Pro于2020-01-13创建。
//
#ifndef ACM_Student_info
#定义ACM _学生信息
#包括
#包括
#包括
//结构学生信息{
//std:字符串名称;
//双期中,期末;
//std:矢量作业;
//
//STD:istream read(STD:istream
//double garde()const;
//};
班级学生信息{
公共:
学生信息();//构造一个空的学生信息对象
student _ info(STD:istream);//读一个流从而构造一个对象
bool vaild() const{ return!工作。empty();}//检查对象是否为空
双等级()常数
STD:istream read(STD:istream);
STD:string name()const { return n;}//存取器:容许对一部分数据结构的进行访问
私人:
STD:string n;
双期中考,期末考;
标准:向量双作业;
};
bool compare(const Student_info,const Student _ info);
STD:istream read _ HW(STD:istream,STD:vector double);
双等级(双、双、双);
double grade(double,double,const STD:vector double);
#endif测试程序:
#包括
#包括
#包括
#包括
#包括
#包括
#包含" test.h "
#include Student_info.h
#包含" h级"
使用STD:CIN;使用STD:endl;
使用STD:cout;
使用STD:ostream;
使用STD:string;
使用STD:vector;
使用STD:istream;
使用STD:domain _ error;
使用STD:sort;
void Pic _ base:pad(STD:ostream OS,wd_sz beg,wd_sz end){
而(求!=end){
OS
求;
}
}
Pic _ base:wd _ SZ String _ Pic:width()const {
pic _ base:wd _ SZ n=0;
for(Pic _ base:ht _ SZ I=0;我!=数据。size();i) {
n=std:max(n,data[i]).size());
}
返回n;
}
void String _ Pic:display(ostream OS,ht_sz row,bool do_pad) const {
wd _ SZ start=0;
//如果排没有超过范围,就输出第排行
如果(行高()){
骨数据[row];
start=data[row].size();
}
//如有必要,补齐输出各行
if(do_pad){
pad(os,start,width());
}
}
void Frame _ Pic:display(ostream OS,ht_sz row,bool do_pad) const {
if(row=height()){
//超出范围
if(do_pad){
pad(os,0,width());
}
}否则{
if(row==0 row==height() -1){
//最顶行或最低行
骨字符串(width(), * );
} else if(row==1 row==height()-2){
//在第二行或倒数第二行
OS " *
pad(os,1,width()-1);
OS " *
}否则{
//在内部图形
OS " *
p- display(os,row - 2,true);
OS " *
}
}
}
void VCat _ Pic:display(ostream OS,Pic_base:ht_sz row,bool do_pad) const {
wd _ SZ w=0;
if(row top- height()){
//处于上面的子图形中
top- display(os,row,do _ pad);
w=顶部宽度();
}else if(行高()){
//处于下面的子图形中
bottom- display(os,row - top- height(),do _ pad);
w=底部宽度();
}
if(do_pad){
pad(os,w,width());
}
}
void HCat _ Pic:display(ostream OS,Pic_base:ht_sz row,bool do_pad) const {
left- display(os,row,do _ pad row right-height());
右显示(os,row,do _ pad);
}
相框(固定图片){
返回新的Frame _ Pic(图片。p);
}
图像hcat(恒定图像我,恒定图像r){
返回新的HCat_Pic(l.p,r . p);
}
图像vcat(恒定图像t,恒定图像b){
返回新VCat_Pic(t.p,b . p);
}
Picture:Picture(const STD:vector STD:String v):p(new String _ Pic(v)){ }
牡蛎运算符(ostream os,const Picture图片){
const Pic _ base:ht _ SZ ht=picture。p-height();
for(Pic _ base:ht _ SZ I=0;我!=hti) {
picture.p- display(os,I,false);
os endl
}
返回OS;
}
//默认构造函数
学生信息:学生信息():期中(0),期末(0){ }
//带参构造函数
Student _ info:Student _ info(istream is){ read(is);}
//按照字母顺序排列学生
布尔比较(常量学生信息x,常量学生信息y){
返回x . name()y . name();
}
istream Student _ info:read(istream in){
期中期末考试;
读取硬件(在,作业);
返回;
}
istream read_hw(istream in,vector double hw){
如果(在){
硬件。clear();
双x;
而(在x中){
硬件。push _ back(x);
}
英寸clear();
}
返回;
}
双中值(向量双向量){
typedef vector double:size _ type vec _ SZ;
vec _ SZ size=vec。size();
if(size==0){
抛出domain_error(空向量的中值);
}
sort(vec.begin()、vec。end());
vec _ SZ mid=size/2;
返回大小% 2==0?(vec[mid]vec[mid-1])/2:vec[mid];
}
double Student _ info:grade()const {
//:使用这个名称的某一个版本,而所使用的这个版本不能称为任何事物的成员
返回:成绩(期中、期末、作业);
}
双倍分数(双倍期中,双倍期末,常数向量双倍硬件){
if(hw.size()==0)
抛出domain_error(学生没有做作业);
回报等级(期中、期末、中位数(HW));//如果家庭作业非空,则调用三年级
}//2级
双倍分数(期中双倍,期末双倍,硬件双倍){
返回期中* 0.2期末* 0.4硬件* 0.4
}
图片直方图(常量向量学生信息学生){
图片名称;
图片等级;
for(vector Student _ info:const _ iterator it=students。begin();它!=学生。end();它){
姓名=vcat(姓名,向量字符串(1,it-name());
grades=vcat(grades,vector string (1, string(it- grade()/5,=)));
}
返回hcat(姓名、成绩);
}
int main(int argc,char** argv){
矢量学生信息学生;
学生信息;
(斯莱德(cin)){
学生。_ back
}
排序(students.begin()、students.end()、compare);
标准输出帧(直方图(学生))endl
返回0;
}1 编写一个自我复制程序,该程序没有输入,在运行时复制一份自己的源代码,并将代码写入输入流。包含
int main(){ char * s= # include % cint main(){ char * s=% c % s % c;printf(第10,34,34节);返回0;};printf(第10,34,34节);返回0;}结果:(由于长度原因不能一次截图完整)
右边的部分
C版本:
#包括
#包括
使用命名空间标准
int main(){ string a= # include T # include T使用命名空间STD tint main(){ string a=;a[19]=a[37]=a[58]=10;couta[19]=a[37]=a[58]=10;cout a.substr(0,80)(char)34;a[19]=a[37]=a[58]=84;cout a(char)34a。substr(80);返回0;}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。