710 likes | 857 Views
a. b. c. ch1. ch2. d. 第六章 数 组. int a, b. 2000 2001. 1094 1095. float c, d. 2004 2005 2006 2007. FFD2 FFD3 FFD4 FFD5. char ch1,ch2. FFD0. FFD1. s1. s2. s3. s100. 现将 100 名学生的英语成绩输入计算机并储存起来. 86. 98. 66. 89. … …. main() { int s1,s2,s3,s4,s5, … , s100 ;
E N D
a b c ch1 ch2 d 第六章 数 组 int a, b 2000 2001 1094 1095 float c, d 2004 2005 2006 2007 FFD2 FFD3 FFD4 FFD5 char ch1,ch2 FFD0 FFD1
s1 s2 s3 s100 现将100名学生的英语成绩输入计算机并储存起来 86 98 66 89 … … main() { int s1,s2,s3,s4,s5, … , s100 ; scanf(“%d%d%d%d …”,&s1,&s2, &s3,&s5,…,&s100); … … }
现将100名学生的英语成绩输入计算机并 储存起来。 s[100] s[i] i (0-99) main() { int i, s[100]; } for(i=0; i<100; i++) scanf(“%d”, &s[i] );
S[0] S[1] S[2] S[3] S[4] S[5] … S[99]
现将100名学生的英语成绩输入计算机并 储存起来。 main() { int i, s[100]; for(i=0; i<100; i++) scanf(“%d”, &s[i] ); … … } S[0] S[1] S[2] S[3] S[4] S[5] … S[99]
6.1 数组和数组元素的概念 S[0] S[1] S[2] S[3] S[4] S[5] … S[99] 一 数组 同类型的数据集合。数组中的每一个数据称为 数组元素 ,并由下标 来表示元素的存储顺序。 数组名 S[3] S[ i ] 数组 元素 下标
2006 2008 S[0] S[1] S[2] S[3] S[4] S[5] … S[99] 2000 2002 2004 200A … … 二 特点 1、数组元素在内存中占用连续的存储单元 2、数组元素的个数固定 3、数组元素的类型相同
S[0] S[1] S[2] S[3] S[4] S[5] … S[99] 三 维数 为描述数组元素所需的下标个数则为该数组的维数 上面我们列出S数组中的元素之间的顺序关系为一度关系(一维),也就是各元素之间只是列的关系,像这样的数组我们称为一维数组;除此之外,还有二度、三度乃至多度的顺序关系即多维数组。
下列矩阵 B11 B12 B13 … B1n B21 B22 B23 … B2n a =B31 B32 B33 … B3n … … Bm1 Bm2 Bm3… Bmn 行下标 每个元素的位置需用行和列两个下标来表示。 且各元素之间的顺序关系是二度的即二维,在C中可用二维数组来表示。 1 2 -1 2 -3 1 4 1 -1 a [3][3] 列下标
页下标 列下标 a [3][3][3] 第0页 第1页 第2页 行下标 1 2 -1 2 -3 1 4 1 -1 1 2 3 4 5 6 7 8 9 每个元素的位置需用页、行和列三个下标来表示。且各元素之间的顺序关系是三度的即三维,在C中可用三维数组来表示 2 2 8 1 -5 1 4 0 -9 a [2][1][2]
6.2 一维数组 一、定义格式 类型标识符 数组名[元素个数] int s[10]; S[0] S[1] S[2] S[3] S[4] S[5] … S[9] 二、 初始化 int s[10]={2,4,6,8,10}; char ch[5]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’};
1 数组的建立与输出 三、对数组元素的操作 包括对数组的建立、数组元素 的引用以及对数组元素的输出。 main() { int s[6] , i ; for(i=0;i<6;i++) scanf(“%d,”,&s[i] ); for(i=0;i<6;i++) printf(“%4d”,s[i] ); } 请将下列一组数据 读入到 S 数组中 30, 56, 88, 45, 100, 20
2 对数组元素的引用 请将下列一组数据读入到 S 数组中,并从中 找出最小的值并输出。 30, 56, 88, 45, 100, 20 main() { int s[6]={30,56,88,45,100,20 , i, min=s[0]; for(i=1;i<6;i++) if(s[i]<min) min=s[i]; printf(“%d”,min ); }
练 习 请将下列一组数据读入到 a 数组中,然后按 逆序存放并输出。 30, 56, 88, 45, 100, 20 a[0] a[1] a[2] a[3] a[4] a[5]
a[0] a[1] a[2] a[3] a[4] a[5] main() { int a[6]={30,56,88,45,100,20} , i, j; for(i=0, j=5; i<3;i++, j--) { t=a[i]; a[i]=a[j]; a[j]=t; } for(i=0 ;i<6;i++ ) printf(“%d”,a[i] ); }
练 习 请将下列一组数据读入到 s 数组中,然后从 中找出最大的一个并与第一个数互换;再找出最 小的一个与最后一个数互换,其余位置上的数均 不动。 30, 56, -88, 45, 100, 20 S[0] S[1] S[2] S[3] S[4] S[5]
S[0] S[1] S[2] S[3] S[4] S[5] main() { int s[6]={30,56,-88,45,100,20} ,t ; int i, p1, p2, max, min; max=min=s[0]; for(i=0;i<6;i++) { if(s[i]>max) { max=s[i]; p1=i;} if(s[i]< min) { min =s[i]; p2=i;} } t=s[0]; s[0]=max; s[p1]=t; t=s[5]; s[5]= min; s[p2]=t; for(i=0;i<6;i++) printf(“%4d,”,s[i]); }
请将下列一组数据按其值由大到小排列并输出 举例 75 80 78 56 66 49 94 86 选择法 希尔法 比较交换 起泡法 插入法
比较 交换 排序 1 从八个数中选出最大的一个 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 8075 78 56 66 49 94 86 9475 78 56 66 49 80 86
2 从七个数中选出最大的数 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 947875 56 66 49 80 86 948075 56 66 49 78 86 948675 56 66 49 78 80
3 从六个数中选出最大的数 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 948678 56 66 49 75 80 948680 56 66 49 75 78
4 从五个数中选出最大的数 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 9486806656 49 75 78 9486807556 49 66 78 9486807856 49 66 75
5 从四个数中选出最大的数 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 9486807866 49 56 75 9486807875 49 56 66
6 从三个数中选出最大的数 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 94868078755649 66 94868078756649 56
7 从两个数中选出最大的数 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 94868078756656 49 75 80 78 56 66 49 94 86
main() { int a[8]={ 75,80,78,56,66,49,94,86 }; int i, j , t; for(i=0;i<8;i++) for(j=i+1;j< 8;j++) if (a[j]>a[i]) { t=a[j]; a[j]=a[i]; a[i]=t }; for(i=0;i<8;i++) printf(“%4d”,a[i]); }
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 读入数据到a数组 for(i=0;i<7;i++) for(j=i+1;j<7;j++) YN a[j]>a[i] t=a[j] a[j]=a[i] a[i]=t 输出已排序的 a 数组
练 习 请在下列一有序数列中插入一个数, 要求该数 插入后,应使得该数列仍然有序。 60, 68, 78, 88, 90, 93, 95, 96, 98, 100 89 x a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] 1、设要插入的数为X, 插入位置为P, 数列个数为 m=9 2、从数列中找出X的位置P,其查找过程如下: 取x与a[0]中元素比较, 若有 x >a[0],再与 a[1]比较, … 一直比较到 x<a[i] 时,即为 P处。
89 x a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] 3、将a数组从p位置开始的元素全部向后平移一个 位置,即移到 a[p + 1] ~a[m + 1] a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] 4、将 x 写入到 a[p]中,并输出该 数列。
main() { int i, p=0, m=9; int a[11]={ 60,68,78,88,90,93,95,96,98,100 }; scanf(“%d”, &x); while (( x>= a[p] ) && (p<=m )) p++; for (i=m; i>=p; i--) a[i+1]=a[i]; a[p]=x; m++; for(i=0; i<=m; i++) printf(“%4d”,a[i]); }
1 请统计从键盘输入字符中大写 字母的个数,用‘#’号结束输入。 作业 main() { char ch; int num=0; scanf(“%c”, &ch); while(ch!=‘#’) { if( (ch>=‘A’) && (ch<=‘Z’) ) num++; scanf(“%c”, &ch); } printf(“num=%d\n”, num); }
2 请写出下列程序段的执行结果 …… a[0]=1; for(i=0; i<5; i++) for(j=i; j<5; j++) a[j]=a[i]+1; for(i=1; i<5; i++) printf(“%4d”, a[i]); printf(“\n”); … … 作业
main() { int a[5], i, j; a[0]=1; for(i=0; i<5; i++) for(j=i; j<5; j++) a[j]=a[i]+1; for(i=1; i<5; i++) printf(“%4d”, a[i]); } 1、i=0 j=0 a[0]=a[0]+1 =1+1=2 a[1]=a[0]+1 =2+1=3 j=1 a[2]=a[0]+1 =2+1=3 j=2 … … 2、i=1 j=1 a[1]=a[1]+1 =3+1=4 j=2 a[2]=a[1]+1 =4+1=5 … … 3、i=2 j=2 a[2]=a[2]+1 =5+1=6 j=3 a[3]=a[2]+1 =6+1=7 a[0] a[1] a[2] a[3] a[4] … … 2 3 3 3 4、i=3 j=3 a[3]=a[3]+1 =7+1=8 j=4 a[4]=a[3]+1 =8+1=9 4 5 5 5 3 5、i=4 j=4 a[4]=a[4]+1 =9+1=10 6 7 7 8 9 10
3 main() ( 97年4月) { int n[3], i, j, k; for(i=0; i<3; i++) n[i]=0; k=2; for(i=0; i<k; i++) for(j=0; j<k; j++) n[j]=n[i]+1; printf(“%d\n”, n[1]); } A) 2 B) 1 C) 0 D) 3 作业
main() { int n[3], i, j, k; for(i=0; i<3; i++) n[i]=0; k=2 for(i=0; i<k; i++) for(j=0; j<k; j++) n[j]=n[i]+1; printf(“%d\n”, n[1]); } A) 2 B) 1 C) 0 D) 3 1、i=0 j=0 n[0]=n[0]+1 =0+1=1 j=1 n[1]=n[0]+1 =1+1=2 2、i=1 j=0 n[0]=n[1]+1 =2+1=3 j=1 n[1]=n[1]+1 =2+1=3 n[0] n[1] n[2] 0 0 0 1 2 3 3
4 main()( 96年4月) { int n[2], i, j, k; for(i=0; i<2; i++) n[i]=0; k=2; for(i=0; i<k; i++) for(j=0; j<k; j++) n[j]=n[i]+1; printf(“%d\n”, n[k]); } A) 不正确的值 B) 3 C) 2 D) 1 作业
5 请编程序实现打印下列图形 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 作业
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * main() { int n1,n2,n3; for(n1=1;n1<=5;n1++) { for(n2=1;n2<=20-n1;n2++) printf(“ ”); for(n3=1;n3<=2*n1-1;n3++) printf(“*”); printf(“\n”); } for(n1=4;n1<=1;n1--) { for(n2=1;n2<=20-n1;n2++) printf(“ ”); for(n3=1;n3<=2*n1-1;n3++) printf(“*”); printf(“\n”); }
6.3 二维数组 一、定义格式 类型标识符 数组名[行下标] [列下标] int s[3][4]; 98 67 87 90 66 78 56 79 68 68 89 78 二、 二维数组在内存中存储形式 S[0][0] S[0][1] S[0][2] S[0][3] S[1][0] S[1][1] S[1][2] S[1][3] … …
三、初始化 int s[3][4]={ 98,67,87,90,66,78,56,79,68,68,89,78 }; int s[3][4]={ { 98,67,87,90 }, { 66,78,56,79 }, { 68,68,89,78 } }; int s[ ][4]={98,67,87,90,66,78,56,79,68,68,89,78 }; 四、通过键盘给二维数组赋值 98 67 87 90 66 78 56 79 68 68 89 78
四、 通过键盘给二维数组赋值并输出 98 67 87 90 66 78 56 79 68 68 89 78 行下标 int s[3][4] main() { int s[3][4], i, j; 列下标 for(i=0; i < 3; i++) j++) for(j=0; j < 4; scanf(“%d,”, &s[i][j]); for(i=0;i<3;i++) { for(j=0;j<4;j++) printf(“%2d”, s[i][j]); printf(“\n”); }
98 67 87 90 66 78 56 79 68 68 89 78 举例 … … for( i=0; i<3; i++ ) for(j=0; j<4; j++) … … 85.50 69.75 75.75 { sum=0; sum+=s[i][j]; ave=sum/4; printf(“%f\n ”, ave); }
1 4 2 5 3 6 1 2 3 4 5 6 a= b= 练 习 main() { int a[2][3]={1,2,3,4,5,6}, b[3][2]; for( i=0; i<2; i++ ) for(j=0; j<3; j++) b[j][i]=a[i][j]; for( i=0; i< 3; i++ ) { for(j=0; j< 2; j++) printf(“%4d”, b[i][j]); printf(“\n”); }
练 习 请建立一个由主对角线的元素都是 1,而其它各 元素均为0的 N阶矩阵。 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
main() { staticint a[5][5], i, j; for(i=0; i<5; i++) for(j=0;j<5;j++) for(i=0; i<5; i++) { for(j=0;j<5;j++) printf(“%4d”, a[i][j]); printf(“\n”); } } if(i=j) a[i][j]=1; else a[i][j]=0; 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
for(i=0; i<5; i++) { for(j=0;j<5;j++) printf(“%4d”, a[i][j]); printf(“\n”); } } main() { staticint a[5][5], i, j; for(i=0; i<5; i++) a[i][i]=1;
0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 4 5 6 7 8 9 5 6 7 8 9 10 练 习 请按下列给出的方阵建立一个 a 数组,并输出 a 数组中各元素值。
for(i=0; i<5; i++) { for(j=0;j<5;j++) printf(“%4d”, a[i][j]); printf(“\n”); } } 0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 4 5 6 7 8 9 5 6 7 8 9 10 main() { int a[6][6], i, j; for(i=0; i<6; i++) for(j=0;j<6;j++) a[i][i]=i+j ;
6 设某学校学生为 5000 人,其年龄在 17岁~ 26岁,请编程序实现统计各年龄 的人数。 作业
for(i=0; i<10; i++) printf(“%2d”, s[i] ); } main() { int s[10]={0}, age, i; for(i=0; i<5000; i++) { scanf(“%d\n”, &age); switch(age) { case 17: s[0]++;break; case 18: s[1]++;break; … … case 26: s[9]++;break; default: printf(“数据错”); } }