电子教案(学生成绩排序)

Download Report

Transcript 电子教案(学生成绩排序)

单元8 项目中数组的应用----学生成绩排序
•
•
•
学习目标:
(1)能力目标
①能正确使用数组名在函数之间传递数据。
②能正确使用函数进行“地址传递”,数组名作函数参数。
③能建立10个学生成绩的一维数组,并能用“冒泡法”对该数组排序。
(2)知识目标
①理解用数组名做函数参数与用数组元素做函数参数的不同点。
②理解数组在内存中的存储结构
③传地址与传值的区别与联系。
能力训练:
1.能正确使用数组名进行数组在函数之间传递数据。
2.能用“冒泡排序法”对10个数据进行升序和降序排列。
3.任务10:初步实现学生成绩排序
项目考核:
① 初步实现学生成绩排序
单元8 项目中数组的应用----任务10:初步完善学生成绩排序
•
8.2 任务10:初步实现学生成绩排序
要完成上述任务,在主函数中,我们设计一个包含10个学生成绩的实型数组。定义数
组的整型常量表达式用符号常量表示,然后完善相应函数。在编写函数的过程中要十分注
意函数的形参与实参的设计。
本任务初步实现按升序排列学生成绩函数AsceSort()和按降序排列学生成绩函数
DropSort()。
(1) 在项目的文件包含行的下面增加下列内容:
#define STUSIZE 10
(2) 主函数稍做修改:
void main()
{
int choose,editnum,dispnum,compnum,sortnum;//定义5个输入变量
float stuscore[STUSIZE]={65.5,80,97.5,55,85,77.5,89,95,68.5,88};
//定义学生成绩数组
……
}
单元8 项目中数组的应用----任务10:初步完善学生成绩排序
(3) 函数声明修改为:
void AsceSort(float score[],int stusize);//按升序排列学生成绩函数声明
void DropSort(float score[],int stusize);//按降序排列学生成绩函数声明
(4) 函数调用语句修改为:
AsceSort(stuscore,STUSIZE);
DropSort(stuscore,STUSIZE
(5) 函数定义修改为:
void AsceSort(float score[],int stusize)//按升序排列学生成绩函数
{
int i,j;
float temp;
float temp_score[STUSIZE];//定义一个新数组
system("cls");
for(i=0;i<stusize;i++)//给新数组赋值
temp_score[i]=score[i];
for(i=0;i<stusize-1;i++)//双重循环实现学生成绩按升序排列
for(j=0;j<stusize-i-1;j++)
单元8 项目中数组的应用----任务11:初步完善学生成绩排序
if(temp_score[j]>temp_score[j+1])
{
temp=temp_score[j];
temp_score[j]=temp_score[j+1];
temp_score[j+1]=temp;
}
gotoxy(5,5);
printf("升序排列结果:");
for(i=0;i<stusize;i++)
printf("%6.1f",temp_score[i]);
gotoxy(20,10);
printf("升序排列成功,按任意键返回上级菜单!");
getch();
}
单元8 项目中数组的应用----任务11:初步完善学生成绩排序
void DropSort(float score[],int stusize)//按降序排列学生成绩函数
{
int i,j;
float temp;
float temp_score[STUSIZE];
system("cls");
for(i=0;i<stusize;i++)
temp_score[i]=score[i];
for(i=0;i<stusize-1;i++)
for(j=0;j<stusize-i-1;j++)
if(temp_score[j]<temp_score[j+1])
{
temp=temp_score[j];
temp_score[j]=temp_score[j+1];
temp_score[j+1]=temp;
}
gotoxy(5,5);
printf("降序排列结果:");
单元8 项目中数组的应用----任务11:初步完善学生成绩排序
for(i=0;i<stusize;i++)
printf("%6.1f",temp_score[i]);
gotoxy(20,10);
printf("降序排列成功,按任意键返回上级菜单!");
getch();
}
在排序函数中,创建并生成了一个新的成绩数组(temp_score),其目的是在排序的
过程中,不影响原成绩数组的排列。
请读者模仿任务10中AsceSort函数和DropSort函数的优化方法,将升、降序排列函数
优化合并成一个新的函数,并正确的调用它。
单元8 项目中数组的应用---- 8.1.3 数组作函数参数
(5)一维数组的应用
【例8.5】随机产生0~100之间的10个数,并用“冒泡法”对10个数排序(由小到大)
。要求排序算法用函数来实现,主函数中输出排序前后结果。
冒泡法的基本思想:通过相邻两个数之间的比较和交换,使排序码(数值)较小的数
逐渐从底部移向顶部,排序码较大的数逐渐从顶部移向底部,较小的逐渐从底部移向顶部
。就像水底的气泡一样逐渐向上冒,因此而得名。
“冒泡法”算法:以六个数9、8、5、4、2、0为例。
单元8 项目中数组的应用---- 8.1.3 数组作函数参数
第1趟比较,有6个数未排好序;两两比较5次,如图6.2所示。
第2趟比较,剩5个数未排好序;两两比较4次,如图6.3所示。
第3趟比较,剩4个数未排好序;两两比较3次。
第4趟比较,剩3个数未排好序;两两比较2次。
第5趟比较,剩2个数未排好序;两两比较1次。
算法结论:对于n个数的排序,需进行n-1趟比较,第j趟比较需进行n-j-1次比较(由
于j从0开始编号)。
程序流程如下图所示(下面以N-S图表示流程):
程序代码:
单元8 项目中数组的应用---- 8.1.3 数组作函数参数
1 #include <stdio.h>
2 #include <stdlib.h>
3 void random(int array[],int n);//函数申明
4 void AsceSort(int array[],int n);//函数申明
5 void main()
6 {
7
int i,a[10]={0};
8
random(a,10);//调用求10个随机数函数
9
printf("排序前:\n");
10
for(i=0;i<10;i++)
11
printf("%4d ",a[i]);
12
printf("\n");
13
AsceSort(a,10);//调用排序函数
14
printf("排序后:\n");
15
for(i=0;i<10;i++)
16
printf("%4d ",a[i]);
17
printf("\n");
18 }
单元8 项目中数组的应用---- 8.1.3 数组作函数参数
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void random(int array[],int n)//求随机数函数
{
与例8.4相同
}
void AsceSort(int array[],int n)//按升序排列
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(array[j]>array[j+1])
{
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
单元8 项目中数组的应用---- 8.1.3 数组作函数参数
程序运行结果:
排序前:
1 51 10 54
排序后:
1 10 21 25
96 25
48
94 30
21
30 48
51
54 94
96
单元8 项目中数组的应用---- 8.1.3 课后作业与思考
1.填空题:
(1)已知数组A为一有14个单元的长整型数组,下面的语句试图从A[0]开始,隔一个输
出一个A中的元素,请补充完整下面的语句:
for(
; j<14;
) printf("%d",
);
(2)已知数组B是一个有15个元素的整型数组,下面的语句是求这15个元素的平均值,
并用B0来保存这个平均值,请补充完整下面的语句:
int j;int B0
;
for(
;
;j++)
;B0
15;
2.选择题:
(1)在C语言中,引用数组元素时,其数组下标的数据类型允许是
。
A.整型常量
B.整型表达式
C.整型常量或整型表达式
D.任何类型的表达式
(2)若有说明,int a[10];则对a数组元素的正确引用是
。
A.a[10]
B.a[3.5]
C.a(5)
D.a[10-10]
3.编程题:
(1)定义一个含有30个元素的整型数组,设计一个函数用于将该数组赋能被3整除的数
,再设计一个函数,实现该数组按每5个元素计算平均值,并将平均值保存在一个新的数组
中。
(2)利用冒泡排序法对十个随机整数进行排序。