首页 > 编程 > C++ > 正文

《C++Primer》读书笔记(一)开始

2019-11-11 02:29:56
字体:
来源:转载
供稿:网友

首先,了解一个我们需要尝试的程序(书店程序),如下:

书店保存每条销售记录的档案,包括3个数据项:ISBN书号、售出册数、售出单价需要能够查询每本书的销量,销售额和平均售价

我认为,主要需要实现的是: - 检测相同ISBN书号 - 可重复录入销售记录的输入功能

书中提出,虽然没有编写程序,但是已经可以确定它必须: - 定义变量 - 进行输入输出 - 使用数据结构保存数据 - 检测两条记录是否有相同的ISBN书号 - 包含一个循环来处理销售档案中的每条记录

接下来,介绍用C++来解决这些子问题

1.1 编写一个简单的C++程序

1.一个函数的定义包含4个部分:返回类型、函数名、形参列表、函数体

2.重要概念:类型(类型不仅定义了数据元素的内容,还定义了这类数据能进行的运算)

编译、运行程序

1.IDE:集成开发环境(Integrated Developed Environment)

2.程序文件成为源文件(source file),C++文件的后缀名常见为:cc、cxx、cpp、cp、c

3.从命令行==运行编译器==

在windows或者UNIX系统外壳程序窗口中,用

$ CC PRg1.cc

CC编译器程序的名字,$是系统提示符

4.从命令行中==运行执行文件== 在windows中,有两种方法

$ prog1 //忽略其扩展名.exe$ ./prog1 //一些系统中,必须择定文件位置,当前目录为./

而在==UNIX系统==中,必须使用==全文件名==

5.访问==main返回值==

在windows和UNIX系统中,都可以用==echo==命令获得返回值,在windows系统中

$ echo %ERROREVEL%

运行GNU或微软编译器(常用编译器:GNU、Visual Studio)

其中GNU编译器,可以如下:

$ g++ -o prog1 prog1.ccg++ 是运行命令-o prog1 是编译器参数(指定生成的可执行文件名为prog1)不指定此参数则可执行文件:a.exe或者a.out

另外,Visual Studio编译器命令可以如下:

C:/Users/me/programs> c1 /Ehsc prog1.ccC:/Users/me/programs>是系统提示符c1命令:调用编译器/Ehsc是编译器选项,用来打开标准异常处理

练习

1.查阅编译器文档,确定文件命名规则,编译并运行一个程序

参考CSDN博客 Windows下使用GNU编译器

2.改写程序返回值为-1,通常这是程序错误的返回,观察你的系统如何处理错误标识

1.2 初识输入输出

1.标准输入输出对象 - 标准输入:cin - 标准输出:cout - 标准错误:cerr - 输出运行程序时的一般性信息:clog

2.一个使用IO库的程序

#include <iostream>int main(){ std::cout<<"Enter two numbers:"<<std::endl; int v1=0,v2=1; std::cin>>v1>>v2; std::cout<<"The sum of"<<v1<<"and"<<v2<<"is"<<v1+v2<<std::endl; return 0;}

(1) #include指令必须在所有函数前面

(2) 输出运算符(<<) - 接受两个对象:左侧的运算对象必须是一个ostream对象,右侧的运算对象是要打印的值;

(3) 操纵符(endl) - 写入endl的效果是:结束当前行,并将与设备关联的缓冲(buffer)区中的内容刷到设备中 - 缓冲刷新操作:保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流

程序员在调试时添加打印语句,应该一直保证刷新流,否则程序崩溃时,输出可能还留在缓冲区,而推断崩溃位置错误

(4)使用标准库中的名字 - 前缀std::是指出cout和endl的命名空间,命名空间可以帮助我们避免名字定义冲突 - 另一个更简便的方法:using声明(第3章介绍)

(5)输入运算符(>>) - 其左侧是一个istream,右侧是一个接受对象

练习

1.编写程序,打印“Hello World”

#include <iostream>int main(){ std::cout<<"Hello World"<<std::endl; return 0;}

2.编写使用乘法运算打印两个数乘积的程序

将例子中的加号改为 * 号即可

3.重写程序,将打印对象放在一条独立语句中

将例子程序中的std::cout切开,记得添加std::endl

4.解释下列语句是否合法

std::cout<<"The sum of"<<v1; <<"and"<<v2; <<"is"<<v1+v2<<std::endl;

不合法,第一、二行缺乏std::endl结束输出,第二、三行缺乏std::cout作为指定输出的对象

1.3 注释

(1)注释界定符(/* */),可以多行,不可以嵌套

(2)单行和半行(//)

1.4 控制流

(1)while语句,形式如下

while(condition) statement

(2)复合赋值运算符 - (+=)本质上相当于sum=sum+val - (++)前缀:将运算对象加1,等价于val=val+1

练习

1.编写程序,用while循环50~100整数相加

#include <iostream>int main(){ int sum=0,val=50; while(val<=100){ sum+=val; val++; } std::cout<<"The sum is:"<<sum<<std::endl; return 0;}

2.使用–运算实现10~0的运算 - 上程序改成(–)

3.编程:用户输入两个数,打印出这两个数之间的整数

#include <iostream>int main(){ int left,right; std::cout<<"Please enter two numbers"<<std::endl; std::cin>>left>>right; while(left<=right){ std::cout<<left<<std::endl; left++; } return 0;}

(1) for语句,形式如下

for(init-statement;condition;expression) statement

读取数量不定的输入数据

int main(){ int sum=0,value=0; while(std::cin>>value) sum+=value; std::cout<<"Sum is: "<<sum<<std::endl; return 0;}windows中,文件输入结束符为:ctrl + ZMac或者UNIX系统中,文件输入结束符为:ctrl + D

(4) if 语句,形式如下

if(conditon) statement统计输入中每个值连续出现了多少次程序int main(){ int currVal=0,val=0; if(std::cin>>currVal){ int cnt=1; while(std::cin>>val){ if(val==currVal) ++cnt; else{ std::cout<<currVal<<" occurs "<<cnt<<" times"<<std::endl; currVal=val; cnt=1; } } std::cout<<currVal<<" occurs "<<cnt<<" times"<<std::endl; } return 0;}

1.5 类简介

(1)通过定义一个类来定义自己的数据结构

(2)关键概念:类定义了行为 - 类的作者决定了类类型对象上可以使用的所有操作

==(3)使用文件重定向== - 当测试程序时,反复敲键盘是非常乏味的,可以利用文件重定向

$ addItems <infile>outfile程序已经为编译为名为addItems的可执行文件,上述命令会从一个名为infile的文件读取销售记录,并将输出结果写入到一个名为outfile的文件中

1.6书店程序

#include <iostream>#include "Sales_items.h"int main(){ Sales_item total; if(std::cin>>total){ Sales_item trans; 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::cerr<<"No data?!"<<std::endl; return -1; } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选