第六章数组 数组:构造型数据类型;有序数据的集合,每 个元素都属于同一类型,用一个数组名和下标 唯一地确定数组中的元素。 好处:让一批相同性质的数据用同一个变量名 ,书写方便,可读性高;便于使用循环语句
第六章 数组 数组:构造型数据类型;有序数据的集合,每 个元素都属于同一类型,用一个数组名和下标 唯一地确定数组中的元素。 好处:让一批相同性质的数据用同一个变量名 ,书写方便,可读性高;便于使用循环语句
s61一维数组的定义和使用 维数组的定义和使用 定义: 类型名数组名[常量表达式]; 例:inta[10 定义一个含有10个整型元素的数组 char c20; 定义一个含有20个字符元素的数组
§6.1 一维数组的定义和使用 一、一维数组的定义和使用 定义: 类型名 数组名[常量表达式]; 例:int a[10]; 定义一个含有10个整型元素的数组. char c[20]; 定义一个含有20个字符元素的数组
注意! ①数组名遵循标识符取名规则 ②用方括号,且其中常量表达式表示元素个数, 下标总是从0开始。 即a[10c20是不存在的。 若定义a[n,则下标从0~n-1是合法的。 △但C语言中对下标不作合法性检查,所以允许在使用 中下标越界。这种情况须程序员自我检查。 ③常量表达式可以包含常量和符号常量,不可使用变量, C语言中不可用可调数组。 ④使用时,只能逐个使用而不能一次使用整个数组。 即:只能对数组元素操作
①数组名遵循标识符取名规则 ②用方括号,且其中常量表达式表示元素个数, – 下标总是从0开始。 – 即 a[10],c[20]是不存在的。 – 若定义a[n],则下标从0~n-1是合法的。 △但C语言中对下标不作合法性检查,所以允许在使用 中下标越界。这种情况须程序员自我检查。 ③常量表达式可以包含常量和符号常量,不可使用变量, C语言中不可用可调数组。 ④使用时,只能逐个使用而不能一次使用整个数组。 即:只能对数组元素操作 注意!
物理意义: 地址下标内容 首地址 0 32767 数组一旦定义:就 首地址+1154 在内存中开辟出 首地址+2287 块连续的空间:空地址+33-90 间的首地址对应于首地址+44876 第一个元素,依次首地址+55-7890 排列。 首地址+66-3654 首地址+779008 首地址+8810 首地址+9935
物理意义: 数组一旦定义:就 在内存中开辟出一 块连续的空间:空 间的首地址对应于 第一个元素,依次 排列。 地址 下标 内 容 首地址 0 首地址+1 1 32767 54 首地址+2 2 87 首地址+3 3 -900 首地址+4 4 876 首地址+5 5 -7890 首地址+6 首地址+7 首地址+8 首地址+9 6 7 8 9 -3654 9008 10 35
引用 先定义,后使用。 下标可以是整型表达式 只能单个使用数组元 素而不能一次使用整 当确定到元素后,对该元 个数组。 素的处理相同与该数组元 数组元素的表示为: 素相同类型的其它变量。 数组名[下标] 如 x[0j=x[1]+sin(×10])+100
引用: 先定义,后使用。 只能单个使用数组元 素而不能一次使用整 个数组。 数组元素的表示为: 数组名[下标] 下标可以是整型表达式 当确定到元素后,对该元 素的处理相同与该数组元 素相同类型的其它变量。 如: x[0]=x[1]+sin(x[10])+100;
维数组的初始化 初始化:即在数组定义时就赋初值 C规定,只有静态存储和外部存储的的数组才可以初 始化。#不同系统可能有不同,请上机试用 1对全部数组元素赋初值 static int a[10]={012345678$ 此时,a[0]=0,a[1]=1…a9=9 对全部元素初始化时,数组长度可不写。 2部分元素初始化,数组长度必须给出。 static int fibonacci[20]=(1, 1; 3不能给数组整体赋初值。如: static int a[10]={010} 应写为: static int a10]={0,0,0000,000.0 4静态型和外部型数组不赋初始值,系统自动赋以0值。 只初始化一部分的,未初始化的部分自动赋以0值
二、一维数组的初始化 初始化:即在数组定义时就赋初值 C规定,只有静态存储和外部存储的的数组才可以初 始化。#不同系统可能有不同,请上机试用。 1.对全部数组元素赋初值 – static int a[10]={0,1,2,3,4,5,6,7,8,9}; – 此时,a[0]=0,a[1]=1,......a[9]=9 – 对全部元素初始化时,数组长度可不写。 2.部分元素初始化,数组长度必须给出。 static int fibonacci[20]={1,1}; 3.不能给数组整体赋初值。如: static int a[10]={ 0*10}; 应写为:static int a[10]={0,0,0,0,0,0,0,0,0,0}; 4.静态型和外部型数组不赋初始值,系统自动赋以0值。 只初始化一部分的,未初始化的部分自动赋以0值
6.1.11维数组的定义 [案例6]从键盘上任意输入10个整数,要求按从小到大的顺序 在屏幕上显示出来。 排序的方法有很多,本题采用冒泡法。 冒泡法的基本思想:通过相邻两个数之间的比较和交换,使排序 码(数值)较小的数逐渐从底部移向顶部,排序码较大的数逐渐从 顶部移向底部。就像水底的气泡一样逐渐向上冒,故而得名。 由A[nA[组成的n个数据,进行冒泡排序的过程可以描述为 (1)首先将相邻的A[n]与A[n1进行比较,如果A[n]的值小于 A[n-1]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着 比较A[n-1与A[n-2],同样使小的上浮,大的下沉。依此类推,直到 比较完A[2和A后,A为具有最小排序码(数值)的元素,称第 趟排序结束。 (2)然后在A[n~A2]区间内,进行第二趟排序,使剩余元素中 排序码最小的元素上浮到A[2];重复进行n1趟后,整个排序过程结 束
6.1.1 1维数组的定义 [案例6.1] 从键盘上任意输入10个整数,要求按从小到大的顺序 在屏幕上显示出来。 排序的方法有很多,本题采用冒泡法。 冒泡法的基本思想:通过相邻两个数之间的比较和交换,使排序 码(数值)较小的数逐渐从底部移向顶部,排序码较大的数逐渐从 顶部移向底部。就像水底的气泡一样逐渐向上冒,故而得名。 由A[n]~A[1]组成的n个数据,进行冒泡排序的过程可以描述为 : (1)首先将相邻的A[n]与A[n-1]进行比较,如果A[n]的值小于 A[n-1]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着 比较A[n-1]与A[n-2],同样使小的上浮,大的下沉。依此类推,直到 比较完A[2]和A[1]后,A[1]为具有最小排序码(数值)的元素,称第 一趟排序结束。 (2)然后在A[n]~A[2]区间内,进行第二趟排序,使剩余元素中 排序码最小的元素上浮到A[2];重复进行n-1趟后,整个排序过程结 束
数组初始化举例 #includesstdio.h> void maino {inta[5]={1,234,5} intb[5]={1,23} intc={12345} static int d 5]: int e5: int 1: for (i=0; 1<5; i++)printf("%d aiD); printf( \n ) for (i=0; i<5; i++) printf("%d",bli) printf("(n ) for(i=0; i<5; i++) printf("%d cliD;printf(\n ) for(i=0;i<5; 1++) printf("%d",dli); printf(\n ) for(i=0; i<5; i++) printf( %d"eli; printf("\n);
数组初始化举例 #include void main() {int a[5]={1,2,3,4,5}; int b[5]={1,2,3}; int c[]={1,2,3,4,5}; static int d[5]; int e[5]; int i; for (i=0;i<5;i++) printf("%d",a[i]);printf("\n"); for (i=0;i<5;i++) printf("%d",b[i]);printf("\n"); for (i=0;i<5;i++) printf("%d",c[i]);printf("\n"); for (i=0;i<5;i++) printf("%d",d[i]);printf("\n"); for (i=0;i<5;i++) printf("%d",e[i]);printf("\n"); }
举例:61 案例代码文件名:AL61C /功能:从键盘上任意输入n个整数,用冒泡法按从小到大地排序, 并在屏幕上显示出来。 #include stdio. h" #define num10 定义符号常量(数据个数N)/ main lint data NUM /定义1个1维整型数组data/ inti,j, temp 定义循环变量和临时变量”/ clrscror 库函数 cIrsii(:清屏 printf("Pleaseinput 10 numbers: n ) for(i=0; i<NUM; i++) scanf(od",&datai:
举例:{6.1] /*案例代码文件名:AL6_1.C*/ /*功能:从键盘上任意输入n个整数,用冒泡法按从小到大地排序, 并在屏幕上显示出来。 */ #include "stdio.h" #define NUM 10 /*定义符号常量(数据个数N)*/ main() { int data[NUM]; /*定义1个1维整型数组data*/ int i,j,temp; /*定义循环变量和临时变量*/ clrscr(); /*库函数clrscr():清屏*/ printf("Please input 10 numbers:\n"); for(i=0;i<NUM; i++) scanf("%d", &data[i]);
/冒泡法排序 for(i=0; ij-)/内循环:进行每趟比较 if(datai]<data[-1])/如果 datai大于data1]交换两者的位置 temp=datalil datai]=datalj-1] datalj-1=temp; 输出排序后的数据v printf( inthe result of sort: \ n ) for(i=0; i<NUM; 1++) printf("/od",datai] getchO /等待键盘输入任一字符,目的使程序暂停 [程序演示]
/*冒泡法排序*/ for(i=0;ii; j--) /*内循环:进行每趟比较*/ if(data[j]<data[j-1]) /*如果data[j]大于data[j-1],交换两者的位置 */ {temp=data[j]; data[j]=data[j-1]; data[j-1]=temp; }; /*输出排序后的数据*/ printf("\nthe result of sort:\n"); for(i=0;i<NUM; i++) printf("%d ",data[i]); getch(); /*等待键盘输入任一字符,目的使程序暂停*/ } [程序演示]