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

CPP Primer 5th 笔记(一)

2016-01-21 13:54 323 查看


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-2​​for语句

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/


1-2
运行结果

​​​上面的程序中头文件一个用尖括号,一个用双引号,两者不同之处在与,前者是包含来自标准库的头文件,后者是不属于标准库的头文件。还是很简单的\^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-3
Sales_item 对象的加法



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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: