项目四设计学生成绩管理系统 -
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务分析 某班50名学生参加了一次C语言程序设计考试, 现要录入和输出全班同学的成绩。本任务要 将50名学生成绩录入并全部输出,按照前面 学过的知识就需要使用50个简单变量来存储 这批数据,光定义这批数据的变量名就需要 大量的工作,这显然是不合理的。 如何处理这样大批的数据呢?这就需要引入 一个数据结构——数组来存储学生的成绩。
项目四 学生成绩排序
义和使用方法 2、数组的存储结构 3、数组的输入输出及数组的应用 4、常用的字符串处理函数 学习目标: 1、使用一维数组和二维数组处理同一类型的大批数 据 2、使用字符数组处理字符串 3、使用二维数组处理字符串
工作任务导入
学生成绩管理是学校教学管理中的一个非 常重要而又非常繁琐的工作。传统的手工管理, 已经不能满足现代教育和管理的要求。取而代 之的是运用高效能的计算机来对学生的成绩进 行管理。 本书将运用C语言开发一个学生成绩管理 系统,系统的功能将在项目四、五、六、七、 八5个项目任务中由简入繁、逐步得到实现、 完善和优化。项目四主要实现的功能包括对多 名学生1门课程的成绩和多名学生多名课程的 成绩进行管理。功能模块如图4.1所示。
int a[ ]={0,1,2,3,4};
设 语 计 言 程 序
4.1.4 一维数组的初始化
C
(2)在定义数组时,对部分数组元素赋初值
Example
int a[5]={1,2,3};
系统为其余元素赋0
4.1.4 一维数组的初始化
(3)当初值的个数多于数组元素的个数时, 编译出错
Example
int a[5]={1,2,3,4,5,6,7};
初始化后: 1 4 2 5 3 6
4.3.4 二维数组的初始化
(2)按数组排列的顺序初始化
Example
int a[2][3]={1,2,3,4,5,6};
初始化后:
1 2 3
4
5
6
4.3.4 二维数组的初始化
(3)对全部数组元素初始化
4.3.1 二维数组
二维数组的定义
数据类型 数组名[常量表达式1][常量表达式2];
行
Example
列
float x[2][3];
int a[3,4], b(3,4) ; x[0][0] x[0][1] x[0][2] x[1][0] x[1][1] x[1][2] int c[ ][ ], d(3)(4);
从高到低的顺序全部打 印出来,怎么办?
for( i=0; i<50; i++) {scanf(“%d”,&x); s+=x; } printf(“%f\n”, s/50.0);
}
任务1 输入/输出多个学生一门 课程的成绩
数 组
相同类型数据的 集合。 让一组同一类型 的数据共用一个变 量名,而不需要为 每一个数据都定义 一个名字。
4.2.3 查询成绩的最大值
从键盘输入10名学生的成绩,输出分数最高 的学生序号及最高成绩。 分析:定义一个变量max,它表示当前最大 的值,然后把a[0]送入max中作为初始值。再 设计一个for语句,从a[1]到a[9]逐个取出并与 max中的内容比较,若比max的值大,则把该 下标变量的值送入max中,因此max总是在已 比较过的下标变量的值中为最大者。比较结 束,输出max的值。
【引导问题】
(1) 多名学生1门课程的学生成绩如何存储? (2) 如何录入和输出多名学生1门课程的成绩? (3) 如何查询学生的成绩?如何对学生成绩进行 排序? (4) 如何录入和输出多名学生多门课程的成绩? (5) 如何计算每位学生的总成绩? (6) 如何对学生的姓名进行处理?
4.1.2 一维数组 一维数组的定义
数据类型 数组名[常量表达式];
数组元素 的数据类型
遵循C语言 标识符规则
例如:int a[5];
数组长度 几个数组元素
4.1.2 一维数组
说明: 常量表达式表示元素的个数,即数组 长度。 常量表达式中可以包括常量和符合常 量,不能包含变量。
int i=5; int a[i]; /*数组长度为变量*/
4.1.3 一维数组的引用
输入5个学生的数学成绩,计算平均分,将平均分 输出到屏幕上。 数组元素的地址也 void main() 是通过“&”运算符 得到的。 { int i,mathScore[5],sum=0;float average; for(i=0;i<5;i++) { scanf("%d",&mathScore[i]); } for(i=0;i<5;i++) { sum=sum+mathScore[i]; } average=sum/5.0; printf("%f ",average); }
任务实施
实现对多名学生多门课程的成绩管理,首先 计算出每位同学3门课程的总分,然后按照总 分由大到小的顺序输出班级成绩单。 本任务最关键的问题是排序,采用的方法是 冒泡法,只是在总分进行交换时,还应该将 此同学的科目成绩进行交换,所以交换的数 据比较多,显得比较繁琐。
4.3.2 二维数组
任务3 学生成绩排序
任务分析 实现学生成绩管理系统中的成绩排序功 能,将某班50位同学参加C语言程序设 计考试的成绩,按从高到低的顺序排序 并输出。即实现学生成绩管理系统中的 第5个功能。
任务实施
数组的排序法有很多, 这里介绍冒泡排 序法。 冒泡排序(Bubble sort),顾名思义, 就是数据由最大值排列到最小值,像是 在水里吐气泡一样,大气泡由于浮力较 大,因此会先浮出水面。
数组名[下标表达式];
Example
int n=5,a[20];
若一个数组长度为n,其 下标值范围是0~(n-1)
表示引用数组a中的第2个元素
表示引用数组a中的第6个元素 表示引用数组a中的第16个元素
a[1]
a[n]
a[3*n]
试一试
问题4.1 给一个数组元素赋值并输出。 分析:输入和输出数组中的10 个元 素,必须使用循环语句逐个输出各下标 变量。
Example
Example
for(i=0;i<5;i++) a[i]=(i+1)*100;
for(i=0;i<100;i++) a[i]=i+1;
设 语 计 言 程 序
4.1.4 一维数组的初始化
C
(1)在定义数组时,对全部数组元素赋初值 此时可以省略数组的长度
Example
int a[5]={0,1,2,3,4};
两层循环结构 – 外层循环每次 把操作范围内 最大的数放到 最后位置 – 内层循环每次 把较大的数放 到靠后的位置
有数组a,其元素值为7、1、5、6、9、3,现 要把该数组按从小到大的顺序排列并输出。
for( i=0; i<6-1; i++) main() {int a[]={7,1,5,6,9,3}; int i,j,t; for( j=0; j<6-1-i; j++) if(x[j]>x[j+1])
任务4 处理多名学生多门课程的成绩
任务分析 : 在前面的任务中,我们实现了对多名学生1门课程 成绩的管理,在实际应用中,我们经常还需要处 理这样的问题:某班50名学生参与考试,考了3门 课程,现要求按总成绩的高低输出成绩单。成绩 单的格式如下: 排序 数学 C语言 英语 总分 1 98 87 88 273 2 96 86 88 270 这就涉及到多名学生多门课程处理的问题,如果 仅仅使用一维数组进行上述处理,是很困难的, 此时需要使用二维数组。
引用:
Example
数组名[行下标][列下标]
int a[3][4]; a[0][0]=3;
a[3][4]=3; /* 下标越界 */ a[1,2]=1; /* a[1][2]=1; */
a[0][1]=a[0][0]+10;
4.3.2 二维数组的引用
二维数组元素的表示形式为: 数组名[行下标][列下标]
4.3.2 冒泡法排序
7 1 1 1 1 1 1 5 5 5 3 3 5 6 6 3 5 5 _ _ _ _ _ 6 7 3 6 6 5 9 3 7 7 7 6 3 9 9 9 9 9
7 1 5 6 9 3 1 7 5 6 9 3 1 5 7 6 9 3 1 5 6 7 9 3 1 5 6 7 9 3 1 5 6 7 3 9
试一试
问题4.3 输出Fibonacci数列的前20项。 Fibonacci数列:第一项和第二项为1,以 后各项为前两项之和。 分析:前面我们使用迭代法解决了这个 问题,现在我们用数组来解决,首先定 义一个大小为20的数组,然后f[0]=1, f[1]=1, f[n]=f[n-1]+f[n-2], (n>1),运用该 公式即可求出数组中后面各项的内容。
4.1.3 一维数组
1、上例中,语句 average=sum/5.0; 修改为 average=sum/5; 结果如何?
2、练习:从键盘输入5个学生的成绩,求出并 输出分数最高的学生序号及最高成绩。
4.1.2 一维数组的引用
数组的赋值只能逐个对数组元素赋值,不能直接对数组名赋值。 因数组在内存占一片连续的存储空间,可用循环语句处理数组。
任务2 查询学生成绩
任务分析: 任务1中录入了50名学生的成绩并保存 到了数组中,任务2实现学生成绩管理系统 中的查询功能:①用户输入待查找学生的 序号,输出该学生的成绩;②查找学生成 绩中的最高分、最低分及所在位置。即实 现学生成绩管理系统的第3个和第4个功能 。
任务实施
输入学生的序号,序号减去1,就得到 了该学生在数组中的下标,直接对数组 元素进行引用即得到该学生的成绩。查 找学生成绩的最高分和最低分,关键在 于增加两个变量:max表示当前的最高 分,min表示当前的最低分。
printf(“the sorted nembers:\{ n”); t=x[j]; for( i=0; i<6; i++) x[j]=x[j+1]; printf(“%5d\n”, x[i]); x[j+1]=t; } }
4.2.1 冒泡法排序 1、上例中,如果要按从大到小的顺序排 序,该如何修改程序呢? 2、练习:一个班50位同学参加了一次C语 言程序设计考试,现要输入全班同学的 成绩,并按从低到高排序并输出。
本项目由5个任务组成。 任务1实现多名学生1门课程成绩的录入/输出; 任务2对学生的成绩进行查询; 任务3对多名学生1门课程的成绩排序; 任务4对多名学生多门课程的成绩进行处理, 计算每位学生的总分,并按照总分由大到小 的顺序输出班级学生成绩单; 任务5输入/输出学生的姓名。
任务1 录入/输出多名学生1门课程的成绩
试一试
问题4.5 输入5名学生3门课程的成绩并 输出。 分析:用双重循环输入和输出二维数组 的元素,外循环控制行,内循环控制列。
练一练
输入一个4行3列的二维数组,计算所有 元素之和。
4.3.4 二维数组的初始化
(1)分行对二维数组初始化
Example
int a[2][3]={{1,2,3},{4,5,6}};
4.1.2 一维数组
以下对一维整型数组a的正确定义的是: A、int a(10) B、int n=10, a[n] C、int n; int a[n]; D、#define SIZE 10 scanf(―%d‖,%n); int a[SIZE];
4.1.3 一维数组的引用
C语言规定只能逐个引用数组元素而不能一次引 用整个数组。
任务实施
在本任务中将定义一个数组int score[50], 用来存放50名学生的C语言成绩,采用 单循环实现学生成绩的录入和输出。还 将设计学生成绩管理系统的菜单界面。
任务1 录入/输出多名学生1门课程的成绩
计算50个学生成绩的平均分
main() { int i, x, s=0;
只用了三个变量就 解决了问题,但数 如果需要把成绩按 据没有保存。
4.2.2 成绩查询
用初始化方法,把10名学生的数学成绩存储 在数组中,再输入一个考分,查找该分数是 否存在在数组中,如果是,则输出它是第几 名学生的成绩。 分析:采用“顺序查找”法,即将数组中的 元素一个一个依次取出,与待查找的数比较, 如果相等,则找到了。如果所有元素取出后, 都没有找到相等的,则该数不存在。