C++程序设计【谭浩强】第二篇:面向过程的程序设计

第3章  程序设计初步

算法:解决问题所采用的方法和步骤(数值算法 和 非数值算法)

C++程序包括:

(1)预处理命令:#include 或者 #define

(2)声明部分:对数据类型和函数的声明,有函数内声明,也有函数外声明

(3)函数

程序的三种基本结构:顺序结构、选择结构 和 循环结构

全局变量与局部变量:在函数内声明的是局部变量,范围到程序结束;在函数外声明的是全局变量,范围到函数外结束

C++中的 9 种控制语句:

(1)if 条件语句

(2)for 循环语句

(3)while 循环语句

(4)do...while 循环语句

(5)continue 结束本次循环,开始下一次循环

(6)break 终止,只能用于 switch 结构 或者 循环结构

(7)switch 分支选择语句

(8)goto 转向语句

(9)return 从函数返回

C++中语句的定义:能够实现某种操作并且最后以分号结尾的都是语句

C++中输入输出基本方式:

(1)输入输出流:cin cout

(2)getchar 和 putchar 函数进行单个字符的输入输出

(3)scanf 和 printf 函数进行输入输出

C++相比于C引入了逻辑型数据,即 bool 类型,其值为 true 或者 false 两个之一

条件表达式:这个感觉不是很常见,它的表达形式是例如 (a > b)? a:b; 如果括号内为真,则取冒号前的值;如果括号内为假,则取冒号后的值。这个条件运算符也是C++中唯一的一个三目运算符

switch 语句与多重 if 语句用哪个?

能用 switch 语句实现的就一定可以使用 if 实现,但是反之不一定,如果是区间范围就采用 if,如果是等值判断使用 switch

循环语句中的 while 语句和 for 语句:当已知循环次数时,使用 for 语句比较好;当未知循环次数时,while 语句比较好(while 语句只给了循环条件)。其实 for 语句最为广泛和灵活,已知未知循环次数都可以用,可以完全替代 while 语句。

举例:一个估计圆周率 π 的程序(基于 π/4 的数学公式)

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

int main(void)
{
	int s = 1;
	double n = 1, t = 1, pi = 0;
	while (fabs(t) > 1e-7)
	{
		pi = pi + t;
		n = n + 2;
		s = -s;
		t = s / n;
	}
	pi = pi * 4;
	cout << "pi = " << pi << endl;

	return 0;
}

除此之外循环的相关小算法还有兔子繁殖的 Fibonacci 数列问题、找素数问题、电码加密问题等等

第4章  函数与预处理

大的程序最好分模块来进行,由主函数来调用其他函数,其他函数也可以互相调用(但是函数不能够嵌套定义),主函数往往写的很简单,其作用就是调度。

在主调函数调用被调函数时,主调函数把实际参数的值传递给被调函数中的形参,C++中在定义函数时必须同时指定函数的类型和函数参数的类型

函数的调用注意事项:

(1)被调函数可以是 库函数 或者 用户自己定义的函数

(2)如果是库函数,则需要在文件开头使用 #include 命令将有关的头文件包含到本文件夹中

(3)如果是用户自己定义的函数,则该函数与主调函数需要在同一个程序单位中,且依据位置决定是否需要作声明

函数的重载:

一般来说一个函数对应一种功能,但是有时候我们要实现的是同一类的功能(例如在比大小的函数中,我的输入数据类型可能有差异,那么不同的数据类型都得写一个函数,这样太麻烦了)。因此,C++允许用同一个函数名分别定义多个函数,这些函数的参数个数和参数类型不同,这就是函数的重载【一物多用】。一个举例就是 << 既可以作为输入输出流的运算符,又可以作为位移运算符。

函数模板:

相比于函数重载更进一步,函数重载还是要定义多个函数,只是函数名一致而已。函数模板的牛逼之处在于其建立了一个通用的函数,其函数类型和形参类型都不指定。

函数模板使用举例:

template <typename T>  //模板声明,其中 T 为类型参数
T max(T a,T b,T c)     //定义一个通用函数,用 T 做虚拟的类型名
{
    if (b>a)
        a = b;
    if (c>a)
        a = c;
    return a;
}

有默认参数的函数:

在定义函数时给定形参一个默认值,这样形参就不一定要从实参取值了,如果不想使形参取这个默认值,就通过实参另行给出。例如这样的函数声明:

float area(float r = 6.5);  //函数声明


area()     //形参拿到了6.5,相当于 area(6.5)
area(7.5)  //形参拿到了7.5

函数的递归调用:

不用去考虑实现递归的过程细节,只需要写出递归公式和递归结束条件(即边界条件)就可以很容易写出递归函数

使用 register 声明寄存器变量:如果有的变量使用十分频繁,那么存取变量会话费不少时间,因此可以把变量放在寄存器当中,举例:

register int i;

C++的预处理功能包括以下三种:

(1)宏定义

#define PI 3.1415

(2)文件包含

#include "file2.cpp"              //用户编写的头文件,在当前路径下
#include "C:\tan\C++\file2.cpp"   //用户编写的头文件,带绝对地址
#include <iostream>               //系统头文件常用<>

(3)条件编译

用的不多,这里就省略了

第5章  数组

数组是属于同一种数据类型的有序数据的集合,寻找一个数组中的元素需要数组名和下标(C++中用方括号来表示下标)这两个要素,数组的存储是连续的,占用一块连续的内存空间。

注意数组的定义和索引(引用)的方式很相似,不要混淆

一维数组的初始化举例:

int a[5] = {1,2,3,4,5};
int a[] = {1,2,3,4,5};   //赋初值时可以不指定数组的长度
int a[5] = {1,2,3};      //赋初值时可以只给一部分元素赋值

二维数组的初始化举例:

int a[2][3] = {
   
   {1,2,3},{4,5,6}};  // 同理也可以写在一个花括号内

C++相对于C增加了新的数据类型——字符串类型 string,在不使用这个字符串类型之前,只能使用字符串数组,运算就要使用字符串函数,例如 strcat(连接)、strcmp(比较) 和 strcpy(复制),而对于 string 类型可以直接使用简单的运算符,例如字符串复制可以直接使用赋值号 = ,字符串连接可以直接使用加号 + ,字符串比较可以直接使用 > 等关系运算符。举例:

//字符串复制
string1 = string2
//字符串连接
string = string1 + string2

第六章  指针

指针就是变量的内存地址,指针变量就是放地址的变量!

int * p 就是定义了一个 int * 类型的指针变量 p

*p 就是访问 p 内放着的地址所对应内存放的值

p = &i 就是拿出来 i 的地址给 int * 类型的指针

还有一个指针的重要作用!!!那就是指针作为参数传给函数!这样有什么用呢?回顾我们之前讲的函数,它只有返回值。假如说我们在主调函数中定义了一个常量,想要通过调用函数改变这个常量。那么仅仅通过把这个常量传入被调函数这样的操作是无不行的,因为被调函数执行完之后内存就被释放掉了,这时候就必须要把这个常量的地址作为参数传递给被调函数,这样才能使得被调函数能够改变主调函数内的数值。

数组与指针:数组名就是数组的首元素的地址,这与指针不谋而合,指针与数组天然就联系紧密,举例

//下面两者等价
p = &a[0];
p = a;

所以 p[i] = a[i] = *(p+i) = *(a+i),分别对应下标法和指针法

另一个C++的重要概念——引用,这是C++对C的一个补充,引用的作用是给变量起一个别名,例如这里b跟a是一个东西,相当于就是起了一个别名,&是引用声明符号,所以原来很多只能用指针才可以解决的问题就可以使用引用来解决

int a;
int &b = a;  //声明b是a的引用

第7章  自定义数据类型

结构体类型:struct

结构体与数组的对比,数组中的元素是属于同一个类型的,但是有时候仅仅有单一的数据处理任务是不够的,所以就有了结构体类型

结构体变量与指针:

//下面三者等价
stu.num;
(*p).num;
p->num

结构体变量与指针结合构成链表

静态链表与动态链表,使用的话还是以动态链表为主

C++中的动态内存分配与C语言中的动态内存分配的区别:C++采用了 new 和 delete 来替代 malloc 和 free 函数,但是要注意,这里的 new 和 delete 都是运算符,而不是函数,因此其执行效率很高。C++中虽然保留了 malloc 和 free,但是不建议使用了

new 的使用举例:

int * p = new int;             //开辟一个放整形的存储空间,返回一个指向该空间的地址
int * p = new int(100);        //开辟一个放整形的存储空间,并赋这个整形初值为100,返回地址
float * p = new float(3.14);  //开辟一个空间,里面放初值3.14,返回该空间地址给指针变量p

delete 的使用举例

delete p;

共用体类型:union

跟结构体类似,不过就是把几种不同的变量存在同一段内存中,其内存长度是等于最长的成员的长度,也就是说它们相互覆盖,所以叫共用体

枚举类型:enum

enum weekday {sun,mon,tue,wed,thu,fri,sat}

使用 typedef 声明类型举例:

typedef struct Node
{
	int id;
	char name[5];
}NODE, * PNODE;

猜你喜欢

转载自blog.csdn.net/weixin_43450646/article/details/106967504