《维数组冒泡排序.ppt》由会员分享,可在线阅读,更多相关《维数组冒泡排序.ppt(36页珍藏版)》请在三一办公上搜索。
1、项目3:学生总评成绩的统计与排序 涉及到的知识点如下:,单元一:while语句的流程以及应用单元二:do-while语句的流程以及应用单元三:for语句的流程以及应用单元四:break、continue语句的应用单元五:循环结构的嵌套练习单元六:分支、循环结构的综合应用单元七:一维数组的定义及应用单元八:二维数组的定义及应用单元九:学生总评成绩统计与排序的实现,单元七:一维数组的定义及应用,第一个问题是:输入100个学生的“C程序设计”课程的成绩,将这100个分数从小到大输出。第二个问题是输入100个学生的“C程序设计”课程的期中和期末成绩,算出总评成绩,总评成绩为“30%期中成绩+70%期末
2、成绩”,计算总评成绩的分数段情况。,什么构造类型?所谓构造类型是指由基本类型数据按一定的规则组成的,是用户自己按规则定义的,数组是构造类型之一。什么是数组?在数学中我们学过数列、矩阵的概念,数列通常表示为:a1、a2、a3、.、an 矩阵通常表示为:,在C语言中表示数列和矩阵的方法是:数组:a0、a1、a2、a3、a4、a5 b0、b1、b2、b3、b4 c00、c01、c10、c11 d111、f2234其中 a,b,c,d,f:称为数组名。方括号中的数:称为下标下标是一个数时,也就是数列,称为一维数组。下标是两个数时,也就是矩阵,称为二维数组。还有三维数组、四维数组等。,例如:有五名学生的
3、一组学号:12、13、14、15、16,int num5;num0=12;num1=13;num2=14;num3=15;num4=16;,int a,b,c,d,e;a=12;b=13;c=14;d=15;e=16;,单元七:一维数组的定义及应用,7.1 一维数组的定义 数组是具有相同数据类型的变量集,并拥有共同的名字。从概念上来说,数组是一组变量,这组变量应该满足下列条件:(1)具有有相同的名字(2)具有相同的数据类型(3)在存储器中连续存放,每个数组在使用之前都需要定义。定义数组的语法是:数据类型说明符 数组名数组长度;注意:数组长度只能是常量。,定义数组中元素的取值类型,定义数组中元素
4、的个数,数组中的每个成员称为数组的一个“数组单元”,保存在其中的数据值称为“数组元素”,数组对象的整体有一个名称,这个名称表示整个数组。,例如:int data5;说明整型数组data,有5个元素。float b10,c20;说明单精度浮点型数组b,有10个元素;单精度浮点型数组c,有20个元素。char string20;说明字符型数组string,有20个元素。,一维数组在内存的存储形式:,一组变量,int num5;num0=12;num1=13;num2=14;num3=15;num4=16;,注意:(1)数组的数据类型定义的是每个数组元素的取值类型。对于一个数组来说,所有数组元素的数
5、据类型应该都是相同的。(2)数组名要符合用户定义字的书写规则,也就是与普通变量一样。(3)在C语言的一个函数中,数组名不能与本函数的其它变量名同名。(4)数组长度不能是变量,也不能是或包含变量的表达式,可以是常量或常量表达式。并且常量表达式应是整型数,不能是小数。,程序段一:#define Size 5main()int aSize,bSize+10;/*正确*/程序段二:main()int n=5;int datan;/*错误*/,7.2 一维数组的引用 引用数组单元的一般形式为:数组名下标 数组下标从0开始,可以是整型变量或整型表达式,但不能是浮点型的变量或浮点型表达式;并且下标不能大于数
6、组长度-1,因为超过部分没有被定义过,是不能正确使用的。例如:data4、datai+j、datai+都是合法的引用方式。,数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组其中:下标可以是常量、变量或表达式,但最终值必须是整型数。,例 int a10;scanf(“%d”,a);(),必须 int a10;for(j=0;j10;j+)scanf(“%d”,数组的定义与引用中下标用法的区别,在数组的定义中:数组长度必须是整型常量,例如 int a100;也就是说在定义数组的个数的时候必须给定元素的个数。下面的定义不正确:int n=5;int an;()n不是常量,是变量。下面
7、的写法也是正确的:#define size 5 main()int asize,bsize+5;(),在数组的引用中:下标可以是常量,可以是变量,对于上面的例子,有:a0a99都可以用,还可以像如下这种方式用:i=2;ai=34;ai+;ai-;a+i;a-i;,7.3 一维数组元素值的输入与输出例如:main()int i,a10;for(i=0;i10;i+)scanf(“%d”,例:用数组方式读入5个整数,并求和。#include stdio.h main()int i,data5,sum=0;printf(nPlease enter 5 integer:);for(i=0;i5;i+)
8、scanf(%d,在语言中只能逐个地使用每个数组单元进行操作,而不能一次引用整个数组。例如,不能用printf(“%d”,data);来代替下面的语句:for(i=0;i=4;i+)printf(%d,datai);因为,C语言规定数组名本身代表数组的首地址。printf(“%u”,data);语句输出的是数组的首地址,而不是数组单元的内容。,7.4 一维数组的初始化 初始化是指在数组定义时给数组元素赋予初值。一维数组初始化的一般形式是:数据类型说明符 数组名数组长度=数值,数值,.数值;,int data5=1,2,3,4,5;注意:(1)允许初始化一部分元素,而不是全部。int data5
9、=1,2;(2)初始化数组时,允许省略数组的长度。int data=1,2,3,4,5;与int data5=1,2,3,4,5;是完全等价的。(3)初始化数组时,不能对整个数组初始化。例如,int data5=1;,数组的初始化和赋值的区别,数组的初始化:是指在定义数组的时候进行的,例如:int a 3=1,2,3;/*初始化*/数组元素的赋值:int a3;/*定义整型数组*/.a1=1;a2=2;/*数组元素赋值*/a3=3,例【1】学校举行知识竞赛,有10个学生参赛,请协助老师编写一个程序把成绩打印出来。解题步骤:1、定义一个一维数组存放成绩2、输出成绩。,7.4程序举例,代码实现#i
10、nclude”stdio.h”main()int i;int student10=90,78,67,98,34,56,75,80,50,92;for(i=0;i10;i+)printf(“%d”,studenti);,例【2】将例【1】中的10个学生的竞赛成绩从键盘输入,计算出平均分,将平均分输出到屏幕上。#include”stdio.h”#define SIZE 10 main()int i,studentSIZE,sum=0,AVG;for(i=0;iSIZE;i+)scanf(“%d”,例 3读10个整数存入数组,找出其中最大值和最小值,步骤:1.输入:for循环输入10个整数2.处理:
11、(a)先令max=min=x0(b)依次用xi和max,min比较(循环)若maxxi,令min=xi3.输出:max和min,#include#define SIZE 10main()int xSIZE,i,max,min;printf(Enter 10 integers:n);for(i=0;ixi)min=xi;printf(Maximum value is%dn,max);printf(Minimum value is%dn,min);,例4用数组方式解决Fibonacci数列问题,求出Fibonacci数列的前20项存储在数组中,并将数组内容输出。,分析:定义一个含有20个元素的数组
12、f,即 int f20;其中 f0=1,f1=1,fn=fn-1+fn-2(n2)用一个循环结构:让循环变量n从 2到 20,循环体为 fn=fn-1+fn-2,#include stdio.hvoid main()int i,fib20=1,1;/*初始化*/printf(n);for(i=2;i20;i+)fibi=fibi-1+fibi-2;for(i=1;i=20;i+)printf(%10d,fibi-1);if(i%5=0)printf(n);/*换行,每行输出5个*/,例 5用冒泡法对 8 个数从小到大排序,排序过程:首先把8个数放到数组a8 中。a0=38;a1=49;a2=6
13、5;a3=76;a4=13;a5=27;a6=30;a7=97;,排序过程:首先把8个数放到数组a8 中。a8=38,49,65,76,13,27,30,97,13 27 30 38 49 65 76 97,38 13 27 30 49 65 76 97,38 49 13 27 30 65 76 97,38 49 65 13 27 30 76 97,38 49 65 76 13 27 30 97,49 38 65 97 76 13 27 30,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,4
14、9,30,49,27,38,27,38,30,38,n=1,n=2,n=3,n=4,n=5,n=6,13 27 30 38 49 65 76 97,n=7,30,27,下标到N-1,下标到N-2,下标到N-3,下标到N-4,下标到N-5,下标到N-6,下标到N-7,冒泡排序法规律总结,1、假如有N个数,则需要进行N-1趟排序,决定最外层的循环 for(i=1;i aj)则交换aj-1与aj的值3、每一趟的到底比较多少次呢?每一趟比较 j都是从1循环到N-i,因此比较的次数 如下:for(j=1;j aj)则交换aj-1与aj的值,4、总的程序如下:for(i=1;i aj)则交换aj-1与aj
15、的值 for(i=0;i=N-1;i+)/*输出排好序的数组*/printf(“%d”,ai);,1、从大到小排序 7,4,10,1,20,5,3,9;2、输入10个整数,求出最小的数以及最小的数在数组中的下标。3、用初始化方法,把某学习小组10名学生的“C语言”成绩课程的考试成绩存储在数组中,再从键盘输入一个分数,查找该分数是否在数组中,如果是,则输出它在数组中的下标。4、输入一个学生的成绩,将该学生的成绩插入到已经排好序的有9个学生的数组a10中。a10=12,25,34,47,56,59,60,80,99,练习,数据,成员,比如要插入数据 36,首先要找到插入的位置,找到第一个比36大的
16、数为47,所以应该插入到34与47 之间。然后将47到99所有的数据向后移动一个位置。看下图。,数据,成员,47,56,59,60,80,99,99,80,60,59,56,47,36,5、输入10个学生的“C程序设计”课程的期中和期末成绩,算出总评成绩,总评成绩为“30%期中成绩+70%期末成绩”,计算总成绩的分数段情况。本题要使用三个平行的数组才能解决问题。这三个数组的第i个元素记录了一个学生的期中成绩、期末成绩和总评成绩。6、假定某数组已经存放互不相同的正整数,现在从键盘输入一个整数,要求从数组中删除与该值相等的元素,并将其后的元素逐个向前递补,输出删除后的数组,如原数组中无此数,则输出“无此数”。,