1、C+程序设计语言程序设计语言121.1 1.1 计算机程序设计语言计算机程序设计语言1.2 C+1.2 C+程序设计语言程序设计语言 1.1 程序设计的基本概念程序设计的基本概念1.计算机与程序计算机与程序l计算机已渗入到我们日常生活的方方面面,它几乎无所不能;计算机已渗入到我们日常生活的方方面面,它几乎无所不能;l计算机所做的一切都是人所赋予的;计算机所做的一切都是人所赋予的;l计算机程序是人向计算机发出的指令的有序集计合;计算机程序是人向计算机发出的指令的有序集计合;l人机交互需要特定的计算机语言人机交互需要特定的计算机语言程序设计语言。程序设计语言。31.1 程序设计的概念程序设计的概念
2、2.计算机程序设计语言计算机程序设计语言 计算机的工作是受程序控制的,任何一个计算机程序必须由某种程序设计计算机的工作是受程序控制的,任何一个计算机程序必须由某种程序设计语言来描述。语言来描述。程序设计语言经历了从程序设计语言经历了从机器语言机器语言、汇编语言汇编语言到到高级语言高级语言这样一个发展过程。这样一个发展过程。C+程序设计语言属于高级语言。程序设计语言属于高级语言。4机器语言:5l直接用计算机能识别的二进制指令来书写;直接用计算机能识别的二进制指令来书写;l直接对计算机硬件产生作用;直接对计算机硬件产生作用;l不同型号计算机的不同型号计算机的“机器语言机器语言”不一样,难理解,不利
3、不一样,难理解,不利于被掌握和推广,只有少数计算机专家或者从事相关工于被掌握和推广,只有少数计算机专家或者从事相关工作的专业技术人员才能使用。作的专业技术人员才能使用。汇编语言:6l是符号化是符号化的的机器语言,用简单助记符来代替机器语言中机器语言,用简单助记符来代替机器语言中的操作指令;的操作指令;例如,机器语言例如,机器语言中,中,二进制代码二进制代码1011011010110110代表加法运算代表加法运算,汇编语言中,汇编语言中则用助记符则用助记符ADDADD表示。表示。l较易理解,方便推广和应用;较易理解,方便推广和应用;l需要需要编译编译成机器语言才能被成机器语言才能被计算机计算机执
4、行,但编译工作可执行,但编译工作可以用专门的工具软件完成。以用专门的工具软件完成。高级语言:7l以近似于自然语言的方式描述程序指令;以近似于自然语言的方式描述程序指令;例如,例如,if(x0)y=x;else y=-x;l更更易理解,更方便推广和应用;易理解,更方便推广和应用;l同样需要同样需要编译编译成机器语言才能被成机器语言才能被计算机计算机执行;执行;l例如,例如,C+、C、Basic、Java等程序设计语言均属于高级程等程序设计语言均属于高级程序设计语言。序设计语言。1.2 C+程序设计语言程序设计语言1.简单简单C+程序框架结构程序框架结构#include using namespa
5、ce std;int main()cout 变量变量1 变量变量2 对象对象n;1.3 C+程序设计简介程序设计简介9l只能用变量接受输入的数据;只能用变量接受输入的数据;l用户可以用以下两种方式从键盘输入数据:用户可以用以下两种方式从键盘输入数据:a)所有数据全部输入后再回车确认,但各数据之间以空格分隔;所有数据全部输入后再回车确认,但各数据之间以空格分隔;b)每个数据输入后立即回车确认。每个数据输入后立即回车确认。例:如果希望将键盘输入的整数例:如果希望将键盘输入的整数10,11,12,13,14 分别依次分别依次存入变量存入变量 a,b,c,d,怎样键盘输入数据?怎样键盘输入数据?int
6、 a,b,c,d;cin a;cin b c d;C+标准输出格式为:标准输出格式为:cout 数据数据1 数据数据2 数据数据n;1.3 C+程序设计简介程序设计简介10l输出对象可以是变量、表达式或立即数;输出对象可以是变量、表达式或立即数;l当输出对象是变量或表达式时,表示输出变量或表达式所代表当输出对象是变量或表达式时,表示输出变量或表达式所代表的数据;的数据;l输出的各个数据之间应适当分隔以增强输出结果的可读性输出的各个数据之间应适当分隔以增强输出结果的可读性。例:试分析下列程序段执行之后的输出结果。例:试分析下列程序段执行之后的输出结果。int a=2,b=3,c=4,d=5;co
7、ut“a+b=“a+bt“c+d=“c+dendl;cout2 的值为的值为 true;表达式表达式 (12)+(41)的值为的值为 0+1+1=22整型整型2.2 基本数据类型基本数据类型 l 关键字:关键字:int表示表示l 分为十进制、八进制、十六进制等表现形式;分为十进制、八进制、十六进制等表现形式;l 缺省进制为十进制;缺省进制为十进制;l 八进制数是以数字八进制数是以数字0开头的整数开头的整数:数码数码07,逢八进一;,逢八进一;l 十六进制数是以十六进制数是以0 x或或0X开头的整数:数码开头的整数:数码09,af,逢逢十六进一,数码十六进一,数码 af 大小写均可。大小写均可。
8、例:例:28,-3,0,+55,0236,-063,0 x56EF,0X43ab,-0 x857 3实型实型2.2 基本数据类型基本数据类型 l 实型数据也称浮点型,实型数据也称浮点型,l 关键字:关键字:float(单精度)、(单精度)、double(双精度)。(双精度)。l 实型数据可以定点表示和浮点表示实型数据可以定点表示和浮点表示定点表示,例:定点表示,例:0.1237;浮点表示(指数形式),例:浮点表示(指数形式),例:2.765E3,1e-2,-0.3e1;l 关于浮点:关于浮点:E可以大写或小写;可以大写或小写;E前面必须有数字(前面必须有数字(1不能省略);不能省略);E后面必
9、须是整数。后面必须是整数。4字符型字符型2.2 基本数据类型基本数据类型 l 关键字:关键字:charl 计算机内部以字符的计算机内部以字符的ASCII码值(整数)存储字符型数码值(整数)存储字符型数据(据(1个字节)个字节)l 普通字符常量书写时用单引号标记普通字符常量书写时用单引号标记例:例:%,a,9。l 任何字符都可以用转义字符形式表示任何字符都可以用转义字符形式表示常用转义字符表示常用转义字符表示字符形式字符形式含义含义n换行换行a响铃响铃t水平制表符(水平制表符(Tab键)键)0空字符空字符反斜杠反斜杠单引号单引号双引号双引号”2.2 基本数据类型基本数据类型 任何字符均可以用其八
10、进制或十六进制任何字符均可以用其八进制或十六进制ASCII码值表示成转义码值表示成转义形式:形式:例如,例如,160、x70都表示字符都表示字符p。字符字符p的的ASCII码值为码值为112,其八进制为,其八进制为0160,十进制为,十进制为0 x70转义表示时不可用十进制,缺省为八进制,十六进制表示时略进制标转义表示时不可用十进制,缺省为八进制,十六进制表示时略进制标志的前缀志的前缀0。所以,字符。所以,字符p的转义形式不可表示为以下形式:的转义形式不可表示为以下形式:0160 0 x70 5.字符串字符串l 一对单引号内只能表示一个字符,多个字符可以组成字符串,字一对单引号内只能表示一个字
11、符,多个字符可以组成字符串,字符串是用一对双引号括起来的字符集合。如:符串是用一对双引号括起来的字符集合。如:“Hello!”,“123456”等。等。l 字符串常量均含有一个字符串结束标志字符串常量均含有一个字符串结束标志0。l 字符串常量中所含字符的个数称为字符串的长度(不含字符串结字符串常量中所含字符的个数称为字符串的长度(不含字符串结束标志)。束标志)。6.基本类型变量基本类型变量 l变量是在程序中可以改变的量变量是在程序中可以改变的量l变量必须先定义后使用变量必须先定义后使用变量定义格式:变量定义格式:数据类型数据类型 变量名变量名1,变量名,变量名2,变量名,变量名n;例如:例如:
12、int a,b,c;float x;定义变量的同时可以给变量赋值(两种方式):定义变量的同时可以给变量赋值(两种方式):int a=1,b,c(3);float x=3.71;可以给已定义的变量重新赋值:可以给已定义的变量重新赋值:int a=5,b;a=10;b=20;a=a*b;可以限定变量在程序中不允许改变:可以限定变量在程序中不允许改变:const int a=5,b(6);int const c=10;const float x(0.26),y=1.2;constconst置于类型符号前或后;置于类型符号前或后;必须赋初值!必须赋初值!C+语言中的运算符包括算术运算符、关系运算符、语
13、言中的运算符包括算术运算符、关系运算符、逻辑运算符、赋值运算符等,将变量、常量和运算符有逻辑运算符、赋值运算符等,将变量、常量和运算符有机地结合起来就组成了表达式。机地结合起来就组成了表达式。2.3 运算符与表达式运算符与表达式l 算术运算符算术运算符:+、-、*、/、%(求模)(求模)l 算术运算符均为双目运算符算术运算符均为双目运算符l 除法运算分整数除和实数除除法运算分整数除和实数除l 求模运算功能是求两个整数相除后的余数。求模运算功能是求两个整数相除后的余数。2.3 运算符与表达式运算符与表达式1.算术运算符算术运算符例,写出下列各语句的输出结果。例,写出下列各语句的输出结果。cout
14、(1+a);/输出结果输出结果:98 cout(5/3-8);/输出结果输出结果:-7 cout(5%3*5/3.0);/输出结果输出结果:3.33333例:例:int a=5,b;b=a=a-2;coutatb、=、5的值为的值为 true (5!=4)=(8=2)的值为)的值为false 注意运算符形式上与数学表达式的差异;注意运算符形式上与数学表达式的差异;数学表达式:数学表达式:abc C+表达式:表达式:ab&bc2.3 运算符与表达式运算符与表达式3.关系运算符关系运算符l 逻辑运算符:逻辑运算符:逻辑非(逻辑非(!)、逻辑与()、逻辑与(&)和逻辑或()和逻辑或(|)l 功能:将
15、多个关系连接起来表达更复杂的关系功能:将多个关系连接起来表达更复杂的关系2.3 运算符与表达式运算符与表达式4.逻辑运算符逻辑运算符l 逻辑非:取反操作逻辑非:取反操作若若a的值为的值为true,则,则!a的值为的值为false;表达式表达式a=0与表达式与表达式!a具有相同的逻辑值具有相同的逻辑值l 逻辑与逻辑与:逻辑乘操作逻辑乘操作仅当仅当a和和b的值均为真时,的值均为真时,a&b的值为真,否则值为假。的值为真,否则值为假。如:如:5&A值为真,值为真,(39)&(2=1)值为假。值为假。l 逻辑或逻辑或:逻辑加操作逻辑加操作仅当仅当a和和b的值均为假时,的值均为假时,a|b的值为假,否则
16、值为真。的值为假,否则值为真。如:如:(39)|(2=1)值为假。值为假。2.3 运算符与表达式运算符与表达式aba&ba|b!a00001010111001011110逻辑运算真值表逻辑运算真值表C+语言中,当能够确定逻辑表达式的值时,运算将不再继续进行。语言中,当能够确定逻辑表达式的值时,运算将不再继续进行。2.3 运算符与表达式运算符与表达式逻辑运算的优化:逻辑运算的优化:例例:int a=4,b=7,c,d;c=(a=a+1)|(b=b+2);d=(a=0)&(b=a+b);coutatbtctdendl;(1)自增和自减运算符)自增和自减运算符 l 单目运算符单目运算符l 自增(自增
17、(+)和自减()和自减(-),分别表示变量自身加),分别表示变量自身加1和减和减1操作。操作。l 不能对表达式进行自增或自减运算。不能对表达式进行自增或自减运算。2.3 运算符与表达式运算符与表达式5.其他运算符其他运算符例:例:int a=3,b=5,c=10,d;d=+a+b+c;coutatbtctdb?a+:+bc=ab?a+:+b;2.3 运算符与表达式运算符与表达式条件运算符的嵌套:条件运算符的嵌套:int a=1,b=2,c=3,d=4,e=5,f;f=ab?cd?a:d e?d:e:c;/f=ab?(cd?a+:(de?d:e):c;l 是双目运算符是双目运算符l 格式:用逗号
18、将一系列表达式列举出来格式:用逗号将一系列表达式列举出来l 运算规则:依次从左到右计算各表达式,交将最后一个表达式的值运算规则:依次从左到右计算各表达式,交将最后一个表达式的值作为最终结果作为最终结果2.3 运算符与表达式运算符与表达式(5)逗号运算符)逗号运算符 例例 int a=2,b=4,c=6,d;d=(a+=1,b+=2,c+=3,a+b+c);比较比较:int a=2,b=4,c=6,d;/与上例变量初值相同与上例变量初值相同 d=a+=1,b+=2,c+=3,a+b+c;/没有括号没有括号!2.3 运算符与表达式运算符与表达式在在C+表达式中,当不同类型的运算符混合运算时,优先级
19、高的运算表达式中,当不同类型的运算符混合运算时,优先级高的运算符将优先运算。符将优先运算。C+运算符的优先级自高向低排序规律大致如下:运算符的优先级自高向低排序规律大致如下:1.括号类运算符括号类运算符2.单目运算符单目运算符3.算术运算符算术运算符4.关系运算符关系运算符5.逻辑运算符逻辑运算符6.赋值运算符赋值运算符7.三目运算符(条件运算符)三目运算符(条件运算符)8.逗号运算符运算符逗号运算符运算符C+语言中部分运算符的优先级和结合性语言中部分运算符的优先级和结合性优先级优先级运算符运算符结合性结合性1:()-&+-左向右左向右2!+-+(类型类型)*&sizeof new delet
20、e右向左右向左3*/%左向右左向右4+-左向右左向右6、=左向右左向右7=!=左向右左向右11&左向右左向右12|左向右左向右13?:右向左右向左14=、+=、-=、*=、/=、%=右向左右向左15,左向右左向右2.3 运算符与表达式运算符与表达式当当C+表达式中出现多种类型的数据混合进行运算时,首先要进行类型表达式中出现多种类型的数据混合进行运算时,首先要进行类型转换。转换。C+的类型转换有自动类型转换、强制类型转换的类型转换有自动类型转换、强制类型转换2种。种。2.4 类型转换类型转换1自动类型转换自动类型转换l 字符型数据在表达式中以其字符型数据在表达式中以其ASCII码值(整数)参加运
21、算;码值(整数)参加运算;l 为保证精度,实型数据自动转换成双精度参加运算。为保证精度,实型数据自动转换成双精度参加运算。l 赋值运算过程中,将右侧操作数转换成左边操作数的类型后赋值。赋值运算过程中,将右侧操作数转换成左边操作数的类型后赋值。l 不同类型的数据自动转换成相同类型的数据后再运算。转换原则是:不同类型的数据自动转换成相同类型的数据后再运算。转换原则是:将精度较低的向精度较高的转换。将精度较低的向精度较高的转换。例:例:int a=1;float x=3.5;char c=49;/将将ASCII码值为码值为49的字符赋给的字符赋给c a=x;/a的值为的值为3 coutF-Bendl
22、;/输出整数输出整数4 coutx+2endl;/输出双精度型数输出双精度型数5.5 cout(a*6+x/2-c)end;/输出双精度型数输出双精度型数-29.252.4 类型转换类型转换 强制类型转换也称显式类型转换,是指将一个表达式强制转强制类型转换也称显式类型转换,是指将一个表达式强制转换到某个指定类型。其一般格式为:换到某个指定类型。其一般格式为:(数据类型名)表达式(数据类型名)表达式或或 数据类型名(表达式)数据类型名(表达式)2强制类型转换强制类型转换2.4 类型转换类型转换例如:例如:cout(int)3.5;/输出整数输出整数3 coutchar(97););/输出字符输出
23、字符a本章结束本章结束谢谢!谢谢!2.4 类型转换类型转换第3章 流程控制语句C+程序设计语言例例3.1 编程根据输入的球的半径求球的体积编程根据输入的球的半径求球的体积知识概要:知识概要:l 程序用变量代表所要处程序用变量代表所要处理的数据;理的数据;l 程序从主函数的第一条程序从主函数的第一条语句开始执行,执行完语句开始执行,执行完所有的语句后程序终止;所有的语句后程序终止;l 简单顺序流程不足以解简单顺序流程不足以解决复杂问题。决复杂问题。1.简单顺序流程简单顺序流程#includeusing namespace std;int main()const float pi=3.14;flo
24、at v,r;coutr;v=4/3.0*pir*r*r;cout“球的体积球的体积 v=”vendl;return 0;1)最基本的if语句if(表达式)语句;if(表达式)语句1;语句2;复合语句2.if 条件控制条件控制例例3.2 根据用户输入的实数,求出其绝对值并输出。根据用户输入的实数,求出其绝对值并输出。#includeusing namespace std;int main()float x;coutx;if(x0)x=-x;cout“该实数的绝对值为:该实数的绝对值为:”xendl;return 0;语句语句 x=-x;不一定执行不一定执行2.if 条件控制条件控制2)if e
25、lse 语句语句 最基本的if语句只能表达“如果那么”的含义。而 if else 语句却能表达“如果那么否则”的含义。if(表达式)语句1;else 语句2;2.if 条件控制条件控制#include using namespace std;int main()int a,b;coutab;if(ab)cout“a大于b”endl;else cout“a可能比b小”endl;cout“a也可能等于b”endl;return 0;复合语句缩进例例3.3 对用户输入的两个整数比较其大小。对用户输入的两个整数比较其大小。2.if 条件控制条件控制3)if 嵌套嵌套 实际应用中我们可能面临更多种选择,
26、可以将ifelse 语句扩展:if语句的每一个分支均可能是嵌套的if语句。if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else 语句4;2.if 条件控制条件控制例例3.4 编程求下列函数的值:编程求下列函数的值:5 5x x2 25 5x x0 01 10 0 x x0 05 5x x0 01 15 5x x2 2f(x)f(x)2.if 条件控制条件控制#include using namespace std;int main(void)int x,y;coutx;if(x5)y=2;else if(x0)y=1;else if(x=0)y=
27、0;else if(x=-5)y=-1;else y=-2;cout“f(x)=”yendl;return 0等于判断书写格式自由注意复杂条件的表达方式注意复杂条件的表达方式:1)if语句层层递进表示语句层层递进表示 2)逻辑运算符的使用逻辑运算符的使用2.if 条件控制条件控制例例3.5 输入一个年份输入一个年份year,计算这一年,计算这一年2月份的天数月份的天数days,然后输出,然后输出days。闰年的条件是:闰年的条件是:year能被能被4整除但不能被整除但不能被100整除,或者整除,或者year能被能被400整除。整除。#include using namespace std;in
28、t main(void)int year,days;coutyear;if(year%4=0&year%100!=0)|year%400=0)days=29;else days=28;coutyear“年2月份的天数为:”daysendl;return 0复杂条件2.if 条件控制条件控制例例3.6 将键盘输入的四个数存入一组变量后对该组变量从大到小排序将键盘输入的四个数存入一组变量后对该组变量从大到小排序#include using namespace std;int main()int a,b,c,d,t;cinabcd;if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=
29、t;if(ad)t=a;a=d;d=t;if(bc)t=b;b=c;c=t;if(bd)t=b;b=d;d=t;if(cd)t=c;c=d;d=t;couta,b,c,db)if(bc)a=a+1;else b=b+1;else if(cd)c=c+1;else d=d+1;if (ab)if(bc)a=a+1;else if(cd)c=c+1;else d=d+1;if (ab)if(bc)a=a+1;else if(cd)c=c+1;else d=d+1;2.if 条件控制条件控制switch语句又称开关语句,它是C+的另一种分支方法。switch(表达式)case 常量表达式 1:语句序
30、列1;break;case 常量表达式 2:语句序列2;break;case 常量表达式 n:语句序列n;break;default:语句序列0;表达式的结果必须是整型、字符型或枚举类型常量表达式的值必须是整型、字符型或枚举类型的常量,不能是变量表达式3.switch 开关控制开关控制例3.7 设计一个程序将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出,90分以上为A,8089分为B,7079分为C,6069分为D,60分以下为E。条件语句条件语句 vs 开关语句开关语句3.switch 开关控制开关控制用条件语句实现:用条件语句实现:#include using namespace
31、std;int main()int s;char c;cout s;if(s=90)c=A;else if(s=80)c=B;else if(s=70)c=C;else if(s=60)c=D;else c=E;cout“五分制分数为五分制分数为:”cendl;return 0;3.switch 开关控制开关控制用开关语句实现:#include using namespace std;int main()int s;char c;cout s;switch(s/10)case 10:case 9:c=A;break;case 8:c=B;break;case 7:c=C;break;case
32、6:c=D;break;default :c=E;cout“五分制分数为:”cendl;return 0;l case 语句的顺序不重要;语句的顺序不重要;l case后的常量互不相同;后的常量互不相同;l default语句的位置不重要;语句的位置不重要;l 可以没有可以没有default语句;语句;l 注意注意break的效果;的效果;3.switch 开关控制开关控制1*2+2*3+3*4=?1*2+2*3+3*4+100*101=?引入循环结构就可以简化程序中大量的重复操作。在C+语言中,循环结构是由 while 语句,dowhile 语句和 for 语句来实现的,为了更方便地控制程序
33、流程,C+语言还提供了两个循环辅助语句 break 和 continue。4.循环控制循环控制1)while循环循环例3.8 求1*2+2*3+3*4+100*101=?while(表达式)语句;#include using namespace std;int main()int n=1,s=0;while(n=100)4.循环控制循环控制2)dowhile循环循环while循环表达的是“当满足条件时一直做某事”。do 语句;while(表达式);dowhile循环表达的是“一直做某事直到不满足条件为止”。有分号!4.循环控制循环控制例3.9 求键盘输入的50个整数中正数之积和负数之和并分别输
34、出。#include using namespace std;int main()int n=1,a,s1=1,s2=0;while(n=50)#include using namespace std;int main()int n=1,a,s1=1,s2=0;do while(n=50);s1,s2的初值为什么不同?4.循环控制循环控制3)for 循环循环实现循环应注意三个方面的问题:实现循环应注意三个方面的问题:l 控制变量的初始化控制变量的初始化l 循环条件循环条件l 控制变量的值的更新控制变量的值的更新for语句在书写形式上正好体现了这种语句在书写形式上正好体现了这种紧密的逻辑关系。紧
35、密的逻辑关系。for(表达式1;表达式2;表达式3)循环体语句;4.循环控制循环控制1*2+2*3+3*4+100*101=?while 循环;#include using namespace std;int main()int n=1,s=0;while(n=100)cout“s=“sendl;for 循环;#include using namespace std;int main()for(int n=1,s=0;n=100;n+)cout“s=“sendl;4.循环控制循环控制关于for循环的一些说明:for(表达式1;表达式2;表达式3)语句;l 表达式表达式1只执行一次只执行一次l
36、表达式表达式2在每次准备循环前执行在每次准备循环前执行l 表达式表达式3在每次循环后执行在每次循环后执行l 各表达式均可省略,但分号不各表达式均可省略,但分号不可省略可省略l 表达式表达式2省略表示循环条件成立省略表示循环条件成立4.循环控制循环控制4)循环嵌套循环嵌套一个循环的循环体可以是另一个循环,称为循环嵌套。例3.10 打印8行7列的星号矩形#include using namespace std;int main()for(int i=0;i8;i+)for(int j=0;j+)cout“*”;coutendl;return 0;如果改为j=i 呢?4.循环控制循环控制各种循环的循
37、环次数也可以是不确定的各种循环的循环次数也可以是不确定的例3.11 不断从键盘输入若干个整数,直到输入整数0为止,求所有输入整数的平均值。#include using namespace std;int main()int a,n=0;float s=0;couta;n+;for(;a!=0;n+)s=s+a;couta;s=s/n;cout“s=“s/nendl;return 0;a的值决定了是否继续输入4.循环控制循环控制5)continue 和和 break 语句语句continue 和 break 语句用于提前开始下一轮循环或中断所有循环例3.12 将100200之间不能被整除的整数输
38、出。#include using namespace std;int main()for(int n=100;n=200;n+)if(n%3=0)coutnendl;return 0;4.循环控制循环控制例3.13:打印半径为整数120的所有圆的面积,如果面积超过100则不打印。#include using namespace std;int main()int r;float s,pi=3.14159;for(r=1;r100)cout“r=”rt“s=”sendl;return 0;switch语句中的break语句功能是否类似?4.循环控制循环控制5.习题习题2、求求100200间的所有
39、素数间的所有素数n个a.71513114 6、用二分法求方程用二分法求方程x2-3-5x=0在在3,10区间的一个解区间的一个解。要求误差不。要求误差不 大于大于10-6的值的值求求 10120012/1kkkk1001001 1k kk k5.习题习题C+实 用 教 程实 用 教 程第四章 数组和指针第第 四四 章章 数组和指针数组和指针4.1 数组4.4 结构体4.3 字符串4.2 指针4.5 枚举类型4.6 引用类型4.1 数组数组由具有各类特殊功能的信息(程序)组成1.计算机系统计算机系统计算机的实体,如主机、外设等一、计算机的软硬件概念硬件软件4.1 数组数组数组是由数目固定、类型相
40、同的若干个变量组成的有序集合,该集合的名字称为数组名,每个变量称为数组的元素。通常用数组名和下标来表示数组中的某个元素,因此数组中的元素也称为下标变量。可以像基本数据类型的变量一样对数组中的元素赋值或将其应用于其它表达式中。数组按维数的不同可分为一维数组和多维数组;按数组元素的类型不同可分为整型数组、浮点型数组、字符数组等。一、一维数组的定义和使用1.一维数组的定义 定义一维数组的一般格式:存储类型;数组名后的方括号称为数组下标运算符,其内部的必须为正整数,它表示该数组所能容纳元素的最大数目。数组定义中的必须由字面常量、const类型的常量或宏定义的标识符构成,不能含有变量,且它的值一定要为正
41、整数 在定义数组的同时,可以对数组中的元素赋初值,称为数组的初始化。通常用初始值表实现。数组的初始化有如下几种形式:(1)在初始值表中给出数组中各元素的初始值。(2)在初始值表中给出数组中部分元素的初始值,此时系统自动将其它元素置0,此时初始值表不能为空。(3)在定义数组时,不直接指定数组的大小。此时编译系统会根据初始值表中元素的个数来确定数组的大小 2一维数组的应用 编译系统为数组分配连续的内存空间。数组中的每个元素都有一个确定的序号来表示它在内存中的位置,该序号是从零开始的。通过该序号可以引用数组中每一个元素,其一般格式如下:;其中是一个值为非负整数表达式,其值表示该元素的在数组中的序号,
42、称为元素的下标,在引用数组中的元素时,要避免下标越界。数组中的元素与普通的变量在使用上没有太大区别,可以对它们赋值,也可将它们参与其它运算。一维数组所占用内存空间的大小为:sizeof()=数组大小*sizeof()二、多维数组的定义和使用1.二维数组的定义 二维数组的定义格式:存储类型 ;其中,称为数组的行数,称为数组的列数。二维数组中元素的个数为:*。在引用二维数组中的元素时,要指明该元素在二维数组中所处的行号和列号。表示二维数组中元素的一般格式为:;其中和分别表示该元素所在的行和列,称为行下标和列下标。二维数组可以看作一维数组的直接推广。二维数组中的元素在存储器中的排列规则是:先按行进行
43、存放,每一行中的元素再按其列下标从小到大进行排列。2.二维数组的初始化 对二维数组的初始化有如下几种方法:(1)以行为单位,对数组中的元素进行初始化。(2)用类似于一维数组初始化的方式对二维数组进行数组进行初始化。(3)在定义二维数组时不指定数组的行数,此时必须对该数组进行初始化,系统将根据初始化的数据,自动确定数组的行数。注意,此时不能省略数组的列数。3.二维数组的应用 例 设计一个程序,定义一个4行5列的二维数组并初始化,求出数组中元素的平均值、最大元素、最小元素以及最大元素和最小元素的位置(行号和列号)。例 已知三行二列的矩阵a与二行三列矩阵b,求这两矩阵的积c=ab。4.2 指针指针一
44、、指针变量的说明 每一个存储单元都有唯一的一个编号与其对应,该编号称为相应存储单元的地址。编译系统在对一个变量进行操作时,都是通过寻找其相应的地址而实现对相应的存储单元中的内容进行操作。可以用取地址运算符“&”来获取编译器为变量分配的地址值。一般格式为:&该运算返回变量的地址。变量的地址值通常是一个无符号整数,它也称为变量的指针,简称指针。我们也可以定义一个变量,该变量用来存放指针,我们称之为指针变量,指针变量的值是某个存储单元的地址。说明一个指针变量的一般格式为:存储类型*,*;其中“*”号为指针运算符。为另一个存储单元(该存储单元中存放的数据称为该指针变量所指向的数据)的地址,而存储类型和
45、分别为该指针变量所指向数据的存储类型和类型,可简称为指针变量的类型。编译系统在编译指针变量时将会有两个存储空间与其相关,一个为指针变量本身所占用的空间,由于它存放的是地址,因此该空间通常与int类型的数据所占用的空间相同,为4个字节;另一个为该指针变量所指向的数据所占用的存储空间。如图下图所示(以字符型指针ptrch1为例):20001ptrch1:ptrch1所指向的数据:地址为20001 指针变量的初始化方法有两种:(1)利用另一个同类型变量的地址对该指针变量进行初始化。(2)第二种方法是通过强制类型转换用一个整型常数直接初始化指针类型的变量。这种方法必须在清楚目前存储空间那些“空闲”的前
46、提下才能使用,否则在程序运行过程中将会出现致命错误。指针变量的值始终是一个地址,它是一个无符号整型数据。指针变量所指向的数据的类型与指针的类型一致,它的值可以用如下的方法获得:*这里的运算符“*”称为取内容运算符。该运算符的运算结果为作为其操作数的指针变量所指向的数据的值。二、指针变量的操作 1、指针变量的赋值运算 (1)将一个变量的地址直接赋给同类型的指针变量。(2)同类型的指针之间可以互相赋值,此时这两个指针指向同一个内存单元。(3)不同类型的指针变量之间可以通过类型强制转换互相赋值。但这样的赋值通常没有价值。可以将一个整型常数赋给指针变量,此时必须要经过强制类型转换,这种赋值方法要慎重使
47、用。但将0(NULL)赋给指针变量具有特殊的含义,它表示该指针变量为空,即该指针变量不指向任何存储单元。必须注意,在对指针变量所指向的存储单元赋值之前,该指针变量必须有一个确定的值,否则将是十分危险的。2.指针变量的算术运算 指针变量常用的算术运算为将指针变量加上或减去一个整型常数。对于下面的运算:=n;计算机的实际处理如下:=sizeof()*n;指针的+、-运算与上述运算类似。3.指针变量的关系运算 通常只进行同类型的变量之间的关系运算,对于不同类型指针之间的关系运算意义不大。常用的指针变量的关系运算包括:判断一个指针是否为空:=0;判断两个指针是否指向同一个存储单元:=;比较两个指针变量
48、的大小等。三、指针与数组 指针和数组有许多相通的地方,比如数组名就是可以看成是一个指针,而对于指针变量,也可以使用数组的下标运算符。数组的起始地址称为数组的指针,而将指向数组元素的指针变量称为指向数组的指针变量。利用指向数组的指针变量来处理数组中的元素是一种常用的方法。1.一维数组与指针 在声明一个一维数组之后,该数组名就可以作为一个指针使用。但数组名并不是一个真正的指针变量,因为在编译数组的声明语句时,编译系统并不会为数组名另外分配存储空间,因此对数组名不能使用赋值语句以及+、-运算符。可以将一个指针变量指向同类型数组的首地址,这样就可以通过对该指针变量访问数组元素。对一维数组而言,数组名和
49、指针有许多相通的地方,归纳如下:(1)数组名a表示数组的起始地址。可以利用a+i表示的第i+1个元素的地址,即&ai;(2)将指针变量pInt指向数组a的起始地址的方法有两种,即pInt=a或pInt=&a0;(3)在将pInt指向数组a的起始地址之后,pInt+i与a+i都表示数组a的第i+1个元素的地址,即&ai;在将pInt指向数组a的起始地址之后,下列表达式都表示同一个元素:ai、*(a+i)、*(pInt+i)、pInti等等。2.多维数组与指针 当将一个指针指向二维数组的第一个元素时,就可以用它访问该数组的所有元素。对于二维数组,首先要分清行地址(行指针)和元素地址(元素指针)。设
50、有如下的一个二维数组:int a43=1,2,3,4,5,6,7,8,9,10,11,12;该数组可以看成是一个一维数组a,该一维数组中有四个元素:a0,a1,a2,a3,每个元素又都是一个一维数组。数组名a表示的是数组的起始地址,也表示该二维数组第0行的首地址,它是一个行地址,而a0表示第0行第0个元素的地址。行地址与元素地址要注意的问题是:(1)行地址加上或减去一个常数还表示行地址;元素指针加上或减去一个常数还是元素的地址。(2)行地址前加上运算符“*”表示该行第0个元素的地址,这里的符号“*”不是用来获取指针所指向的内容,它只是用来区分行地址和元素地址;而在元素指针前加运算符“*”表示该