第6章 数组
主要内容 一、一维数组 二、二维数组 三、字符数组
一、一维数组 一组编了号的变量。 1、定义 格式: 类型名 数组名[常量表达式]; int a[5]; float b[3*2]; 1 2 格式: 类型名 数组名[常量表达式]; int a[5]; float b[3*2]; 1 2 3 4 5 6 7 8 9 a 12 5 7 9 24 15 36 27 10 19
一、一维数组 2、数组元素的引用 格式: 数组名[下标] 下标:从0开始 如:a[1]
一、一维数组 3、数组元素的赋值 (1)定义时赋值 int a[3]={1,2,3},b[4]={0},c[]={1,2,3,4}; (2)程序运行中赋值 a[0]=1; for(i=0;i<=2;i++) scanf("%d",&a[i]); //从键盘上输入3个数
一、一维数组 4、实例 例1 从十个数中查找最大数。 1 2 3 4 5 6 7 8 9 a 12 5 7 9 24 15 36 27 10 例1 从十个数中查找最大数。 1 2 3 4 5 6 7 8 9 a 12 5 7 9 24 15 36 27 10 19
一、一维数组 max=a[0]; if (max<a[1]) max=a[1]; if (max<a[2]) max=a[2]; 1 2 3 4 5 6 7 8 9 a 12 5 7 9 24 15 36 27 10 19 max=a[0]; if (max<a[1]) max=a[1]; if (max<a[2]) max=a[2]; if (max<a[3]) max=a[3]; if (max<a[4]) max=a[4]; if (max<a[5]) max=a[5]; if (max<a[6]) max=a[6]; if (max<a[7]) max=a[7]; if (max<a[8]) max=a[8]; if (max<a[9]) max=a[9]; max=a[0]; for(i=1;i<=9;i++) if (max<a[i]) max=a[i];
一、一维数组 #include <stdio.h> void main() { int i, max,a[10]; for(i=0;i<=9;i++) scanf(“%d”,&a[i]); max=a[0]; for(i=1;i<=9;i++) if (max<a[i]) max=a[i]; printf(“MAX is %d”,max); }
一、一维数组 例2 对n个数按从小到大的顺序排列。 起泡排序法:将相邻两个数比较,将小的数调到前头。 1 2 3 4 5 a 9 8 5 4 1 2 3 4 5 a 9 8 5 4 2 8 9 5 4 2 8 5 9 4 2 第一趟:最大的数调到了最后 8 5 4 9 2 8 5 4 9 2 8 5 4 2 9
一、一维数组 例2 对n个数按从小到大的顺序排列。 if (a[0]>a[1]) a[0]<->a[1] ; 起泡排序法:将相邻两个数比较,将小的数调到前头。 1 2 3 4 5 a 9 8 5 4 2 if (a[0]>a[1]) a[0]<->a[1] ; if (a[1]>a[2]) a[1]<->a[2] ; if (a[2]>a[3]) a[2]<->a[3] ; if (a[3]>a[4]) a[3]<->a[4] ; if (a[4]>a[5]) a[4]<->a[5] ; for(j=0;j<5;i++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
一、一维数组 for(j=0;j<5;i++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;} for(j=0;j<4;i++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;} for(i=0; i<5; i++) for(j=0; j<5-i; i++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;} for(j=0;j<3;i++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;} for(j=0;j<2;i++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;}
一、一维数组 #include <stdio.h> void main() { int i, max,a[10]; for(i=0;i<=9;i++) scanf(“%d”,&a[i]); for(i=0; i<9; i++) for(j=0; j<9-i; i++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;} printf(“the sorted numbers:\n”); printf(“%d ”, a[i]); }
一、一维数组 例3 在n个数中查找是否存在一个数 x 。 折半查找法: x=45 1 2 3 4 5 6 7 8 9 a 12 45 48 1 2 3 4 5 6 7 8 9 a 12 45 48 51 57 68 89 90 95 98 i j mid x=a[mid]?
一、一维数组 思路: 给数组a[15]赋值 ; 读入x的值; i=0; j=14; while (i<j) { mid=(i+j)/2; if ( x==a[mid] ) {printf("%d在第%d位",a[mid],mid); break;} else if (x>a[mid]) i=mid+1; else j=mid-1; } if (i>j) printf("无此元素");
一、一维数组 #include<stdio.h> void main() { int a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; int i,j,x,mid; scanf("%d",&x); i=0;j=14; while(i<=j) { mid=(i+j)/2; if (x==a[mid]) { printf("%d在第%d位",a[mid],mid); break; } else if (x>a[mid]) i=mid+1; else j=mid-1; } if(i>j) printf("无此元素");
二、二维数组 1、定义 格式: 类型 数组名[常量表达式][常量表达式]; int a[3][3];
二、二维数组 2、数组元素的引用 int a[3][2]; a[0][1]=8; 1 1 2 a[0][0] a[0][1] a[1][0] 1 1 2 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
二、二维数组 3、赋值 int a[2][2]={{1,2},{3,4}}; a[0][0]=1; for(i=0;i<=1;i++) for(j=0;j<=1;j++) a[i][j]=i+j; 1 2
二、二维数组 4、实例 例4 查找矩阵中的最大数。 max=-1,r=0,c=0 if (max<a[0][0]) 例4 查找矩阵中的最大数。 max=-1,r=0,c=0 if (max<a[0][0]) max=a[0][0]; for(i=0;i<=2;i++) a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] for(j=0;j<=2;j++) if (max<a[0][j]) {max=a[0][j]; r=0; c=j; } for(j=0;j<=2;j++) if (max<a[i][j]) {max=a[i][j]; r=i; c=j; } if (max<a[0][1]) max=a[0][1]; if (max<a[0][2]) max=a[0][2]; .......... if (max<a[2][2]) max=a[2][2];
二、二维数组 例5 矩阵的加法。 for(i=0;i<=2;i++) for(j=0;j<=2;j++) 例5 矩阵的加法。 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] b[0][0] b[0][1] b[0][2] b[1][0] b[1][1] b[1][2] b[2][0] b[2][1] b[2][2] for(i=0;i<=2;i++) for(j=0;j<=2;j++) a[i][j]+=b[i][j];
二、二维数组 练习: 矩阵的各元素之和。 for(i=0;i<=2;i++) for(j=0;j<=2;j++) ? 练习: 矩阵的各元素之和。 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] for(i=0;i<=2;i++) for(j=0;j<=2;j++) ?
三、字符数组 1、定义 char c1[5]; int c2[5]; c1[0]='a'; c2[0]='a';
三、字符数组 2、字符数组的初始化 char c[10]={'I','a','m','a','b','o','y'}; for(i=0;i<=9;i++) scanf("%c",&c[i]);
三、字符数组 3、字符串和字符串结束标志 字符串用字符数组来表示,字符串标志为'\0' char c[10]="I am a boy"; 等价于 char c[10]={'I','a','m','a','b','o','y','\0'};
三、字符数组 4、字符数组的输入和输出 char c[10]; scanf("%s",c); printf("%s",c);
三、字符数组 5、字符串处理函数 (1) puts(str) :输出字符串 (2) gets(str) : 输入字符串 (3) strcat(str1,str2) : 连接字符串 (4) strcpy(str1,str2)、strncpy(str1,str2) : 字符串复制 (5) strcmp(str1,str2) : 比较字符串 (6) strlen(str) : 测字符串长度 (7) strlwr(str) : 转换为小写 (8) strupr(str) : 转换为大写
三、字符数组 6、实例 例6 输入一行字符,统计其中有多少个单词,单词间用空格相隔。 word: 0--未出现新词,1--新词开始 I a 例6 输入一行字符,统计其中有多少个单词,单词间用空格相隔。 word: 0--未出现新词,1--新词开始 I a m b o y . word=0 word=1 num++; word=0 直到遇到'\0'结束
三、字符数组 #include<stdio.h> void main() { char string[81],c; int i,num,word=0; gets(string); for(i=0;(c=string[i])!='\0';i++) if (c==' ') word=0; else if (word==0) {word=1; num++;} printf("单词总数为%d",num); }
三、字符数组 例7 从键盘上输入身份证号,截取出生年月并输出。 4 2 3 6 1 9 8 5 X
三、字符数组 #include<stdio.h> void main() { char string[25]; int i; gets(string); for(i=6;i<=13;i++) c[i-6]=string[i]; c[8]='\0'; printf("出生年月为%s",c); }
习题1 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。 四、综合实例 习题1 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。 1 2 3 4 5 6 7 8 9 a 12 45 48 51 57 68 89 90 95 98 x=87 89 90 95 98 a[10]=a[9] a[i+1]=a[i] a[9]=a[8] i: 6~9 a[8]=a[7] a[6]=x a[7]=a[6] a[6]=x
四、综合实例 习题2 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 a[3][3]: 8 1 6 习题2 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 a[3][3]: 8 1 6 3 5 7 4 9 2 k=0,h=0 对第一行:k=0,h=0 for(i=0;i<3;i++) if a[k][h]<a[0][1] h=1; {for(j=1;j<3;j++) if (a[k][h]<a[i][j]) h=j; for(j=1;j<3;j++) if (a[k][h]<a[0][j]) h=j; if a[k][h]<a[0][2] h=2; if a[k][h]>a[0][h] break; j=0; while (a[k][h]<a[j][h] && j<3) j++; if a[k][h]>a[1][h] break; if (j>3) a[k][h]是鞍点; if a[k][h]>a[2][h] break; } if (i>3 && j>3) 没有鞍点;
四、综合实例 习题3 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其它字符的个数。 a[3][80]: lsff UYIJ n IUJ ;k;sdf gets(a[0]); ABCFD fgthhy uh8ghj* 9 for(i=0;(c=a[0][i])!='\0';i++); dffd56678 768 ,;.k { if c是大写字母 个数+1; if c是小写字母 个数+1; if c是.....................; }