zoukankan      html  css  js  c++  java
  • [C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题

    一、复习题

        

     2.using声明和using编译指令的区别

    using声明:  using std::cin;  using std::cout;  using std::endl;

    using编译指令:using namespace std;

    二、编程练习

        

       

     头文件golf.h

    const int Len = 40;
    struct golf {
        char fullname[Len];
        int handicap;
    };
    
    void setgolf(golf &g,const char * name,int hc);
    int setgolf(golf &g);
    void handicap(golf &g, int hc);
    void showgolf(const golf &g);

    golf.cpp

    #include<iostream>
    #include<string>
    #include "golf.h"
    //using std::cin;
    //using std::cout;
    //using std::endl;
    using namespace std;
    
    void setgolf(golf &g, const char * name, int hc) {
        strcpy_s(g.fullname, name);
        g.handicap = hc;
    }
    int setgolf(golf &g) {
        cout << "Enter name:";
        cin >> g.fullname;
        if (g.fullname[0] == '')
            return 0;
        cout << "Enter handicap value: ";
        while (!(cin >> g.handicap))    //如果输入错误
        {
            cin.clear();
            cout << "请输入整数:";
        }
        while (cin.get() != '
    ')
            continue;
        return 1;
    }
    void handicap(golf &g, int hc) {
        g.handicap = hc;
    }
    void showgolf(const golf &g) {
        cout << "Golfer: " << g.fullname <<endl;
        cout << "Handicap: " << g.handicap <<endl;
    }

    main.cpp

    #include<iostream>
    #include<string>
    #include "golf.h"
    using namespace std;
    
    const int Mems = 5;
    void main()
    {
        golf team[Mems];
        cout << "输入 " << Mems << " 球队成员:
    ";
        int i;
        for (i = 0; i<Mems; i++)
            if (setgolf(team[i]) == 0)
                break;
        cout << endl;
        for (int j = 0; j<i; j++)
            showgolf(team[j]);
        setgolf(team[0], "Fred Norman", 5);
        showgolf(team[0]);
        handicap(team[0], 4);
        showgolf(team[0]);
        system("pause");
    }

     2、修改程序清单9.9:用string对象代替字符数组.这样,该程序将不再需要检查输入的字符串是否过长,同时可以将输入字符串同字符串""进行比较,比判断是否为空行

     修改前

    #include<iostream>
    using namespace std;
    
    const int Size=10;
    void strcount(const char *str){//const表示str指针不能修改指向的内容(不过可以指向另外一块内容)
        static int total=0;//static静态变量,首次初始化后,其值一直存在(即第二次调用strcount函数时,total的值不会再次初始化)
        int count=0;
        cout<<"""<<str<<"" contains ";
        while (*str++)//先判断*str是否为NULL,然后再str++
            count++;
        total+=count;
        cout<<count<<" characters
    ";
        cout<<total<<" characters total!
    ";
    }
    
    void main() {
        char in[Size];
        char next;
        cout<<"Enter a line:"<<endl;
        cin.get(in,Size);//最多接收Size-1个字符+1个''
        while (cin)    // ==while(!cin.fail()),即读入流成功 
        {
            cin.get(next);
            while(next!='
    ')    //若next不是换行符
                cin.get(next);
            strcount(in);
            cout<<"Enter next line (empty line to quit):
    ";
            cin.get(in,Size);
        }
        cout<<"Bye!"<<endl;
        system("pause");
    }

    修改后

    #include<iostream>
    #include<string>
    using namespace std;
    
    void strcount(const string &str){
        static int total=0;//static静态变量,首次初始化后,其值一直存在(即第二次调用strcount函数时,total的值不会再次初始化)
        int count=str.length();
        cout<<"""<<str<<"" contains ";
        total+=count;
        cout<<count<<" characters
    ";
        cout<<total<<" characters total!
    ";
    }
    
    void main() {
        string input;
        cout<<"Enter a line:"<<endl;
        getline(cin,input);
        while (""!=input)    
        {
            strcount(input);
            cout<<"Enter next line (empty line to quit):
    ";
            getline(cin, input);  
        }
        cout<<"Bye!"<<endl;
        system("pause");
    }

    3.下面是一个结构声明

    #include<iostream>  
    #include<cstring>  
    using namespace std;
    
    const int BUF = 512;  
    const int N = 2;  
    char buffer[BUF];  
    struct chaff   
    {  
        char dross[20];  
        int slag;  
    };  
      
    void main()   
    {  
        //使用静态数组作为缓冲区  
        chaff *cf = new(buffer)chaff[N];  //定位new运算符:将数组cf放在了数组buffer中
        for (int i = 0; i < N; i ++)  
        {  
            cout << "Please enter dross: ";  
            char dross[20];  
            cin.getline(dross,20);  
            strcpy_s(cf[i].dross, dross);  
            cout << "Please enter slag:";  
            cin >> cf[i].slag;  
            cin.get();  
        }  
        for (int i = 0; i < N; i++)  
            cout << cf[i].dross << " : " << cf[i].slag << endl;  
          
        //使用动态数组作为缓冲区  
        char* buffer2 = new char[BUF];  
        chaff* cf2 = new(buffer2)chaff[N];  
        for (int i = 0; i < N; i++)  
        {  
            cout << "Please enter dross: ";  
            char dross[20];  
            cin.getline(dross, 20);  
            strcpy_s(cf2[i].dross, dross);  
            cout << "Please enter slag:";  
            cin >> cf2[i].slag;  
            cin.get();  
        }  
        for (int i = 0; i < N; i++)  
            cout << cf2[i].dross << " : " << cf2[i].slag << endl;  
        cf2 = NULL;//把这个置为空指针  
        delete[] buffer2;//把缓冲区删除了  
    
        system("pause");
    }   

     sale.h头文件

    namespace SALES
    {
        const int QUARTERS = 4;
        struct Sales
        {
            double sales[QUARTERS];
            double average;
            double max;
            double min;
        };
        void setSales(Sales & s, const double ar[], int n);
        void setSales(Sales & s);
        void showSales(const Sales& s);
    }

    sale.cpp函数定义

    #include <iostream>  
    #include "sale.h"  
    using namespace std;
    
    void SALES::setSales(Sales & s, const double ar[], int n)//使用命名空间SALES后就可不必添加SALES::
    {
        double total = 0;
        for (int i = 0; i < QUARTERS; i++)
        {
            if (i >= n)
                s.sales[i] = 0;
            else
                s.sales[i] = ar[i];
            if (i == 0)
            {
                s.max = s.sales[i];
                s.min = s.sales[i];
            }
            else
            {
                if (s.sales[i] > s.max)
                    s.max = s.sales[i];
                if (s.sales[i] < s.min)
                    s.min = s.sales[i];
            }
            total += s.sales[i];
        }
        s.average = total / QUARTERS;
    }
    
    void SALES::setSales(Sales & s)
    {
        double d[QUARTERS];
        for (int i = 0; i < QUARTERS; i++)
        {
            cout << "Enter the sales:";
            cin >> d[i];
        }
        setSales(s, d, QUARTERS);
    }
    
    void SALES::showSales(const Sales& s)
    {
        cout << "Sales:";
        for (int i = 0; i < QUARTERS; i++)
        {
            cout << s.sales[i];
            cout << "		";
        }
        cout << "
    Min:" << s.min << " 	Max:" << s.max << " 	average:" << s.average << endl;
    }

    main.cpp主函数

    #include<iostream>
    #include "sale.h"
    using namespace std;
    
    void main() {
        double d[4] = { 123.3, 323, 342.333, 8933 };
        SALES::Sales s1, s2;
        setSales(s1, d, 4);
        setSales(s2);
        showSales(s1);
        showSales(s2);
        system("pause");
    }

  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7706403.html
Copyright © 2011-2022 走看看