吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7060|回复: 46
收起左侧

[其他转载] C++学习日记(第八章)

  [复制链接]
SstudentT 发表于 2015-3-8 14:40
本帖最后由 SstudentT 于 2015-4-9 18:54 编辑

为了坚持把C++Primer书中的练习敲出来故写下这帖子。
现在看的C++书比较坑:The C++ PL还有C++ Primer,都是英文版的。
还有就是对于帖子的更新,就是写上英文题目和实现的代码!
要是看见我的回复代码老是变,说明我一直在修改代码。
先从第八章开始,前面的应该会补上。更新应该是等我看完一章然后统一实现课后习题。毕竟整体把握比较好。
附件是我从git上下下来的代码(目前就这个算是标准解答了)
/*
8.1 Write a function that takes and returns an istream&. The function
should read the stream until it hits end-of-files. The function should print what it reads
to the stdndard output. Reset the stream so that it is valid before returning the stream.
*/

/*
8.2 Test your function by calling it,passing cin as argument.
*/
[C++] 纯文本查看 复制代码
#include <iostream>
using std::istream;
istream &func(istream&is)
{
    std::string str;
    is>>str;
    std::cout<<str<<std::endl;;
    is.clear();
    return is;
}
int main()
{
    istream &is=func(std::cin);
    std::cout<<is.rdstate()<<std::endl;
    return 0;
}


/*
8.3 What causes the following while to terminate?
while(cin>>i)
*/
Answer:
The while candition checks the state of the stream return from the >> expression.

strm::badbit           value used to indicate that a stream is corrupted.
strm::failbit            value used to indicate that an IO operation failed.
strm::eofbit           value used to indicate that a stream hit end-of-file.

If one or more of them is setted.Than the while terminate.

Cpp-Primer-master.zip

497.36 KB, 下载次数: 1, 下载积分: 吾爱币 -1 CB

git上标准的课后解答源码

免费评分

参与人数 1热心值 +1 收起 理由
忘掉过去 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| SstudentT 发表于 2015-3-22 19:50
断了一周,这一周看第七章,看的好费劲,练习敲得也不是很顺手。。。

8.6  Rewite the bookstore program from 7.1.1(p.256) to read its transactions  from a file. Pass the name of the file as an arguement to main().下面是我照着课本改装的,第一次感觉看着这么顺啊!哈哈哈!
[C++] 纯文本查看 复制代码
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include "Sales_item.h"
int main(int argc,char *argv[])
{
    using namespace std;
    ifstream readf(argv[1]);
    if(!readf)
        return 1;
    string line,word;
    getline(readf,line);
    istringstream readl(line);
    Sales_item total;
    if(readl>>total)
    {
        Sales_item trans;
        getline(readf,line);
        do{
        istringstream  reads(line);
        reads>>trans;
            if(total.isbn()==trans.isbn())
                total+=trans;
            else{
                cout<<total<<endl;
                total=trans;
            }
        }while(getline(readf,line) );
        cout<<total<<endl;
    }else{
    cerr<<"No data?!"<<endl;
    return -1;
    }
    readf.close();
    return 0;
}


这是自带的头文件,有点长。。。

[C++] 纯文本查看 复制代码
/*
 * This file contains code from "C++ Primer, Fifth Edition", by Stanley B.
 * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the
 * copyright and warranty notices given in that book:
 * 
 * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."
 * 
 * 
 * "The authors and publisher have taken care in the preparation of this book,
 * but make no expressed or implied warranty of any kind and assume no
 * responsibility for errors or omissions. No liability is assumed for
 * incidental or consequential damages in connection with or arising out of the
 * use of the information or programs contained herein."
 * 
 * Permission is granted for this code to be used for educational purposes in
 * association with the book, given proper citation if and when posted or
 * reproduced.Any commercial use of this code requires the explicit written
 * permission of the publisher, Addison-Wesley Professional, a division of
 * Pearson Education, Inc. Send your request for permission, stating clearly
 * what code you would like to use, and in what specific way, to the following
 * address: 
 * 
 *     Pearson Education, Inc.
 *     Rights and Permissions Department
 *     One Lake Street
 *     Upper Saddle River, NJ  07458
 *     Fax: (201) 236-3290
*/ 

/* This file defines the Sales_item class used in chapter 1.
 * The code used in this file will be explained in
 * Chapter 7 (Classes) and Chapter 14 (Overloaded Operators)
 * Readers shouldn't try to understand the code in this file
 * until they have read those chapters.
*/

#ifndef SALESITEM_H
// we're here only if SALESITEM_H has not yet been defined 
#define SALESITEM_H

// Definition of Sales_item class and related functions goes here
#include <iostream>
#include <string>

class Sales_item {
// these declarations are explained section 7.2.1, p. 270 
// and in chapter 14, pages 557, 558, 561
friend std::istream& operator>>(std::istream&, Sales_item&);
friend std::ostream& operator<<(std::ostream&, const Sales_item&);
friend bool operator<(const Sales_item&, const Sales_item&);
friend bool 
operator==(const Sales_item&, const Sales_item&);
public:
    // constructors are explained in section 7.1.4, pages 262 - 265
    // default constructor needed to initialize members of built-in type
    Sales_item() = default;
    Sales_item(const std::string &book): bookNo(book) { }
    Sales_item(std::istream &is) { is >> *this; }
public:
    // operations on Sales_item objects
    // member binary operator: left-hand operand bound to implicit this pointer
    Sales_item& operator+=(const Sales_item&);
    
    // operations on Sales_item objects
    std::string isbn() const { return bookNo; }
    double avg_price() const;
// private members as before
private:
    std::string bookNo;      // implicitly initialized to the empty string
    unsigned units_sold = 0; // explicitly initialized
    double revenue = 0.0;
};

// used in chapter 10
inline
bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) 
{ return lhs.isbn() == rhs.isbn(); }

// nonmember binary operator: must declare a parameter for each operand
Sales_item operator+(const Sales_item&, const Sales_item&);

inline bool 
operator==(const Sales_item &lhs, const Sales_item &rhs)
{
    // must be made a friend of Sales_item
    return lhs.units_sold == rhs.units_sold &&
           lhs.revenue == rhs.revenue &&
           lhs.isbn() == rhs.isbn();
}

inline bool 
operator!=(const Sales_item &lhs, const Sales_item &rhs)
{
    return !(lhs == rhs); // != defined in terms of operator==
}

// assumes that both objects refer to the same ISBN
Sales_item& Sales_item::operator+=(const Sales_item& rhs) 
{
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue; 
    return *this;
}

// assumes that both objects refer to the same ISBN
Sales_item 
operator+(const Sales_item& lhs, const Sales_item& rhs) 
{
    Sales_item ret(lhs);  // copy (|lhs|) into a local object that we'll return
    ret += rhs;           // add in the contents of (|rhs|) 
    return ret;           // return (|ret|) by value
}

std::istream& 
operator>>(std::istream& in, Sales_item& s)
{
    double price;
    in >> s.bookNo >> s.units_sold >> price;
    // check that the inputs succeeded
    if (in)
        s.revenue = s.units_sold * price;
    else 
        s = Sales_item();  // input failed: reset object to default state
    return in;
}

std::ostream& 
operator<<(std::ostream& out, const Sales_item& s)
{
    out << s.isbn() << " " << s.units_sold << " "
        << s.revenue << " " << s.avg_price();
    return out;
}

double Sales_item::avg_price() const
{
    if (units_sold) 
        return revenue/units_sold; 
    else 
        return 0;
}
#endif



注意,如果你的编译器生成的.exe程序在xxxxxx目录下,那么,你必须把要打开的.txt文件放在同一个目录才能用cmd来调用。
举例:
生成的.exe  在D:\CodeBlocks\myproject\C++Primer\exercise8.6\bin\Debug这个目录里面
那么你要操作的.txt        也要在D:\CodeBlocks\myproject\C++Primer\exercise8.6\bin\Debug目录里面
用cmd 操作的时候输入:
D:           回车(发现切到了D盘)
cd   D:\CodeBlocks\myproject\C++Primer\exercise8.6\bin\Debug    回车(切到了生成的.exe程序的目录)

接着输入你生成的.exe文件全名     以及  要操作的文件全名  我的是这样:
exercise8.6.exe 123.txt       回车(搞定!!!)
 楼主| SstudentT 发表于 2015-4-3 19:04
本帖最后由 SstudentT 于 2015-4-3 19:14 编辑

8.11   The program in this section defined its istringstream object inside the outer while loop.What changes would need to make if record  were defined outside the loop?
Rewrite the program,moving the definition of record outside the while, and see whether you thought of all the changes that are needed.


The program this exercise refer is in the book p322. I am a lazy man. So I  copy the program from the git。。。I beg your forgive.

When I saw this question, I remember the Table in the p321:

sstream     strm;                     strm is an unbound stringstream .
sstream     strm(s);                 strm is an sstream holds a copy of the string s. This constructor is explicit.
strm.str();                             Return a copy of the string that strm holds.
strm.str(S);                           Copies the string s into strm. Return void.

How useful it is! The second  and fourth messages in the table tell me the actions the strm(s); and strm.str(s); done. If we don't clear the content strm holds before, the statement strm.str(s) don't  execute what we want.
[C++] 纯文本查看 复制代码
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using std::vector; using std::string; using std::cin; using std::istringstream;

struct PersonInfo {
    string name;
    vector<string> phones;
};

int main()
{
    string line, word;
    vector<PersonInfo> people;
    istringstream record;
    while (getline(cin, line))
    {
        PersonInfo info;
        record.clear();
        record.str(line);
        record >> info.name;
        while (record >> word)
            info.phones.push_back(word);
        people.push_back(info);
    }

    for (auto &p : people)
    {
        std::cout << p.name << " ";
        for (auto &s : p.phones)
            std::cout << s << " ";
        std::cout << std::endl;
    }

    return 0;
}

触类旁通CDC 发表于 2015-3-8 14:53
 楼主| SstudentT 发表于 2015-3-8 14:56
D:\383.jpg
 楼主| SstudentT 发表于 2015-3-8 15:06
本来想发个书的图片,没想到太大了上传不了,算了,上面那个是错误的尝试留下的后遗症。。。
青稚 发表于 2015-3-8 15:10
C++的 好远啊 还没学习到
kinaha 发表于 2015-3-8 19:39
支持一下,棒棒哒!
 楼主| SstudentT 发表于 2015-3-12 13:45
最近功课紧,晚上等我发第二贴!
刃夜 发表于 2015-3-13 11:27
我还在C中学习  希望尽快能学到C++
smartway 发表于 2015-3-13 12:36
支持楼主的日志,和我们这些新人一起学习,一起进步
 楼主| SstudentT 发表于 2015-3-13 12:49
smartway 发表于 2015-3-13 12:36
支持楼主的日志,和我们这些新人一起学习,一起进步

我也是新人!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-1 00:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表