CPP_Basic_Code_P8.1-PP8.8.7
来源:互联网 发布:c语言随机数生成 编辑:程序博客网 时间:2024/05/14 03:49
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);//字面值的字符串务必使用constint 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;}
0 0
- CPP_Basic_Code_P8.1-PP8.8.7
- pp8.3 column
- 8.7.1 Constants & 8.7.2 Fields
- 8.7.1 旋转和坐标系
- Debian-8.7.1 系统安装
- 8.7
- 8.7
- 8.7
- Pebrowse Professional Interactive V 8.7.1
- 8.7.1 makefile实例——项目中的总makefile
- CentOS6.5 Django1.8.7之安装篇(1)
- Win8.1+VS2010环境下Qt4.8.7编译
- 8.7 Classes
- 8.6 8.7
- 习题8.7
- 8.7 总结
- 8.7总结
- cpp 8.7
- POJ 1276 Cash Machine
- Properties&JavaBean
- Python 2.7视频安装
- Stage 3D:结缘、性能对比及相关开发框架推荐
- 最长上升子序列
- CPP_Basic_Code_P8.1-PP8.8.7
- Qt类内部有一个该类类型指针
- Selenium自动化测试框架的搭建 (转)
- linux基本语法7
- LintCode 把排序数组转换为高度最小的二叉搜索树
- Linux操作系统使用及linux常用命令
- dom4j
- 对JVM的理解
- HDU1257 最少拦截系统 —— LIS