第7章构造数据类型 ·构造数据类型: 共用体、用户自 定义类型 §7.1数组 组同类型的若干个(已知个数)多个相关变量 的数据集合
第7章 构造数据类型 •构造数据类型:数组、结构体、共用体、用户自 定义类型 §7.1 数组 一组同类型的若干个(已知个数)多个相关变量 的数据集合。 在内存中存放在地址连续的存储单元
个例子:对三个任竟整数从小到大排序。 main fint a, b, c scanf(%od, %od, % od, &a, &b, &c) if(a>b)t=a; a=b; b=t; 3 if(a>c)t-a, a=c; c=t; 1 if(b>c)(t=b, b=c, b=t; 1 printf( %a, %b, %ocn) 思考:若是10个数、100个数、1000个 数..n个数排序又如何? 我们需要通过循环来访问到每个变量,数组 能满足这一要求
一个例子:对三个任意整数从小到大排序。 main() {int a,b,c; scanf(“%d,%d,%d”,&a,&b,&c); if(a>b){t=a;a=b;b=t;} if(a>c) {t=a;a=c;c=t;} if(b>c) {t=b;b=c;b=t;} printf(“%a,%b,%c\n); } 思考:若是10个数、100个数、1000个 数…n个数排序又如何? 我们需要通过循环来访问到每个变量,数组 能满足这一要求
7.1.1一维数组的定义 今定义方式 数据类型数組名[常量表达式]; 例inta6]; 合法标识符 ]:数组运算符 单目运算符 a alot 优先级(1) alll 左结合 a[2] 不能用() 编译时分配连续内存 数组名表示内存首地址, a[3] a4] 内存字节数=数组维数* 是地址常量 [5 SIzes(元素数据类
7.1.1 一维数组的定义 ❖定义方式: 数据类型 数组名[常量表达式]; 合法标识符 表示元素个数 下标从0开始 [ ] :数组运算符 单目运算符 优先级(1) 左结合 不能用( ) 例 int a[6]; 0 a[0] 1 4 5 a[1] a[2] a[3] a[4] a[5] 2 3 a 编译时分配连续内存 内存字节数=数组维数* sizeof(元素数据类型 数组名表示内存首地址, 是地址常量
例 int data[5] data[5}-10;∥C语言对数组不作越界检查,使用时要注意 今数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整个数组 数组元素表示形式:数组名[下标] 其中:下标可以是常量或整型表达式 例inta[1l0] printf da);(×) 必须for(=0<10;j++) printf("%,alD
一维数组的引用 ❖数组必须先定义,后使用 ❖只能逐个引用数组元素,不能一次引用整个数组 ❖数组元素表示形式: 数组名[下标] 其中:下标可以是常量或整型表达式 例 int i=15; int data[i]; (不能用变量定义数组维数) 例 int a[10]; printf(“%d”,a); () 必须 for(j=0;j<10;j++) printf(“%d\t”,a[j]); () 例 int data[5]; data[5]=10; //C语言对数组不作越界检查,使用时要 注意
维数组的初始化 初始化方式 inta[5}{1,2,3,45}; 等价于:a[0}=l;a[l=2;a[2]=3;a[3]=4;a[4]=5; 今说明 ●数组不初始化。其元素值为随机数 ●对 static数组元素不赋初值,系统会自动赋以0值 ●只给部分数组元素赋初值 出为组 inta={1,2,3,4,5,6}; 编译系统根据初值个数确定数組维数
一维数组的初始化 ❖初始化方式 在定义数组时,为数组元素赋初值 (在编译阶段使之得到初值) int a[5]={1,2,3,4,5}; 等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; ❖说明: ⚫数组不初始化,其元素值为随机数 ⚫对static数组元素不赋初值,系统会自动赋以0值 ⚫当全部数组元素赋初值时,可不指定数组长度 如 int a[5]={6,2,3}; 等价于: a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0; 如 int a[3]={6,2,3,5,1}; () static int a[5]; 等价于:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0; ⚫只给部分数组元素赋初值 int a[]={1,2,3,4,5,6}; 编译系统根据初值个数确定数组维数
程序举例 #include #define size 10 例读10个整数存入数mamO i int xsIze,i,max,min printf("enter 10 integers: n") for(i=0; Kx) minX 3.输出:max和min printf("Maximum value is %d\n", max) printf("minimum value is %dn", min)
程序举例 例 读10个整数存入数组,找出其中最大值和最小值 步骤: 1. 输入:for循环输入10个整数 2. 处理: (a) 先令max=min=x[0] (b) 依次用x[i]和max,min比较(循环) 若maxx[i],令min=x[i] 3. 输出:max和min #include #define SIZE 10 main() { int x[SIZE],i,max,min; printf("Enter 10 integers:\n"); for(i=0;ix[i]) min=x[i]; } printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); }
F1=1 例用数组求 Fibonacci数列前20个数 F2=1 (n=2) F=F,+F #include f01 maino i int i intf20}={1,1} 2 for(i=2;i<20;i++) f3] fu=f1-2+fi-1 f4] for(i=0;1<20;i++) f5 f if(1%==0) printf("n") printf(%12d",fi) 1919n19
例 用数组求Fibonacci数列前20个数 f[0] f[1] f[2] f[3] f[4] f[5] f[19] ……... 1 1 f[19] 0 1 4 5 2 3 19 2 3 5 #include main() { int i; int 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]); } }
例用冒泡法对10个数排序 排序过程 (1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止—第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
例 用冒泡法对10个数排序 排序过程: (1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止——第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
例 38383813131313 4949 49 2727 2727 65651327303030 1327303838 2730 4949 27 30165 65 76 第第第第第第第 始关键字 四五六七 趟趟趟趟趟趟 n=8
例 38 49 65 76 13 27 30 97第一趟 38 49 65 13 27 30 76第二趟 38 49 13 27 30 65第三趟 38 13 27 30 49第四趟 13 27 30 38第五趟 13 27 30第六趟 49 38 65 97 76 13 27 30初始关键字 n=8 38 49 76 9713 9727 3097 97 13 76 76 7627 30 13 6527 6530 65 13 13 49 4930 4927 2738 3830 38 13 27第七趟
#include [i+1 for(i=1;iai+ID 输出a[到an] {t=a;a[i=a[i+1];a[i+1]=t;} printf("The sorted numbers: n") for(i=1;i<11;i++) printf( %d"aiD)
输入n 个数给a[1] 到 a[n] for j=1 to n-1 for i=1 to n-j a[i]>a[i+1] 真 假 a[i]a[i+1] 输出a[1] 到 a[n] #include main() { int a[11],i,j,t; printf("Input 10 numbers:\n"); for(i=1;ia[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }