版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 前面所用到的数据均为基本类型(整、实、字符),为了丰富数据类型 ,须提供强有力的数据表达方式。C语言提供了一种构造类型数据由基本类型按某一规则组合在一起。 其中数组:同一种(基本)类型按一定顺序组合在一起的数据类型。第1页/共45页7.17.1 一维数组一维数组7.1.1 一维数组的定义1. 数组名的确定方法同变量名。2. C语言用方括号 表示数组元数个数。形式: 类型说明符 数组名常量表达式;例: int a 20; float x 100;3. 常量表达式为常量和符号常量。不允许有变量,其表达式的值代表了元素的个数。例: int a20; 表示有20个元素 且元素从0开始编排:a0,a1
2、,a 19第2页/共45页4. 可在定义时对静态数组和外部存储(全局)数组赋初值, 方法如下: 对部分元素赋初值 static int a10=0,1,2,3,4;静态 对全部元素赋初值 static int a10=10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 如此,只有前5个元素初值确定,后5个元素由系统设置(一般缺省初始化为0)。 如对数组元素赋同一初值,必须一一写出: static int a10=0,0,0,0,0,0,0,0,0,0;不可写成: static int a10*0;第3页/共45页7.1.2 一维数组的引用 2. 引用方式: 数组名下
3、标 代表了一个元素,等价一个同类型的变量。 3. 一般地,一维数组各元素分配在连续地内存单元之中。1. 须象使用变量那样,先定义,后使用例: a 05+a1 6 为正确的算术表达式 若赋全部元素的初值,可省略常量表达式 a =0,1,2,3; 表示a4,即只有4个元素。第4页/共45页7.1.3 一维数组的存储结构和初始化1 一维数组的存储结构 C编译系统为所定义的数组变量在内存中分配一片连续的存储单元,诸元素按数组下标从小到大连续排列,每个元素占用相同的字节数。 例如,定义数组a如下: static int a5;数组a的存储示意图如下图所示:1000a0(a)a1a2a3a41006a0(
4、b)8824123a1a2a3a4第5页/共45页(1) 在定义数组时对所有数组元素赋初值。例如: static int a5=8,8,2,4,123;(2) 给数组部分元素赋初值 static int a57,6; 表明只给前2个元素赋初值,即a07,al6,其他元素自动赋0值。(3) 对全部元素赋初值时,可以不指定数组长度,C 编译系统自动根据初值个数来决定数组长度。例如: static int a=l,3,5,7,9,11,13;2 一维数组的初始化 由于一维数组是顺序存储在内存中,数组名代表了数组在内存的起始地址,而每个数组元素字节数相同,因此,根据数组元素序号可以求得数组各元素在内存
5、的地址,并实现对数组元素进行随机存取。 第6页/共45页下面是找出最大与最小数的代码:for(i=0;i5;i+) if(maxai) min=ai; /*把当前最小值送min,下标送k*/ k=i;例1:从键盘上输入5个数,输出最大、最小元素的值以及它们的下标。 (在书上)第7页/共45页在上面的for循环语句中max、min与所有元素一一比较,比max大的元素值赋给max,比min小的赋给min,同时用变量j,k分别记录最大、最小元素的下标。 打印:格式字符串中第一个d用输出项第一项变量 j 的值替换,后面三个d分别用max、k、min的值替换,其余字符原样输出。 printf(“max:
6、 a%d=%d, min: a%d=%d”,j,max,k,min);详细源代码如下:#define N 5#include main( )int i, j, k, max, min;static int a5; for(i=0; i5; i+) scanf(“ %d ”, &ai);第8页/共45页max=min=a0; /*假定第一个元素既是最大的,也是最小的*/j=k=0; /*对分别记录最大,最小元素下标的变量j,k初始化*/for(i=0; i5; i+) if( maxai ) min=ai; /* 把当前最小值送min,下标送k */ k=i;printf(“max: a
7、%d=%d, min: a%d=%d”, j,max,k,min); 第9页/共45页7.2 7.2 二维数组二维数组7.2.1 二维数组的定义1. 不可将定义写为int a4,10。形式 类型说明符 数组名常量表达式 常量表达式例: int a4 10; float x8 20;2. 可将二维数组的元素看成为若干个特殊的一维数组。如: int b3 4; 则: 有三个特殊的一维数组b0,b1, b2,每一个又有四个元素: b00, b01, b02, b03, b10, b11, b12, b13, b20, b21, b22, b23, b30, b31, b32, b33,第10页/共4
8、5页3. 二维数组的存放方式为: 按行存放。由此可推广 至三维、n维数组的定义和存放。 即: 最右边的下标变化最快。4. 初始化: 按行给二维数组赋初值: static int a34=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; 可以去掉其中的 。 可以对部分元素赋初值,但需表达清楚。如: static int a34=1,2,3,8。则相当于 1 2 0 0 3 0 0 0 8 0 0 0第11页/共45页请看一下这个例子: static M34= 1, 2, 3, 4, 5, 6, 7, 8, 9; 想一下这句语句的结果是什么。(假设数组的起始内存地址是:
9、0100H) 则相当于 1 2 3 0 4 5 6 0 7 8 9 0可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小. static int a 4=1, 2, 3, ,12 ;现在, 我们再来看一个使用第二种初始化方法的例子。static int M34= 1, 2, 3, 4, 5, 6, 7, 8, 9 ;请想一下它的结果。请注意这两个例子间的差别。则相当于 1 2 3 4 5 6 7 8 9 0 0 0第12页/共45页7.2.2 二维数组元素的引用形式: 数组名下标下标 其中的下标为整型表达式,但不得越界。 与一维数组元素一样,二维数组元素相当于同类型的简单变量。看下面的
10、例子:例7.4 二维数组的输入输出。#include main( )int a23, j, k;printf( “n Input array a: ” );for(j=0; j2; j+) for(k=0; k3; k+) scanf(“ %d ”, &ajk);第13页/共45页printf( n Output array a: n“ );for(j=0; j2; j+) for(k=0;k3;k+) /*循环三次,输出一行共三个元素*/ printf(“%4d”,ajk);printf(“n”); /*输出一行后换行,再输出下一行*/ 第14页/共45页7.2.3 二维数组的存储结
11、构和初始化1 二维数组的存储结构 系统为数组在内存中分配一片连续的内存空间,将二维数组诸元素按行的顺序存储在所分配的内存区域。 如有以下定义: static int a23; 对数组a,先存储第一行元素:a00,a01,a02,再存第二行元素:al0,a11,a12。下图表示出了数组a元素顺序与存储结构。 第一行第二行 a00 a01 a02 a10 a11 a12 第15页/共45页程序如下:#include main( ) int i, j ;int a44;for( i=0; i4; i+ ) for(j=0; j4; j+) scanf(“ %d ”, &aij);例1 从键盘
12、上输入16个整数,保存在44的二维数组中,输出数组偶数行和偶数列中的所有元素。 第16页/共45页 for( i=0; i4; i+ ) for( j=0; j4; j+ ) if (i%2=0 | j%2=0) printf( “%-4d”, aij); printf(“ n ”); 如果输入为:0 1 2 34 5 6 78 9 10 1112 13 14 15输出结果如下:0l23468910111214第17页/共45页几点注意: (1) 将数组所有元素初始值按相应顺序写在一个花括号内,各初值用逗号分隔,按数组元素排列顺序给各元素赋值。如:static int a32=0, l, 2,
13、 3, 4, 5;这使得:a00=0,a01=1,a10=2,al1=3,a20=4,a21=5。应该注意的是初始值在花括号中的顺序与初值个数不能错。 (2)根据二维数组的特点,分行给二维数组赋初值。如:static int a32=0, 1, 2, 3, 4, 5;赋初始值的结果与上面一种方法相同。显然这种方式比上种方式更直观,符合二维数组的特点,初始值与元素关系(行、列)清楚,不易出错。第18页/共45页例2.用如下的44矩阵初始化数组a44,求其转置矩阵并输出之。 123 4567 8 910 11 1213 14 15 16转置 成1 59 132 610 143 711 154812
14、 16 (3)给全部元素赋初值时,可以不指定第一维大小,但是第二维大小必须指定。如:static int a2=0, 1, 2, 3, 4, 5;定义了一个32(三行两列)数组a。static int a2=l, 2, , 0, 5;定义了一个32的数组a。第19页/共45页思路: 转置矩阵是将原矩阵的元素按行列互换所形成的矩阵,使用二维数组来处理矩阵问题是很方便的,而二维数组常常用二重循环来实现,内循环处理列,外循环处理行。程序如下:#define M 4#define N 4#include main( )int i,k;int aMN=1, 2, 3, 4, 5, 6, 7, 8, 9,
15、 10, 11, 12, 3, 14, 15, 16 ;int bMN;第20页/共45页for(i=0; iM; i+)for(k=0; kN; k+)bik=aki;for(i=0; iM; i+)for(k=0; kN; k+) printf( “%5d”, bik);printf(“ n ”);输出结果为:l 5 9 132 6 10 143 7 l l 154 8 12 16第21页/共45页7.3 7.3 多维数组多维数组7.3.1 多维数组的定义多维数组的定义 C语言支持多维数组,最大维数受编译程序限制。定义多维数组的格式是:存储类别 类型标识符数组名常量表达式1常量表达式2常量
16、表达式n; 7.3.2 多维数组的引用多维数组的引用 同一维、二维数组一样,对多维数组的引用就是对具体元素的引用,而不能对一个多维数组整体引用。多维数组名同一维数组名一样表示整个数组的首地址。 比如三维数组b323,可以认为是一个广义的一维数组b3,它的每一个元素都是一个23的二维数组。 第22页/共45页下面举例说明三维数组的引用。char a224=“I l”, “ore”, “you”;printf(“%s”, a);printf(“n %s”, a01);printf(“n %s”, a1);printf(“n %c”, a012);该段程序输出的结果如下: I l ove you e
17、第23页/共45页7.4 7.4 字符数组和字符串字符数组和字符串7.4.1字符数组的定义与初始化1. 初始化: 直接给出字符串中的各字符 static char a4= G , o , o , d ; 存放字符数据。字符串用字符数组存放。类型名数组名大小 char c10;若字符多于元素个数,则语法错,反之,后而补0可以去掉定义时的大小设置,而通过自动赋值决定长度(大小) static char x = I , , a , m , , a, , s , t , u , d , e , n , t ;第24页/共45页 前面说过,字符串常量用“ ” 表示,且由 0结尾. static char
18、 x =I am a student. ; 则长度为15+1=16, 其中x15存放 0,其中 亦可省略。2. 字符数组的引用 每一个字符数组元素相当于一个字符变量。7.4.2字符串的概念及存储字符串的概念及存储 在C语言中,没有字符串类型,自然不能使用字符串变量,但可以使用字符串常量,也即是字符串。 在对字符串进行处理时,字符串存放在字符数组中。例如:chars14=“How are you?”;第25页/共45页Howare you0 系统将双撇号括起来的字符依次赋给字符数组的各个元素,并自动在末尾补上字符串结束标志字符0,并一起存到字符数组中,s的长度为14实际字符只有12个,其存储示意
19、图如下图所示。 s0 s1 s13第26页/共45页格式符: %c 逐个输入/输出字符。 %s 整个串一次输入/输出。1. 输出 (1)用%s格式 用 %s 输出时,不输出 0 . 在printf中须直接写数组名. static char c =I am a student; printf(%s, c);7.4.3 字符数组的输入输出 若数组长度大于字符串长度,则遇到 0 即停止输出 static char c10= china; printf( %s, c); 输出时遇到第一个0即结束。第27页/共45页static char word=H, e, l, l, o, !; for(i=0;i
20、6;i+) printf(%c,wordi); (2)用%s格式该语句的输出结果为:Hello!2. 输入(用%s) 输入字符串时,系统自动加上0 输入多个字符串,可用空格隔开。 Static char str15, str25, str35; scanf( %s%s%s, str1, str2,str3);则:输入 How are you? str1: H o w 0 str2: a r e 0 str3: y o u 0第28页/共45页输入: How are you 则只会将How输入,且存为 Scanf 中须用地址量,数组名表示地址量。str: H o w 0 但若: static c
21、har str13 scanf(%s, str);第29页/共45页7.4.4 字符串处理函数 由学生自学,能否根据它们的功能自己编写其函数(可由主函数main实现)gets() 函数。 puts() 函数。 scanf() 函数。 printf() 函数。练习:练习一:找错误。练习二:写出程序的输出。第30页/共45页 strcat() 函数 strcpy() 函数 strcmp() 函数 strlen() 函数练习:练习一:找错误。练习二:写出程序的输出。第31页/共45页7.4.5 字符串数组举例例:字符串输入。 程序如下:#include main( )char s20,s120;sc
22、anf(“%s”,s);printf(“%s n”,s);scanf(“%s%s”,s,s1); /*从键盘上输入字符串,将How给s,将do给sl*/第32页/共45页 printf(“s=%s,sl=%s”,s,s1);puts(“n”);gets(s);puts(s);程序运行结果:How do you do? HowHow do you do? SHow,S1doHow do you do? How do you do? 例中使用了scanf( )与gets( )两个函数来实现字符串的输入,要注意它们的差别,根据需要来选用。 第33页/共45页例:从键盘上输入两个字符串,若不相等,将短
23、的字符串连接到长的字符串的末尾并输出。#include #include main( ) char s180,s280;gets(s1);gets(s2);if (strcmp(s1,s2)!=0)if (strlen(s1)strlen(s2) 第34页/共45页strcat(s1,s2);puts(s1);else strcat(s2,s1); puts(s2);输入:you Thank 输出:Thank you第35页/共45页7.5 7.5 数组作为函数的参数数组作为函数的参数7.5.1 数组元素做函数实参 数组元素作函数的参数与一般变量作函数参数相同,要注意的是,数组元素作参数时候,
24、值的传递方式仍是单向的值传递。 由于这方面在函数一章讲述较多,这里重点讲第二节。7.5.2 将数组名作函数参数 此时形参与实参都应使用数组名,分别在被调函数与主调函数中说明数组类型,并且要求实参与形参数组的类型相同,维数相同。在进行参数传递时是“地址传递”,即实参数组的首地址传给形参数组,而不是将实参数组的每个元素一一送给形参的各数组元素。第36页/共45页思路: 把相邻两数比较,若前面数大,则两数交换位置,直至最后一个元素被处理,最大的元素就“沉”到最下面,即在最后一个元素位置。这样,如有n个元素,共进行n-1轮,每轮让剩余元素中最大的元素“沉”到下面,从而完成排序。 程序如下:下面给出一个
25、程序设计中的经典例子。例:用冒泡法将10个数按由小到大排序。 第37页/共45页#include #define N 80main( )int aN;int i, m; void sort(int b , int k);void print(int b , int k);printf(“n Input m(80): ”);scanf(“%d”, &m); /*输入要排序的元素的个数*/for(i=0; im; i+)scanf(“ %d ”, &ai); /*输入m个元素到数组a中*/sort(a,m);print(a,m); 第38页/共45页void sort(int b,int k) int i, j, t, flag;for(j=0; jk-1; j+)flag=0;for(i=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年上海市东方公证处招聘公证员助理、辅助人员备考题库完整答案详解
- 3D打印个性化缝合导板的设计与应用
- 2型糖尿病社区综合管理路径优化
- 2025年工作地在合川备考题库重庆一国企招聘及答案详解1套
- 2025年枫亭镇中心卫生院招聘编外工作人员备考题库及答案详解一套
- 2025年第十师北屯面向社会公开引进高层次事业编工作人员备考题库及答案详解一套
- 2025年资阳市人才发展集团有限公司诚聘3名项目人员备考题库带答案详解
- 灰色时尚商务总结汇报模板
- 2025年个旧市医共体卡房分院招聘备考题库及1套参考答案详解
- 2025年广州南沙人力资源发展有限公司招聘公办幼儿园编外工作人员备考题库及1套完整答案详解
- 编制竣工图合同范本
- 新22J01 工程做法图集
- 智慧树知到《艺术与审美(北京大学)》期末考试附答案
- 2024-2025学年上海市长宁区初三一模语文试卷(含答案)
- 钢管支撑强度及稳定性验算
- 全国医疗服务项目技术规范
- 人教版六年级数学下册全册教案
- 医院公共卫生事件应急处理预案
- 智慧校园云平台规划建设方案
- 机械制图公开课课件
- 内镜下治疗知情同意书
评论
0/150
提交评论