CPP_Basic_Code_P8.1-PP8.8.7
// The Notes Created by Z-Tech on 2017/2/17.
// All Codes Boot on 《C++ Primer Plus》V6.0
// OS:MacOS 10.12.4
// Translater:clang/llvm8.0.0 &g++4.2.1
// Editer:iTerm 2&Sublime text 3
// IDE: Xcode8.2.1&Clion2017.1
//P8.1
#include <iostream>
inline double square(double x) {return x*x;}//注意内联函数结尾没有;
int main()
{
using namespace std;
double a,b;
double c=13.0;
a=square(5.0);
b=square(4.5+7.5);
cout<<"a= "<<a<<",b= "<<b<<"\n";
cout<<"c= "<<c;
cout<<",c square= "<<square(c++)<<"\n";
cout<<"Now c= "<<c<<"\n";
return 0;
}
//P8.2
#include <iostream>
int main()
{
using namespace std;
int rats=101;
int& rodents=rats;//引用rodents
cout<<"rats= "<<rats;
cout<<",rodents= "<<rodents<<endl;
rodents++;
cout<<"rats= "<<rats;
cout<<",rodents= "<<rodents<<endl;
cout<<"rats address= "<<&rats;
cout<<",rodents address= "<<&rodents<<endl;
return 0;
}
//P8.3
#include <iostream>
int main()
{
using namespace std;
int rats=101;
int& rodents=rats;//引用rodents
cout<<"rats= "<<rats;
cout<<",rodents= "<<rodents<<endl;
cout<<"rats address= "<<&rats;
cout<<",rodents address= "<<&rodents<<endl;
int bunnies=50;
rodents=bunnies;
cout<<"bunnies= "<<bunnies;
cout<<",rats= "<<rats;
cout<<",rodents= "<<rodents<<endl;
cout<<"bunnies address= "<<&bunnies;
cout<<",rodents address= "<<&rodents<<endl;
return 0;//应该通过初始化声明来引用,而不能通过赋值引用
}
//P8.4
#include <iostream>
void swapr(int& a,int& b);
void swapp(int* p,int* q);
void swapv(int a,int b);
int main()
{
using namespace std;
int wallet1=300;
int wallet2=360;
cout<<"wallet1= $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<endl;
cout<<"Using reference to swap contents:\n";
swapr(wallet1,wallet2);//引用法交换
cout<<"wallet1= $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<endl;
cout<<"Using pointer to swap contents:\n";
swapp(&wallet1,&wallet2);//指针法交换
cout<<"wallet1= $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<endl;
cout<<"Using R_value to swap contents:\n";
swapv(wallet1,wallet2);//实值法交换是无效的
cout<<"wallet1= $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<endl;
return 0;
}
void swapr(int& a,int& b)
{
int temp;
temp=b;
b=a;
a=temp;
}
void swapp(int* p,int* q)
{
int temp;
temp=*q;
*q=*p;
*p=temp;
}
void swapv(int a,int b)//此函数实际是无效的
{
int temp;
temp=b;
b=a;
a=temp;
}
//P8.5
#include <iostream>
double cube(double a);
double refcube(double &ra);//引用式参数
int main()
{
using namespace std;
double x=3.0;
cout<<cube(x);
cout<<" = cube of "<<x<<endl;
cout<<refcube(x);
cout<<" = cube of "<<x<<endl;
return 0;
}
double cube(double a)//副本而已,不会改变x的值
{
a*=a*a;
return a;
}
double refcube(double &ra)//引用会改变x的值
{
ra*=ra*ra;
return ra;
}
//P8.6
#include <iostream>
#include <string>
struct free_throws
{
std::string name;
int made;
int attempts;
float percent;
};
void display(const free_throws& ft);
void set_pc(free_throws& ft);
free_throws& accumulate(free_throws& target,const free_throws& source);
int main()
{
free_throws one {"Ifelsa Branch",13,14};
free_throws two {"Andor Knots",10,16};
free_throws three {"Minnie Max",7,9};
free_throws four {"Whily Looper",5,9};
free_throws five {"Long Long",6,14};
free_throws team {"Throwgoods",0,0};
free_throws dup;
set_pc(one);
display(one);
accumulate(team,one);
display(team);
display(accumulate(team,two));
accumulate(accumulate(team,three),four);
display(team);
dup=accumulate(team,five);
std::cout<<"Displaying team:\n";
display(team);
std::cout<<"Displaying dup after assignment:\n";
display(dup);
set_pc(four);
accumulate(dup,five)=four;//此类语句应该避免,最后dup仍为four
std::cout<<"Displaying dup after ill-advised assignment:\n";
display(dup);
return 0;
}
void display(const free_throws& ft)
{
using namespace std;
cout<<"Name: "<<ft.name<<'\n';
cout<<"Made: "<<ft.made<<'\t';
cout<<"Attempts: "<<ft.attempts<<'\t';
cout<<"Percent: "<<ft.percent<<'\n';
}
void set_pc(free_throws& ft)
{
if (ft.attempts!=0)
ft.percent=100.0f*float(ft.made)/float(ft.attempts);//强制类型转换
else
ft.percent=0;
}
free_throws& accumulate(free_throws& target,const free_throws& source)
{
target.attempts+=source.attempts;
target.made+=source.made;
set_pc(target);
return target;//返回引用
}
//P8.7
#include <iostream>
#include <string>//非必需
using namespace std;
string version1(const string& s1,const string& s2);
const string& version2(string& s1,const string& s2);//单边效应
const string& version3(string& s1,const string& s2);//糟糕的设计,虽clion中未崩溃
int main()
{
string input;
string copy;
string result;
cout<<"Enter a string: ";
getline(cin,input);
copy=input;
cout<<"Your string as entered: "<<input<<endl;
result=version1(input,"****");
cout<<"Your string enhanced: "<<result<<endl;
cout<<"Your original string: "<<input<<endl;
result=version2(input,"###");
cout<<"Your string enhanced: "<<result<<endl;
cout<<"Your original string: "<<input<<endl;
cout<<"Resetting original string.\n";
input=copy;
result=version3(input,"@@@");
cout<<"Your string enhanced: "<<result<<endl;
cout<<"Your original string: "<<input<<endl;
return 0;
}
string version1(const string& s1,const string& s2)
{
string temp;
temp=s2+s1+s2;
return temp;
}
const string& version2(string& s1,const string& s2)
{
s1=s2+s1+s2;
return s1;
}
const string& version3(string& s1,const string& s2)
{
string temp;
temp=s2+s1+s2;
return temp;//危险操作,返回即将被析构的temp!
}
//P8.8
#include <iostream>
#include <fstream>
//#include <cstdlib>//非必需
using namespace std;
void file_it(ostream& os,double fo,const double fe[],int n);
const int LIMIT=5;
int main()
{
ofstream fout;
const char* fn="ep-data.txt";//字面字符串赋值必需使用const
fout.open(fn);
if (!fout.is_open())//检测打开是否正常
{
cout<<"Can't open"<<fn<<".Bye.\n";
exit(EXIT_FAILURE);
}
double objective;
cout<<"Enter the focal length of your "
"telescope objective in mm: ";
cin>>objective;
double eps[LIMIT];
cout<<"Enter the focal length,in mm,of "<<LIMIT<<" eyepieces:\n";
for (int i=0;i<LIMIT;i++)
{
cout<<"Eyepiece #"<<i+1<<": ";
cin>>eps[i];
}
file_it(fout,objective,eps,LIMIT);
file_it(cout,objective,eps,LIMIT);
cout<<"Done.\n";
return 0;
}
void file_it(ostream& os,double fo,const double fe[],int n)
{
ios_base::fmtflags initial;//声明格式化存储信息initial,存储格式化设置
initial=os.setf(ios_base::fixed);//使用定点表示法模式
os.precision(0);//定点模式下有效,指定小数位数设置
os<<"Focal length of objective: "<<fo<<" mm\n";
os.setf(ios::showpoint);//显示小数点模式
os.precision(1);
os.width(12);//输出的字段宽度,此设置仅是一次性的
os<<"f.1. eyepiece";
os.width(15);
os<<"magnification"<<endl;
for (int i=0;i<n;i++)
{
os.width(12);
os<<fe[i];
os.width(15);
os<<int(fo/fe[i]+0.5)<<endl;
}
os.setf(initial);//恢复最初的格式化设置initial
}
//P8.9
#include <iostream>
const int ArSize=80;
char* left(const char*str,int n=1);
int main()
{
using namespace std;
char sample[ArSize];
cout<<"Enter a string:\n";
cin.get(sample,ArSize);
char* ps=left(sample,4);
cout<<ps<<endl;
delete [] ps;//删除new出的指针,地址已被赋予ps
ps=left(sample);
cout<<ps<<endl;
delete [] ps;
return 0;
}
char* left(const char*str,int n)//默认值添加到原型就足够,否则重复初始化
{
if (n<0)
n=0;
char* p=new char[n+1];//最后一位标记'\0'
int i;
for (i=0;i<n&&str[i];i++)//其中str[i]可确保未抵达数组字符串末尾前为true
p[i]=str[i];
while (i<=n)//为"假设要求5位,原字符串却只有4位设计"
p[i++]='\0';//将剩余的数组部分填充0
return p;
}
//P8.10
#include <iostream>
unsigned long left(unsigned long num, unsigned ct);
char* left(const char* str,int n=1);
int main()
{
using namespace std;
const char* trip="Hawaii!!";
unsigned long n=12345678;
int i;
char* temp;
for (i=1;i<10;i++)
{
cout<<left(n,i)<<endl;//函数重载1
temp=left(trip,i);//函数重载2,且赋值出temp是为了delete
cout<<temp<<endl;
delete [] temp;
}
return 0;
}
unsigned long left(unsigned long num, unsigned ct)
{
unsigned digits=1;
unsigned long n=num;
if (ct==0||num==0)
return 0;
while (n/=10)//测出输入总共有多少位
digits++;
if (digits>ct)
{
ct=digits-ct;
while (ct--)
num/=10;//删除ct位后就是所要的num
return num;
}
else
return num;
}
char* left(const char* str,int n)
{
if (n<0)
n=0;
char*p=new char[n+1];
int i;
for (i=0;i<n&&str[i];i++)
p[i]=str[i];
while (i<=n)//防止要求的位数比能提供的多
p[i++]='\0';
return p;
}
//P8.11
#include <iostream>
template <typename T>//or use <class T>
void Swap(T& a,T& b);//引用式模板交换函数
int main()
{
using namespace std;
int i=10;
int j=20;
cout<<"i,j= "<<i<<", "<<j<<".\n";
cout<<"Using compiler-generated int swapper:\n";
Swap(i,j);
cout<<"Now i,j= "<<i<<", "<<j<<".\n";
double x=24.5;
double y=81.7;
cout<<"x,y= "<<x<<", "<<y<<".\n";
cout<<"Using compiler-generated int swapper:\n";
Swap(x,y);
cout<<"Now x,y= "<<x<<", "<<y<<".\n";
return 0;
}
template <typename T>//定义前面也必须带这个模板声明
void Swap(T& a,T& b)
{
T temp;
temp=a;
a=b;
b=temp;
}
//P8.12
#include <iostream>
template <typename T>
void Swap(T& a,T& b);//指向引用
template <typename T>
void Swap(T* a,T* b,int n);//指向指针
void show(int a[]);
const int Lim=8;
int main()
{
using namespace std;
int i=10,j=20;
cout<<"i,j= "<<i<<", "<<j<<".\n";
cout<<"Using compiler-generated int swapper:\n";
Swap(i,j);
cout<<"Now i,j= "<<i<<", "<<j<<".\n";
int d1[Lim] {0,7,0,4,1,7,7,6};
int d2[Lim] {0,7,2,0,1,9,6,9};
cout<<"Original array:\n";
show(d1);
show(d2);
Swap(d1,d2,Lim);
cout<<"Swapped arrays:\n";
show(d1);
show(d2);
return 0;
}
template <typename T>
void Swap(T& a,T& b)
{
T temp;
temp=a;
a=b;
b=temp;
}
template <typename T>
void Swap(T* a,T* b,int n)
{
T temp;
for (int i=0;i<n;i++)
{
temp=a[i];
a[i]=b[i];
b[i]=temp;
}
}
void show(int a[])
{
using namespace std;
cout<<a[0]<<a[1]<<"/";
cout<<a[2]<<a[3]<<"/";
for (int i=4;i<Lim;i++)
cout<<a[i];
cout<<endl;
}
//P8.13
#include <iostream>
template <typename T>
void Swap(T& a,T& b);
struct job
{
char name[40];
double salary;
int floor;
};
template <> void Swap<job>(job& j1,job& j2);//显式具体化
void show(job& j);
int main()
{
using namespace std;
cout.precision(2);
cout.setf(ios::fixed,ios::floatfield);
int i=10,j=20;
cout<<"i,j= "<<i<<", "<<j<<".\n";
cout<<"Using compiler-generated int swapper:\n";
Swap(i,j);
cout<<"Now i,j= "<<i<<", "<<j<<".\n";
job sue {"Susan Yaffee",73000.60,7};
job sidney {"Sidney Taffee",78060.72,9};
cout<<"Before job swapping:\n";
show(sue);
show(sidney);
Swap(sue,sidney);//交换结构中的数值
cout<<"After job swapping:\n";
show(sue);
show(sidney);
return 0;
}
template <typename T>
void Swap(T& a,T& b)
{
T temp;
temp=a;
a=b;
b=temp;
}
template <> void Swap<job>(job& j1,job& j2)
{
double t1;
int t2;
t1=j1.salary;
j1.salary=j2.salary;
j2.salary=t1;
t2=j1.floor;
j1.floor=j2.floor;
j2.floor=t2;
}
void show(job& j)
{
using namespace std;
cout<<j.name<<": $"<<j.salary<<" on floor "<<j.floor<<endl;
}
//P8.14
#include <iostream>
template <typename T>
void ShowArray(T arr[],int n);//接收指针
template <typename T>
void ShowArray(T* arr[],int n);//接收指向指针的指针
struct debts
{
char name[50];
double amount;
};
int main()
{
using namespace std;
int thing[6] {13,31,103,301,310,130};
debts mr_E[3]
{
{"Ima Wolfe",2400.0},
{"Ura Foxe",1300.0},
{"Iby Stout",1800.0}
};
double* pd[3];//指针数组
for (int i=0;i<3;i++)
pd[i]=&mr_E[i].amount;//全部指向结构体中的double
cout<<"Listing Mr.E's counts of thing:\n";
ShowArray(thing,6);//thing是数组名,是一个指向第一个元素的指针
cout<<"Listing Mr.E's debts:\n";
ShowArray(pd,3);//pd是指针数组的数组名,是指向第一个指针的指针
return 0;
}
template <typename T>
void ShowArray(T arr[],int n)
{
using namespace std;
cout<<"template A\n";
for (int i=0;i<n;i++)
cout<<arr[i]<<' ';
cout<<endl;
}
template <typename T>
void ShowArray(T* arr[],int n)
{
using namespace std;
cout<<"template B\n";
for (int i=0;i<n;i++)
cout<<*arr[i]<<' ';//指针必须解除引用
cout<<endl;
}
//P8.15
#include <iostream>
template <class T>
T lesser(T a,T b)//返回值较小的那个
{
return a<b?a:b;
}
int lesser(int a,int b)//返回绝对值较小的那个
{
a=a<0?-a:a;
b=b<0?-b:b;
return a<b?a:b;
}
int main()
{
using namespace std;
int m=20;
int n=-30;
double x=15.5;
double y=25.9;
cout<<lesser(m,n)<<endl;//#2
cout<<lesser(x,y)<<endl;//#1
cout<<lesser<>(m,n)<<endl;//#1显式实例化,<>提示选择模板函数
cout<<lesser<int>(x,y)<<endl;//#1显式实例化,使用int代替T来执行实例化
//故此,会丢小数点
return 0;
}
//PP8.8.1
#include <iostream>
void show(const char* str,int n=0);
int main()
{
using namespace std;
const char* strr="Hello,word.\n";
show(strr);
int number;
cout<<"Enter a number: ";
cin>>number;
show(strr,number);
cout<<"Done.\n";
return 0;
}
void show(const char* str,int n)
{
using namespace std;
if (n<=0)
n=1;
for (int i=0;i<n;i++)
cout<<str;
}
//PP8.8.2
#include <iostream>
struct CandyBar
{
char Brandname[30];
double Weight;
int Calaries;
};
void fill_struct(CandyBar& strc,const char* nm="Millennium Munch",double wt=2.85,int clr=350);
void show_struct(CandyBar& strc);
int main()
{
using namespace std;
CandyBar* xv=new CandyBar;
cout<<"Please enter Brandname: ";
cin>>xv->Brandname;
cout<<"\nEnter Weight of product: ";
cin>>xv->Weight;
cout<<"\nEnter Calaries of product: ";
cin>>xv->Calaries;
show_struct(*xv);
fill_struct(*xv);
show_struct(*xv);
fill_struct(*xv,"快说你是不是傻",9.99,9999);
show_struct(*xv);
delete xv;
return 0;
}
void fill_struct(CandyBar& strc,const char* nm,double wt,int clr)
{
strcpy(strc.Brandname,nm);
strc.Weight=wt;
strc.Calaries=clr;
}
void show_struct(CandyBar& strc)
{
using namespace std;
cout<<"BrandName: "<<strc.Brandname<<endl;
cout<<"Weight: "<<strc.Weight<<endl;
cout<<"Calaries: "<<strc.Calaries<<endl;
}
//PP8.8.3
#include <iostream>
//#include <string>
//#include <cctype>
void fuct_up(std::string& str);
int main()
{
using namespace std;
string something;
cout<<"Enter a string (q to quit): ";
while (getline(cin,something)&&something!="q"&&something!="Q")
{
fuct_up(something);
cout<<something<<endl;
cout<<"Next string: (q to quit): ";
}
cout<<"\nBye!";
return 0;
}
void fuct_up(std::string& str)
{
long num=str.size();
for (int i=0;i<num;i++)
str[i]=toupper(str[i]);
}
//PP8.8.4
#include <iostream>
#include <cstring>
using namespace std;
struct stringy
{
char* str;
int ct;
};
void set(stringy& strct,char* str);
void show(const char* str,int num=1);
void show(const stringy& strct,int num=1);
int main()
{
stringy beany;
char testing[]="Reality isn't what it used to be.";
set(beany,testing);
show(beany);
show(beany,2);
testing[0]='D';//直接数组式操作调整字符串内容
testing[1]='u';
show(testing);
show(testing,3);
show("Done!");
delete beany.str;//释放内存
return 0;
}
void set(stringy& strct,char* str)
{
char* xvr=new char[strlen(str)+1];
strct.str=xvr;//使结构成员指向new出的指针
strcpy(strct.str,str);//复制字符串内容
strct.ct=strlen(str);
}
void show(const char* str,int num)
{
using namespace std;
for (int i=0;i<num;i++)
cout<<"Testing: "<<str<<endl;
}
void show(const stringy& strct,int num)
{
using namespace std;
for (int i=0;i<num;i++)
{
cout<<"String: "<<strct.str<<endl;
cout<<"String Length: "<<strct.ct<<endl;
}
}
//PP8.8.5&PP8.8.6
#include <iostream>
//#include <cstring>
template <typename T>
T maxn(T arry[],int n);
template <> const char* maxn(const char* arry[],int n);//字面值的字符串务必使用const
int main()
{
using namespace std;
int arr_int[6]{1,3,23,4,11,66};
double arr_db[4]{22.4,23.6,74.8,9.9};
cout<<"Now using maxn():\n";
cout<<"Array_int_Max: "<<maxn(arr_int,6)<<endl;
cout<<"Array_db_Max: "<<maxn(arr_db,4)<<endl;
const char* str_arry[5]{"Hello~","world!long~long~long!","Kitty~~","Love..","!Awesome!"};
//字面值的字符串务必使用const
cout<<"Max string: "<<maxn(str_arry,5)<<endl;
cout<<"Done.";
return 0;
}
template <typename T>
T maxn(T arry[],int n)
{
T Max=arry[0];
for (int i=0;i<n;i++)
{
if (Max<arry[i])
Max=arry[i];
}
return Max;
}
template <> const char* maxn(const char* arry[],int n)//具体化
{
const char* xv=arry[0];
for (int i=1;i<n;i++)
{
if (strlen(arry[i])>strlen(xv))
xv=arry[i];
}
return xv;//返回指针
}
//PP8.8.7
#include <iostream>
template <typename T>
void SumArray(T arr[],int n);//接收指针
template <typename T>
void SumArray(T* arr[],int n);//接收指向指针的指针
struct debts
{
char name[50];
double amount;
};
int main()
{
using namespace std;
int thing[6] {13,31,103,301,310,130};
debts mr_E[3]
{
{"Ima Wolfe",2400.0},
{"Ura Foxe",1300.0},
{"Iby Stout",1800.0}
};
double* pd[3];//指针数组
for (int i=0;i<3;i++)
pd[i]=&mr_E[i].amount;//全部指向结构体中的double
cout<<"Listing Mr.E's counts of thing:\n";
SumArray(thing,6);//thing是数组名,是一个指向第一个元素的指针
cout<<"Listing Mr.E's debts:\n";
SumArray(pd,3);//pd是指针数组的数组名,是指向第一个指针的指针
return 0;
}
template <typename T>
void SumArray(T arr[],int n)
{
using namespace std;
cout<<"Result_Sum: \n";
int count=0;
for (int i=0;i<n;i++)
count+=arr[i];
cout<<count<<endl;
}
template <typename T>
void SumArray(T* arr[],int n)
{
using namespace std;
cout<<"Result_Sum: \n";
int count=0;
for (int i=0;i<n;i++)
count+=*arr[i];//指针必须解除引用
cout<<count<<endl;
}