C语言课件第7章Arrays

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行结果: a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5
例7-1(P138):
输入10个整数,计算并输出它们的 和,再分别输出这10个数。
4.数组大小的定义只能是常量,而不能是变量或动态地定义。
举例:
main( ) { int n=5, a[n]; a[1]=100; printf (“a[1]=%d\n”,a[1]); }
a[1]a[2]a[3]a[4]a[5]a[6]
1~5 1~6-j a[i]>a[i+1]
9 8 5 4 2 0 8 9 8 5 9 8 8 8 5 5 4 9 5 4 2 5 4 2 8 9 0 9
2
3
4
5
2 3 4 1 2 3 1 2 1
ta[2],a[2]=a[3],a[3]=t ta[3],a[3]=a[4],a[4]=t ta[4],a[4]=a[5],a[5]=t ta[1],a[1]=a[2],a[2]=t ta[2],a[2]=a[3],a[3]=t ta[3],a[3]=a[4],a[4]=t ta[1],a[1]=a[2],a[2]=t ta[2],a[2]=a[3],a[3]=t ta[1],a[1]=a[2],a[2]=t
&a[1][2]=ffd8 a[1][2]=11
3. 多维数组的定义和在内存中的存放顺序: 如 int a[2][3][4]; 共24个元素,在内存中排列的顺序是:第三维变化最快,然
后是第二维,第一维最慢。
#include <stdio.h> void main() { int i,j,k; float a[2][2][2]; for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) scanf("%f",&a[i][j][k]); for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) { printf("&a[%d][%d][%d]=%x",i,j,k,&a[i][j][k]); printf("\t a[%d][%d][%d]=%f\n",i,j,k,a[i][j][k]); } }
a[0] a[1] a[2] a[3] a[4] a[5] a[6]
for(i=1; i<=6-j; i++) if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } printf (“the sorted numbers:\ n”); for(i=1;i<7;i++) printf(“%d _ _”,a[i]); }
7.1.3 一维数组的初始化
实现的方法有: 1.定义时对数组元素初始化
如: int a[5]={1, 2, 3, 4, 5}; 2. 只给部分元素赋值 如: int a[5]={1, 3, 5}; 3. 初始化时给全部元素赋0值 如: int a[5]={0,0,0,0,0}; 或 int a[5]={0}; 4. 对全部元素赋初值时可以不指出长度 如: int a[5]={2,4,6,8,10};
运行结果: 1 1 8 13 89 144 987 1597
i 2 3 4 5 6 7
f[i]=f[i-2]+f[i-1] f[2]=f[1]+f[0]=2 f[3]=f[2]+f[1]=3 f[4]=f[3]+f[2]=5 f[5]=f[4]+f[3]=8 f[6]=f[5]+f[4]=13 f[7]=f[6]+f[5]=21
第7章


数组:构造类型(复合类型),元素为基类型(整、实、字符)。 它是有序的、同类型数据的集合。
7.1 一维数组
7.1.1 一维数组的定义
形式:类型说明符 数组名[常量表达式]
如:int a[5]; 说明:
float b[10];
1.命名规则:数组名是由合法的标识符组成。
2.数组名后是用 [ ] 括起来的是常量表达式 包括:整、字符、符号常量表达式。 如: int a[2+3], b[5], c[„a‟] , _d[8], xyz[„#‟] („#‟=35) #define N 5 main() { int a[N]; printf(“%d\n”,a[1]=100); }
运行:input 6 numbers: 输入:9 8 5 4 2 0
输出:0 2 4 5 8 9
j 1
i 1 2 3 4 5 1 ta[1],a[1]=a[2],a[2]=t ta[2],a[2]=a[3],a[3]=t ta[3],a[3]=a[4],a[4]=t ta[4],a[4]=a[5],a[5]=t ta[5],a[5]=a[6],a[6]=t ta[1],a[1]=a[2],a[2]=t
注:从键盘给数组元素赋值,可通过一中间变量进行。
举例: 实型数组从键盘赋值情况 main() { int i,j; float a[2][3],k; for(i=0;i<2;i++) for(j=0;j<3;j++) { scanf("%f",&k); for(j=0;j<3;j++) a[i][j]=k; scanf(“%f%f”,&a[0][j],&a[1][j]) } for(i=0;i<2;i++) for(j=0;j<3;j++) { printf("&a[%d][%d]=%x",i,j,&a[i][j]); printf(“\t a[%d][%d]=%f\n",i,j,a[i][j]); } }

2 21 233 2584
3 34 377 4181
5 55 610 6765
例7-3(P140):
输入5个互质整数,将它们存入数组a中,再输入1个数x,然后在数组
中查找x。如果找到,则输出相应的下标,否则输出“not found”.
例7-4(P141): 输入1个正整数n(1<n<=10),再输入n个整数,将它们存入数组a中:
main( ) { int a[7]; int i, j , t; printf (“input 6 numbers:\ n”); for(i=1;i<7;i++) scanf(“%d”, &a[i ]; printf (“\ n”); for(j=1; j<=5; j++)
x 9 8 5 4 2 0
(1)输出最小值与它所对应的下标
(2)将最小值与第一个数交换,输出交换后的n个数
例7-5(P142)选择法排序: 输入1个正整数n(1<n<=10),再输入n个整数,将它们存入数组a中, 用选择法将它们从小到大排序后输出。
补充例:用起泡法排序(由小到大) 思路:将相邻两数两两比较,若小则调到前头,不小也要比较 9 8 5 4 2 0 8 9 5 4 2 0 8 5 9 4 2 0 8 5 4 9 2 0 8 5 4 2 9 0 8 5 4 2 0 9
或 int a[ ]={2,4,6,8,10}; 效果一样。
举例:定义时对数组元素初始化 #include <stdio.h> main() { int i; int a[5]={2,4,6,8,10};
Leabharlann Baidu
运行结果: 2 4 6 8 10
for(i=0;i<=4;i++) printf("%d\n",a[i]);
} 注:
一版教材叙述中,定义数组采用的是静态存储类别static 二版教材省去了static 存储类别,这和新ANSI新标准一致, 若采用static,数组元素的值被存储在静态区。
7.1.4 一维数组程序举例
例7-2(P140) 求Fibonacci 数列问题 关于菲波那契算法:头两个数各为1, 以后的每个数皆为前两个数之和。 #include <stdio.h> main() { int i,f[20]={1,1}; for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++) { if(i%5==0) printf ("\n"); printf ("%12d",f[i]); } }
举例:键盘输入2X3矩阵,输入各元素地址和值
地址 值 数组元素 main( ) ffce 1 a[0][0] { int i, j, a[2][3]; ffd0 3 a[0][1] for(i=0; i<2; i++) ffd2 5 a[0][2] ffd4 7 a[1][0] for(j=0; j<3; j++) ffd6 9 a[1][1] scanf(“%d”, &a[i][j]); ffd8 11 a[1][2] for(i=0; i<2;i++) for(j=0;j<3;j++) { printf(“&a[%d][%d]=%x”, i, j, &a[i][j]); printf (“a[%d][%d]=%d\ n”,i,j,a[i][j]); } 输入:1 3 5 7 9 11 } 输出:&a[0][0]=ffce a[0][0]=1 &a[0][1]=ffd0 a[0][1]=3 &a[0][2]=ffd2 a[0][2]=5 &a[1][0]=ffd4 a[1][0]=7 &a[1][1]=ffc6 a[1][1]=9
8 5 4 2 0
5 8 4 2 0
5 4 8 2 0
5 4 2 8 0
5 4 2 0 8
5 4 2 0
4 5 2 0
4 2 5 0
4 2 0 5
4 2 2 2 4 0 0 0 4
200 02
第一轮大数沉底 此处:n=6 外层循环j: 1 ~ n-1
第二轮
第三轮
第四轮
第五轮
内层循环i: 1 ~ n-j
编译指出:constant expression required in function main ( 主函数中要求常量表达式)
7.1.2 一维数组元素的引用
引用规则:1.先定义,后使用。 2.引用形式:数组名[下标] ,下标可以是整、字符 型的常量、变量或表达式。 3.引用方法:针对元素而不是整个数组。 如:a[0]=a[„b‟ - „a‟] + a[„ b‟ -96] +a[3] - a[2*2] 举例: 对数组a 顺序赋值,逆序输出 #include <stdio.h> main( ) 0 a[0] 运行结果: { int a[5],i; 1 a[1] a[4]=4 for(i=0; i<=4; i++) 2 a[2] a[3]=3 a[i]=i; 3 a[3] a[2]=2 4 a[4] a[1]=1 for(i=4;i>=0;i--) a[0]=0 printf("a[%d]=%d\n", i, a[i]); }
而:int a(10) , b[x], %[5], 8[3], x-y[50], 5x[100] 是否正确? 又:int i=5; int a[5+i] 是否正确性?
3.数组的长度 int a[5] 说明 a[0], a[1], a[2], a[3], a[4]
5个元素 ,下标从0 ~ 4
举例:将1,2,3,4,5分别存入数组a,并打印这些数组元素。 #include <stdio.h> main( ) { int i, a[5]; for(i=0;i<=4;i++) { a[i]=i+1; printf ("a[%d]=%d\n", i, a[i]); } }
越界问题:Turbo C和Visual C++中,系统不检查数组元素
下标超过定义范围(下标越界问题)
#include <stdio.h> main( ) { int i, a[5]; for(i=0;i<=4;i++) { a[i]=i+1; printf ("a[%d]=%d\n", i, a[i]); } printf("a[%d]=%d\n", 5, a[5]); printf("a[%d]=%d\n", 6, a[6]); }
5 5 5 4 4 4 2 2 0
4 4 4 5 2 2 4 0 2
8 2 8 2 0 5 0
4
8
5
7.2 二维数组的定义和引用
7.2.1 二维数组的定义
1.一般形式:
类型说明符 数组名[常量表达式][常量表达式] 如:float a[3][4]; 定义数组a具有三行四列
在C中,可将二维数组看着是特殊形式的一维数组。 如上述定义可看着是具有三个元素的一维数组,而每个元 素又可看作是包含四个元素的一维数组。 2.二维数组各个元素在内存中的存放顺序是: 按先行、后列的顺序依次存放
相关文档
最新文档