美文网首页
CPP_Basic_Code_P8.1-PP8.8.7

CPP_Basic_Code_P8.1-PP8.8.7

作者: 贴墙上的咖啡 | 来源:发表于2017-04-21 22:29 被阅读0次

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

    相关文章

      网友评论

          本文标题:CPP_Basic_Code_P8.1-PP8.8.7

          本文链接:https://www.haomeiwen.com/subject/boejzttx.html