CPP_Basic_Code_P8.1-PP8.8.7

版权声明:本文虽为 贴墙上的咖啡 原创,未经允许仍可转载. https://blog.csdn.net/enochhugh/article/details/70340057

##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;
}

猜你喜欢

转载自blog.csdn.net/enochhugh/article/details/70340057
pp
8.1