(C语言课件)第四章数组_第1页
(C语言课件)第四章数组_第2页
(C语言课件)第四章数组_第3页
(C语言课件)第四章数组_第4页
(C语言课件)第四章数组_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 数组,分类: 一维数组 多维数组 字符数组,在C程序中每个使用的变量都需要声明,以便编译系统为其开辟内存空间用于存储数据。有时程序中需要一批连续的存储单元,存放数据,这就需要声明一个数组。 数组: C语言用同名的带下标的变量组成,数组是由固定数目的同类型的变量按一定顺序排列而构成的,4.1.1 一维数组的定义和初始化 定义格式: 元素类型名 数组名常量表达式 说明: (1) 元素类型名指定该数组各元素的类型。 (2) 数组名的表示方法同变量名,应符合标识符命名规则。 (3)用方括号括起来的常量表达式的值表示该数组含数组元素的个数, 即数组长度。常量表达式中可包含常量和符号常量,不允许有

2、变量。引用时,数组元素的下标从0开始编排。 如: int m20; 表示整型数组m有20个元素:m0,m1,m 19。 float x 10; 表示实型数组x有10个元素:x0,x1,x9。,(1)可以在定义时对数组进行初始化, 如: 对全部元素赋初值 int m10=10,11,12,13,14,15,16,17,18,19 可对部分元素赋初值 int m10=0,1,2,3,4; 前5个元素初值由初值列表确定, 后5个元素为0。 如对数组元素赋同一初值, 也必须一一列出: int m10=2,2,2,2,2,2,2,2,2,2; 不可写成: int m10*2; 若全部元素都赋初值, 可省

3、略方括号中的常量表达式, 数组长度由初值个数确定。 int m =0,1,2,3,4,5; 花括号中有6个数, 表示一维数组m的长度为6。,4.1.2 一维数组元素的引用 C语言规定, 数组名代表数组0号元素的地址(详见第7章)。 数组元素的引用格式: 数组名下标 下标为整型表达式,它确定了引用元素的序号 下标从0开始编号, 最大等于定义的数组长度减1 在程序中数组元素等价于一个同类型的变量。 main() int m10=1,2,3,4,5,6,7,8,9,0; m9=m3*6; /* 正确, m9的值为24 */ m6=m10; /* 不正确, m10下标越界 */ Printf ( %d

4、 %d %d %dn, m4,m5,m6,m9); ,for (i=0;i10;i+) printf(“%4d”,mi);,给数组元素读值、输出、处理的方法是用循环结构,循环控制变量作为数组下标,对数组元素逐个进行操作。 例如:将数组m的十个元素输出,for (i=0;i10;i+) printf(“%4d”,mi);,将十个数据从键盘输入存入数组m中,for(i=0;i10;i+) scanf(“%d”,注意:数组m的输入输出这样做是错误的 scanf(“%d”,m); printf (“%d”,m);,使用数组的常见错误是下标越界,对于这种错误C的编译系统不检测错误,也没有警告,但结果往往

5、不正确。,例1: 从键盘输入五个数据,以输入顺序相反的顺序输出,#include void main() int x5, i ; for (i=0;i=0;i-) printf(“%6d”,xi); ,例 2 从键盘输入10个学生的成绩求平均分并输出大于平均分的所有成绩。 main( ) int i; int s10; float a=0.0; /*定义数组和变量 */ printf ( Input 10 students scores:n ); for(i=0; i average):n,a); for(i=0; ia) printf(%8d, si); ,例3 :输入十个数据,由大到小排序

6、后输出,排序是非数值处理领域重要的算法,目前公布的排序方案有二十余种,选择排序是一种简单易理解的算法。 基本思想: 从一组数中选出最大的,使其与第一个数交换位置。 从第2-n个数中选出最大的,使其与第二个数交换位置。 从第3-n个数中选出最大的,使其与第三个数交换位置。 ,这样的选择过程进行n-1次,4.2 二维数组,每个元素都带两个下标, 称此数组为二维数组。 4.2.1 二维数组的定义,定义格式: 元素类型名 数组名常量表达式1 常量表达式2,其中,常量表达式1的值表示数组行数, 常量表达式2的值表示数组列数。它们均为常量,二维数组的存放方式为: 按行存放。,可将二维数组看成由若干个特殊的

7、一维数组(可称为分数组)组成。如: int b35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; 则, 有三个一维分数组b0,b1, b2,每个一维分数组又有5个元素, 如图4.3。 b0有: b00, b01, b02, b03, b04 b1有: b10, b11, b12, b13, b14 b2有: b20, b21, b22, b23, b24,初始化 int a34=1,2,3,4,5,6,7,8,9,10,11,12;,int a34= 1,2,3,4,5,6,7,8,9,10,11,12;,int a34=1,2,3,8;,1 2 0 0 3 0 0

8、 0 8 0 0 0,4.2.2 二维数组元素的引用 引用格式: 数组名行下标列下标 其中的行下标和列下标均为整型表达式, 最小下标都是0, 最大下标分别等于数组定义的行数减1和列数减1, 引用时行下标和列下标都不得越界。 与一维数组元素一样,二维数组元素相当于同类型的简单变量。大部分语句都只能逐个引用数组元素, 不能单独用数组名引用整个数组, 不能给数组整体赋值。而且必须在引用数组元素之前, 先定义该数组。,例 4.5 计算矩阵下三角阵(不包括对角线元素)各元素之和。,main() int a33=3,4,5,6,7,8; int i,j,t=0; for(i=1;i3;i+) for(j=

9、0;ji;j+) t+=aij; printf(t=%dn,t); ,3 4 0 5 6 0 7 8 0,4.2.3 程序举例 例 4.6 输出10行扬辉三角形。 算法分析: main() int a1010; int i,j; for(i=0;i10;i+) ai0=1; aii=1; for(i=0;i10;i+) for(j=1;ji;j+) /* 0,1两行不用计算,j循环不执行 */ aij= ai-1j+ ai-1j-1; /*上一行的同列元素与前一列元素之和*/ for(j=0;j=i;j+) printf(%5d, aij); printf(n); ,例 4.7 将一个二维数组

10、行和列元素互换,存到另一个二维数组中(转置矩阵)。 如: 1 4 1 2 3 a = b = 2 5 4 5 6 3 6,程序如下: main ( ) int a2 3=1, 2,3,4, 5,6; int b3 2, i, j; printf(array a: n); for (i=0; i=1; i+) for (j=0; j=2; j+) printf(%5d, aij); bji=aij; printf(n); printf(array b:n); for (i=0; i=2; i+) for (j=0; j=1; j+) printf(%5d, bij); printf(n); ,4

11、.3 字符数组 存放字符数据的数组,它的每个元素存放一个字符。字符串就可以用字符数组存放。,4.3.1 字符数组的定义和引用 1. 定义格式 char 数组名常量表达式 字符数组的元素类型是字符,所以元素类型名是char 如: char c20; char是元素类型名,c是字符数组名, 常量表达式20是元素个数即数组的长度。,1. 初始化 (1) 直接给出字符数组中的各字符 char a5=G, o, o, d; (2) 可以去掉定义时的长度设置, 此时,字符数组的长度等于中的字符数。后面不会自动加字符串结束符0。 char x =I, ,a,m, ,a, ,s,t,u,d,e,n,t,.;

12、(3) 还可以用字符串常量对字符数组初始化。 如: char x20=I am a student.; 数组x的长度为20, x15自动存放0。可以省略 直接写为: char x20=I am a student.; 也可以去掉定义时的长度设置: char x =I am a student.;,char s10=“ENGLISH”;,字符0是ASCII码为0的字符,是系统自动加上的结束标志。,1. 字符数组的引用 除了在输入输出和函数调用语句中可以用数组名引用字符数组外, 在其它地方都不能整体引用字符数组, 只能引用数组元素, 引用一个元素相当于引用一个字符变量。不能给字符数组整体赋值。 4

13、.3.2 字符数组的输入输出 用scanf()和printf()输入/输出字符数组时, 可以用如下两种格式符: %c 逐个元素输入/输出字符(char)。 %s 整体一次输入/输出字符串(string)。 1.用格式符%c逐个元素输入/输出字符 将scanf()和printf()放在循环中, 用%c指定格式, 输入/输出项用数组元素, 其下标在循环中不断变化。输入时数组元素前应加地址符 int i; for (i=0;si!=0;i+) putchar(si); /* 等效于printf(“%c”,si); putchar(n); ,1. 用格式符%s整体输出字符数组 在printf( )中用

14、格式串“%s”, 输出项直接写数组名。 如: char c =I am a student; printf(%s, c); 注意: (1) 若数组长度大于字符串长度, 则遇到0即结束。 如: char c12=student; printf( %s!, c); 输出结果(注意 student 与 ! 之间没有空格): student! (2) 结束符0不显示。若数组中有多个0,输出时遇到第一个0即结束。 (3) 如果数组中没有0,当用此格式整体输出数组时结果可能不对, 最好改用%c格式输出各元素。如: char c=G,o,o,d; printf(%s,c); /* 结果在Good之后可能还有

15、其它内容 */ (4)数值数组不能整体输入/输出, 字符数组可以整体输入/输出。,1.用格式符%s整体输入字符串 在scanf()中用格式串“%s”, 输入项直接用数组名。 如: char c20; scanf(%s, c); 注意: (1)数组名本身就代表该数组的首地址(0号元素的地址), 所以scanf()中数组名前不允许再加地址符 若输入 You are happy! 则: s1: You s2: are s3: happy! 输入带空格的字符串时, 只有第一个空格前的字符串有效。,4.3.3 字符串处理函数 C语言程序库中提供了一些专门处理字符串的函数:包含string.h,stdio

16、.h puts(字符串或数组); 字符串输出到终端 gets(字符数组名); 输入一行字符序列到字符数组, 返回字符数组的首地址 strlwr (字符串); 将字符串大写字母转换为小写, 返回字符串的首地址 strupr (字符串); 将字符串小写字母转换为大写, 返回字符串的首地址,字符串连接函数strcat 格式:strcat(字符数组1,字符数组2) 功能:把字符数组2连到字符数组1后面 返值:返回字符数组1的首地址 说明:字符数组1必须足够大 连接前,两串均以0结束;连接后,串1的0取消, 新串最后加0,字符串拷贝函数strcpy 格式:strcpy(字符数组1,字符串2) 功能:将字

17、符串2,拷贝到字符数组1中去 返值:返回字符数组1的首地址 说明:字符数组1必须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符数组赋值,例 strcpy与strcat举例,#include #include void main() char destination25; char blank = , c= C+,turbo=Turbo; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf(%sn, destination); ,Turbo C+,字符串比较函数strc

18、mp 格式:strcmp(字符串1,字符串2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码), 直到遇到不同字符或0为止 返值:返回int型整数,a. 若字符串1 字符串2, 返回正整数 c. 若字符串1= 字符串2, 返回零 说明:字符串比较不能用“=”,必须用strcmp,字符串长度函数strlen 格式:strlen(字符数组) 功能:计算字符串长度 返值:返回字符串实际长度,不包括0在内,例 对于以下字符串,strlen(s)的值为: (1)char s10=A,0,B,C,0,D; (2)char s =“tv0willn”; (3)char s =“x69082n”;,答案:1 3 1,How are you?Hello! Len1=6,Len2=12,Len3=18,4.3.4 字符数组举例 例 4.11 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。,# include stdio.h main ( ) char c,string81; int i, n=0, k=0; gets (string); for (i=0; c=stri

温馨提示

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

评论

0/150

提交评论