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