1-2 初识输入输出
一个流就是一个字符序列,是从IO设备读出或者写入IO设备的。
术语“流”想要表达的是:随着时间的推移,字符是顺序生成或者顺序消耗的。
4个IO对象
1.cin 标准输入
2.cout 标准输出
3.cerr 输出警告或者错误的消息
4.clog 输出程序运行的一般性信息
使用一个IO库的程序
#include
int main(intargc, char** argv) {
std::cout<<"Enter twonumbers"<<std::endl;
intv1=0,v2=0;
std::cin>>v1>>v2;
std::cout<<"This sum of "<< v1 <<" and"<< v2 <<" is "<< v1+v2<<std::endl;
return0;
}
#include指令
向流写入数据
输出运算符<<
"<<"左侧的对象必须是一个ostream的对象右侧是运算是对象要打印的值。
输出运算符的计算结果就是其左侧运算对象。
上面的例子中我们用了两次运算符“<<” 但是对象是一样的 都是std::out
我们可以写成不同的格式:
栗子(一):
(std::cout<<"Enter twonumbers")<<std::endl;
栗子(二):
std::cout<<"Enter twonumbers";
std::cout<<std::endl;
哈哈 上面两个是一样了 就是酱紫\@~@/
解释一下栗子二:
第一条语句输出的书土匪字符串字面值常量(stringliteral),在双引号之间的文本被打印到标准输出。
第二条语句打印endl这是一个被称为操纵符(manipulatoer)的特殊值,效果是结束当前行,保证与设备相关联的缓冲区中的内容被刷到设备中去,并且保证当前程序所有输出都输入到输出流中去,而不是仅仅停留在内存中。
warning:在调试打印语句时候要保证一直在刷新流,不然会导致关于程序崩溃错误位置的判断(因为输出还有可能停留在缓冲区中)。
使用标准库中的名字
还有一个小朋友们关注的问题。。。上课的时候就觉得好奇怪。
为什么在cout和endl之前要“std::”?
这是表示cout和endl是定义在名为std的命名空间(namespace)中的 。
从流中读取数据
对比“<<”而言,“>>”的使用时类似的。都是接受左侧作为运算对象
她从给定的istream读入数据,并存入给定的对象中
继续两个例子:
栗子(一)
(std::cin>>v1)>>v2;
栗子(二)
std::cin>>v1;
std::cin>>v2;
两个当然是一样的!
完成程序
std::cout<<"This sum of "<< v1<<" and "<< v2 <<" is "<< v1+v2<<std::endl;
恩!看到。。。现实是运算的对象都不是相同类型的值,某些运算对象是字符串字面值常量,算术表达式和int型。
课后习题
一、最简单的输出helloworld
#include
int main(intargc, char** argv) {
std::cout<<"Hello,World"<<std::endl;
return0;
}
二、将所有的输出操作都放在独立的语句中
#include
int main(intargc, char** argv) {
std::cout<<"Enter twonumbers"<<std::endl;
intv1=0,v2=0;
std::cin>>v1>>v2;
std::cout<<"This sum of ";
std::cout<< v1 ;
std::cout<<" and ";
std::cout<< v2 ;
std::cout<<" is ";
std::cout<< v1+v2;
std::cout<<std::endl;
return0;
}
三、下面的语句是否合法
std::cout<<"This sum of"<< v1 ;
<<" and "<< v2;
<<" is "<< v1+v2 <<std::endl;
输出运算符“<<”左侧没有运算对象
1-3 注释简介
注释的作用:概括算法,确定变量的用途,或者解释晦涩难懂的代码并且修改代码后要及时更改注释。
C++中注释的种类
两种:
(一)单行注释 //恩我就是注释
(二)界定符对注释
注释界定符不能嵌套
这个就不举栗子了。。。
1-4控制流
1-4-1 while语句
++val;
前缀递增运算符++;val的值在当前行就会发生变化(记得在while判断的时候val++和++val会有不同的结果)。等价于val=val+1;
课后作业时间
一、while循环将50-100的数相加
#include
int main(intargc, char** argv) {
//intnum=50;
intsum=0;
inti=50;
while(i<=100){
sum=sum+i;
++i;
//num+=1;
}
std::cout<<sum<<std::endl;
return0;
}
二、输出10-0之间的整数
#include
int main(intargc, char** argv) {
inti=11;
while(i>=1){
--i;
std::cout<<i<<std::endl;
}
return0;
}
三、提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数
#include
int main(intargc, char** argv) {
intv1=0,v2=0;
inti=0;
std::cout<<"Enter two numbers:";
std::cin>>v1>>v2;
if(v2>v1){
i=v2-v1;
while(i>=1){
--i;
v2--;
std::cout<<v2<<std::endl;
}
}
if(v2
{
i=v1-v2;
while(i>=1){
--i;
v2++;
std::cout<<v2<<std::endl;
}
}
return0;
}
。。。终于无论正负都行了
1-4-2for语句
while 和for语句的差别
在while循环中检测变量在循环体中递增变量的模式使用非常频繁。。。for可以简化这种循环。
for实现 输出两个整数范围内所指定的整数
#include
int main(intargc, char** argv) {
intv1=0,v2=0;
inti;
std::cout<<"Enter two nums:"<<'\n';
std::cin>>v1>>v2;
if(v2>v1){
intj=v2-v1-1;
for(i=0;i
++v1;
std::cout<<v1<<std::endl;
}
}
if(v2
intj=v1-v2-1;
for(i=0;i
--v1;
std::cout<<v1<<std::endl;
}
}
return0;
}
问题。。。。。。程序
#include
int main(intargc, char** argv) {
intv1=0,v2=0;
inti;
std::cout<<"Enter two nums:"<<'\n';
std::cin>>v1>>v2;
if(v2>v1){
for(i=0;i
++v1;
std::cout<<v1<<std::endl;
}
}
if(v2
for(i=0;i
--v1;
std::cout<<v1<<std::endl;
}
}
return0;
}
1-4-3 读取数量不定的输入数据
当我们使用istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误时,检测成功,当遇到文件结束符(EOF),或者遇到无效输入时候,istream对象的状态会变为无效,那么istream对象会使得条件变假。
1-4-4 if语句
#include
int main(intargc, char** argv) {
intcurrVal=0,val=0;//currVal is the number we are counting ;we'll readvalues into val
std::cout<<"Enter some numnbers:"<<'\n';
if (std::cin>> currVal){
int cnt =1;//store the count for the current value we areprocessing
while(std::cin>>val){
if(val ==currVal)
++cnt;
else{
std::cout<<currVal<<" occurs "
<<cnt<<"times "<<std::endl;
currVal =val;
cnt = 1;//reset the count
}
}
std::cout<< currVal <<" occurs "<< cnt<<" times "<<std::endl;
}
return0;
}
写完这个程序。。。只想说一句窝草!!!
1-1
问题:输完程序当时的情况是这样子的:。。。。就在上面1-1 窝草我的两次1000呢?
原来程序没有中断。。。我个傻逼
中断:window ctrl+z 然后enter
linux Ctrl+d
好了!这一章就这样结束了!
1-5类简介
c++最初设计焦点就是能定义使用上像内置类型一样自然的类类型!
#include
#include"Sales_item.h"
intmain()
{
Sales_itembook;//read ISBN,number of copies sold,and salesprice
std::cin>>book;
std::cout<<book<<std::endl;
}
运行结果见下面1-2
这里还有一个关于头文件的问题-》#include"Sales_item.h"
该头文件的代码可以从这里获取
http://www.douban.com/note/270656478/
上面的程序中头文件一个用尖括号,一个用双引号,两者不同之处在与,前者是包含来自标准库的头文件,后者是不属于标准库的头文件。还是很简单的\^0^/
Sales_item对象的加法
下面是一个栗子
#include
#include"Sales_item.h"
int main(){
Sales_itemitem1,item2;
std::cin>>item1>>item2;
std::cout<<item1+item2<<std::endl;
return0;
}
1-5-2 初识成员函数
将两个Sales_item对象相加的程序首先应该检查两个对象是否具有相同的ISBN,方法如下:
#include
#include"Sales_item.h"
int main(){
Sales_itemitem1,item2;
std::cin>>item1>>item2;
if(item1.isbn() == item2.isbn()) {
std::cout<<item1+item2<<std::endl;
}else{
std::cerr<< "Data must refer to same ISBN"
<< std::endl;
return-1;
}
}
摔!
什么是成员函数?
上面的if 检测条件 item1.isbn() == item2.isbn()中调用名为isbn的成员函数。成员函数是定义为类的一部分的函数,有时候也被称之为方法。
我们通常以类对象的名义调用成员函数。-> item1
我们使用点运算符(.)来表达我们需要“名为item1的对象的isbn成员”,点运算符只能用于类类型的对象。其左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算对象为右侧对象指定的成员。
当我们运用点运算符来调用一个成员函数时,我们通常是想调用该函数,我通常通过调用运算符(())来调用一个函数。调用运算符是一对圆括号。。。里面放置的是实参列表,也有可能是空。
习题:
编写程序读取多条销售记录,并统计每个ISBN有几条销售记录
#include
#include"Sales_item.h"
int main(){
//Write aprogram that reads several transactions and counts how manytransactions occur each ISBN
//Sales_itemitem;
Sales_itemitem1,item2;
if(std::cin>>item1){
int cnt =1;
while(std::cin>>item2){
if(item2.isbn() == item1.isbn() ){
++cnt;
} else{
std::cout<< item1<<" occurs " << cnt << " times "<<std::endl;
item1 =item2;
cnt =1;
}
}
std::cout<< item1<<"occurs"
<< cnt << "times"<<std::endl;
}
return0;
}
1-6 书店程序
我们需要从一个文件中读取销售记录
生成每本书的销售报告:显示出售册数,总销售额和平均售价。
假设每个ISBN书号的所有销售记录在文件中是聚在一起保存的。
我们的程序将每个isbn的数据合并起来,存入total的变量中,我们使用另一个名为trans的变量保存读取的每条销售记录。如果trans和total指向相同的isbn,我们会更新total的值。否则,我们会打印total的值,并将其重置为刚刚读取的数据(trans):
#include
#include"Sales_item.h"
int main(intargc, char** argv)
{
Sales_itemtotal;
if(std::cin>>total){
Sales_itemtrans;
while(std::cin>>trans){
if(total.isbn()== trans.isbn()){
total +=trans;
}else{
std::cout<<total<<std::endl;
total =trans;
}
}
std::cout<<total<<std::endl;
}else{
std::cout<<" no data " <<std::endl;
return-1;
}
return 0;
}
2016-1-21 13:44