C++程序设计谭浩强(第3版)笔记

    技术2026-02-23  4

    200704

    基本知识

    2.1 c++数据类型

    3.1 基于过程的程序设计和算法

    c语言基于过程,做什么怎么做具体设计出计算机执行的每一个步骤安排执行顺序

    3.1.1 算法的概念

    一个基于过程的程序应包括: 1)对数据的描述(数据结构) 2)对操作的描述(算法) 程序=数据结构+算法 数据结构:在程序中要指定数据的类型和数据的组织形式。 算法:处理问题的一系列步骤。算法必须具体地指出在执行时每一步应当怎样做。

    3.1.2 算法的表示

    1.自然语言 2.流程图 3.伪代码 4.计算机语言表示算法即计算机程序

    3.2 c++的程序结构和c++语句

    每一个程序单位由以下3个部分组成: 1)预处理指令。如#include 2)全局变量。 3)函数。 c++程序中最小的单位是语句,分为以下4种: 1)声明语句 2)执行语句 1.控制语句:如if else 2.函数和流对象调用语句 3.表达式语句:如 i=i+1; 3)空语句 4)复合语句:可以用{ }把一些语句括起来成为复合语句

    3.3 赋值操作

    1)c++中的赋值号“=”是一个运算符。如:a=b=c=d合法 2)赋值表达式可以包括在其他表达式中。如:if((a=b)>0)合法

    c++的输入与输出

    cin>>变量1>>变量2; cout<<表达式1<<表达式2; 输入输出流控制符

    dec–设置数值的基数为10

    hex–设置数值的基数为16

    oct–设置数值的基数为8

    setfill©–设置填充字符c,c可以是字符常量,也可以是字符变量

    setprecision(n)–设置浮点数的精度为n位,一般以十进制小数位输出,n代表有效数字,在以fixed(固定小数位数)和scientific(指数)形式输出时,n为小数位数

    setw(n)–设置字段宽度为n位

    setiosflags(ios:fixed)–设置浮点数为固定的小数位显示

    setiosflags(ios:scientific)–设置浮点数以指数形式显示

    setiosflags(ios:left)–设置数组左对齐

    setiosflags(ios:right)–设置数据右对齐

    setiosflags(ios:skipws)–忽略前导空格

    setiosflags(ios:uppercase)–数据以十六进制输出时字母大写

    setiosflags(ios:lowercase)–数据以十六进制输出时字母小写

    setiosflags(ios:showpos)–输出正数时加“+”

    getchar函数和putchar函数 c语言的scanf(格式控制,输出表列)和printf(格式控制,输出表列)

    3.6 关系运算和逻辑运算

    3.6.1 关系运算和关系表达式

    运算优先级问题 1)>,>=,<,<=优先级大于==,!= 2)算数运算符>关系运算符>赋值运算符 3)关系表达式的值是一个逻辑值,真为1,假为0

    3.6.2 逻辑常量和逻辑变量

    c++增加了逻辑型数据。bool,它的值是true和false之一。 在储存布尔值时ture和false仍用1和0来储存。

    3.6.3 逻辑运算和逻辑表达式

    逻辑运算符: 1)&& 逻辑与 2)|| 逻辑或 3)! 逻辑非 优先级 1)逻辑运算符内 !>&&>|| 2)!>算数运算符>关系运算符>&&和||>赋值运算符 例: 判断闰年:1.能被4整除,但不能被100整除 2.能被100整除,又能被400整除

    (year%4 == 0 && year%100=0|| year % 400 == 0

    3.7 选择结构和if语句

    3.7.1 if语句的形式

    1)if(表达式)语句

    if(x>y) cout<<x<<endl;

    2)if (表达式) 语句1 else 语句2

    if(x>y) cout<<x; else cout<<y;

    if(表达式1) 语句1 else if(表达式2)语句2 else if(表达式3) 语句3

    3.7.2 if语句的嵌套

    if(x>y){ if(x>z){ max=x; }else{ max=z } }else{ if(y>z){ max=y; }else{ max=c; } }

    3.7.3 条件运算符和条件表达式

    表达式1?表达式2:表达式3 例如:max=(a>b)?a:b 条件运算符的执行顺序是:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值为整个条件表达式的值

    3.7.4 多分支选择结构和switch语句

    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<<"<60\n";break; default:cout<<"error\n";break; }

    3.8 循环结构和循环语句

    while(){} do{}while() for(){}

    4.1 什么是函数

    4.1.1 为什么需要函数

    一个函数就是一个功能

    4.1.2 函数调用举例

    函数不能嵌套定义

    4.1.3 函数的分类

    从用户使用的角度看,函数有两种: 1)系统函数,即库函数 2)用户自己定义的函数 从函数的形式看 1)无参函数:调用函数时不必给出参数。可以带回或不带回函数值,但一般以不带回函数值的居多。 2)有参函数:在调用函数时,要给出参数。同样可以带回函数值供主调函数使用,也可以不带回。

    4.2 定义函数的一般形式

    4.2.1 定义无参函数的一般形式

    类型名 函数名([void]) {声明部分 执行语句} 例如:void printstar(void){ }

    4.2.2 定义有参函数的一般形式

    类型名 函数名(形式参数表列) {声明部分 执行语句} 例如: int max(int x,int y) {int z; z=x>y?x:y; return(z); }

    4.3 函数参数和函数的值

    4.3.1 形式参数和实际参数

    形式参数:定义函数时函数名后面括号中的变量 实际参数:调用函数时函数名后面括号中的变量 1)形参不占用内存中的存储单元,只有发生函数调用时,形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。 2)实参可以是常量、变量或表达式,如max(3,a+b),但要求a和b有确定的值,以便在调用函数时将实参的值赋给形参。 3)实参和形参的类型应相同或者赋值兼容。以形参类型为主。 4)值传递只由实参传给形参而不能由形参传给实参。因此在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。

    4.3.2 函数的返回值

    1)函数的返回值是通过return语句获得的,它将被调用函数中的一个确定值待会主调函数。 2)如需要从被调函数中待会值则必须有return语句,如不需要则可以不要return语句。 3)一个函数可以有一个以上的return语句。 4)return语句后的括号可以要也可以不要 5)return语句后面的值可以是一个表达式,这样可以使函数体更加简短。例如:

    int max(int x,int y){return(x>y?x:y);}

    6)函数返回值的类型应该与定义函数时指定的函数类型一致。如果不一致,则以函数类型为准,即函数类型决定返回值类型。对于数值型数据,可以自动进行类型转换。

    4.4 函数的调用

    4.4.1 函数调用的一般形式

    函数名([实参表列]) 如果时无参函数,则实参表列可以没有,但圆括号不能省略。

    4.4.2 函数调用的方法

    1)函数语句。例如:printstar(); 2)函数表达式。例如:c=2*max(a,b); 3)函数参数。例如:m=max(a,sqrt(b));

    4.4.3 对被调用函数的声明和函数原型

    1)被调用的函数必须时已经存在的函数。 2)如果使用库函数,还应该在本文件开头用#include指令将有关头文件“包含”到本文件中来。例如:#include 3)函数声明:如果使用用户自己定义的函数,而该函数与调用它的函数(即主调函数)在同一个程序单位中,且位置在主调函数之后,则必须在调用此函数之前对被调用的函数作函数声明。

    函数声明: 在函数声明中可以不写形参名,只写形参类型

    float add(float,float);

    也可以带形参名

    float add(float a,float b);

    但编译系统并不会检查形参名,因此形参名是什么都无所谓。 4)对函数的外部声明:函数声明的位置可以在调用函数所在的函数中,也可以在函数之外。如果函数的声明被放在函数的外部,在所有函数定义之前,则在各个主调函数中不必对所调用的函数再做声明。

    char letter(char,char); //对函数的外部声明,作用域是整个文件 int mian(){ } char letter(char c1,char c2){} //定义letter函数

    如果一个函数被多个函数调用,用这种方式比较好,不必在每个主调函数中声明。

    4.5 函数的嵌套定义

    c++不能嵌套定义函数,但可以嵌套调用函数。

    4.6 函数的递归调用

    在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 包含递归调用的函数称为递归函数 例:

    #include<iostream> using namespace std; int age(int); int main() {cout<<age(5)<<endl; return 0; } int age(int n) {int c; if(n==1) c=10; else c=age(n-1)+2; return c; } #include<iostream> using namespace std; int main() {int n; long y; cout<<"please input an integer"; cin>>n; y=fac(n); cout<<"n!="<<y<<endl; return 0; } long fac(int n) {long f; if(n<0){ cout<<"n<0,data error!"<<endl; f=-1;} else if(n==0||n==1) f=1; else f=fac(n-1)*n; return f; }

    4.11局部变量和全局变量

    第五章

    5.2.1 定义一维数组

    定义一维数组的一般形式: 类型名 数组名[常量表达式]

    5.2.2 引用一维数组的元素

    数组元素的表达形式为 数组名[下标] 下标可以是整形常量或整形表达式 a[0]=a[5]+a[7]-a[2*3]

    5.2.3 一维数组的初始化

    (1)在定义数组时对全部数组元素赋初值

    int a[10] = {0,1,2,3,4,5,6,7,8,9};

    (2)可以只给一部分元素赋值

    int a[10]={0,1,2,3,4};

    表示只给前面5个元素赋值,后5个元素值默认为0 (3)在对全部数组元素赋初值时,可以不指定长度

    int a[5]={1,2,3,4,5}; int a[ ]={1,2,3,4,5};

    在第二种写法中,花括号中有5个数,系统就会据此自动定义a数组的长度为5。但若被定义的数组长度与提供初值的个数不相同,则数组长度不能省略。

    5.3.1 定义二维数组

    定义二维数组的一般形式为 类型名 数组名[常量表达式] [常量表达式]

    float a[3][4];

    定义a为3*4(三行四列)的单精度数组

    5.3.2 引用二维数组的元素

    一般形式 数组名[下标] [下标]

    5.3.3 二维数组的初始化

    (1)按行给二维数组全部元素赋初值

    int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11}};

    比较直观的赋值方法 (2)可以将所有数据写在一个花括号内,按数组排列的顺序对全部元素赋初值。

    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

    数据多时不如第一种方式直观 (3)可以对部分元素赋初值

    int a[3][4]={{1},{2},{3}}

    它的作用是对各行第一个元素赋初值,其余元素值自动置为0. 也可以对各行中的某一元素赋初值:

    int a[3][4]={{1},{0,6},{0,0,11}}

    当然也可以只对某几行元素赋值 (4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。

    5.5 字符数组

    5.5.1 定义和初始化字符数组

    初始化时可以一次定义各个位置的字符

    char c[10]={'I',' ','a','m',',',' ','h','a','p','p','y'};

    5.5.2 字符数组的赋值与引用

    赋值时不能像定义初始化一样一次性赋值

    char a[3]; c[0]='a'; c[1]='b'; c[2]='c';
    Processed: 0.011, SQL: 9