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

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

  • 书店保存每条销售记录的档案,包括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.cc
  • g++ 是运行命令
  • -o prog1 是编译器参数(指定生成的可执行文件名为prog1)
  • 不指定此参数则可执行文件:a.exe或者a.out

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

C:\Users\me\programs> c1 /Ehsc prog1.cc
  • C:\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 + Z
  • Mac或者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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值