第一章 C++的初步认识
1.1从C到C++
-
C++保留了C语言原有的优点,增加了面向对象的机制;
-
用C语言编写的程序几乎可以毫不修改的用于C++;
1.2最简单的C++程序
#include<iostream>
using namespace std;
int main()
{
cout<<" Hello World.This is a C++ program."
return 0;
}
1.3 C++程序的构成和书写形式
-
一个C++程序可以由一个或者多个程序单位构成;
-
在一个程序单位中,主要包含下面三部分:
-
预处理命令;
-
全局声明部分;
-
函数;
-
一个C++程序总是从main函数开始执行的;
1.4 C++程序的编写和实现
-
C++的源程序是以.cpp作为后缀的;
-
运行程序步骤:
-
对源程序进行编译
-
将目标文件链接
-
运行程序
-
分析运行结果
第二章 数据的储存、表现形式和基本运算
2.1 C++的数据类型
![](https://img-blog.csdnimg.cn/img_convert/b8a054c01c27d668fdec41df36306268.png)
2.2 常量
-
常量包括数值型常量和字符型常量,如12,1,‘a';
-
常量的值不能改变;
-
符号常量:可以用一个符号名代表一个常量,称为符号常量;
#define Price 30
//Price 在文中指代常量30;该句句末不要加分号
2.3变量
-
定义:在程序运行期间可以改变的量称为变量;
-
变量命名规则:只能用字母、下划线、和数字组成,且第一个字符必须为字母或者下划线;
-
定义变量:必须先定义后使用;
int a,b,c,d;
float i,j,k;
//数据类型 变量名列表
-
常变量:在定义变量时加上关键词const,则变量的值在运算期间不能改变;
2.4 C++的运算符
![](https://img-blog.csdnimg.cn/img_convert/f50a2308ce223db12401e7cfc003ba14.png)
上述为常用的运算符
2.5算术运算符和算术表达式
-
算术运算符的结合方向为“自左向右”;
-
不同类型的数据之间进行计算,不同类型要先转换为同一类型;
![](https://img-blog.csdnimg.cn/img_convert/c739a87378c4aa50334f92ee462dedb7.png)
一般由低类型向高类型转换;
-
自增和自减运算符
-
++ i:在使用i之前,先使i的值加1,例如i的值为3,执行j=++i之后,i=3, j为4;
-
i ++:在使用i之后,先使i的值加1,例如i的值为3,执行j=i ++之后,j=3, i为4;
-
- - i :在使用i之前,先使i的值减1,例如i的值为3,执行j= - - i之后,j为2,i=3;
-
i - - :在使用i之后,先使i的值减1,例如i的值为3,执行j= i- -之后,j为3,i=2;
-
强制类型转换符:
(double)a //将a转换成double类型
(int) (x+y) //将x+y的值转换为整型
//一般转换形式为(类型名) (表达式)
2.6赋值运算符和赋值表达式
-
赋值运算符为“=”,与“==”关系运算符等于不同,“=”运算符意为将一个数据赋给一个变量;
-
不同类型的整型数据间的赋值归根结底就是按照存储单元中的储存形式直接传送;
-
在赋值符“=”之前加上其他运算符,可以构成复合运算符;
a+=3 //等价于a=a+3
x%=3 //等价于x=x%3
第三章 C++程序初步设计
3.1基于过程的程序设计和算法
-
一个基于过程的程序应该包括以下两方面:
-
对数据的描述;
-
对操作的描述,即算法;
-
算法可以用自然语言、流程图、伪代码、计算机语言来表示;
3.2 C++的程序结构和C++语句
-
每一个程序单位有以下3部分组成:
-
预处理命令:如#include指令或#define;
-
全局声明:在函数外对数据类型、函数、变量做出声明和定义;
-
函数:在函数体中可以包含声明语句和执行语句;
-
C++语句分为以下4种
int a,b; //声明语句
if() ....else... //执行语句,完成一定的控制功能
; //空语句
{ } //复合语句
3.3 C++的输入与输出
-
cout ( 输出 )语句的一般格式:
cout<<表达式1<<表达式2<<endl;
cin ( 输入 )语句的一般格式:
cin>>变量1>>变量2;
-
常用控制符
-
setw(n):设置字段宽度为n 位;
-
用getchar和putchar函数进行输入和输出;
putchar(c); //输出字符变量c的值
c=getchar( ); //从输入设备得到字符
-
用scanf和printf函数进行输入和输出
scanf("%d %c %f",&a,&b,&c);//scanf(控制格式,输出列表)
printf("a=%d,b=%f,c=%c\n",a,b,c);//printf(格式控制,输出列表)
3.4 关系运算和关系表达式
-
C++的关系运算符
![](https://img-blog.csdnimg.cn/img_convert/3430d8752ba02e91b1f2a3c91ad37d46.png)
注:算术运算符优先级最高,关系运算符次之,赋值运算符优先级最低;
-
逻辑型常量和逻辑变量
-
逻辑型常量只有2个,即false(假)和true(真);
-
逻辑变量用bool来定义,又称为布尔变量;如bool falg;
3.5 逻辑运算和逻辑表达式
-
逻辑运算符
-
&& 逻辑与(相当于and)
-
| | 逻辑或(相当于or)
-
! 逻辑非(相当于not)
注:逻辑运算符中的“&&“和“| |“低于关系运算符,“!”高于算术运算符;
3.6选择结构和if语句
-
if语句的形式
if(表达式) 语句 //第一种,没有else部分
if(表达式)语句1 else 语句2 //第二种,包含else部分
if(表达式1) 语句1
else if(表达式2) 语句2
else 语句n //第三种,内嵌多层的if语句
注:else总是与它上面最近的且未配对的if配对;
-
条件表达式
if(a>b)
max=a;
else max=b;
等价于下面这条语句
max=(a>b)?a:b; //条件表达式的一般形式为表达式1?表达式2:表达式3
条件运算符的执行顺序是:先求解表达式1,若为非0(真),则求解表达式2,此时表达式2的值就是整个条件表达式的值;若表达式1的值为0(假),则求解表达式3的值,表达式3的值就是整个条件表达式的值。
-
多分支选择结构与switch语句
if语句只有2个分支可供选择,而实际问题常常需要用到多分支的选择,当然也可以使用嵌套的if语句,但不免过于冗长,可读性差;C++提供switch语句,它的一般形式如下:
switch(表达式)
{ case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
case 常量表达式3:语句3;break;
default :语句n
}
例如:
switch(grade)
{
case'A':cout<<"85~100\n";break;
case'B':cout<<"70~84\n";break;
case'C':cout<<"60~69\n";break;
case'D':cout<<"0~59\n";break;
defalut:cout<<"error\n";
}
注:break语句用来在执行一个case子语句之后终止switch语句的执行;
此外多个case语句可以用同一个执行语句;
3.7循环结构和循环语句
顺序结构、选择结构和循环结构是结构化程序设计的3种基本结构,是各种复杂程序的基本构造单元;
-
用while语句构成循环
![](https://img-blog.csdnimg.cn/img_convert/d144fc74e3e20e47af3cd41a0b481fd4.png)
int i=1,sum=0;
while(i<=100)
{
sum=sum+i;
i=i+1;
}
注:while语句其作用是当指定的条件为真(表达式非0)时,执行while语句中的内嵌语句,特点是先判断再执行语句;
循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现;
在循环体中应有使循环趋向于结束的语句;
-
用do ...while语句构成循环
do.....while语句的特点是先执行循环体,然后判断循环条件是否成立;其一般形式为
do
{ sum=sum+i;
i=i+1;
} while(i<=100);
//一般形式如下
do
语句
while(表达式);
-
用for语句构成循环
![](https://img-blog.csdnimg.cn/img_convert/a7c57e31cf9e261dd1d0963130d8f9f6.png)
执行过程如下:
-
先求解表达式1;
-
求解表达式2,若其值为真,则执行for语句中指定的内嵌语句,然后执行第三步;若为假,则结束循环,转到第五步;
-
求解表达式3
-
转回第二步继续执行
-
循环结束,执行for语句下面的语句
for(循环变量赋初值;循环条件;循环变量增值)语句,该语句为最常用
for(i;i<=100;i++)
sum=sum+i;
//等价于下面语句块
i=1;
while(i<=100)
{sum=sum+i;
i++;
}
注:for语句的一般格式中的“表达式1”可以省略,此时应该在for语句之前给循环变量赋初值,但“表达式1”之后的分号不可以省略;
表达式3也可以省略,但必须另外设法保证循环能正常结束;
表达式1和表达式3可以同时省略,只有表达式2,即只给循环条件;
3.8 循环的嵌套和提前结束方法
-
循环的嵌套
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套,3种循环方式可以互相嵌套;
-
提前结束循环
-
用break语句提前结束循环过程,在switch语句中已介绍过;
-
用continue语句提前结束本次循环;,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判断,用法和break语句一样;
第四章 利用函数事先指定的功能
4.1什么是函数
1.函数是用来实现各种功能。解决问题的过程就是调用和执行一系列函数的过程,一个函数就是一个功能;无论把一个程序划分为多少模块 ,只能有一个main函数;
-
函数的分类
-
系统函数,即库函数;
-
用户自己定义的函数,主要分为有参函数和无参函数;
4.2函数参数与函数的值
在调用函数时,大多数情况下函数是带参的,主调函数和被调用函数之间有数据传递关系,在定义函数时函数名后面的括号里面的变量名称为形式参数(形参),在主调函数中调用一个函数时,函数名后面的括号中的参数称为实际参数(实参);
int max(int x, int y) //x,y为形参
{
int z;
z=x>y?x:y;
return z;
}
int main()
{
int a,b,c;
cin>>a>>b>>c;
c=max(a,b); //a,b为实参
cout<<c<<endl;
return 0;
}
注:
-
未出现函数调用时,形参不占据内存中的储存单元;
-
实参可以是常量、变量、表达式;
-
形参和实参的类型应相同或赋值兼容,且实参和形参的个数应该相等;
-
实参对形参的传递是“值传递”,只能实参传形参,不能由形参传回;
4.3 对被调用函数的声明和函数原型
-
在一个函数中调用另一个函数需要什么条件呢?
-
首先被调用的函数必须是已存在的函数(库函数或者自己定义的函数);
-
如果是库函数被调用,在文件开头用#include指令将有关文件包含到本文件中;
-
如果是自己定义的函数被调用,但被调函数在主函数之后,需要对被调函数作出声明,即在函数尚未定义的情况下,事先将该函数的有关信息通知编译系统;
注:定义是指对函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等等;声明的作用是把函数的名字、函数类型以及形参个数、类型和顺序告知编译系统;
4.4 函数的使用方法
-
嵌套调用:在调用一个函数的过程中又调用另一个函数,需要注意的是,在调用函数之前,需要对每一个函数作出声明(除非定义在前,调用在后);
-
函数的递归调用:在调用一个函数的过程中又直接或间接地调用函数本身
int age(int n)
{
int c;
if(n==1)
c=10;
else c=age(n-1)+2;
return c;
}
-
内置函数
函数调用过程
-
程序先执行函数调用之前的语句;
-
流程的控制转移到被调用函数的入口处,同时进行函数传递;
-
执行被调用函数中函数体的语句;
-
流程返回到调用函数的下一条指令处,将函数返回值带回;
-
接着执行主函数中下一条语句;
注:C++提供一种高效率的方法,即在编译时将所调用的函数代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数,也称内联函数;
指定内联函数的方法是在函数首行的左端加一个关键字inline;
内联函数中不能包括复杂的控制语句如switch语句,只有那些规模较小又不会频繁调用的函数适合声明为内联函数;
-
函数重载
C++允许同一个函数名定义多个函数 ,而这些函数的参数个数和参数类型可以不相同,这就是函数的重载,即对一个函数名重新赋予它新的含义,方便起名之用;
注: 重载函数的参数个数、参数类型或者参数顺序三者至少有一种不同;
-
函数模板
实际上函数模板就是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数即函数模板;
template<typename T>
通用函数定义
或template<class T>
通用函数定义
template<typename T>
例:T max(T a,T b,T c)
{if (b>a) a=b;
if(c>a) a=c;
return a;
}
-
有默认参数的函数
当用同样的实参多次调用同一函数时,C++提供了一种简单的处理办法,给形参一个默认值;
注:一个函数不能即作为重载函数,又作为有默认参数的函数;因为当调用函数时系统无法确定是利用重载函数还是利用默认参数的函数;
4.5 局部和变量
-
在一个函数内部定义的变量是局部变量,只能在本函数范围内有效;
-
在函数之外定义的变量是全局变量,作用于全局;
-
内部函数:如果一个函数只能被本文件中的其他函数调用,则称为内部函数,函数首部左侧加static即可;
-
如果在函数首部左侧加以关键字extern,则表示此函数是外部函数,可供其他文件调用;
4.6头文件
头文件一般包含以下内容
-
宏定义
-
函数声明
-
对类型的声明
-
全局变量定义
-
如有需要包含其他头文件
第五章 利用数组批量处理数据
5.1为什么需要数组
所谓数组,就是用一个统一的名字代表这批数据,而用序号和下标来区分各个数据;例如用S来代表学生成绩这组数据,S就是数组名,用S1,S2分别表示学生1和学生2的成绩;数组可以理解为有序数据的集合。
-
定义一维数组
例:int a[10]; //表示数组名为a,有10个元素;需注意数组元素第一个是a[0];
数组的初始化:int a[10]={0,1,2,3,4,5,6,7,8,9};
注:可以只给一部分元素赋值,默认为先给前面的元素赋值,此外在对全部数组赋值时,可以不指定数组长度;
5.2 定义和使用二维数组
定义:具有2个下标的数组称为二维数组;
例:int a[3][4]; //定义a为3行4列的数组;
二维数组的初始化:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
2种方法都可以使用,也可以只对部分元素赋初值;
5.3用数组做函数参数
-
用数组元素做函数实参
数组元素做函数的实参,与变量做函数实参一样,将数组元素的值传递给形参;
-
可以用数组名做函数的实参和形参
注:在用变量做函数参数时,只能将实参传递给形参,且实参的值不应形参的值改变而改变;而用数组名做实参时,如果改变了形参数组的值,实参数组的值也将改变;
5.4 字符数组
用来存放字符数据的数组就是字符数组,字符数组具有数组的共同特性;
-
字符数组的赋值
char c[5];
c={'c','h','j','k','i'}; //错误,不能对整个数组一次性赋值;
c[0]='c';c[1]='h';c[2]='j';c[3]='k';c[4]='i'; //正确
注:C++规定了一个“字符串结束标志”,即'\0',遇到'\0'即字符串结束;
-
字符数组的输入和输出
注:
-
输出的字符不包括结束符;
-
如果数组长度大于字符串实际长度,输出遇到'\0'结束;
-
输出字符串时,cout流中用字符数组名,而不是数组元素名;
cout<<str; //输出一个字符串
cout<<str[4]; //输出一个字符
-
字符串连接函数strcat
char str1[5]="CHINA";
char str2[3]="I LOVE";
cout<<strcat(str2,str1);
结果:I LOVE CHINA
-
字符串复制函数strcpy
char str1[10],str2[]="CHINA";
strcpy(str1,str2);
执行后str2中的字符复制到str1中;
-
字符串比较函数strcmp
strcmp(str1,str2);
strcmp("CHINA","USA");
strcmp(str1,"CHINA");
如果字符串str1与str2中的字符完全相同,函数值为0;
如果字符串1大于字符串2则函数为正数,否则为负数;
-
字符串长度函数strlen
用于输出字符串的字符数量
5.5字符串变量
C++提供了一种新的数据类型——字符串类型(string)
-
字符串变量的定义和赋值
string string1="CHINA";
注:使用string变量需要在文件开头加上#include<string>
-
字符串变量的运算
-
字符串复制直接用赋值号
例:string1=string2;
-
字符串连接用加号
string string1="I LOVE";
string string2="CHINA";
string1=string1+string2;
-
字符串比较直接用关系运算符
注:字符数组不可以直接比较,字符串变量可以直接比较大小;