[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] == '\0') return 0; cout << "Enter handicap value: "; while (!(cin >> g.handicap)) //如果输入错误 { cin.clear(); cout << "请输入整数:"; } while (cin.get() != '\n') 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 << " 球队成员:\n"; 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\n"; cout<<total<<" characters total!\n"; } void main() { char in[Size]; char next; cout<<"Enter a line:"<<endl; cin.get(in,Size);//最多接收Size-1个字符+1个'\0' while (cin) // ==while(!cin.fail()),即读入流成功 { cin.get(next); while(next!='\n') //若next不是换行符 cin.get(next); strcount(in); cout<<"Enter next line (empty line to quit):\n"; 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\n"; cout<<total<<" characters total!\n"; } void main() { string input; cout<<"Enter a line:"<<endl; getline(cin,input); while (""!=input) { strcount(input); cout<<"Enter next line (empty line to quit):\n"; 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 << "\t\t"; } cout << "\nMin:" << s.min << " \tMax:" << s.max << " \taverage:" << 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"); }