C语言教学课件之数组

上传人:文**** 文档编号:240608803 上传时间:2024-04-24 格式:PPT 页数:95 大小:3.77MB
收藏 版权申诉 举报 下载
C语言教学课件之数组_第1页
第1页 / 共95页
C语言教学课件之数组_第2页
第2页 / 共95页
C语言教学课件之数组_第3页
第3页 / 共95页
资源描述:

《C语言教学课件之数组》由会员分享,可在线阅读,更多相关《C语言教学课件之数组(95页珍藏版)》请在装配图网上搜索。

1、C 程 序 设 计问 题如果需要处理1名学生的10门课程的成绩,用什么来存储这些数据?方法一:定义10个变量,每个变量中存放1门成绩。方法二:定义一个可以存储10门成绩一维数组。课程程1课程程2课程程3课程程4课程程5课程程6课程程7课程程8课程程9课程程1090819377926879839470变量:杯子,一个变量只能存放一个数据数组:带多个杯子的托盘,一个数组可以存放多个数据数轴上的一维向量x=1,2,-2,1,0,3;就相当于一维数组 直角坐标系中的矩阵就相当于二维数组 E4.1 一维数组 4.2 二维数组 4.3 字符数组一维数组定义格式:类型说明符 数组名 整型常量表达式;例如:i

2、nt a10;就定义了一个包含10个整型元素的数组a,它的内存大小可以存放10个整型数据。4.1.1 一 维数组的定义类型说明符 数组名 整型常量表达式;int,char等都可以,说明此数组中每个 元素都属于此类型命名规则与变量一致不能和其他变量重名指定元素的个数,最小为0,不能是变量#define N 3int aN;int a3+5;int a1.5;int n;scanf(“%d”,&n);int an;int a;int a3;int a,b3;int n=3;int an;【例 4.1】判断以下数组定义是否合法,并说明原因。(1)int a2.5;(2)int a-3;(3)int

3、i=3;(4)int i;int ai;scanf(“%d”,&i);int ai;(5)#define N 3 (6)int a;int a N;int a3;(7)int a2+3;(8)int i,a3,b0;4.1.2一维数组元素的引用一维数组引用格式:数组名下标 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9注意:1.数组必须先定义,再使用。2.只能逐个引用数组元素,不能一次引用整个数组。例如:int a10;可以使用a0、a1.a9。若有 a=1;或者a10=1;出错。a10不代表整个数组,它是下标为10的元素,越界!13.下标可以是常量或变量,它表示元素的序号。例如:

4、int i=3,a10;ai=1;表示给下标为3的元素赋值为1。4.一维数组在内存中连续存放,先存放下标为0的元素,再存放下标为1的元素,依次直至存放完所有元素。【例 4.2】定义一个包含3个整型元素的数组a,输出其元素值。只定义数组,不给数组元素赋值,数组元素中存放的是随机值。一般要先给数组元素赋值,再使用。数组名a中存放的是数组起始元素的地址【例 4.3】定义一个包含3个整型元素的数组a,从键盘给数组元素输入值,然后输出。【例 4.4】定义一个包含10个整型元素的数组a,从键盘给数组元素输入值,然后输出。4.1.3一维数组的初始化定义一维数组的同时给数组元素赋初值称为一维数组的初始化。其一

5、般格式为:类型说明符 数组名N=初值1,初值2,初值N;其中,N是表示数组元素个数的常量。一维数组的初始化方式有以下几种:(1)全部元素初始化:char a3=1,2,n;int b5=2,11,3,14,5;int b =2,11,3,14,5;int b4=2,11,3,14,5;在对数组的所有元素赋初值时,可以不指定数组长度。系统自动定义其长度为5初值个数不能超过数组长度。否则,会出现语法错误。(2)全部元素初始化:int a10=0,1,2;char a10=1,2;(3)全部元素初始化为0:int a10=0;将a0a2依次初始化为0、1、2。未赋值的元素a3a9值全部被初始化为in

6、t中表示假的值0。将元素a0a9 全部初始化为0将a0a1依次初始化为0、1。未赋值的元素a2a9值全部被初始化为char中表示假的值0。若想全部初始化为1int a10=1;错误【例 4.5】定义一个含有10个元素的整型一维数组并全部初始化,将数组中所有元素逆序输出。【例4.6】:用冒泡法对5个数排序。解:冒泡排序过程如后面图所示,其中,红圈以内为已排好序的记录。规则:令相邻位置的数依次比较,若上面的数大,则交换。414135241 交换43 交换342 交换1 13 不交换34 32 交换513245 12 交换12345 12不交换结果 12345R 第0趟 第1趟 第2趟 第3趟第0次

7、第1次第2次第3次for(i=0;iRj+1 的值)则交换 j增1 for(j=0;j4i;j+)/内循环 如果(Rj的值R2的值)temp R1;R1 R2;R2 temp;j增加1,比较Rj 和 Rj+1的大小 如果(Rj的值Rj+1的值)j增加1,比较Rj 和 Rj+1 的大小实现交换43 交换R1R243 不交换4R25R32R4temp 2.交 换 过 程 与 核 心 程 序434 int i;int j;for(i=0;i=3;i+)for(j=0;jRj+1的大小)temp Rj;Rj Rj+1;Rj+1 temp;3.循 环 与 核 心 程 序 的 组 合 int i,j;类型

8、一样,合并在一起外循环,将处理5个数推广到处理n个数 for(i=0;i=n-2;i+)内循环for(j=0;jRj+1)满足交换条件,则交换;在程序中将赋值箭头转换为赋值等号temp=Rj;Rj=Rj+1;Rj+1=temp;标出交换的起始位置标出内循环的起始位置标出外循环的起始位置4.冒 泡 算法整理 int i,j;/定义int 类型的变量i,j int temp;/定义新的存储单元 tempfor(i=0;i=n-2;i+)/外循环 for1 /外循环for1开始 for(j=0;jRj+1)/比较数组R 中相邻元素值的大小 /开始交换 temp=Rj;/先将Rj中的值赋给 temp

9、Rj=Rj+1;/再将Rj+1中的值赋给Rj Rj+1=temp;/最后又把temp中的值赋给Rj+1 /结束交换 /内循环for2结束 /外循环for1结束 /经过n1=4 次循环,完成排序功能5.冒泡算法真实程序6.优化推广程序改进的冒泡排序算法例如:待排序的数组元素为:3,1,2,5,4313124531 交换32 交换224 不交换451 13 不交换23 34 不交换45 45 不交换 12不交换结果 12345R i=0 i=1j=0j=1j=2j=3排好设置一个标识量,若某趟中一次交换也没有进行,设置标识量的值,代表数据已完全排好,不需要进行后面的排序。【例 4.7】改进冒泡排序

10、算法。【例 4.8】从键盘输入10个学生成绩,计算出 平均成绩,并输出高于平均分的学生成绩。【例】求fibonacci数列的前20项,并输出。fibonacci:1,1,2,3,5,8,13,21 4.1 一维数组E4.2 二维数组 4.3 字符数组问 题如果需要处理3名学生的期末成绩,每名学生有4门课程的成绩,用什么来存储这些数据?方法一:定义12个变量,每个变量存储1个学生的1门课程成绩。方法二:为3名学生各定义3个数组,每个数组可以存放4门成绩。方法三:用一个3行4列的二维数组来存储。成成绩表表数学数学英英语计算机算机C语言言学生学生1928996.580学生学生288.5679070学

11、生学生3719088604.2.1 二维数组的定义1.格式:类型说明符 数组名常量表达式M常量表达式N;例:float a34;0120 1 2 3M和N只能是正整数例:float a342.二维数组可以看成是由一维数组组成的3.二维数组在内存中连续存放,先顺序存放第一行的元素,再存放第二行的元素,依次直至存放完所有元素。4.2.2 二维数组的引用引用格式引用格式:数组名行下标列下标;例:int a23;a00、a01、a02 a10、a11、a1212 15 365 8 13常出现的错误:下标越界!a23=3;/*应为a12=3;*/4.2.3 二维数组的初始化1、分行赋初值:例:int a

12、34=1,2,3,4,5,6,7,8,9,10,11,12;1 2 3 4 5 6 7 8 9 10 11 122、全部数据写在一个花括号内,按数组排列的顺序对各元素赋初值:例:int a34=1,2,3,4,5,6,7,8,9,10,11,12;赋初值时,数组的行下标可以省略,例如:int a 4=.。3、对部分元素赋初值:(1)int a34=0,1,2;0 1 2 0 0 0 0 0 0 0 0 0 功能:仅对a00、a01、a02赋值,其余为0(2)int a34=1,5,6,9;1 0 0 0 5 6 0 0 9 0 0 0 功能:仅对a00、a10、a11、a20赋值,其余为0【例

13、4.9】求一个3*4矩阵的最大值及其所在 行列下标。【例4.10】3名学生各有4门课程的成绩,计算每个学生的平均成绩。【例4.11】打印输出杨辉三角形(输出前10行)多维数组多维数组定义格式:类型 数组名常量表达式1常量表达式2;例:int a333;注意:多维数组的元素在内存中的排列顺序是按行存放。引用格式:数组名下标下标例:a000=100;a012=20;a222=50;一个n维数组可以看成由多个n-1维数组构成。4.1 一维数组 4.2 二维数组E4.3 字符数组在程序中如果要存储姓名、地址等类型的数据,例如:“小明”、“成都市高新西区西园大道1号”等需要使用什么样的类型呢?这些是字符

14、串,C语言中没有专门的字符串变量,如果要存储字符串,需要用到字符数组。字符数组是专门用来存放字符数据的。字符数组中的一个元素存放一个字符。4.3.1 字符数组字符数组中可以存储普通字符序列,也可以存储字符串,两者依据字符数组末尾是否有字符串结束符0来区分。例如:(1)char c11=“I am happy”;或 char c =“I am happy”;(2)char c11=“I am happy”;或 char c =“I am happy”;(3)char c11=I,a,m,h,a,p,p,y,0;或 char c =I,a,m,h,a,p,p,y,0;(4)char c11=I,a

15、,m,h,a,p,p,y;这四种方式,字符数组c存储的是字符串(5)char c10=I,a,m,h,a,p,p,y;或 char c =I,a,m,h,a,p,p,y;这种方式,字符数组c存储的是普通字符序列若要重新给字符数组(字符串变量)赋值,使它改而存放别的字符串,应注意以下几点:(1)应充分估计新字符串所需的最大空间,不要出现越界情况。例如:char c =“fish”;数组c的长度是5。若要将“chicken”赋给c,新字符串需要8个字节的内存空间,就会出错。为了防止这类的错误发生,习惯上将字符数组长度设置大一些。例如:char c20=“fish”;(2)不能使用赋值语句对字符串变

16、量集体赋值,而应该使用赋值语句为每个字符数组元素单独赋值。例如:char c=“fish”;若要将数组c的内容修改为“cat”,直接写为:c=“cat”;或者c=“cat”;都是错误的。可以对c中的元素逐个重新赋值:c0=c;c1=a;c2=t;c3=0;注意:不要省略给c3赋值为 0,否则c中新的字符串内容为“cath”。4.3.2字符数组的输入输出一、使用 scanf 函数输入字符串到字符数组中。(1)以单个字符的格式逐个输入。例如:char c5;scanf(“%c%c%c%c%c”,&s0,&s1,&s2,&s3,&s4);数组元素跟普通变量一样,前面要加取地址符(2)以字符串的格式输

17、入。例如:char c5;scanf(“%s”,c);说明:1.%s是字符串的格式字符,数组名代表数组的起始地址,因此输入表列中只需要给出数组名即可。若写为&c,程序出错。2.输入字符串时,空格或者回车键是输入结束符,不能作为有效的字符输入。假如从键盘输入cat或者cat。数组c中存入cat后,C编译系统会自动在后面补上一个 0。3.输入的字符串长度应该比字符数组的长度短。例如:从键盘输入catcat,数组c中存入catca,没有 0的位置,容易出现内存错误。4.可以用scanf 输入多个字符串,输入时以空格键或回车键隔开。例如:char c15,c25,c35;scanf(“%s%s%s”,

18、c1,c2,c3);从键盘输入Catordog?二、使用 printf 函数将字符数组中的字符串输出。(1)以单个字符的格式逐个输出。例如:char c5;printf(“%c%c%c%c%c”,c0,c1,c2,c3,c4);(2)以字符串的格式输出,将数组名写在输出表列中。例如:char c5;printf(“%s”,c);注意:(1)若数组长度大于字符串的实际长度,也只输出到遇到0结束。例如:char c10=“China”;printf(“%s”,c);(2)如果一个字符数组中包含一个以上0,则遇第一个0时输出就结束。【例4.12】删除字符串中的空格,并输出。三、使用scanf和 pr

19、intf 为二维数组输入输出字符串二维数组可看作由一维数组组成。如果将一维字符数组看作是存放字符串的变量,那么二维字符数组就可以看作是存放字符串的一维字符串数组。例如:定义char c35;相当于定义了3个字符串变量。c0、c1、c2分别是3个字符串的起始地址。可以使用scanf 和 printf 函数为其输入、输出字符串。【例4.13】利用二维字符数组输入、输出字符串。【例】输出一个菱形图。4.3.3 字符串处理函数C语言提供了多个常用的字符串处理函数。字符串输入函数、输出函数、比较函数、连接函数及求字符串长度等函数。注意:字符串函数均在头文件 string.h 中定义,要使用这些函数,需将

20、此文件包含进来。有的编译器会自动包含。1.字符串输出函数 puts格 式:puts(字符串)功 能:将字符串结束符0转换成n后输出字符串。例如:char c6=“China”;执行函数:puts(c);等价于:printf(%sn,c);puts函数也可以直接输出字符串常量。例如:puts(“China”);2.字符串输入函数 gets格 式:gets(字符数组)功 能:从键盘输入一个字符串到字符数组中。例如:char s10;执行函数:gets(s);从键盘输入:China 将包括0在内的6个字符送到字符数组s中。gets、puts与scanf、printf函数的使用区别:(1)gets()

21、、puts()函数一次只能输入输出一个字符串;scanf()、printf()则可以输入输出多个字符串。例如:char s110,s210;1.gets(s1);gets(s2);puts(s1);puts(s2);2.scanf(“%s%s”,s1,s2);printf(“%sn%sn”,s1,s2);(2)使用gets函数输入的字符串以回车符结束;而 scanf函数以空格或回车符结束字符串的输入。例如:char s130,s230;从键盘输入HELLO WORLD!,1.执行gets(s1);gets(s2);执行结果:s1中存入字符串“HELLO WORLD!”,光标等待用户再次输入字符

22、串,从键盘输入hello world!s2中获得字符串“hello world!”。例如:char s130,s230;从键盘输入HELLO WORLD!,2.执行scanf(“%s%s”,s1,s2);执行结果:s1中存入字符串“HELLO”,s2中存入字符串“WORLD!”。3.字符串连接函数 strcat格 式:strcat(字符数组1,字符数组2或字符串)功 能:把字符数组2中的字符串连接到字符数组1中的字符串的后面,结果放到字符数组1中。注 意:1)数组1必须足够大,以容纳连接后的新字符串。2)连接时串1后面的0被覆盖,只在新串后保留1个0字符数组2可为字符串常量,1呢?例如:cha

23、r s10=“te”;strcat(s,“st!”);执行过程中数组s的存储情况:【例4.14】使用strcat函数实现两个字符串连接的功能。【例4.15】不使用strcat函数实现两个字符串连接的功能。4.字符串复制函数 strcpy 格 式:strcpy(字符数组1,字符数组2或字符串)功 能:将字符串2复制到字符数组1中,该字符数组1 中原有内容被覆盖。说明:(1)字符数组1必须足够大,能容纳复制过来的字符串(2)复制时连同0一起复制到字符数组1中。(3)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。例如:char str130=“China”,str230;str2=s

24、tr1;(4)可以用strncpy函数将字符串2中的前n个字符复制到字符数组中。字符数组其他位置的元素不发生变换。例如:char str130=Chengdu;char str230=Beijing;strncpy(str1,str2,2);执行结果:str1为Beengdu。【例4.16】使用strcpy函数实现字符串的拷贝。【例4.17】不使用strcpy函数实现字符串的拷贝。5.字符串比较函数 strcmp格 式:strcmp(字符串1,字符串2)功 能:比较“字符串1”和“字符串2”。比较规则:自左至右逐个字符比较ASCII码,直到遇到不同字符或0,比较的结果由函数值带回。字符串1 字

25、符串2,函数返回正整数,1例如:strcmp(“a”,“b”);函数返回-1 即:“a”“compare”例如:strcmp(“CHINA”,“china”);函数值是-1 表示:“CHINA”“CHINA”注意:字符串只能用strcmp 函数比较,不能用关系运算符“=”、“”等直接比较。例如:要判断str1是否比str2大,若使用str1str2就会出错,应该使用strcmp(str1,str2)0。【例4.18】使用strcmp函数比较两个字符串。【例4.19】不使用strcmp函数比较两个字符串。6.求字符串长度函数 strlen格 式:strlen(字符数组或字符串)功 能:测字符串实

26、际长度,不包含0在内。例 如:char str20=“Test”;printf(“%d”,strlen(str);说明:输出结果不是 20,也不是5,而是4。【例4.20】使用strlen函数测字符串长度的功能。【例4.21】不使用strlen函数测字符串长度的功能7.字符串大小写转换函数 格 式:strupr(字符数组)功 能:将字符数组中字符串的小写字母转换成大写字母。例 如:char str1“abcdef”;strupr(str1);puts(str1);结果:ABCDEF8.字符串大小写转换函数 格 式:strlwr(字符数组)功 能:将字符数组中字符串的大写字母转换成小写字母。例 如:char str2=“ABCDEF”;strlwr(str2);puts(str2);结果:abcdef字符数组应用举例【例】输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。【例】输入有3个字符串,要求找出其中最大者。设一个二维字符数组str,大小为320,即有3行20列,每一行可以容纳20个字符。C h i n a 0 str0str1 str2J a p a n 0 I n d i a 0 0 1 2 3 4 5 6 7 8 9 10 19 str320

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!