版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、C+标识符的命名规则1. 所有标识符必须由一个字母(az或AZ)或下划线(_)开头;2. 标识符的其它部分可以用字母、下划线或数字(09)组成;3. 大小写字母表示不同意义, 即代表不同的标识符,如前面的cout和Cout;二、如何正确地声明变量及其初始化2. C+中变量定义的格式: 类型名 变量名1,变量名2,变量名n ; 如:int num1, num2; (2.1)在C+中,每个变量在使用前必须被定义,以便
2、编译器检查变量使用的合法性。变量定义只是给变量分配相应的空间。 (2.2)C+允许在定义变量的同时给变量赋初值。变量未被赋值前,值为未知 格式: 类型名 变量名 = 初值;或者:类型名 变量名(初值); 如:int count = 0; 或 int count(0); 都是定义整型变量count,并为它赋初值0。
3、160;可以给被定义的变量中的一部分变量赋初值,如:int sum = 0, count = 0, num; (2.3)一旦定义了一个变量,可以将一个常量赋给该变量。变量赋值过程是“覆盖”过程,用新值去替换旧值 如 int a; a=123; 或 a = 0x123;
4、160;都是正确的 (2.4)在C+中, 定义变量时没有赋初值,然后直接引用该变量是危险的!3. 数据类型(data type):数据的编码方式、值域和可执行的操作。数据类型包括两个方面:数据的取值范围、可用的操作。C/C+中的数据类型分为两大类:基本数据类型:整型、浮点型、字符型和布尔型构造数据类型:字符串、数组、结构、联合和枚举 (3.1)整型(int):以补码形式存储。基本型 int ;长整型long: long / long int
5、0; (3.1.1)整数运算时要注意数据的表示范围。如整数用两个字节表示,正整数 32767 加 1 的结果为 -32768。这称为整数运算的溢出,系统不检查这样的错误,程序员必须自己保证程序中不出现这样的错误。 (3.1.2)在某些应用中,不可能出现负数,则整型数中有一半的数值范围是被浪费的。因此在C/C+中可以将所有的数都看成正整数,称为无符号数。无符号数的定义:在各种整数类型前加上关键词unsigne
6、d,变成unsigned int, unsigned short, unsigned long (3.2) 实型:以浮点表示,操作类似于整型,浮点数无法精确表示。 (3.2.1)浮点类型的分类: 单精度 float ;双精度 double(3.3)字符型(char):存放一个字母或符号,占一个字节,存放的是字符的内码。可执行比较、连接等运算。具有双重属性:整数属性和字符属性,整数属性:字符类型即单字节的整数类,字符属性:数据值即为相应字符的
7、0;Ascii 码。字符类型名:char。可分为可打印字符:小写字母、大写字母、数字、标点符号、空格等;非打印字符:换行和报警字符或响铃 等控制字符 (3.4)布尔型(bool): 只有“真”、“假”两个值。可执行判断运算。如 bool flag=true; (3.5)字符串(string):是类类型,用双引号“ ”表示,可执行字符串比较,连接应用时要加 #include <string>如 string str= “dfhds
8、f”; 三、如何声明常量4.常量:值的直接表示。如1、3、1.57、“A等,又称直接量。 (4.1) 整型常量可用十进制、八进制和十六进制表示: 如十进制: 123, -234;八进制: 0123 十六进制:0x123, 0x3a2f (4.2)浮点数常量有两种表示法: (1)十进制表示:1.23 , 3.14; (2)科学计数法:尾数e指数 123e2=12300
9、;2.25e-3=0.00225 ; 注意:尾数不能为空,指数必须为整数 (4.3)字符常量:”a, “S, ”2等用一对单引号括起来的数据。字符串常量用双引号 (4.4)命名常量:为值指定一个描述性的文字,增加程序的可读性。在C+语言中,用const修饰,如 const double PI =3.14; 见 PI即知3.14。注意一般变量名需大写,如PI。 二、算术运算符号及其运行规则a) 整数除整数b) % 求模运
10、算5.算术运算符:+(加) -(减) *(乘) / (求商) %(求余) (5.1)“-”可为二元运算符,也可为一元运算符,其余所有的算术运算符都是二元运算符。 (5.2)优先级:高 * / %, 低 + - (5.3)整型与整型数运算,结果为整型,如 5 / 2 = 2 ;整型与浮点数运算,结果为浮点
11、数,如5 / 2.0 = 2.5 ;字符与整型数运算,结果为整型;字符与浮点数运算,结果为浮点数。 浮点数与浮点数运算,结果为浮点数。 “%”运算符:取余,其两边都必须是整型数。 6.关系运算符: >, >=, =, <=, <,
12、 != (6.1) 优先级:高于赋值运算符,低于算术运算符。关系运算符内部:=和 !=较低 (6.2)关系表达式:用关系运算符将二个表达式连接起来称为关系表达式。关系表达式的结果是 true 或 false。“等于”运算符是由两个等号组成。常见的错误是在比较相等时用一个等号。=(相等),=(赋值) 7. 逻辑运算符 :&& (and)
13、0; | (or) ! (not) (7.1)优先级: ! 高于 关系运算符 高于 && 高于| (7.2)逻辑表达式:由逻辑运算符连接起来的表达式,其结果为“真(true)”或“假(false)” 逻辑表达式在执行时,先处理
14、左边。如左边已能决定此逻辑表达式的结果,则右边不执行。因此,在&& 逻辑表达式中,应把false可能性较大的条件放在左边,在|表达式中,应把true可能性较大的条件放在左边,这样可以减少程序执行的时间 8赋值运算符:= 的优先级比算术运算符低 (8.1)赋值语句: 把一个值赋给一个变量。如x = y + z; x = 3.14; 赋值语句的左边是变量,右边是表达式。 (8.2)赋值表达式格式:<变量>
15、160;= <表达式> 如x = x + 2。 作用:将右边的表达式的值存入左边的变量,整个表达式的值是右边的表达式的结果。 赋值运算符是右结合的 (8.3)左值(lvalue): 在C+中,能出现在赋值运算符左边的表达式称为左值 右值(rvalue):赋值运算符右边的表达式的值 (8.4)赋值语句:赋值表达式后面加上分号。 (8.5)将赋值表达式作为更大的表达式的一部分 。如:a =&
16、#160;(x = 6) + (y = 7) 等价于分别将x 和 y 的值设为6 和 7,并将6和7相加,结果存于变量a (8.6)其他运算符与赋值运算符结合的运算符称为复合赋值运算符。 格式:变量 op= 表达式; 等价于:变量 = 变量 op 表达式; 常用的复合赋值运算符有:+=,=,*=,/=,%= 如: balance
17、60;+= deposit; balance -= surcharge; x /= 10; salary *=2; (8.7)赋值和运算时的自动类型转换,在进行赋值操作时,会发生类型转换,将取范围小的类型转为取值范围大的类型是安全的反之是不安全的,如果大类型的值在小类型能容纳的范围之内,则平安无事 强制类型转换: (类型名)(表达式);或类型名 (表达式);如z = (double)x /
18、 y; 静态转换(static_cast):用于编译器隐式执行的任何类型转换 格式:转换类型<类型名> (表达式) 如 z = static_cast<double>(x) / y; 1. 单个分号组成的语句成为空语句 2. 用 括起来的一组语句称为复合语句。在逻辑上看成一个语句。 v 复合语句可
19、以放在任何单语句出现的地方。 3. 在复合语句中可以定义变量,但必须定义在最前面。 4. 逗号表达式语句格式:表达式1,表达式2,,表达式n v 逗号运算符的优先级是所有运算符中最低的 如a的初值为0,则表达式 a += 1, a += 2, a += 3, a += 4, a += 5的结果为 15 5. 前置
20、 +i, -i (先执行i+1或i-1,再使用i值)6.后置 i+, i- (先使用i值,再执行i+1或i-1) If语句c) 形式d) 三种If语句的执行流程9. 控制语句: 改变程序中语句的执行次序。 (9.1)if语句: 两个分支:条件测试为true时所执行的程序块叫做then子句,条件为false时执行的语句叫做else子句。 格式( 1 )
21、 if (条件测试) 语句;即else语句可省略 格式(2) if (条件测试) 语句1; else 语句2; eg. if (grade >= 60) cout << “passed
22、”; eg. if (grade >= 60) cout << “passed”; else cout << “failed”; (3)多分支语句:
23、条件1为true时所执行的程序块1,条件1为false但满足条件2时执行的语句块2,。依次类推,条件n-1为false但满足条件n时执行else语句。常见的有 3分支语句:ifelse ifelse。 eg. if (grade >= 90) cout << “A”;
24、; else if (grade >= 80) cout << “B”; else if (grade >= 70) cout << “C”;
25、0; else if (grade >= 60) cout << “D”; else cout &l
26、t;<”E”; (9.2)条件语句使用注意 条件的结果值应该是 true 或 false,它们是C+中bool类型的值 条件可为任意表达式,不一定是关系表达式。0 为false,非 0 为true。 if 语句可以没有else子句。合理的缩排。 if语句的then子句和else子句含有if语句,称为if语句的嵌套。 eg if (x < 100) if (
27、x < 90) 语句1; else if (x<80) 语句2; else 语句3; else 语句4; 歧义性:如最后一个else跟哪个if 配对.。 eg if (y != 0)
28、; if (x != 0) result = x / y; else cout<<“error :y = 0”<<endl; 配对原则:每个else子句是和在它之前最近的一个没有else子句的if语句配对。
29、 在每个if-else语句后加一对大括号 是一种良好习惯,特别是有两个以上的复合语句需要执行时。 (9.2)条件表达式:作用:更加简练的用来表达条件执行的机制 ?:运算符 :问号冒号运算符 形式 : (条件) ? 表达式1 : 表达式2 eg: max = x > y ?
30、x :y; 循环语句e) 形式f) 三种循环语句的区别g) 三种循环语句的执行流程10.循环语句:一个完整的循环结构一般由四部分组成: (10.1)For 语句:主要用于计数循环 v 格式:for(表达式1;表达式2;表达式3) 语句;or语句快; 可以理解为:for(循环变量赋初值;循环条件;循环变量增值) 符合循环条件时的执行语句 v 循环体可以是复合语句或空语句。 v 循环里所有语句的一次完全执行称为一个循环周期
31、。 v 执行过程:先执行表达式1,再执行判断表达式2,如果为true,执行一次循环体(即一个循环周期),接着执行表达式3,然后重新执行判断表达式2,若为true,又执行一次循环体,重复直至判断表达式2为false,,最后跳出整个循环。若开始执行条件表示2为false, 循环体一次也不执行。 v For循环的三个表达式可以是任意表达式。三个表达式都是可选的。 v 如果循环不需要任何初始化工作,则表达式1可以缺省。如循环前需要做多个初始化工作,可以将多个初始化工作组合成一个逗号表达式,作为表达式1。 如fo
32、r (int i=0,; i<=10; +i) v 表达式2也不一定是关系表达式。它可以是逻辑表达式,甚至可以是算术表达式。当表达式2是算术表达式时,只要表达式的值为非0,就执行循环体,表达式的值为0时退出循环。 v 如果表达式2省略,即不判断循环条件,循环将无终止地进行下去。无终止的循环称为“死循环” ,最简单的死循环是 for ( ); (10.2)While语句: 与for循环等价,可相互代替。 v 格式:wh
33、ile(表达式) 语句;or 语句块; v 执行过程:先计算出条件表达式的值。如果是false,循环终止;如果是true,整个循环体将被执行,而后又回到while语句的第一行,再次对条件进行检查,若为true,接着执行循环体,重复直到条件为false,,跳出整个循环。 v 用途:用于循环次数不定的循环。循环是否结束取决于某一个变量的值(标记控制重复) v 在for和while语句之后一般没有分号,有分号表示循环体就是分号之前的内容(空循环体) (10.3) &
34、#160; Do- While语句 v 格式: do语句;or 语句块; while (表达式); v 执行过程:首先执行语句,然后判断表达式的值。如果表达式为0,继续向下执行,否则,再次执行语句,再次判断表达式的值 v 用途:用于至少执行一次的循环。注意后面有分号; 11跳转语句: v break语句:跳出整个循环或switch语句。若有多重循环,跳出含break最近的循环体。 v con
35、tinue语句:跳出当前本次循环,接着判断是否执行下次循环周期。 12 几种典型的循环。注意格式及应用 v 输入验证循环:以下两种等价,右边一个常用 cout <<"请输入半径:" /提示输入 do cout <<“请输入半径:" cin>>radius; area = PI * radius
36、60;* radius while ( radius < 0) / 当radius
37、 < 0,重复输入,直到>0 2.while(true) / 或while (1) &
38、#160; for ( )
39、160; cout << “输入一个正整数:"/提示用户并读入数据 &
40、#160; cin >>num; if (num = -1) break; / if (num=标志) 跳出; sum +
41、= num; /处理数据 v 查询循环
42、60; 累加循环 p=0; char ans; /用于用户响应
43、0; for(int i=1;i<=N;i+) cout <<"请输入半径:" /提示输入 &
44、#160; p=p+i; cin >> radius; area = PI * radius * radius
45、0; 累乘循环 : p=1 cout << "area = " <<area <<endl;
46、160; for(int i=1;i<=N;i+) cout << "do you again?"<<endl; /询问提示
47、; p=p*i; cin >>ans; /询问输入 while(ans = 'Y'| ans = 'y'); /询问循环 v 编译(compiler):将高级语言的程序翻译成机器语言,分为解释执行,编译执行
48、160;v 连接(link):将目标程序与已有的其它目标程序连接起来,产生一个可执行的程序 v 输出流是传给显示器的数据流,将变量或表达式的内容显示在显示器上 格式 Ø 输出一个变量的值:cout << a; Ø 输出多个变量的值:cout << a << b << c; Ø 输出表达式的结果:cout <<
49、; “Hello worldn” << endl Ø 上述情况的组合: cout << a << “+”<< b << “=”<< a+b << endl; v 键盘流入的数据流,将键盘输入的数据存入变量 格式: cin >>变量1
50、60;>> 变量2 >> >> 变量n; 如 cin >> a; 当程序执行到cin时会停下来等待用户的输入,后面一定是变量名,不可加引号 用户可以输入数据,用回车()结束。 当有多个输入数据时,一般用空白字符(空格、制表符和回车)分隔。 如:a为整型,d为double,则对应于cin >> a >>d,用户的输入可以为
51、0;12 13.2 or 12(tab键)13.2 or 1213.2 如何定义一个带默认值参数的函数如何调用一个带默认值参数的函数h) 参数使用默认值i) 参数不使用默认值 函数v 过程单元是程序的基本单位。在过程化的语言中,过程单元就是程序中某个模块的表示。在面向对象的语言中,过程单元说明对象对各种事件是如何响应的。 v
52、160;每个程序都必须有一个名为main的函数,它是程序的入口。主程序由一个或多个函数组成 v 程序主体(主函数main():主要包含如下模块:(definition input-proocess-ouput) (1)变量定义:为程序中的数据准备存储空间 ( declaration or definition) (2)输入阶段:接受所需输入的信息。它由两部分组成:显示提示信息和接收输入(input) (3)计算阶段:完成所需的计算(process) (4)输出阶段:输出计算
53、的结果(output) v 函数的主要构成:函数声明,函数定义,函数调用 v 可以把函数想象成数学中的函数。如f(x)=2x 参数表是一组自变量x,返回类型是函数值的类型; 函数声明就是设函数为f(x), 函数定义(函数头+函数体)就是函数表达式如2x,函数调用就是带值计算如f(2)=2×2。 v 函数声明:类似于变量声明,所有函数在使用前必须被声明。又称函数的原型,功能:说明函数和外界的交流,反映函数调用的全部信息。 包括下列内容:函数名,函数的参数类型,函数的返回类型 它
54、的形式为: 返回类型 函数名(参数表); 返回类型:是函数的输出值的类型, void 函数没有返回值 函数名:是函数的名字。程序可以通过函数名执行函数体的语句 参数表:是函数的输入, 无参数列表,可不写,但是括号必须有。参数表中的参数说明之间用“,”分开,每个参数说明可以是类型,也可以是类型后面再接一个参数名。如:int max(int, int); int max(int a, in
55、t b); int main( ) v 函数定义:函数头+函数体,相当于一个小程序。 函数头:说明函数和外界的交流,与函数声明一样,参数表要有形参,void除外 函数体: 一系列独立的程序步骤;,必须定义在函数体最前面 形式:返回类型 函数名(参数表)/函数头 c
56、ode here; /函数体 Eg : int max(int a, int b) /函数定义
57、; if (a > b) return(a); else return(b); v 函数调用形式: 函数名(实际参数表);一般出现在主调函数中或其他调用函数中。 eg. max( x ,y); v
58、0;函数执行过程: (1) 在主程序中计算每个实际参数值。 (2) 调用时将实际参数的值赋给对应的形式参数。在赋值的过程中完成自动类型转换。 (3) 进入函数体依次执行函数体的每个语句,直到遇见return语句或函数体结束 (4) 计算return后面的表达式的值,如果表达式的值与函数的返回类型不一致,则完成类型的转换。 (5) 用函数的返回值置换函数,继续主程序的执行。 Eg int max(int
59、60;a, int b); /函数声明 int main( ) int x, y;cin >> x >> y; cout << max(x + 5, y - 3);/函数调用 int max(int a, int b) /函数定义
60、160; if (a > b) return(a); else return(b); v 注意: (1) 形式参数和实际参数的个数(number)、排列次序(order)、类型(type)要完全相同。 (2) 实际参数可以是常量、变量、表达式,甚至是另一个函数调用 (3) 传递方式:值传递,执行函数调用时,将实参值传递给形参,并替换形参同名的实体 (4)
61、60;值传递:函数获得了主调程序参数变量值的拷贝。被调程序可以改变这些拷贝,但这对主调程序的环境没有影响。 (5)请注意:C+中不允许函数定义嵌套,即在函数定义中再定义一个函数是非法的。一个函数只能定义在别的函数的外部,函数定义之间都是平行的,互相独立的。 例如:下面的代码在主函数中非法嵌套了一个f()函数定义: void main() void f() / &
62、#160; 函数参数的传递比较: 1. 按值传递 以按值传递方式进行参数传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的长度,然后把已求出的实参表达式的值一一存入到为形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。这种方式被调用函数本身不对(主调函数中)实参进行操作,也就是说,即使形参的值在函数中发生了变化(主调函数中)实参的值也完全不会受到影响,仍
63、为调用前的值。 例:按值传递。 void swap(int,int);/函数定义 void main() int a=3,b=4; cout<<"a="<<a<<",b=“ <<b<<endl; swap(a,b); /函数调用
64、160; cout<<"a="<<a<<",b=" <<b <<endl; void swap(int x,int y)/函数定义 int t=x; x=y; y=t; 此程序的运行结果为:a=3,b
65、=4 a=3,b=4 2. 地址传递 如果在函数定义时将形参的类型说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式即为地址传递方式。这种地址传递与上述的按值传递不同,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。 例:地址传递。 void swap(int *x ,int *y);/函数声明
66、void main() int a=3,b=4; cout<<"a="<<a<<",b=“ <<b<<endl; swap(&a,&b);、 cout<<"a="<<a<<",b=“ <
67、<b<<endl; void swap(int *x,int *y) int t=*x; *x=*y; *y=t; 此程序的运行结果为:a=3,b=4 a=4,b=3 3. 引用传递 按值传递方式容易理解,但形参值的改变不能对实参产生影响;地址传递方式虽然可以使得形参的改变对相应的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序容易产生错误且难
68、以阅读。如果以引用作为参数,则既可以使得对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。 例引用传递。 void swap(int &,int &); void main() int a=3,b=4; cout<<"a="<<a<<",b=“
69、160; <<b<<endl; swap(a,b); cout<<"a="<<a<<",b=“ <<b<<endl; void swap(int &x,int &y) int t=x; x=y; y=t;&
70、#160; 此程序的运行结果为:a=3,b=4 a=4,b=3 函数的嵌套调用: 函数体 由前述可知,C+函数不能嵌套定义,即一个函数不能在另一个函数体中进行定义。但在使用时,允许嵌套调用,即在调用一个函数的过程中又调用另一个函数。 例如: func1(int a, float b) float c
71、; c=func2(b-1,b+1);/嵌套调用,func1调用func2 int func2(float x, float y) /函数体 /func1和func2是分别独立定义的函数,互不从属。如何定义一个递归函数j) 汉诺塔k) 求最大公约数l) 计算阶乘函数的递归调用: &
72、#160;一个函数直接或间接地调用自身,这种现象就是函数的递归调用。 递归调用有两种方式:直接递归调用和间接递归调用。直接递归调用即在一个函数中调用自身,间接递归调用即在一个函数中调用了其他函数,而在该其他函数中又调用了本函数。 利用函数的递归调用,可将一个复杂问题分解为一个相对简单且可直接求解的子问题(“递推”阶段);然后将这个子问题的结果逐层进行回代求值,最终求得原来复杂问题的解(“回归”阶段)。 例:求n的阶乘。(函数递归调用的例程。) long f(int
73、;n) if(n<0) cout<<“error!“ <<endl; return(-1); else if(n<=1) return(1); else
74、0; return (n*f(n-1);/自己调用自己 void main() long f(int n); int n; cout<<"input n:" <<endl; cin>>n; cout<<"n!="<<f(n)
75、160; <<endl; 此程序的运行结果为:please input n:5 n!=120 程序的内存区域: 一个程序将操作系统分配给其运行的内存块分为4个区域。 (1)代码区,存放程序的代码,即程序中各个函数中的代码块。 (2)全局数据区,存放程序全局数据和静态数据。 (3)堆区,存放程序的动态数据。 (4)栈区,存放程序的局部数据,即各个函数中的数据
76、。 如何使用变量(变量的作用是什么?)2.局部变量。 在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使用这些变量了。所以内部变量也称“局部变量”。 关于局部变量的作用域还要说明以下几点: 1主函数main()中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。 2形参变量也是内部变量,属于被
77、调用函数;实参变量,则是调用函数的内部变量。 3允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。 4在复合语句中也可定义变量,其作用域只在复合语句范围内。 3.全局变量 (1)在函数外部定义的变量称为外部变量。以此类推,在函数外部定义的数组就称为外部数组。 (2)外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本文件结束为止。 (3)外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量 对于全局变量还有以下几点说明:
78、160;(1)外部变量可加强函数模块之间的数据联系,但又使这些函数依赖这些外部变量,因而使得这些函数的独立性降低。从模块化程序设计的观点来看这是不利的,因此不是非用不可时,不要使用外部变量。定义但不初始化,则自动赋以""(整型和实型)或'0'(字符型) (2)在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。 (3)外部变量的作用域是从定义点到本文件结束。如果定义点之前的函数需要引用这些外部变量时,需要在函数内对被引用的外部变量进行说明。外部变量说明的一般形式为: extern
79、0; 数据类型 外部变量,外部变量2; 注意:外部变量的定义和外部变量的说明是两回事。外部变量的定义,必须在所有的函数之外,且只能定义一次。而外部变量的说明,出现在要使用该外部变量的函数内,而且可以出现多次。 静态局部变量1.定义格式: static 数据类型 内部变量表; 2.存储特点 (1)静态局部变量属于静态存储。在程序执行过程中,即使所在函数调用结束也不释放。换句话说,在程序执行期间,静态内部变量始终存在,但其它函数是不能引用它们的。
80、160;(2)定义但不初始化,则自动赋以""(整型和实型)或'0'(字符型);且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值! (3)何时使用静态局部变量 §需要保留函数上一次调用结束时的值。变量只被引用而不改变其值。 一维数组m) 如何正确地声明一维“静态”数组并初始化i. 初始化列表的长度与数组大小的关系ii. 数组大小必须是整型常量n) 如何使用数组元素i. 通过“索引值”访问数组中的具体元素ii. 对“索引值”的说明(整型值、从0开始)o) Josep
81、hus问题p) 筛选质数13.数组: v 数组是一组同类元素,它有两个特征: Ø 数组元素是有序的 Ø 数组元素是同类的 v 定义数组要定义三个基本内容: Ø 数组名字 Ø 数组元素的类型 Ø 数组的大小 v 定义格式: 类型 数组名元素个数;
82、0; 其中,元素个数必须是常量。如: int intarray10; 但 int n=10; int intarrayn; 是错的 v 常用的方法是将元素个数定义为一个常量。如: Const&
83、#160;int NumOfElement= 10; int intarrayNumOfElement; 相当于 int intarray10; v 声明数组时可以对数组初始化 float x5 = -1.1, 0.2,
84、33.0, 4.4, 5.05 v 初始化表的长度短于要被初始化的数组元素数目,那么剩余元素被初始化为0。 v 带有初始化的数组可以不定义长度 int a=1,2,3,4,5; 则默认数组大小为5 v 数组元素的使用是通过数组名及元素的序号来指定,如intarray2。当数组的大小为n时,元素的序号为0 n-1。 v 元素的序号称为下标。程序中,下标
85、可为整数、整型变量或结果为整型的任意表达式 v 定义数组就是定义了一块连续的空间,空间的大小等于元素数*每个元素所占的空间大小。 v 数组元素按序存放在这块空间中。 v C+语言不检查数组下标的超界。如定义数组 int intarray10; 合法的下标范围是0 9,但如果你引用intarray10,系统不会报错。如数组intarray 的起始地址是1000,则引用intarray10,则系统对1040号内存进行操作。而1040可能是另一个变量的地址 v
86、;解决方法:由程序员自己控制。在对下标变量进行操作前,先检查下标的合法性。 v 由一系列字符组成的一个单元称为字符串 v 字符串: v 在C+中,字符串常量用一对双引号括起来。如”Hello,world” v 字符串变量:用字符类型的数组来表示 v 字符串的本质是一系列的有序字符,因此可以用一个字符数组来保存这组字符 。用数组名表示这个字符串 v 由于数组名是数组的起始地址,因此该字符串从该地址开始存储。但到哪里为止?C+用0表示
87、字符串的结束。 v 字符串所需的存储空间比实际的字符串长度大1 v 如要将字符串”Hello,world”保存在一个数组中 ,该数组的长度为12 v Char ch= H, e, l, l, o, , w, o, r, l, d, 0; v char ch = ”Hello,world”; v char c
88、h = ”Hello,world”; v 不包含任何字符的字符串称为空字符串。 v 空字符串占用的空间为1个字节,存储0 v 注意a和“a”的区别 v 逐个字符的输入输出:这种做法和普通的数组操作一样。v 将整个字符串一次性地用cin和cout输入或输出。 v 通过函数get和put输入输出。 v get函数 v 从终端接受一个包含任意字符的字符串。 v 格式:cin.g
89、et(ch) ch为char型 v put函数 v 将一个字符串(以0结束的字符序列)输出到终端 v 格式: cout.put(ch) ch为char型 v 字符串不能直接用系统的内置运算符进行操作 v C+的函数库中提供了一些用来处理字符串的函数。这些函数在库cstring中 v C+还提供了一个string类来处理字符串 函数 作用 strcpy(dst, src)&
90、#160;将字符从 src拷贝到dst。函数的返回值是dst的地址 strncpy(dst, src, n) 至多从 src 拷贝n个字符到dst。函数的返回值是dst的地址 strcat(dst, src) 将 src 接到 dst 后。函数的返回值是dst的地址 strncat(dst, src, n) 从 src 至多取 n 个字符接到 dst 后。函
91、数的返回值是dst的地址 strlen(s) 返回s的长度 strcmp(s1, s2) 比较 s1 和 s2。如 s1 > s2 返回值为正数,s1=s1返回值为0,s1<s2返回值为负数 strncmp(s1, s2, n) 如 strcmp,但至多比较n个字符 strchr(s, ch) 返回一个指向s中第一次出现ch的地址 strrchr(s, ch)
92、60;返回一个指向s中最后一次出现ch的地址 strstr(s1, s2) 返回一个指向s1中第一次出现s2的地址 如何定义一个函数q) 函数返回类型r) 函数名s) 参数列表i. 一维数组作为参数,该如何处理?ii. 二维数组作为参数,该如何处理?t) return语句数组作为函数的参数小结: v 可以将数组元素传递给函数,这时实际参数用的是数组元素 函数调用判断是否为素数 isprime(ai); 函数定义bool isprime&
93、#160;(ai); v 也可以将整个数组传递给函数,这时实际参数用的是数组名。 如 函数调用sort(a,n); 函数定义sort(int a, int n); v 数组传递的实质是传递地址。把实际参数中的数组首地址作为形式参数中的数组的首地址 v v 数组在函数中的定义:函数原型应该体现数组参数是一个数组,所以用无数组大小定义的方括号表示数组。你可能希望规定数组的大小,但在C+语言中并不检查数组的界限,
94、所以在函数中也没必要知道数组的大小。数组大小只在数组定义中明确(为了申请内存量)。 v 数组的每一个元素又是数组的数组称为多维数组 v 最常用的多维数组是二维数组,又称为矩阵 v 二维数组的定义格式: 类型说明 数组名常量表达式1常量表达式2 v 存放次序:按行存放 int a45; v vector类模板是一种更加健壮,
95、160;且有许多附加功能的数组 v 附加功能例如: 提供下标越界检查; 提供数组用相等运算和大小比较 提供数组间赋值等运算 指针u) 利用指针移动(指针加法、减法运算),处理数组中的不同元素。v) 利用new/delete处理一维动态数组指针与引用 v 指针就是把地址作为数据,可以把地址存储在内存中 v 指针变量:存储地址的变量 v
96、 变量的指针:当一个变量存储另一个变量的地址时,那我们说它就是那个变量的指针 v 如何定义一个变量是指针? 类型标识符 *指针变量; 如:int *intp; double *doublep v 如何把某一变量的地址置入一个指针变量中?因为我们不知道系统分配给变量的真正地址是什么。 Ø 用
97、地址运算符 “&” 解决。如表达式 “&x” 返回的是变量 x 的地址。 如:intp = &x; Ø & 运算符后面不能跟常量或表达式。如 &2 是没有意义的,&(m * n + p )。也是没有意义的 v 如何用指针变量处理和改变它所指向的单元的值? Ø 用引用运算符 “*” 解决。
98、如 *intp 表示的是 intp 指向的这个单元的内容。 Ø 在对 intp 使用引用运算之前,必须先对 intp 赋值 如有:int X, *intp, Y;X=3;Y=4 intp=&X; 注意:不能用 int p=100;因为我们永远不知道变量存储的真实地址,而且程序每次运行可能都不同。 v 指针变量可以指向不同的变量。如上例中int
99、p指向x,我们可以通过对intp的重新赋值改变指针的指向。如果想让intp指向y,只要执行intp=&y就可以了。这时,intp与x无任何关系。 v 同类的指针变量之间可相互赋值,表示二个指针指向同一内存空间。 v 空指针 Ø 指针没有指向任何空间 Ø 空指针用常量NULL表示,NULL的值一般赋为0 Ø 不能引用空指针指向的值 v 指针在使用前必须初始化。 v 仅和别的变量一样定义指针,不初始化是一个比较普通的
100、错误。 v 没有初始化的指针可能指向任意地址,对这些指针作操作可能会导致程序错误。v NULL是一个特殊指针值,称为空指针。它的值为0。它可被用来初始化一个指针,表示不指向任何地址。 v 指向数组元素的指针 Ø 数组元素是一个独立的变量,因此可以有指针指向它。如:p = &a1, p = &ai Ø 数组元素的地址是通过数组首地址计算的。如数组的首地址是 1000,则第 i 个元素的地
101、址是1000 + i * 每个数组元素所占的空间长度 v 数组名可以看成是常量指针,对一维数组来说,数组名是数组的起始地址,也就是第0个元素的地址 v 如执行了p=array,则*p与array0是等价的,对该指针可以进行任何有关数组下标的操作 例如:有定义 int a10, *p并且执行了 p=a, 那么可用下列语句访问数组a的元素 for ( i=0; i<10; +i ) cout << pi; for ( i=0; i<10; +i )
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度科技研究与开发合同
- 《论我国民事拟制自认制度的完善》
- 《吉利并购沃尔沃汽车的绩效分析》
- 《同人作品的权利冲突研究》
- 《绿色金融对制造业转型升级的影响研究》
- 《天津市常见观赏树种光合特性及生态功能研究》
- 2024年哈尔滨客运资格考试技巧答题软件
- 2024年南昌客运资格证考试题库答案
- 2024年银川客运资格证考题技巧和方法
- 人教部编版六年级语文上册第13课《桥》精美课件
- 2024二十届三中全会知识竞赛题库及答案
- 预防接种工作规范(2023年版)解读课件
- 医院检验外包服务项目招标文件
- 档案整理及数字化服务方案
- 正高级会计师答辩面试资料
- 田间生产管理记录档案
- 道路桥涵工程施工方案(完整版)
- 智慧城市建设论文5篇
- 人教版八年级地理(上册)期中试卷及答案(完整)
- 园林绿化工程施工及验收规范(完整版)
- 光伏冬季施工方案(1)(完整版)
评论
0/150
提交评论