第7章数组 为了解决比较复杂的问题,本章介绍C语言提供的 种最简单的构造类型——数组 7,11维数组的定义和引用 722维数组的定义和引用 73字符数组与字符串 Return
为了解决比较复杂的问题,本章介绍C语言提供的 一种最简单的构造类型──数组。 7.1 1维数组的定义和引用 7.2 2维数组的定义和引用 7.3 字符数组与字符串 [Return] 第7章 数 组
711维数组的定义和引用 71.11维数组的定义 7121继数组元素的引用 7131维数组元素的初始化 7141维数组应用举例 Return
7.1 1维数组的定义和引用 7.1.1 1维数组的定义 7.1.2 1维数组元素的引用 7.1.3 1维数组元素的初始化 7.1.4 1维数组应用举例 [Return]
7.11一维数组的定义 案例71]从键盘上任意输入10个整数,要求按从小到大的顺序 在屏幕上显示出来 排序的方法有很多,本题采用冒泡法。 冒泡法的基本思想:通过相邻两个数之间的比较和交换,使排序 码(数值)较小的数逐渐从底部移向顶部,排序码较大的数逐渐从顶 部移向底部。就像水底的气泡一样逐渐向上冒,故而得名 由A[n]A[]组成的n个数据,进行冒泡排序的过程可以描述为 1)首先将相邻的A[n与A[n-进行比较,如果An]的值小于 A[n-1]的值,则交换两者的位置,使较小的上浮,较大的下沉;接着 比较A[n-1与A[n-2],同样使小的上浮,大的下沉。依此类推,直到 比较完A[2]和A]后,A[1]为具有最小排序码(数值)的元素,称第 趟排序结束。 (2)然后在AnA[2]区间内,进行第二趟排序,使剩余元素中 排序码最小的元素上浮到A[2];重复进行n-1趟后,整个排序过程结 束
7.1.1 一维数组的定义 [案例7.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趟后,整个排序过程结 束
/*案例代码文件名:AL71C* *功能:从键盘上任意输入n个整数,用冒泡法按从小到大地排序, 并在屏幕上显示出来。* #include stdio. hw # definen 1i定义符号常量(数据个数N)*/ maino iint data n; /定义1个1维整型数组data* int lit /定义循环变量和临时变量 cirscry; /库函数 clrscro:清屏* printf(" Please input 10 numbers: In"); for(i=l; i<N; i++) scanf(%od",&data iD;
/*案例代码文件名:AL7_1.C*/ /*功能:从键盘上任意输入n个整数,用冒泡法按从小到大地排序, 并在屏幕上显示出来。*/ #include "stdio.h" #define N 11 /*定义符号常量(数据个数N)*/ main() { int data[N]; /*定义1个1维整型数组data*/ int i,j,t; /*定义循环变量和临时变量*/ clrscr(); /*库函数clrscr():清屏*/ printf("Please input 10 numbers:\n"); for(i=1; i<N; i++) scanf("%d", &data[i]);
冒泡法排序六 for(i=1;i<=N-l;i+)γ外循环:控制比较趟数* for(j=1;j=N-i;j++)/内循环:进行每趙比较* if(datalj< fatal-1)/如果 datal大于 datai-1,交换 两者的位置 it=datal; datal= dataj-1; dataj-1=t;j /输出排序后的数据* printf(inthe result of sort: n"); for(i=0; i<N; i++) printf("%od",datai; 「程序演示
/*冒泡法排序*/ for(i=1; i<=N-1; i++) /*外循环:控制比较趟数*/ for(j=1; j<=N-i; j++) /*内循环:进行每趟比较*/ if(data[j]<data[j-1]) /*如果data[j]大于data[j-1],交换 两者的位置*/ {t=data[j]; data[j]=data[j-1]; data[j-1]=t; } /*输出排序后的数据*/ printf("\nthe result of sort:\n"); for(i=0; i<N; i++) printf("%d ",data[i]); } [程序演示]
数组同变量一样,也必须先定义、后使用。 一维数组是只有1个下标的数组,定义形式如下: 数据类型数组名常量表达式数组名2常量表达式2]… 1)“数据类型”是指数组元素的数据类型 (2)数组名,与变量名一样,必须遵循标识符命名规则。 (3)“常量表达式”必须用方括号括起来,指的是数组的元 素个数(又称数组长度),它是一个整型值,其中可以包含常数和 符号常量,但不能包含变量。 注意:C语言中不允许动态定义数组。 (4)数组元素的下标,是元素相对于数组起始地址的偏移量, 所以从0开始顺序编号。 (5)数组名中存放的是一个地址常量,它代表整个数组的首 地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存 储单元 Return
数组同变量一样,也必须先定义、后使用。 一维数组是只有1个下标的数组,定义形式如下: 数据类型 数组名[常量表达式][,数组名2[常量表达式2]……]; (1)“数据类型”是指数组元素的数据类型。 (2)数组名,与变量名一样,必须遵循标识符命名规则。 (3)“常量表达式”必须用方括号括起来,指的是数组的元 素个数(又称数组长度),它是一个整型值,其中可以包含常数和 符号常量,但不能包含变量。 注意:C语言中不允许动态定义数组。 (4)数组元素的下标,是元素相对于数组起始地址的偏移量, 所以从0开始顺序编号。 (5)数组名中存放的是一个地址常量,它代表整个数组的首 地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存 储单元。 [Return]
7.1.2数组元素的引用 引用数组中的任意一个元素的形式: 数组名下标表达式 1.“下标表达式”可以是任何非负整型数据,取值 范围是0~(元素个数-1)。 特别强调:在运行C语言程序过程中,系统并不自动 检验数组元素的下标是否越界。因此在编写程序时,保 证数组下标不越界是十分重要的。 2.1个数组元素,实质上就是1个变量,它具有和相 同类型单个变量一样的属性,可以对它进行赋值和参与 各种运算 3.在C语言中,数组作为1个整体,不能参加数据 算,只能对单个的元素进行处理 Return
7.1.2 数组元素的引用 引用数组中的任意一个元素的形式: 数组名[下标表达式] 1.“下标表达式”可以是任何非负整型数据,取值 范围是0~(元素个数-1)。 特别强调:在运行C语言程序过程中,系统并不自动 检验数组元素的下标是否越界。因此在编写程序时,保 证数组下标不越界是十分重要的。 2.1个数组元素,实质上就是1个变量,它具有和相 同类型单个变量一样的属性,可以对它进行赋值和参与 各种运算。 3.在C语言中,数组作为1个整体,不能参加数据运 算,只能对单个的元素进行处理。 [Return]
7131维数组元素的初始化 初始化格式: 数据类型数组名[常量表达式]={初值表}; (1)如果对数组的全部元素赋以初值,定义时可以 不指定数组长度(系统根据初值个数自动确定)。如果 被定义数组的长度,与初值个数不同,则数组长度不能 省略。如:inta={1,2,4,8};inta[5}-{0};inta[10}={1,4,8}; (2)“初值表”中的初值个数,可以少于元素个数, 即允许只给部分元素赋初值。inta10]-={14.8}; (3)根据存储类型的不同,数组有静态数组( static 和动态数组(auto)之分;根据定义的位置不同,数组有 内部数组(在函数内部定义的数组)和外部数组(在函 数外部定义的数组)之分 Return
7.1.3 1维数组元素的初始化 初始化格式: 数据类型 数组名[常量表达式]={初值表}; (1)如果对数组的全部元素赋以初值,定义时可以 不指定数组长度(系统根据初值个数自动确定)。如果 被定义数组的长度,与初值个数不同,则数组长度不能 省略。如:int a[]={1,2,4,8}; int a[5]={0};int a[10]={1,4,8}; (2)“初值表”中的初值个数,可以少于元素个数, 即允许只给部分元素赋初值。 int a[10]={1,4,8}; (3)根据存储类型的不同,数组有静态数组(static) 和动态数组(auto)之分;根据定义的位置不同,数组有 内部数组(在函数内部定义的数组)和外部数组(在函 数外部定义的数组)之分。 [Return]
7.14一维数组应用举例 [案例72]已知某课程的平时、实习、测验和期末成绩,求该课 程的总评成绩。其中平时、实习、测验和期末分别占10%、20%、 20%、50%。 /*案例代码文件名:AL72C*/ *功能:从键盘上循环输入某课程的平时、实习、测验和期末成绩, 按10%,20%,20%,50%的比例计算总评成绩,并在屏幕上显示 出来。按空格键继续循环,其他键终止循环。* # include“ stdio.h maino i int i=l, j char con key=x20 /*x20空格键的ASCI码* float score[5] ratio[4]}={0.10.2,0.2,0.5};/*定义成绩、比例系数数组*
7.1.4 一维数组应用举例 [案例7.2] 已知某课程的平时、实习、测验和期末成绩,求该课 程的总评成绩。其中平时、实习、测验和期末分别占10%、20%、 20%、50%。 /*案例代码文件名:AL7_2.C*/ /*功能:从键盘上循环输入某课程的平时、实习、测验和期末成绩, 按10%,20%,20%,50%的比例计算总评成绩,并在屏幕上显示 出来。按空格键继续循环,其他键终止循环。*/ #include “stdio.h” main() { int i=1,j; char con_key=‘\x20’; /* ‘\x20’ 空格键的ASCII码*/ float score[5],ratio[4]={0.1,0.2,0.2,0.5}; /*定义成绩、比例系数数组*/
while(con key==x20) iclrscro print("输入第%2d个学生的成绩n",计++) print("平时实习测验期末成绩n"); score 4}=0 /* score[4]:存储总评成绩* for(=0;j<4;j+ i scanf(%f", &scoreD) score[4]+= score[]*rationl printf(“总评成绩为%6.1fn",sore[4]) print("n按空格键继续,其它键退出") con key= getch(;/* getcho函数等待从键盘上输入一个字符* 「程序演示 Return
while(con_key=='\x20') {clrscr(); printf("输入第%2d个学生的成绩\n", i++); printf("平时 实习 测验 期末成绩\n"); score[4]=0; /* score[4]:存储总评成绩*/ for(j=0; j<4; j++) {scanf("%f",&score[j]); score[4] += score[j] * ratio[j]; } printf(“总评成绩为:%6.1f\n",score[4]); printf("\n按空格键继续,其它键退出"); con_key=getch(); /*getch()函数等待从键盘上输入一个字符*/ } } [程序演示] [Return]