1、C语言第7章数组第7章 数 组概述:1构造数据类型 char,int,float,double 等在C语言中称为基本数据类型。 由基本数据类型导出的各种数据类型,如数组、结构、联合等称为构造数据类型。2为什么要有构造数据类型? 为程序设计提供方便v 如同时定义多个变量:统计在一篇文章中各字母出现的次数。 进行一些特殊数据的处理 常用于处理大批量数据3什么是数组 数组是有序数据的集合,是类型相同的变量组成的序列,有统一的数组名,通过下标不同来访问不同变量,称这些变量为数组元素。 数组中的所有元素在内存中一定是连续存储的 数据特点:存在内在联系 只有一个下标一维数组 有两个下标二维数组7.1 一维
2、数组 只有一个下标 格式: 类型说明符 数组名元素个数;例:int a10; /*定义含有10个元素的整型数组*/ 每个数组元素都是整数。 相当于同时定义了10个整型变量例:float b100; /*定义含有100个元素的浮点型数组*/ 每个数组元素都是浮点数 相当于同时定义了100个浮点型变量例:int a5, b6+3;1说明: 数组的命名规则与变量命名规则相同 定义一维数组时,数组元素的个数必须明确,即在方括号内的元素个数说明中不能使用变量; 可用 #define 定义符号常量,方便修改程序 例如: #define N 10 那么程序中可定义数组 int sN; 如要将数组b的长度改为
3、20,只需把命令行改为#define N 20 其它部分无需改动2注意 数组元素下标从0开始;v int a10;v 定义的数组元素有a0,a1,.,a9共10个,且每个元素均为一个int型变量,v float b100;定义的数组元素有b0,b1,.,b99共100个,且每个元素均为一个float型变量,可与以前学过的变量一样使用。3一维数组的存储方式 数组在内存中是连续存储的。每个数组元素占有相同大小的空间。 数组占据的总的内存空间就是每个数组元素所占空间*数组元素个数。 数组第一个元素的起始地址就是整个数组的首地址。4一维数组元素的引用 格式:数组名下标 数组元素的下标从0开始,即int
4、 a4,表示定义4个数组元素,分别是a0,a1,a2,a3 例如,a2,bi,bi+1是合法引用 下标可以是常量、变量或表达式 其值必须确定、且是整型 系统不做下标越界检查 注意,只能每次使用一个元素,而不能一次引用数组全体(字符串除外)。 常用循环对数组进行输入输出操作【例】存放字符的数组示例。#define N 4#include main( ) int i; char chN; ch0=G; ch1=o; ch2=o; ch3=d; for ( i=0; i4; i+ ) putchar(chi); 例:#includemain() int i,a10; for(i=0;i=0;i-)
5、printf(“%dn”,ai); 【例】输入若干学生的成绩(用负数结束输入),计算其平均成绩,并统计不低于平均分的学生人数。 分析: 为了统计不低于平均分的学生人数,先把学生成绩存起来,等到计算平均成绩后,再与平均分比较 如果使用普通变量,过程就会很繁琐 选用数组简化程序 #define N 40 main( ) int i, n=0, count=0; float score,total=0,aN,ave; printf(data:n); scanf(%f,&score); while( score=0 ) an= score; n+; total=total+score; scanf(%
6、f,&score); ave=total/n; for ( i=0; i=ave ) count+; printf(ave=%f,count=%d,ave,count);5一维数组的初始化 数组可以在定义时赋初值,称为初始化。【例】int i;int a5=1,2,3,4,5; for( i=0; i5; i+ ) printf(%5d,ai); 可以只对部分元素赋值,未赋值自动为0.【例】int i;int b5=2,3,4; /int b5=2,3,4,0,0; for( i=0; i5; i+ ) printf(%5d,bi); 对整个数组进行初始化时,可以不指明元素的个数,此时,系统自
7、动按所给初值的个数来确定数组的元素数。【例】int i;int c =3,4,5,6,7; for( i=0; i5; i+ ) printf(%5d,ci); 例:int i;int d5=0; for( i=0; i5; i+ ) printf(%5d,di); 注意:不能写成 int e ; 【例】char a4=G,o,o,d; 6一维数组程序举例【例】定义含有10个元素的数组,并将数组中的元素按逆序重新存放后输出。 #include main( ) int i,t,a10=1,2,3,4,5,6,7,8,9,10; for( i=0; i10; i+ ) printf(%4d,ai)
8、; printf(n); for(i=0; i10/2; i+ ) t=ai; ai=a10-i-1; a10-i-1=t; for( i=0; i10; i+ ) printf(%4d,ai); printf(n); 例:观察运行情况int i,t,a10=1,2,3,4,5,6,7,8,9,10;t=a0; for ( i=0; i9; i+ ) ai=ai+1; a9=t; for ( i=0;i10;i+) printf(%4d,ai);【例】输入十个互不相同的整数并存在数组中,找出最大元素所在的下标。 #include main( ) int i,k,a10; printf(Inpu
9、t data:); for ( i=0; i10; i+) scanf(%d, &ai); printf(n);k=0; for ( i=1; i10; i+ ) if ( akai ) k=i; printf(“max=%dn”,k); 【例】在数组中找出最小元素,并与第一个元素对调 k=0; for( j= 1; jaj ) k=j; temp=a0; a0=ak; ak=temp; for ( j=0; j10; j+ ) printf(%4d,aj); 【例】选择排序 算法:v 1.输入N个数;v 2.找出最大的一个,与第一个元素交换位置。v 3.在其余的元素中找出最大的一个,与第二个
10、元素交换位置。v 4.重复上一过程,直到所有元素都已排序。 【例】冒泡排序main( ) int a11,i,j,t; printf(“Input 10 numbers:n”); for (i=1;i11;i+) scanf(“%d”,&ai); printf(“n”); for (i=1;i=9;i+) for (j=1;jaj+1) t=aj; aj=aj+1; aj+1=t; printf(“the sorted numbers:n”); for (j=1; j=10;j+) printf(“%d”,aj);【例】将键盘输入的一个数,插入到已按降序排列的数组中,要求按原来的排序规律插入。
11、算法: 设数组存储空间足够大 找合适的插入位置 向右移动插入点后的元素 插入 #include main( ) int i,j=0,k; int a11=20,18,16,14,12,10,8,6,4,2; for ( i=0; i=k & j=j; i- ) ai+1=ai; aj=k; for ( i=0; i11; i+ ) printf(%4d,ai); printf(n);7.2 二维数组1二维数组的定义 在二维数组中,有两个下标起作用,只有当两个下标都确定时,才可以唯一决定一个元素。 定义: 数据类型 数组名下标1下标2v 此时数组元素的个数为:下标1*下标2通常也把下标1称为行,
12、下标2称为列,类似一张二维表(由行列组成的表)例:int a32; 表示有3行,每一行2列,共有6个元素。行、列下标都从0开始2二维数组的存储方式 与一维数组相同,二维数组在内存中也是连续存储的,各个数组元素之间按下标的前后顺序连续,下标小的在内存中的地址也小 可以认为是二维数组由多个一维数组组成,每个行是一个一维数组v 如int a23可以认为是由2个一维数组构成,每个一维数组有3个元素v a0有3个元素a00,a01,a02,v a1有3个元素 a10,a11,a123二维数组元素的引用 二维数组的每个元素可以当作一个内存变量来使用 引用格式:数组名 下标1下标2v 其中:下标可以是整型常
13、数、变量或表达式。4二维数组的初始化二维数组初始化中要注意行、列的区分,赋初值的顺序是按照数组元素的存储顺序来进行的。例1:int a23=1,2,3,4,5,6;例2:int a23=1,2,3,4,5,6;例3:int a 3=1,2,3,4,5,6;例4:int a23=1,2,4,5,6;例5:int a23=1,2,4,5,6;例6:int a23=1,0,2;输入举例#include main( ) int i,j,s34;for(i=0; i3; i+) for(j=0; j4; j+) scanf(%d,&sij);printf(Array s:n);for(i=0; i3;
14、i+) for(j=0; j4; j+) printf(%5d,sij); printf(n); 例:有一个3x4的矩阵,要求编程求出其中最大元素的值,以及其所在行列号main( ) int i,j,max, row,col,a34; for (i=0;i3;i+) for (j=0;j4;j+) scanf(“%d”,&aij); max=a00;row=0; col=0; for (i=0;i3;i+) for (j=0;jmax) max=aij; row=i; col=j; printf(“max=%d,row=%d,col=%dn”,max,row,col); 7.3 字符串1定义
15、用双引号括起来的字符序列称为字符串 字符串的输出控制符用%sprintf(“%sn”, “aaaaaaaaaaa” ); 字符串与字符的区别在于字符串在内存中存储时,结尾一定要加上一个0(ASCII码为0的字符)作为字符串的结束符 C语言中没有专用的字符串类型变量,字符串要通过字符型char来处理 字符串实质上是一个以0为结束符的一维字符数组 有效字符的个数称为字符串长度 例如,“abc”的长度为3,但占4个字节(0占一位) 2初始化 用来存放字符型数据。 定义与使用方式可与数值型数组相同。 例:v char string5=H,e,l,l,o;v char string1=G,o,o,d;v
16、 string为一个字符型的一维数组,初值在定义时指定,此时,string也可称为一个字符串变量。 字符数组可用字符串来赋初值;v 例:char string=“Hello”;v char s=“Hello”;v 注意:此时的s和string所占的空间均为6。3字符数组的输入输出 【例】字符串示例#include main( ) int i=0; char a =K; char b = Sit down ; while(ai!=0) putchar(ai); i+; printf(n); i=0; while(bi!=0) putchar(bi); i+; 一维字符数组可作为“字符串变量”来使
17、用。v 例:char str20;v scanf(“%s”,str); v printf(“%sn”,str); 用scanf输入多个字符串时,中间以空格分格v 例:char str15, str25, str35;v scanf(“%s%s%s”,str1,str2,str3);v 输入how are you?4字符串输入输出函数 gets()v 从标准输入设备读入一个字符串v 例,char s20;v gets(s);v 此时,若输入how are you ,就会保存在s中 puts()v 将一个字符串输出到标准输出设备上v 例 char s=“China”;v puts(s);v 相当于
18、printf(“%s”,s);【例】#include main( ) char a10, b10; gets(a); scanf(“%s”,b); puts(a); printf(“%sn”,b); 5二维字符数组 二维字符数组的每一行可作为一个一维字符数组,即可保存一个字符串。例:char months10=“January”,“February”,“March”;v 相当于定义了一个有3行10列的二维数组,每一行是一个一维数组,6常用字符串函数【例】求字符串长度函数的使用。strlen #include #include main( ) char a80; int count; gets(
19、a); count=strlen(a); printf(%s: %dn,a,count); 【例】字符串复制函数的使用。strcpy #include #include main( ) char a50,b80; gets(a); strcpy(b,a); puts(b); 两个字符串交换:char a5=”ABCD”,b5=”abcd”;char temp5;strcpy(temp,a); strcpy(a,b); strcpy(b,temp); 【例】字符串连接函数的使用。strcat#include #include main( ) char a80,b30; gets(a); gets
20、(b); strcat(a,b); puts(a);【例】连接字符串的自编程序。 #include main( ) int i=0,j=0; char a80,b30; gets(a); gets(b); while( ai!=0 ) i+; while( bj!=0 ) ai=bj; i+; j+; ai=0; puts(a); 【例】字符串比较函数的使用。strcmp#include #include main( ) char a30,b30; gets(a); gets(b); if( strcmp(a,b) 0 ) printf(第一个串大于第二个串n); if( strcmp(a,b
21、) = 0 ) printf(两串相等n); if( strcmp(a,b) 0 ) printf(第一个串小于第二个串n); 【例】字符数组举例:p138例7.8 统计一行字符中单词的个数 算法:v 若某一字符为非空格,而前面一字符为空格,则单词数加1;用变量num计数v 若某一字符为非空格,而前面一字符也为非空格,则表示还是原单词,单词数不变;用变量word来标识v 连续的空格算为一个空格main() char c, string80; int i,num=0,word=0; gets(string); for (i=0;(c=ctringi)!=0;i+) if (c= ) word=0
22、; else if (word=0) word=1; num+; printf(“There are %d wordsn”,num);例:字符数组举例有10个字符串,按字母表顺序求排在最前面的。#include #include main( ) char s20,str1020; int i; for (i=0;i10;i+) gets(stri); strcpy(s,str0); for (i=1;i10;i+) if(strcmp(stri,s)0) strcpy(s,stri); printf(“the first :%sn”,s);作业7.1 用筛法求100之内的素数main() in
23、t i,j,line,a101; for(i=2;i101;i+) ai=i; for(i=2;isqrt(101);i+) for(j=i+1;j101;j+) if (ai!=0&aj!=0) if(aj%ai=0) aj=0; 7.6 打印杨辉三角形#includemain() int i,j,n;long int a2020; /*定义二维数组存储生成的三角形*/printf(“Please input a number 120 :”); scanf(%d,&n); for (i=0;i1) /*从第三行开始,计算中间的所有元素值*/ for (j=1;ji;j+) aij=ai-1j
24、-1+ai-1j; 7.8 找出二维数组中的鞍点main()int t,j,k,f=0,max,col,a34; for(t=0;t3;t+) max=at0; col=0; for(j=0;jmax) max=atj; col=j; for(k=0;k3;k+) if (akcolmax) break; if (k=3) printf(“key=%d,row=%d,col=%dn”,max,t,col); f=1; /*for*/ if (f=0) printf(“not found!n”);7.15 编程,将字符数组s2中的字符全部拷贝到s1中,但不能使用strcpy函数。 要求:s2从键盘输入。输出s1。#includemain() char s180,s280; /*定义两个字符数组*/ int i; printf(Please input string s2:); scanf(“%s”,s2); /*输入的字符串保存在s2中*/ i=0; while(s2i!=0) s1i=s2i; i+; s1i=0; /*为字符串s1加上结束符*/ printf(The string of s1 is %sn,s1);