版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 第一节 数组的基本概念 第二节 一维数组 第三节 二维数组 第四节 字符数组 第五节 应用实例第六章 数组C中定义了在基本数据类型基础上的构造数据类型(数组,结构体,共用体等) 变量先定义,再使用,如果变量个数少,且彼此独立时,可以 int a,b,c ; a = 5; b=10;c=23; printf(“%d,%d,%d”,a,b,c);当变量个数比较多,并且有内在的关系时,例如 :全班有30个人,每人一个成绩 定义int a1,a2,a30 ? 一组有序数据的集合,各个元素属于同一个类型,用统一的名称标识这一组数,用下标唯一地确定这组数中的每一个值。6 1 数组的基本概念数组的三
2、要素数组数组是有限个相同的数据类型的数据分量的有序集合相同的数据类型(定义数组时规定)有限的成员个数 (定义数组时规定)彼此有序的排列 (引用数组元素时的下标)int a5int a5; a0=1;a1=2;.62 一维数组的定义和使用 一 、一维数组的定义格式:类型 标识符 长度 int a10所有元素为同一类型变量名,即数组名数组中所含元素的个数int a10;由10个整数组成的数组,共同拥有数组名a数组长度必须是整型量int a2*3说明:用方括号可以用常量表达式不能不定义长度,也不能做动态定义int an,n=10;62 一维数组的定义和使用 二 、一维数组元素的引用原则数组必须先定义
3、,再使用 数组中的元素必须逐一引用方法:通过数组名及其元素的下标逐一引用定义时 类型 数组名N int a10引用时 数组名下标下标范围从 0 到 N-1 a0,a1,a9为数组a中的所有元素6 2 一维数组的定义和使用 下标表示了元素在数组中的位置下标可以用表达式 a2*3相当于a6说明(数组中第?个元素)?三、 一维数组的初始化变量在使用之前使其有值如果没有初值?数组初始化的方法int a4可以对静态或外部存贮类型的数组进行初始化。6 2 一维数组的定义和使用 数据类型 数组名 常量表达式初始化数据;在数组说明的同时进行初始化的一般形式为:1.定义数组时,对全部元素赋值 int a5=1,
4、2,3,4,5;用 包括所有初值,用逗号分隔各数值2 对部分元素赋值 按顺序给前2个元素赋值float x5 = 1.9, 2.0 ;x0=1.9;x1=2.0;其余元素为 ?若要对数组的全部元素初始化,则可省略数组说明中的大小。 int a = 1, 2, 3, 4;6 2 一维数组的定义和使用 要求* 初值的个数不能超过定义的数组长度C规定,只有静态数组(static)才能初始化,(第7章内容), Turbo C中,允许为数组(非静态)初始化区别:static int a5=1,2,3;后两个元素值为0int a5=1,2,3;后两个元素为随机数 int i, a10=1,2,3,4,5,
5、6,7,8,9,10; for(i=0;i10;i+)printf(“%d,”,ai);通过数组名和下标引用数组中的每一个数据 运行结果:1,2,3,4,5,6,7,8,9,10,6 2 一维数组的定义和使用 有一个数组,内有10个数,求出最小的数和它的下标,然后将它与数组中的第一个数对换。71332668153206512int a10a0a i a971331682653206512i=?定义两个临时变量 min和 k假定第一个元素就是最小的,min=a0,k=0思路用min与数组中的每一个元素ai比较, 若ai比min小, 将ai赋给min, 将下标I赋给k, 否则,继续比较.6 2 一
6、维数组的定义和使用 2671332668153206512min=a0i=1i=2i=3i=4i=5i=6i=7i=8i=91326 min=a1 k=1循33 min和k的值不变133203 min和k的值不变11 min和k的值不变1&min531 min和k的值不变 121 min和k的值不变651 min和k的值不变min=1k=5ai=a0a0=min713316826532065126 2 一维数组的定义和使用 main( ) int i,a10,min,k; for(i=0;i10;i+) scanf ( “%d”,&ai ); min=a0; for(i=1;iai ) min
7、=ai ; k=i ; ai=a0; a0=min; for(i=0;i10;i+) printf(“4d”,ai); printf(“%d,%d”,k,min); 循环输入10个数循环找出最小的交换数据输出数组输出最小值和原始下标6-3 二维数组的定义和引用当一个一维数组中的每个元素本身又是一个一维数组时,该数组为一个二维数组一、二维数组的定义 1 格式:类型 标识符长度1长度22 二维数组元素需要两个下标表示例:int a34表示数组a中有3行4列共12个数据3 二维数组在存储空间中是按行优先存储 int a34行列a00a01a02a23.a03第一行最后一个元素矩阵二 、二维数组的引用
8、原则:逐一引用数组名下标1下标2下标1从0到长度-1下标2从0到长度-1方法:标识符N1N2int a42a00.a31共8个数据(对本例,决不可能有元素a42)三、二维数组的初始化方法:1 对全部元素赋初值,分行,各用一个 int a23=1,2,3,4,5,6;6-3 二维数组的定义和引用2 整体赋值,系统自动分行int a23=1,2,3,4,5,6;1,2,33 对部分元素赋初值,注意区别:(1)int a23=1,2,3; (2) int a23=1,2,3; (3) int a23=0,1,2,3;当为全部元素赋值时,一维长度可省略 int a 3=1,2,3,4,5,6;类似可以
9、推广到三维或多维数组6-3 二维数组的定义和引用88年90年王张李王张李4 5 4 3 5 3 4 3 5 4 3 3 3 5 4 3 3 5 3 5 3 5 5 3 教学 科研 文体 其他用数组定义 int a ?a111=?6-3 二维数组的定义和引用若定义int a34,则对a的正确引用是:A) a 2 4 B) a 1,3 C) a 1+1 0 D) a (2)(1)以下二维数组说明方式中正确的是:A) int a3 ; B) float a(3,4);C) double a14; D) float a(3)(4);引用假设二维数组a有m列,则计算任一元素aij在数中的位置的公式为:
10、i*m+j+1即a00位于数组的第一个位置上i*m+j+16-3 二维数组的定义和引用6-3 二维数组的定义和引用例题:不用输入,自动生成下列矩阵1 2 3 4 51 1 6 7 81 1 1 9 101 1 1 1 111 1 1 1 1元素值为 1按行递增main ( ) int i,j,a55; k=2; for(i=0;i5;i+) /* 按行循环 */ for(j=0;j5;j+) /* 按列循环 */ if(j=i) aij=1; /*下三角 */ else aij=k+; /*上三角 */ for(i=0;i5;i+) for(j=0;j5;j+) printf(“%4d”,ai
11、j); printf(“n”); /* 输出一行后换行 */ 6-4 字符数组的定义和引用用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。字符数组一、字符数组的定义定义方式与前面介绍的类似。例:char c10, d23;由于字符型与整型是互相通用的,因此也可定义 int c10;二、字符数组的初始化与前面介绍的类似,只是数组的每一个元素对应一个字符。static char c10=I,a, m, , n,a , p, p, y;static char c23= , *, *, , , * ;6-4 字符数组的定义和引用三、字符数组的引用可以引用字符数组中的一个元素,得到一
12、个字符。原则:逐一引用标识符N1N2char a42方法:数组名下标1下标2下标1从0到长度-1下标2从0到长度-1a00.a31共8个数据例1输出一个字符串main( ) static char c11=I, ,a,m, ,a, ,b,o,y ; int i;for(i=0;i10;i+)printf(%c,ci);printf(n); 例2输出一个图形main( ) char a55,i,j;* for(i=0;i5;i+)* for(j=0;j5;j+)* * if(j= =0|i= =j)* * aij=*;* *else aij= ; for(i=0;i5;i+)for(j=0;j5
13、;j+) printf(%c,aij); printf(n); 6-4 字符数组的定义和引用四、字符串和字符串结束标志 在C语言中,字符串是作为字符数组来处理的。同时,为了测定字符串的实际长度,在C语言规定了一个“字符串结束标志”(字符0 ),如一个字符串第10个字符为0,则此字符串的有效字符为9个,即在遇到第一个字符0时,表示字符串结束,由它前面的字符组成字符串。 系统对字符串常量也自动加一个0 作为结束符,当然在定义字符数组时应估计实际字符串长度。 对字符数组初始化,可以用字符串常量来使字符数组初始化。 如:static char c =“I am happy”; 或static char
14、 c =“I am happy”;此时系统自动在串尾加 0。6-4 字符数组的定义和引用五、字符数组的输入输出输入输出有两种方式: 逐个字符输入输出。用“%c” 将整个字符串一次输入输出。用“%s”输出应注意的问题static char c=“china”;printf(“%s”,c);输出字符不包括结束符0用“%s”格式输出字符时,printf函数中的输出项是字符数组名,而不是数组元素名。如果数组长度大于字符串实际长度,也只输出到0结束如果一个字符数组中包含一个以上0,则遇到第一个0时输出就结束。输入时应注意:在使用scanf函数时,若输入字符串,用“%s”格式,则后面跟数组名,且不带“&”
15、符号,数组名指向该数组的起始地址。6-4 字符数组的定义和引用六、字符串处理函数puts(字符数组)将以0结束的字符序列输出到终端,使用puts函数输出的字符串中可以包含转义字符。gets(字符数组)从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址。main()char str13; gets(str); puts(str);Computer & C Computer & Cstrcat(字符数组1,字符数组2) 连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放到字符数组1中,函数调用后得到一个函数值-字符数组1的地址。说明:字符数组1必须足够大
16、,以便容纳连接后的新字符串连接时,自动取消数组1后的0,只在新串最后保留一个06-4 字符数组的定义和引用strcpy(字符数组1,字符串2)它是“字符串拷贝函数”,作用是将字符串2拷贝到数组1中去。说明:字符数组1必须足够大,以便容纳被拷贝的字符串。“字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名,也可以是一个字符串常量 如:strcpy(str1,str); strcpy(str1,China) ;拷贝时连同字符串后面的0一起拷贝到字符数组1中;不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组 如:str1=“China”为非法;可以用strcpy函数将字符串2中
17、前面若干个字符拷贝到字符数组1中去;strcpy(str1,str2,2)拷贝前2个字符,然后再加一个06-4 字符数组的定义和引用strcmp(字符串1,字符串2) 作用: 比较字符串1和字符串2 方法: 对两个字符串自左至右逐个相比,直到出现不同的字符或遇到0为止,如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准,比较的结果由函数值带回。字符串1=字符串2, 函数值为0字符串1字符串2, 函数值为一正整数字符串1字符串2, 函数值为一负整(记忆方法:绝对值)strlen(字符数组) 是测试字符串长度的函数,函数的值为字符串中的实际长度,不包括0在内。st
18、rlwr(字符串)将字符串中大写字母换成小写字母。strupr(字符串)将字符串中小写字母换成大写字母。6-4 字符数组的定义和引用6-4 应用实例int a10,已经赋值,如何进行排序?1.选择排序2.起泡排序3.插入排序找出数组中最小的,与第一个元素对换,再在其余9重复上述操作顺序比较相邻两元素的大小,若左边元素比右边的大,则交换,否则不交换,比较需进行多次假定第一个元素是合适的,取出第二个元素与之比较,若小,插到前面否则,位置不变,再将第三个元素与前面两个比较 ,放到有序序列中合适的位置,依次类推.6-4 应用实例 main( ) int i,j,min,a10,k; for(i=0;i
19、=9;i+) scanf(“%d”,&ai); for(j=0;j9;j+) min=aj; k=j; for(i=j+1;iai) m=ai; k=i; ak=aj; aj=min; for(i=0;i=9;i+) printf(“%d ”,ai); 选择排序程序起泡排序:数组: (9,7,18,3,4,10,8)(1) 9,7,18,3,4,10,8 交换7,9,18,3,4,10,8 不交换7,9,18,3,4,10,8 交换7,9,3,18,4,10,8 交换7,9,3,4,18,10,8 交换7,9,3,4,10,18,8 交换7,9,3,4,10, 8,18 第一轮比较结束,较小的
20、数向前移动,较大的数向后移动7-4 应用实例(2) 7,9,3,4,10, 8,18 不交换 7,9,3,4,10, 8,18 交换 7,3,9,4,10, 8,18 交换 7,3,4,9,10, 8,18 不交换7,3,4,9,10, 8,18 交换7,3,4,9,8, 10,18 7,3,4,9,8, 10,18 不交换第二轮比较结束6-4 应用实例(3) 7,3,4,9,8, 10,18 交换 3,7,4,9,8, 10,18 交换 3,4,7,9,8, 10,18 不交换 3,4,7,9,8, 10,18 交换不交换 3,4,7,8,9, 10,18 3,4,7,8,9, 10,18
21、不交换第三轮比较结束 3,4,7,8,9, 10,18 (4) 3,4,7,8,9, 10,18 排序完毕6-4 应用实例6-4 应用实例 main( ) int i,j,m,a11; for(i=1;i=10;i+) scanf(“%d”,&ai); /*输入N个整数 */ for(j=1;j=10;j+) /* N-1轮排序处理 */ for(i=1;iai+1) m=ai; /* 交换数据 */ ai=ai+1; ai+1=m; for(i=1;i=10;i+) printf(“%d ”,ai);起泡排序程序例2: 输入一行字符,统计有多少个单词,单词用空格分隔。 如:I am a st
22、udent. #include stdio.hmain( ) char string81, c; int i,num=0,word=0; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= = ) word=0; else if (word= =0) word=1; num+; printf(There are %d words in the linen,num); 6-4 应用实例例3任输入十个国家的名字,按由小到大排序。#include stdio.hmain( ) char a1020, b20; int i, j; for(i=0;i10;i+
23、) gets(ai); for(i=0;i9;i+) for(j=i+1;j0) strcpy(b,ai); strcpy(ai,aj); strcpy(aj,b); for(i=0;i10;i+)printf(%sn,ai); 6-4 应用实例第6章 习题1. 下面不能把字符串:Hello! 赋给数组的语句是A)static char b110=H,e,l,l,o,!;B)static char b210;b2=Hello!;C)static char b310;strcpy(b3,Hello!);D)static char b410=Hello!;2、若二维数组a 有m列,则aIj前的元素
24、个数为: A) j*m+I B) I*m+j C) I*m+j-1 D)I*m+j+1 3、下面程序段运行结果是: char c5=a,b,0,c,d,0 ; printf(“%s”,c); A) ab B)ab C) ab c D)ab04、以下对S的初始化,不正确的是: A) char s5=“abc” B) char s5=a,b,c; C) char s5= ; D) char s5=“abcdef”;5、有下面程序段: char a3,b =“china”; a=b; printf(“%s”,a); 则A)运行后输出china B)运行后输出chC)运行后输出chi D)编译出错第6
25、章 习题6、若定义二维数组 int a33=1,2,3,4,5,6,7,8,9;int k;则下列语句的输出结果是: for (k=0;k3;k+) printf (“%d”, ak,2-k); A) 3 5 7 B) 3 6 9 C) 1 5 9 D) 1 4 7 7、判断字符串a 和 b 是否相等,应当使用: A) if (a= = b) B) if (a=b) C) if (strcpy(a,b) D) if (strcmp(a,b)第6章 习题读程序,写出正确结果:1、main() char a5=*,*,*,*,* int i, j, k; char space= ; for (i=
26、0;i5;i+) printf(“n”); printf(“ ”); for (j=1;j=i;j+) printf(“%c”,space); for (k=0;k5;k+) printf (“%c”,ak); * * * * *第6章 习题读程序,写出正确结果:2、 #include stdio.h”; #include main() char a80=“AB” ,b80=“LMNP” int I =0; strcat (a,b); while (aI+ !=0 ) bI=aI; puts(b); 答案:LBLMNP注意:当b 赋值时,I的值已递增即 b1=a1,而b0仍保持原来的值L第6章
27、 习题程序填空:数组A包括10个整型元素。下面程序是求出A中各相邻两个元素的和,并存入数组B中,按每行3 个元素的形式输出,请填空。 main() int a10,b10, I; for (I=0;I10;I+) scanf(“%d”,&aI); for (_;I10;I+); _; for (I=1;I10;I+) printf (“%3d”,bI); if (_ = = 0) printf(“n”); 第6章 习题 6.1 用“筛法”求1100以内的素数。 #include math.h main() int i, j, count=0, a101; for (i=1;i=100;i+)
28、ai=i; /*赋值*/ for (i=2;isqrt(100);i+) for (j=i+1;j=100;j+) if (ai!=0 & aj!=0) if (aj%ai=0) aj=0; printf(n); /*输出*/ for (i=2;i=100;i+) if (ai!=0) printf(%5d,ai); count+; if (count%10=0) printf(n); printf(n count=%d, count); 第6章 习题6.4 main( ) int a11=1,3,5,7,9,10,13,14,35,98; int i,j,k,number; clrscr()
29、; for (i=0;i=9;i+) printf(%5d,ai); printf(nPlease input inserted data:); scanf(%d,&number); for (i=0;inumber) k=i; break; for (i=10;ik;i-) /*依次后移一个位置*/ ai=ai-1; ak=number; /*插入*/ printf(nThe inserted numbers:n); for (i=0;i=10;i+) printf(“%5d”,ai); 第6章 习题6.6 #define N 11 main() int i,j,aNN; for (i=1;
30、iN;i+) /*初值*/ aii=1;ai1=1; for (i=3;iN;i+) for (j=2;j=i-1;j+) aij=ai-1j-1+ai-1j; for (i=1;iN;i+) /*输出*/ for (j=1;j=i;j+) printf(%6d,aij); printf(n); printf(“n”); 第6章 习题6.7 main() int a34 ,i,j,x,k,max,maxi,maxj; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d”,&x); aij=x; for(i=0;i3;i+) max=ai0; maxi=i; maxj=0; for(j=1;j4;j+) if(maxaij) max=aij; maxi=i; maxj=j; min=a0maxj; for(k=1;k3;k+) if(minmkmaxj) m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大跨度结构安装专项施工方案
- 起重机械使用单位班组安全活动制度
- 非金属矿山安全管理员定期维护安全操作规程
- 土方工程开挖及支护施工方案
- 物业小区突发网络中断应急预案演练脚本
- 我是值日小先锋和教室守整洁
- 2026年初中道德与法治九年级上册模拟试卷冲刺押题
- Unit 5 Revealing nature Using language 学案-2022-2023学年高中英语外研版2019选择性必修第一册
- 《非遗面塑》课件-2.1.2面塑制作过程
- 2026年调速永磁交流电动机行业技术分析报告
- 2026青岛能源集团有限公司招聘笔试参考题库及答案解析
- 2026年国企信息化管理岗位考试题含答案
- (2025)泌尿系结石药物溶石临床应用中国专家共识课件
- 认知障碍课件
- 儿童青少年体能训练课程指南
- 牛保才事迹课件
- 微格教学美术课件
- 机电概念设计毕业论文
- 新疆94电力安全事故案例
- 超星尔雅学习通《中华民族共同体概论(云南大学)》章节测试附答案
- 社区卫生服务中心规章制度职责
评论
0/150
提交评论