视频:
P4-1【应用数组进行程序设计】第一节——知识要点:一维数组
项目四 应用数组进行程序设计
任务一:冒泡排序
知识要点:一维数组
目录
一、任务分析
二、必备知识与理论
三、任务实施
一、任务分析
用冒泡法对任意输入的 10 个整数进行由小到大的排序。
1.首先是定义一个一维数组包含10个元素来存放这10个整数;
2.懂得冒泡法排序的思想,利用循环的嵌套来解决问题;
3.利用这个一维数组来输出排好序的10个整数。
二、必备知识与理论
1. 认识数组
在C语言中,数组必须是静态的,没有提供动态数组的类型。也就是说,定义一个数组之后,就确定了它的维数和所容纳的同类元素的个数(即数组大小)。这就构成了数组类型的两个特点:
(1)数组大小必须是确定的,不允许随机变动。
(2)数组元素的数据类型必须相同,不允许出现混合类型。
也就是说,数组只可以处理同样类型的有限个成批数据信息。在软件设计中尤其是一维数组、二维数组应用最广。
注意:数组的维数和大小是在定义数组时就确定的,程序运行的时候不能改变。
2.一维数组的定义
数组变量也要遵循“先定义后引用”的原则。一维数组定义的一般形式为:
类型说明符 数组名[常量表达式];
例如: int m[8];
它表示定义一个整型数组,数组名是m,数组m中有8个元素。
数组定义中要注意以下几个问题:
(1)“类型说明符”可以是任何一种基本数据类型或构造数据类型。
(2)“数组名”的命名规则和变量命名规则相同,都遵循标识符的命名规则。
(3)数组名后的常量表达式是用方括号[]括起来的,不能使用圆括号。如:int a(10);用法是不对的。
(4)“常量表达式”表示数组中数据元素的个数,即数组长度。通常是一个整型常量,符号常量也行,不能包含变量。例如在m[8]中,表示数组m有8个元素,下标从0开始一直到7,这8个数组元素分别是:m[0]、m[1]、m[2]、m[3]、m[4]、m[5]、m[6]、m[7],注意没有m[8]。若使用m[8]会出现下标越界的错误。
(5)一个数组定义语句中可以只定义一个数组,也可以定义多个数组,还可以同时定义数组和变量。
例如:double a[10],b[6];/*定义了一个有10个元素的双精度型数组a和一个有6个元素的双精度型数组b*/
char f[8],e1;/*定义了一个有8个元素的字符型数组f和一个字符型变量e1*/
3.一维数组的引用
数组必须先定义,然后使用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。在C语言中,凡是一般简单变量可以使用的地方都可以使用数组元素。
一维数组元素的表示形式如下:
数组名[下标]
注意:在编译和执行程序时,系统不检查数组的下标是否越界,因此在编程时,要注意下标越界问题,以免发生错误。
4. 一维数组的初始化
在定义数组的同时给数组元素赋初值称为数组的初始化。
一维数组初始化的一般形式为:
类型说明符 数组名[常量表达式]={数据值,数据值,……,数据值};
C语言对数组的初始化赋值还有以下几点规定:
(1)可以只给部分元素赋初值。没有赋初值的元素:对于数值型数组,自动赋初值为0;对字符型数组,自动赋初值为空字符。
例如:int m[8]={1,2,3,4};
定义的数组m有8个元素,但大括号内只有4个初值,这表示只给前面4个元素赋初值,后4个元素值均为0。即 m[0]=1,m[1]=2,m[2]=3,m[3]=4,m[4]=0,m[5]=0,m[6]=0,m[7]=0。
(2)只能给元素逐个赋值,不能给数组整体赋值。
例如:给数组m中的8个元素全部赋值“2”只能用以下形式来表示:
int m[8]={2,2,2,2,2,2,2,2};
而不能为了方便写成如下的形式:
int m[8]=2;
(3)如果给全部数组元素赋初值,则在数组说明中,可以不指定数组的长度,其长度等于花括号中数值的个数。
例如:int m[5]={1,2,3,4,5};
可写为:int m[ ]={1,2,3,4,5};
(4)当花括号内提供的初值个数多于数组元素的个数时,系统编译时将会出错。
三、任务实施
本任务是用冒泡法对任意输入的10个整数进行由小到大排序。
冒泡法的算法思想是: n个数排序,将相邻两个数依次进行比较,将小数调在前面,大数放在后面,这样逐次比较,直至将最大的数移至最后;然后再将n-1个数继续比较,重复上面操作,直至比较完毕。由于排序过程类似每次将最大的数沉到下面,把小的数浮到上面,所以称为冒泡法排序,也有称为沉石子法的。
若对10个数据进行排序,则算法可以描述为:
(1)定义数组a的长度为11,本例中对a[0]不用,只用a[1]到a[10],以符合人们的习惯。
(2)利用循环的嵌套来解决问题。由上面的算法分析,可以看出10个数据的数组升序排列,需要进行9趟排序。每趟的排序仅在内层循环中对数组中的数据两两进行比较,而外层循环仅说明了总共需要比较的趟数,不会处理数组中的元素。另外,根据上述问题的分析,可以看出内、外层循环变量之间的变化规律,每趟执行的内循环的次数和相应的趟数之和为定值。可采用二重循环实现冒泡法排序,外循环控制进行比较的次数,内循环找出最大的数,并放在最后位置(即沉底)。
冒泡法排序的程序代码如下:
#include <stdio.h>
main()
{
int a[11]; /*数组a的长度为11,本例中对a[0]不用,只用a[1]到a[10],以符合人们的习惯*/
int i,j,t;
printf("input l0 numbers:\n"); /* 输出提示信息 */
for(i=1;i<11;i++)
scanf("%d",&a[i]); /* 设置循环语句,通过键盘将10个整数分别放到 a[1]到a[10]中*/
printf("\n");
for(j=1;j<=9;j++) /* 外循环,10个数排序进行9次*/
for(i=1;i<=10-j;i++) /* 内循环,10-外循环次数=内循环次数 */
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;} /*借助于中间变量t交换数据*/
printf("the sorted numbers:\n");
for(i=1;i<11;i++)
printf("%d ",a[i]);
}
运行结果如下:
input l0 numbers:
1 0 4 8 12 65 -76 100 -45 123↙
the sorted numbers:
-76 -45 0 1 4 8 12 65 100 123