C++ Primer第一章 书店会保存所有销售记录的档案,,每条记录保存了某本书的一次销售的信息。每条记录包含三个数据项: ISBN:0-201-70353-X 册数:4 单价:24.99 书店老板需要查询此档案计算每本书的销量,销售额,平均售价。 准备工作: 为了完成程序我们需要:定义变量,输入输出,保存数据,检测ISBN是否相同,处理销售档案中的每条记录。 简单的C++程序 main函数是程序的入口 返回类型 函数名(形参1,...) { //函数体 return 返回值;//0表示程序运行成功非0返回值由系统定义。 } #include <iostream> int main() { std::cout << "hello,world." << std::endl; return 0; } VS下编译,进入命令行cd切换到源文件目录,cl -o outputname xxx.cpp在本目录下就会生成outputname.exe,运行屏幕上会输出hello,world. 输入echo %ERRORLEVEL%查看程序的返回值。 初始输入输出 C++是通过标准库来实现IO机制。iostream库包含两个基础类型istream和ostream表示输入和输出流 标准输入输出对象 cin,cout,cerr,clog.系统将程序所运行的窗口和这些对象关联起来。 使用IO的程序 #include <iostream> int main() { int v1 = 0,v2 = 0; std::cout << "Enter tow numbers:" << std::endl; std::cin >> v1 >> v2; std::cout << "The sum of " << v1 <<" and " << v2 <<" is "<< v1+v2 << std::endl; return 0; } <> ""表示搜索头文件的路径不同,尖括号是从系统目录搜索,双引号是从本地工程目录搜索。 std::cout<<是一个函数,函数的返回值是cout所以可以连起来写。endl是一个操纵符,写入endl的效果是结束当前行并将与设备关联的缓冲区中的内容刷到设备中。 C++有两种注释风格//单行注释和/**/多行注释。 标准库定义的所有名字都在命名空间std中。通过作用域运算符(::)指明我们想要使用定义在命名空间中的名字。 控制流 while语句 #include <iostream> int main() { int sum = 0,val = 1; while(val <= 10) { sum += val; val++; } std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl; return 0; } while (condition) { statement; } while会先检测condition是否为真,若为真则执行statement,然后继续检测。若为假则退出。 符合运算符 sum += val;等价于sum = sum + val; 前缀递增和后缀递增 ++i,i++ for(init-statement;condition;expression) { statement; } #include <iostream> int main() { int sum = 0; for(int i = 1; i <= 10; i++ ) { sum += i; } std::cout << "Sum of 1 to 10 is " << sum <<std::endl; return 0; } for循环初始化语句只被执行一次然后检测条件若为真则执行循环体再执行expression.再进行条件检测。 读取数量不定的输入数据 #include <iostream> int main() { int sum = 0,value = 0; while(std::cin >> value) { sum += value; } std::cout << "Sum is: " << sum << std::endl; return 0; return 0; } 本例中的循环条件是std::cin因此循环条件实际上检测的是std::cin其效果是是检测流的状态。如果流是有效的即流未遇到错误,检测成功.遇到文件结束符或遇到一个无效输入时istream对象的状态会变为无效。 语法错误 //main的参数列表漏掉了 int main({ //错误:endl后使用了冒号而非分号 std::cout << "Read eech file." << std::endl; //错误:字符串字面常量的两侧漏掉了引号 std::cout << Update master. << std::endl; //错误:漏掉了第二输出运算符 std::cout << "Write new master." std::endl; //错误:return语法漏掉了分号 return 0 } 类型错误(type error) C++中每个数据都有其类型 int a = "hello,world"; 声明错误(declaration error) C++程序中的每个名字都要先声明后使用。标准库的名字忘记使用std::,标识符名字拼写错误。 if语句 统计输入中每个值连续出现了多少次。 #include <iostream> int main() { //curVal正在统计的数 int curVal = 0,val = 0; if (std::cin >> curVal) { int cnt = 1; while (std::cin >> val) { if(curVal == val) { cnt++; } else { std::cout << curVal << " occurs " << cnt << " times"<<std::endl; curVal = val; cnt = 1; } } } } 类简介 我们通过定义一个类class来定义自己的数据结构。一个类定义了一个类型,以及与其关联的一组操作。类机制是C++最重要的特性之一。实际上,C++最初的一个设计焦点就是能定义使用上像内置类型一样自然的类类型(class type). //Sales_item.h class Sales_item { public: Sales_item(); Sales_item(string isbn,int nums,double price); Sales_item(const Sales_item& item); friend istream& operator>>(istream& in,Sales_item& item); friend ostream& operator<<(ostream& out,Sales_item& item); bool SameISBN(const Sales_item& rhs)const; Sales_item operator+(const Sales_item& item); Sales_item& operator+=(const Sales_item& item); double GetPrice(){ return m_price;} int GetNums(){ return m_nums;} ~Sales_item(); private: string m_isbn; int m_nums; double m_price; }; Sales_item::Sales_item() { } Sales_item::Sales_item(string isbn,int nums,double price): m_isbn(isbn),m_nums(nums),m_price(price) { } Sales_item::Sales_item(const Sales_item& item) { this->m_isbn = item.m_isbn; this->m_nums = item.m_nums; this->m_price = item.m_price; } bool Sales_item::SameISBN(const Sales_item& rhs)const { return this->m_isbn == rhs.m_isbn; } Sales_item Sales_item::operator+(const Sales_item& item) { double total = this->m_nums * this->m_price + item.m_nums * item.m_price; int totalNums = this->m_nums + item.m_nums; double avgPrice = total / totalNums; return Sales_item(this->m_isbn,totalNums,avgPrice); } Sales_item& Sales_item::operator+=(const Sales_item& item) { double total = this->m_nums * this->m_price + item.m_nums * item.m_price; this->m_nums = this->m_nums + item.m_nums; this->m_price = total / this->m_nums; return *this; } istream& operator>>(istream& in,Sales_item& item) { in >> item.m_isbn >> item.m_nums >> item.m_price; return in; } ostream& operator<<(ostream& out,Sales_item& item) { out << item.m_isbn << " " << item.m_nums << " " << item.m_price << endl; return out; } Sales_item::~Sales_item() { } //读取和输出Sales_items int _tmain(int argc, _TCHAR* argv[]) { //Sales_item item; //cin >> item; //cout << item; //Sales_item item1,item2; //cin >> item1 >> item2; //if(item1.SameISBN(item2)) //{ // cout << item1 + item2 <<endl; //} //else //{ // cerr << "Data must refer same ISBN" << endl; //} Sales_item total; if (cin >> total) { Sales_item curItem; while (cin >> curItem) { if (curItem.GetISBN() == total.GetISBN()) { total += curItem; } else { cout << total << endl; total = curItem; } } cout << total << endl;//打印最后一条的数据 } else { cerr << "No data ?" << endl; } return 0; } |
|
来自: dongtongtong > 《C Primer(第五版)》