版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、教学内容: 10.1 数组的概念 10.2 一维数组 10.3 多维数组 10.4 字符数组与字符串 10.5 字符串处理函数 10.6 数组作为函数参数,第10 章 数组与字符串处理,教学要求: 1掌握数组的定义,及其数组元素的下标表示方法。 2掌握数组的初始化方法。掌握数组元素的引用,数组数据输入/输出方法。 3掌握数组在程序设计中的应用,以及有关的算法,例如排序算法等。 4掌握字符数组的应用方法。 5掌握字符串处理函数的使用。,第10 章 数组与字符串处理,数组是最简单的一种构造类型。 构造类型是由基本类型按一定规则构造而成的,一个构造类型数据可以分解为多个构造元素,这些元素可以是基本类
2、型,也可以是构造类型。 一个数组可以分解为多个数组元素,这些数组元素可以是基本类型或是构造类型。 按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。,10.1 数 组 的 概 念,在实际应用中,人们不可避免的要遇到“批量数据的存储和处理”问题。 例如:在学生成绩管理系统中,可能需要对一个班 30 名学生的成绩进行输入,计算出平均分,然后输出所有高于平均分的成绩。 为了便于处理,对于这样一组有着内在联系、具有相同性质的数据,可以按顺序组织起来,共用一个统一的名字,即:数组名。数组中各个数据的区分用数组名带下标的形式表示。 我们可以为 30 名学生的成绩建立一个名
3、为 s 的数组,30 个成绩顺序存放在 s0s29这 30 个带下标的变量中,,1一维数组的定义 定义的语句形式: 类型说明符 数组名 常量表达式 (1)“数据类型”是指数组元素的数据类型。 (2) 数组名定名规则和变量名相同。 (3) 常量表达式, 必须用方括号括起来。它是一个整型值, 指定数组元素的个数,即数组的长度。 常量表达式其中可以包含常数和符号常量,但不能包含变量。,10.2 一 维 数 组,例如: int a10; 上述说明语句,定义了一个整型一维数组。 数组名称:a ,有10个数组元素;系统分配10个连续的存储单元。 数组的数据类型是:int 每一个数组元素的存储单元占用2个字
4、节, 存放一个整型值。 (4) 数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号。 上述数组的数组元素为: a0, a1, a2, a9,没有a10。,(5)数组名表示的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素按其下标顺序占用一段连续的存储单元. a 表示数组起始地址 ,(7) 数组说明语句一次可定义几个数组, 形式如下: 数据类型 数组名常量表达式, 数组名2常量表达式2; 例如: int a1 4 , a2 5 ; 上述说明语句,定义了两个整型一维数组。 数组名为:, a2 a1 一维数组有4个数组元素: a10, a11, a12, a13 a2
5、 一维数组有5个数组元素: a20, a21, a22, a23 , a24 数组元素的数值类型均为: 整型(int ) a1, a2, 分别代表各自数组的起始地址 数组元数:a0 a7 (2)在C语言中,数组作为1个整体,不能参加数据运算,只能对单个的元素进行处理。 (3)下标不能越界。 (4)下标变量和我们前面的简单变量具有相同的地位和作用,可以象使用简单变量一样使用。,例10.1数组元素的引用。 main() int i,a10; for(i=0;i=0;i-) printf(%d,ai); 本例中第一个循环语句给a数组各元素赋值,然后用第二个循环语句,输出数组元素a9 a0的各个数值。
6、 输出结果: 9 8 7 6 5 4 3 2 1 0,数组元素引用可以用变量,定义数组,元素个数不能用变量,例10.2 数组元素引用 main( ) int a4; float b3; a0=3; a1=4; a2=a1*14; a3=23; scanf(“%f%f%f”, ,3 4 56 23,a0 a1 a2 a3,a,定义数组, 元素个数 不能用变量,说明: (1)根据存储类型的不同,数组有静态数组(static)和动态数组(auto)之分; (2)根据定义的位置不同: 在函数内部定义的数组,称为内部数组。 在函数外部定义的数组,称为外部数组。 (3)赋值语句和输入语句均可使数组中的元素
7、赋初值,但占用运行时间。 简捷的方法是在程序运行之前使数组初始化。,3. 一维数组元素的初始化格式 数据类型 数组名常量表达式初值表; (1)只给部分元素赋初值。当 中值的个数少于元素个数时,只给前面部分元素赋值。 例如: int a10=0,1,2,3,4; 表示只给a0a45个元素赋值,而后5个元素自动赋0值。 (2)只能给元素逐个赋值,不能给数组整体赋值。 例如给十个元素全部赋1值,只能写为: int a10=1,1,1,1,1,1,1,1,1,1; 而不能写为:int a10=1;,(3)如不给数组赋初值,则元素值不确定,对于static型的数组,系统会自动赋以0或0。 (4)如给全部
8、元素赋值,则在数组说明中,可以不给出数组元素的个数,编译系统根据初值个数确定数组长度。 例如: int a5=1,2,3,4,5; 可写为: int a=1,2,3,4,5; (5)若花括弧中提供的初值个数大于数组长度,则按语法错误处理。,例10.3 求数组中8个数的最大值 # include main( ) int i, max, a8=2, 5, 9, 6, 35, 7, 67, 49; for ( i=0; imax ) max=ai; printf( “max=%dn”,max); ,例10.4 求Fibonaci数列的前20项 #include main() int i, fb20;
9、 fb0=1; fb1=1; for( i=1; i19; i+) fbi+1 = fbi+fbi-1; for( i=0; i20; i+) if ( i%5=0) printf(n); printf(%7d,fbi); ,Fibonaci数列的前20项: 1 1 2 3 5 8 13 21 34 55 89 ,排序过程算法: (1)比较第一个数与第二个数,若为逆序a1a2,则交换;然后比较第二个数与第三个数;依次类推,直至第9个数和第10个数比较为止第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。 (2)对前9个数进行第二趟冒泡排序,结果使次大的数被安置在第9个元素位置。 (3)重
10、复上述过程,共经过9趟冒泡排序后,排序结束。,例10.5用冒泡法对个数由小到大排序。排序的N-S图如图10.2所示。,ai ai+1,图 10.2,main( ) int i, j, t, a11; printf(“input 10 numbers :n”); for ( i=1; iai+1 ) t=ai; ai=ai+1; ai+1= t; printf(“the sorted numbers :n”); for (i=1; i11; i+) printf(“%d”,ai); ,10.3 多 维 数 组,1. 二维数组的定义 (1)语句形式: 类型说明符 数组名常量表达式1 常量表达式2
11、例如:float a34; 定义a是一个3x4 (3行4列)的数组,即a数组有12个元素。但不得写成:float a3,4; (2) 二维数组中元素的排列顺序为按行按列。即存放完第1 行的元素后再接着存放第 2 行的元素,依次类推。 a00 a01 a03 a03 a10 a11 a12 a13 a20 a21 a22 a23,我们可把二维数组看作是一种特殊的一维数组,它的元素又是一个一维数组。例如:a34可看成 a0-a00 a01 a02 a03 a a1-a10 a11 a12 a13 a2-a20 a21 a22 a23 a0 a2每个元素又是一个包含4个元素的一维数组。 数组名: a
12、 代表整个数组的首地址 a 0:数组第0行的首地址 即第1个元素地址,2. 二维数组元素的引用形式为: 数组名行下标表达式列下标表达式 (1) “行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。 (2) “行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。 假设有数组x34,则可用的行下标范围为02,列下标范围为03。 (3) 对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。,3. 二维数组的初始化 (1) 按行给二维数组赋初值。如: static int a34 =1,2,3,4,5,6,7,8,9,10,11,12; 这种方法比较直
13、观,一行对一行,不易遗漏,易于检查。 (2) 顺序按行按列给二维数组赋初值。如: static int a34=1,2,3,4,5,6,7,8,9,10,11,12; (3) 可以对部分元素赋初值。如: static int a34=1,5,9; static int a34=1,0,6,0,0,11; static int a34=1,5,6; static int a34=1, ,9; 注意:所赋给的值是按行按列对号入座的。,(4) 对二维数组的全部元素赋初值时,可以不指定第一维的长度,但不得省去第二维的长度。如: static int a34=1,2,3,4,5,6,7,8,9,10,1
14、1,12; 可以写成: static int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 同样, static int a 4=0,0,3, ,0,10; 也是正确的。,例10.6 给一个23的2维数组各元素赋值,并输出全部元素的值。 #include stdio.h main() int i, j, a23;/*定义数组array*/ for( i=0; i2; i+ ) /*外循环控制行数*/ for( j=0; j3; j+) /*内循环控制列数*/ scanf( “%d”, ,例10.7 输出一个3 4数组中每行中的最大元素之值及其位置。 main( ) int i
15、, j, c, max ; static int a34=6,-5,11,3,8,9,4,7,2,13,1,-10; for (i=0; imax) max=ai j; c=j; printf(“max=%2d,row=%d,colum=%dn”,max,i+1,c+1); ,输出结果: max=11, row=1, colum=3 max= 9, row=2, colum=2 max=13, row=3, colum=2,1字符数组的定义 一维字符数组,用于存储和处理1个字符串,其定义格式与1维数值数组一样。 二维字符数组,用于同时存储和处理多个字符串,其定义格式与2维数值数组一样。 cha
16、r s18, s2312; 2字符数组的初始化 字符数组的初始化,可以通过为每个数组元素指定初值字符来实现。例如: char s38= ” asdfggh ” ;,10.4 字符数组与字符串,char s48= a, b, c, d, e ; static char d33 = , , , , ,; 3字符串及其结束标志 字符串,是指若干有效字符的序列。 C语言中的字符串,可以包括字母、数字、专用字符、转义字符等。 C语言规定:以 0 作为字符串结束标志 。 0 代表ASCII码为0的字符,表示一个空操作,只起一个标志作用。 在 0 前面的字符的个数为该字符串的有效长度。,说明: 由于系统在存
17、储字符串常量时,会在串尾自动加上1个结束标志,所以无需人为地再加1个。 结束标志在字符数组中也要占用一个元素的存储空间,因此在说明字符数组长度时,至少为字符串所需长度加1。 字符数组并不要求它的最后一定要加0。是否加0,完全视需要而定。,4.字符数组的输入输出 (1)用“%c”格式符逐个的输入或输出字符数组的字符。 for(i=0;i11;i+) scanf( %s, ai ); for(i=0;i11;i+) printf( %c,ai ); 输出数组单个元素的数值,要指出元素的下标。 (2)用“%s”格式符将整个字符串一次输入或输出。 printf(“%s”,c); 中c是字符数组名,不是
18、数组元素名。 scanf( %s, ai ); 输入或输出时,并不输入或输出结束符0。,(3)字符数组的输出 在用printf函数输出字符串时,当遇到0时就停止输出,系统不输出字符的定界符。 如果字符数组的长度大于字符串的实际长度,也只输出到0为止。 如果字符数组中有多个0 ,则遇到第一个0时停止输出。 puts( )函数将一个以0结束的字符串输出到终端,且字符串中可以包含转义字符。如: static char str = “ChinanBeijing”; puts(str); 输出: China Beijing,(4)字符数组的输入 scanf( “%s”,c ); c为字符数组名,输入一个
19、字符串,以回车键而不必以结束符0结束输入,系统会自动加上一个结束符0。 同时字符数组名 c 前也不再加地址符 int i; for(i=0;i3;i+) scanf(%c, ,例10.9 二维字符数组的改变 #include #include main() int i; char a74=sun,mon,tue,wed, thu,wen,sat; printf(Result is:n); a03= ,a,10.5 字符串处理函数,字符串标准函数的原型在头文件string.h中。 1输入字符串gets()函数 (1)调用方式:gets(字符数组) (2)函数功能:从标准输入设备(stdin)键盘
20、上,读取1个字符串(可以包含空格),并将其存储到字符数组中去。 (3)使用说明 1)gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。 2)该函数输入的字符串中允许包含空格,而scanf()函数不允许。,2输出字符串puts()函数 (1)调用方式:puts(字符数组) (2)函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用n取代字符串的结束标志0。用puts()函数输出字符串时,不要求另加换行符。 (3)使用说明 1)字符串中允许包含转义字符,输出时产生一个控制操作。 2)该函数一次只能输出一个字符串,而printf()函数也能
21、用来输出字符串,且一次能输出多个。,例10.10 统计字符串中字母的个数 int isalp(char c) if (c=a ,3拷贝字符串 strcpy()函数 (1)调用方式:strcpy(字符数组, 字符串) 其中“字符串”可以是串常量或字符数组。 (2)函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。 (3)使用说明 1)字符数组必须定义得足够大,以便容纳复制过来的字符串。连同结束标志0一起复制。 2)不能用赋值运算符“”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。,#include main( ) int i; char name
22、16=pear; char name213=Apple ,例10.11 字符拷贝函数 strcpy ()进行字符串复制,将name1中的字符串连同0一 起复制到name2,运行结果如下:,Result is: 1:name1-pear 2:name2-Apple int i=0; while(1) clrscr(); printf(请输入密码n); gets(passstr); /*输入密码*/ if (strcmp(passstr,“password”)!=0) printf(口令错误,按任意键继续); else break; /*输入正确的密码,中止循环*/ getch(); i+; if
23、(i=3) exit(0); /*输入三次错误密码退出程序*/ fun(); /*输入正确密码所进入的程序段*/ ,字符串长度函数strlen 格式:strlen(字符数组) 作用:测试字符串长度 函数值:为字符串的实际长度,不包括0在内。 例如: strlen(“china”); 结果是5。 若改成: char str10=“china”; strlen(str); 结果也是5,不要误认为是10或是6。,字符串小写函数strlwr 格式:strlwr(字符串) 作用:将字符串的大写字母转换成小写字母。 请给出下面程序结果。 main() char str1=CHINA; printf(n%s
24、,strlwr(str1); 运行结果:china 字符串大写函数strupr 格式:strupr(字符串) 作用:将字符串中的小写字母转换成大写字母。,1.数组元素作函数参数 用数组元素作实参时,由于数组元素与普通变量具有相同的地位和作用; 对数组元素的处理是和普通变量一样的。,10.6 数组作为函数参数,例10.14c 数组元素作为实参 #include float fun( float a,float b,float c); main() float b3; float ave; b0=21.3; b1=b0/3; b2=8.2; printf(b0=%4.1fn b1=%4.1fn”
25、,b0, b1); printf( b2=%4.1fn”, b2 ); ave=fun( b0, b1, b2 ); printf( ave=%4.1fn,ave); printf(b0=%4.1fnb1=%4.1fn”,b0,b1); printf( b2=%4.1fn”,b2); getch(); ,实参为数 组元素作,float fun(float a,float b,float c) float sum, aver; sum=a+b+c; a=a+5.5 b=b+5.5; c=c+5.5; aver=sum/3.0; printf( a=%4.1fn” ,a ); printf( b=
26、%4.1fn” ,b ); printf( c=%4.1fn” ,c ); return (aver); ,用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。 换句话说,对数组元素的处理是按普通变量对待的。,2. 数组名作函数参数 在用数组名作函数参数时,不是把实参数组的每一个元素的值都赋予形参数组的各个元素。 因为实际上形参数组并不存在,编译系统不为形参数组分配内存。 因为数组名就是数组的首地址,所以在数组名作函数参数时是把实参数组的首地址赋予形参数组名(即地址传递)。,使用说明: (1)数组名作为函数的形参和实参,应该在调用函数和被调用函数中分别定义
27、数组,要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明,否则结果将出错。 (2)C编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。 如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。,例10.15 数组名作为实参 #include main() float Expfun2(float a4); float s4=88.5,90.5,70,71; float ave; printf(s0=%4.1fns1=%4.1fn”,s0,s1 ); printf( s2=%4.1fn s3=%4.1fn,s2,s3); ave=Expfun2( s ); printf( ave=%4.1fn,ave);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安徽省淮北市第二中学2026届初三下学期半期测试语文试题试卷含解析
- 租赁合同提前终止的条件
- 全家酸奶活动方案策划(3篇)
- 依云营销方案(3篇)
- 应急预案讨论内容(3篇)
- 产科应急预案脚本(3篇)
- 俱乐部体育营销方案(3篇)
- 形神兼备营销方案(3篇)
- 新房防水施工方案(3篇)
- 智能外贸营销方案(3篇)
- 2026年临床试验质量管理规范(GCP)培训考试试题及答案
- 新媒体运营新人考核制度
- 2025年乡镇事业编转公务员考试及答案
- 2025年邳州恒润城市投资笔试及答案
- 锯木灰清扫制度规范
- (2025)中国成人患者肠外肠内营养临床应用指南
- 智能制造科普介绍
- 网络信息安全维护合同协议(2025年防火墙升级)
- 直播中控培训课件
- 《应急预案编制与演练》全套教学课件
- 诊所医疗废物污水污物粪便处理方案
评论
0/150
提交评论