2018-03-11 c++感觉好难,加油加油,明年考研之前多学一点儿东西,
练习1.2:
返回值-1通常被当做程序错误的标识。
int main() { return -1; }
1.2 标准输入输出
iostream库包含了两个基础类型istream和ostream,分别代表输入流和输出流。流(stream)代表,随时间推移,字符是顺序生成或消耗的。
标准输入输出对象
标准库定义了4个IO对象。cin(标准输入)、cout(标准输出)、cerr(标准错误)、clog(输出程序运行时的一般性信息)
系统通常将程序所运行的窗口与这些对象关联起来。因此,当我们读取cin,数据将从程序正在运行的窗口读入,当我们向cout, cerr, clog写入数据时,将会写到同一个窗口。
一个使用IO库的程序: 计算两数之和
1 #include<iostream> 2 int main() 3 { 4 std::cout << "Enter two numbers:" << std::endl; 5 int v1 = 0, v2 = 0; 6 std::cin >> v1 >> v2; 7 std::cout << "The sum of " << v1 <<" and " << v2 8 << " is " << v1 + v2 << std::endl; 9 return 0; 10 }
#include<iostream>告诉我们使用iostream库,尖括号里的名字指出一个头文件,每个使用标准库的程序都必须包含相关的头文件。
向流写入数据
输出运算符("<<")
endl(操作符): 结束当前行,并与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内容中等待写入流。
使用标准库中的名字
前缀std::指出名字cout和endl是定义在名为std的命名空间(namespace)中的。命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。标准库定义的所有名字都在命名空间std中。
通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字十,必须显示说明我们想使用来自命名空间std中的名字。例如,需要写出std::cout,通过使用作用域运算符(::)来指出我们想使用cout.
从流读取数据
输入运算符(">>")
练习1.3:标准输出打印Hello, World
1 #include<iostream> 2 int main() 3 { 4 std::cout << "Hello, World"; 5 return 0; 6 }
练习1.4: 打印两个数相加
1 #include<iostream> 2 int main() 3 { 4 int v1 = 0, v2 = 0; 5 std::cout << "Please enter two numbers :"; 6 std::cin >> v1 >> v2; 7 std::cout << "v1 * v2 = " << v1 * v2; 8 return 0; 9 }
练习1.5: 将每个运算对象的打印操作放在一条独立的语句中
1 #include<iostream> 2 int main() 3 { 4 std::cout <<"I put a long sentences"; 5 std::cout <<"In too manys"; 6 std::cout <<"short sentences"; 7 return 0; 8 }
练习1.6:解释下面程序片段是否合法。
1 std::cout <<"The sum of " << v1; 2 <<" and " << v2; 3 << " is " << v1 + v2 << std::endl;
不合法。第二三条左侧输出运算符没有左侧对象。
改成:
1 std:: cout << "The sum of " << v1 << " and "<< v2 <<" is " <<v1 + v2 <<std::endl;
1.3 注释详解
跟c语言相同,不多说。
1.4 控制流
1.4.1 while语句
1 #include<iostream> 2 int main() 3 { 4 int sum = 0, val = 1; 5 //只要val的值小于等于10,while循环就会持续执行 6 while(val <= 10){ 7 sum += val; //将sum + val赋予sum 8 ++val; //将val加1 9 } 10 std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl; 11 return 0; 12 }
练习1.9 while循环50加到100
1 #include<iostream> 2 int main() 3 { 4 int sum = 0,num = 50; 5 while(num != 101) 6 { 7 sum += num; 8 num++; 9 } 10 std::cout << "The sum from 50 to 100 is " << sum; 11 return 0; 12 }
练习1.10 递减运算符打印0到10整数
1 #include<iostream> 2 int main() 3 { 4 for(int i = 10;i >= 0;i--) 5 { 6 std::cout << i << " "; 7 } 8 return 0; 9 }
练习1.11 输入两个整数,打印两数之间所有的整数
1 #include<iostream> 2 int main() 3 { 4 int a = 0, b = 0; 5 std::cout <<"please enter two numbers:"; 6 std::cin >> a >> b; 7 for(;a <= b;a++) 8 { 9 std::cout << a << " "; 10 } 11 return 0; 12 }
1.4.2 for语句
跟c语言一样,不写了
1.4.3 读取数量不定的输入输入数
1 #include<iostream> 2 int main() 3 { 4 int sum = 0,num = 1; 5 std::cout << "enter numbers: "; 6 while(num){ 7 std::cin >> num; 8 sum += num; 9 } 10 std::cout <<"The sum is: " << sum ; 11 return 0; 12 }
再探编译
编译器能检查:语法错误、类型错误、声明错误
练习 1.16 如上一个小程序
1.4.4 if语句
还是跟c语言一样,懒得写
统计输入中每个值连续出现了多少次
1 #include<iostream> 2 int main() 3 { 4 //currVal是我们正在统计的数,我们将读入的新值存入val 5 int currVal = 0, val = 0; 6 int cnt; 7 if(std::cin >> currVal){ 8 cnt = 1; //保存我们正在处理的当前值的个数 9 while(std::cin >> val){//读取剩余的数 10 if(val == currVal) 11 ++cnt; 12 else{ 13 std::cout << currVal << " occurs " 14 << cnt << " times" << std::endl; 15 currVal = val; //记住新值 16 cnt = 1; //重置计数器 17 } 18 } 19 //记住打印文件中最后一个值的个数 20 std::cout << currVal << " occurs " 21 << cnt <<" times" << std::endl; 22 } 23 return 0; 24 }
不知道为什么用42 42 42 42 42 55 55 62 100 100 100测试100就是不出来
解决方法:while读到100时还未跳出循环,随便输一个不是100的数跳出循环
练习1.17:如果输入的值都相等,程序会一直等待输入。如果没有重复值,输出都为出现一次
练习1.18:
#include<iostream> int main() { int a = 0, b = 0; std::cout <<"please enter two numbers:"; std::cin >> a >> b; if(a > b) { int temp = a; a = b; b = temp; } for(;a <= b;a++) { std::cout << a << " "; } return 0; }
1.5 类简介
书店程序:
读写Sales_item:
1 #include<iostream> 2 #include "Sales_item.h" 3 int main() 4 { 5 Sales_item book; 6 //读入ISBN号、售出的册数以及销售价格 7 std::cin >> book; 8 //写入ISBN、售出的册数、总销售额和平均价格 9 std::cout << book << std::endl; 10 return 0; 11 }
如果输入:
0-201-70353-X 4 24.99
则输出为:
0-201-70353-X 4 99.96 24.99
包含来自标准库的头文件时,也应该用(<>)包围头文件名,对于不属于标准库的头文件,则用双引号(" ")包围
Sales_item对象的加法
懒得打字了。。。很简单。。。
文件重定向
$ addItem <infile>outfile
嘉定$是操作系统提示符,我们的加法程序已经编译为名为addItems.exe的可执行文件,则上述命令会从一个名为infile的文件读取销售记录,并将输出结果写入到一个名为outfile的文件中,两个文件都位于当前目录中。
1.5.2 初识成员函数
1 #include<iostream> 2 #include "Sales_item.h" 3 int main() 4 { 5 Sales_item item1, item2; 6 std::cin >> item1 >> item2; 7 //首先检查item1和item2是否表示相同的书 8 if(item1.isbn() == item2.isbn()){ 9 std::cout << item1 + item2 << std::endl; 10 return 0; 11 }else{ 12 std::cerr << "Data must refer to same ISBN" <<std::endl; 13 return -1;//表示失败 14 }
item1.isbn() == item2.isbn();
调用名为isbn的成员函数.成员函数有时也被成为方法。点运算符(.)表达我们需要“名为item1的对象的isbn成员。
使用调用运算符(())来调用一个函数。调用运算符是一对圆括号,里面放置实参列表(可能为空)。
因此item1.isbn()调用名为item1的对象的成员函数isdn,此函数返回item1中保存的ISBN书号。
1.6 书店程序
我们的程序会将每个ISBN的所有数据合并起来,存入名为total的变量中。我们使用另一个名为trans的变量保存读取的每条销售记录。如果trans和total指向相同的ISBN,我们会更新total的值。否则,我们会打印total的值,并将其重置为刚刚读取的数据(trans):
1 #include<iostream> 2 #include "Sales_item.h" 3 int main() 4 { 5 Sales_item total; //保存下一条交易记录的变量 6 if(std::cin >> total){ 7 Sales_item trans; //保存和的变量 8 //读入并处理剩余交易记录 9 while(std::cin >> trans){ 10 //如果我们仍在处理相同的书 11 if(total.isbn() == trans.isbn()) 12 total += trans; //更新总销售额 13 else{ 14 //打印前一本书的结果 15 std::cout << total << std::endl; 16 total = trans; //total现在表示下一本书的销售额 17 } 18 std::cout << total << std::endl;//打印最后一本书的结果 19 } 20 } 21 else{ 22 //没有输入! 警告读者 23 std::cerr << "No data?!" <<std::endl; 24 return -1;//表示失败 25 } 26 return 0; 27 }
前面的应该跟c差不多,下一章就不看太基础的了。。。