- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义数组的同时可以对数组初始化。以下初始化的方法都是允许 的: int a[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化 int a[]={1,2,3,4,5,6,7,8,9,10}; //完全初始化,可省略长度 int a[10]={1,2,,4,5};//部分元素a[0]、a[1]、a[3]、a[4]初始化
21世纪高等学校精品规划教材
第6章 数组
掌握一维数组、二维数组的定义、初始化和数 组元素的引用 掌握字符数组的定义、初始化和数组元素的引 用 掌握字符串的存储方法和应用 掌握有关处理字符串的系统函数的使用方法
【问题】从键盘接收10个数,求平均 数并输出所有小于平均数的数。
【分析】从键盘接收10个数,求平均数很简单,可以采 用边接收边求和的方法,最后根据总和求平均数。下面 的程序可以做到: int a,i; float s; for(i=0,s=0;i<10;i++) { scanf("%d",&a); s = s + a; }
省略行的完全初始化
分行完全初始化,可读性较好
部分初始化
Байду номын сангаас
int a[3][4]={1,2,3,4};
【例6-2】演示二维数组的定义及 元素引用
#include <stdio.h> main() { int i,j,k=0; int a[3][4]; for(i=0;i<3;i++) /*变量i控制数组a的行下标*/ { for(j=0;j<4;j++) /*变量j控制数组a列下标*/ { a[i][j]=k; printf("a[%d][%d]=%d\t",i,j,a[i][j]); k++; } printf("\n"); } }
注意:
C语言不允许对数组的大小作动态定义,即定义行中的数组长度 可以包括常量和符号常量,但不能包括变量。例如,下面的定义 是错误的。
int n=10; int a[n];
/*因为n为变量*/
而下面的定义是正确的:
#define N 10 main() { int a[N]; /*N为符号常量*/ …}
连接后的s1的有效字符长度为17,包括结束符在 内,s1至少需要18个字符长度,否则连接是错误 的。
6.4.2 字符串函数
strcmp(字符串1, 字符串2) 字符串比较函数
函数比较s1和s2字符串的大小,并返回比较的结果。 若s1大于s2,则返回一个正整数。 若s1等于s2,则返回0。 若s1小于s2,则返回一个负整数。 字符串比较规则:自左向右按ASCII码值大小进行比较,直 至出现一对不同字符或者遇到结束符为止。例如: strcmp("ABC","abc") /*返回负整数,前面字符串小 */ strcmp("ABC","ABC\0abc")/*返回0,二者相等*/ strcmp("ABC","AB") /*返回正整数,前面的大*/ strcmp("AB","ABC") /*返回负整数,前面的小*/
strcpy(字符串1, 字符串2) 字符串复制函数
char s1[20]; char s2[] = "Good luck"; strcpy(s1,s2); puts(s1); /*输出Good luck*/
strcpy函数可以将结束符一起复制过去,以上复制 操作也可以直接写成:strcpy(s1, "Good luck");
【例6-3】输入3位学生的计算机、数 学成绩,计算每门课程的平均分。
#include <stdio.h> main() { float score[3][2],average[3],temp; char info[2][10]={"Computer","English"}; int i,j; for(i=0;i<2;i++) for( i = 0 ; i < 3 ; i++ ) { temp = 0; { printf("No:%d\n",i+1); for(j=0;j<3;j++) temp = temp + score[j][i]; for( j = 0 ; j < 2 ; j++ ) average[i] = temp / 3; { printf("%s:",info[j]); printf("%s:%.2f\n", scanf("%f",&score[i][j]);} info[i],average[i]); } } }
6.5 程序举例
【例6-6】将10个数排序输出(冒泡法排序)
【分析】对一系列数进行排序有很多种方法,冒泡 法是其中比较容易理解的一种算法。所谓冒泡法, 就是指找到的大数或者小数像气泡一样浮出水面被 发现。为了理解算法,来看下面的例子。
【例6-6】将10个数排序输出
第1次查找,范围:7 2 9 1 8 第1步:7>2,将7和2交换位置,得到 2 7 9 1 8 第2步:7<9,不交换。 第3步:9>1,将9和1交换位置,得到 2 7 1 9 8 第4步:9>8,将9和8交换位置,得到 2 7 1 8 9 第1次查找,将9作为最大数放在最后,结果为 2 7 1 8 9
初始化的方法如下:
【例6-4】输入一串字符,将其按 逆序输出。
#include <stdio.h> #include <string.h> main() { char s[100]; int i=0; printf("Input a string:"); gets(s); while(s[i] != '\0') i++; while(--i>=0) putchar(s[i]); putchar('\n'); }
6.2 一维数组
一维数组用于存储一行或一列的数据。定义 方式如下:
<类型> <数组名> [<常量表达式>]; <类型>:简单类型或结构体、共用体等复杂类 型。 <数组名>:数组的标识、命名规则同变量名。 <常量表达式>:用来定义数组的长度,因为数 组也必须先定义再使用。 例如:int a[10];char s[100];
正确的定义:
【例6-1】编程求10个数中的最大值、最小 值、平均值。输出所有小于平均值的数。
void main() aver = s/10; { int a[10],i; printf("max is %d\n",max); int max,min; printf("min is %d\n",min); float s=0,aver; printf("average is %.2f\n",aver); printf("Input 10 numbers: "); for(i=0;i<10;i++) for (i=0;i<10;i++) if(a[i]<aver) printf("%4d",a[i]); scanf("%d",&a[i]); printf("\n"); s = max = min = a[0]; } for (i=1;i<10;i++) { if (a[i]>max) max=a[i]; else if (a[i]<min) min=a[i]; s = s + a[i]; }
注意:
数组元素的下标从0开始。 数组名不能像变量一样进行赋值操作。以下用法是错 误的:
int a[10],b[10]; a=b; /*错误*/ int a[10]; /*定义整型数组a,它有10个元素*/ char s[20]; /*定义字符型数组s,它有20个元素*/ float f[5],g[10]; /*定义实型数组f和g,f数组有5个元素,g 数组有10个元素*/
6.1 数组的基本概念
所谓数组,就是一组类型相同的变量。 它用一个数组名标识,每个数组元素都是通过 数组名和元素的相对位置——下标来引用的。 数组可以是一维的,也可以是多维的。
int a1,a2,a3,…,a10 int a[10]; === (a[0],a[1],a[3],…,a[9]) 其中下标从0开始,和前面不同的是,这些变量统 一共享一个数组名a。
int a[3][4]
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
二维数组的初始化
完全初始化
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};