您的位置:首页 > 编程语言 > C语言/C++

《c++编程思想第2卷》第四章练习题4-15答案

2015-08-14 17:12 417 查看
最近在看c++编程思想第2卷,今天刚刚做完了第4章输入输出流的练习题,觉得第15题有点意思,特写到博文里,以便以后查阅和学习。

题目如下:(意思是解析文件,并按格式输出)

15.    Suppose you are given line-oriented data in a file formatted as follows:

//: C04:Exercise15.txt

Australia

5E56,7667230284,Langler,Tyson,31.2147,0.00042117361

2B97,7586701,Oneill,Zeke,553.429,0.0074673053156065

4D75,7907252710,Nickerson,Kelly,761.612,0.010276276

9F2,6882945012,Hartenbach,Neil,47.9637,0.0006471644

Austria

480F,7187262472,Oneill,Dee,264.012,0.00356226040013

1B65,4754732628,Haney,Kim,7.33843,0.000099015948475

DA1,1954960784,Pascente,Lester,56.5452,0.0007629529

3F18,1839715659,Elsea,Chelsy,801.901,0.010819887645

Belgium

BDF,5993489554,Oneill,Meredith,283.404,0.0038239127

5AC6,6612945602,Parisienne,Biff,557.74,0.0075254727

6AD,6477082,Pennington,Lizanne,31.0807,0.0004193544

4D0E,7861652688,Sisca,Francis,704.751,0.00950906238

Bahamas

37D8,6837424208,Parisienne,Samson,396.104,0.0053445

5E98,6384069,Willis,Pam,90.4257,0.00122009564059246

1462,1288616408,Stover,Hazal,583.939,0.007878970561

5FF3,8028775718,Stromstedt,Bunk,39.8712,0.000537974

1095,3737212,Stover,Denny,3.05387,0.000041205248883

7428,2019381883,Parisienne,Shane,363.272,0.00490155

///:~

 

The heading of each section is a region, and every line under that heading is a seller in that region. Each comma-separated field represents the data about each seller. The first field in a line is the SELLER_ID which unfortunately was written out in hexadecimal
format. The second is the PHONE_NUMBER (notice that some are missing area codes). LAST_NAME and FIRST_NAME then follow. TOTAL_SALES is the second to the last column. The last column is the decimal amount of the total sales that the seller represents for the
company. You are to format the data on the terminal window so that an executive can easily interpret the trends. Sample output is given below.

                          Australia

              ---------------------------------

 

*Last Name*  *First Name*   *ID*    *Phone*        *Sales*   *Percent*

 

Langler       Tyson          24150   766-723-0284     31.24   4.21E-02

Oneill        Zeke           11159   XXX-758-6701    553.43   7.47E-01

(etc.)

本人实现代码为:

/*
* 415.cpp
*
* Created on: Aug 14, 2015
* Author: zyl
*/
#include <fstream>
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
#include "../require.h"
using namespace std;

class Sales_man {
size_t id;
string last_name, first_name;
string phone;
double sales;
double percent;

public:
enum {NAME_LENGTH = 12, ID_LENGTH = 5, PHONE_LENGTH = 12,
SALES_LENGTH = 8, PERCENT_LENGTH = 7
};
friend ostream& operator<<(ostream& os, const Sales_man& sales_man);
friend istream& operator>>(istream& is, Sales_man& sales_man);
};

ostream& operator<<(ostream& os, const Sales_man& sales_man) {
char fillc = os.fill(' ');
streamsize prec = os.precision();
os << left << setw(Sales_man::NAME_LENGTH) << sales_man.last_name << " "
<< setw(Sales_man::NAME_LENGTH) << sales_man.first_name << " "
<< setw(Sales_man::ID_LENGTH) << sales_man.id << " "
<< setw(Sales_man::PHONE_LENGTH) << sales_man.phone << " "
<< right << setw(Sales_man::SALES_LENGTH) << setprecision(2) << sales_man.sales << " "
<< right << setw(Sales_man::PERCENT_LENGTH) << setprecision(2) << scientific << sales_man.percent
<< left;
os.fill(fillc);
os.precision(prec);
return os;
}

istream& operator>>(istream& is, Sales_man& sales_man) {
char comma;
is >> hex >> sales_man.id;
is >> comma;
char phone[255];
is.get(phone, sizeof(phone), ',');
// add '-' into phone
sales_man.phone = phone;
sales_man.phone.insert(3, "-");
sales_man.phone.insert(7, "-");
is >> comma;
char lastname[255];
is.get(lastname, sizeof(lastname), ',');
sales_man.last_name = lastname;
is >> comma;
is.get(lastname, sizeof(lastname), ',');
sales_man.first_name = lastname;
is >> comma;
is >> sales_man.sales;
is >> comma;
is >> sales_man.percent;
return is;
}

bool startsWith(const string&line, const string& start) {
size_t pos = line.find(start);
if (pos == 0) {
return true;
}
return false;
}

void printTitle(ostream& os) {
char fillc = os.fill(' ');
streamsize prec = os.precision();
os << left << setw(Sales_man::NAME_LENGTH) << "*Last Name*" <<" "
<< setw(Sales_man::NAME_LENGTH) << "*First Name*" <<" "
<< setw(Sales_man::ID_LENGTH) << "*ID*"<< " "
<< setw(Sales_man::PHONE_LENGTH) << "*Phone*" <<" "
<< right << setw(Sales_man::SALES_LENGTH) << "*Sales*" << " "
<< right << setw(Sales_man::PERCENT_LENGTH) << "*Percent*" <<" "
<< left;
os.fill(fillc);
os.precision(prec);
}

int main() {
ifstream ifs("Exercise15.txt");
assure(ifs);
string line;
while (getline(ifs, line)) {
// jump the comment line
if (startsWith(line, "//")) {
continue;
}

istringstream is(line);
size_t pos = line.find(",");
if (pos == string::npos) {
//it's country line
cout << " " << line << endl;
cout << " --------------------" << endl;
printTitle(cout);
cout << endl << endl;
} else {
Sales_man man;
is >> man;
cout << man << endl;
}
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息