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

  • 相关阅读:
    Spring 结合 Hibernate 配置 C3P0
    servlet直接调用spring的serivce方法
    http协议 web开发的应用 笔记
    一个让微软晕倒的中国人,绝对经典
    经典的上课插嘴
    教授说接吻
    在狼身上值得我们学习的十大处世哲学(经典)
    结婚前的暴强对话
    小笑话
    非一般的分手信
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7706403.html
Copyright © 2011-2022 走看看