04任务四用数组实现学生成绩管理系统【课件】_第1页
04任务四用数组实现学生成绩管理系统【课件】_第2页
04任务四用数组实现学生成绩管理系统【课件】_第3页
04任务四用数组实现学生成绩管理系统【课件】_第4页
04任务四用数组实现学生成绩管理系统【课件】_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 语 言 程 序 设 计 项 目 教 程,04任务四 用数组实现学生成绩管理系统,学习情境 前面部分中用do-while循环结构搭建了学生成绩管理系统的整个框架,但由于所学知识点有限,在执行菜单选项功能时,只能输出对应菜单项的编号,不能实现各菜单项的具体功能。本部分的任务就是利用数组类型实现录入学生成绩、显示学生成绩、查询学生成绩、修改学生成绩、添加学生记录、删除学生记录、排序学生成绩的功能。,C 语 言 程 序 设 计 项 目 教 程,03任务三 学生成绩管理系统主菜单重复选择的实现,第一部分 任务学习引导 4.1 一维数组4.2 二维数组4.3 字符串与字符数组第二部分 模块实现:用数组实现学生成绩管理系统,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用(1)一维数组的定义在语言中,数组与变量相同,必须先定义后使用。 一维数组的定义形式为:类型说明符 数组名常量表达式;其中: 类型说明符指的是数组的数据类型,实际上也是数组元素的数据类型,可以是任一种基本数据类型或构造数据类型。 数组名是用户定义的标识符,因此数组名的命名要符合标识符的命名规则,建议要做到见名知意。 方括号中的常量表达式表示数据元素的个数,也称为数组的长度。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用(1)一维数组的定义例如: int a10;定义了一个长度为10的整型数组a。即定义的数组a中有10 个数组元素,最多存储10个数据,这10个元素分别表示为a0、a1、a2、a9,每个元素都是int类型。 float b10;定义了一个长度为10的实型数组b。即定义的数组b中有10 个数组元素,最多存储10个数据,这10个元素分别表示为b0、b1、b2、b9,每个元素都是float类型。 char ch20;定义了一个长度为20的字符数组ch。即定义的数组ch中有20个数组元素,最多存储20个数据,这20个元素分别表示为ch0、ch1、ch2、ch19,每个元素都是char类型。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用(1)一维数组的定义对于一维数组的定义应注意以下几点: 数组的数据类型实际上是指数组元素取值的数据类型。对于同一个数组,其所有元素的数据类型都是相同的。 数组名的书写规则应符合标识符的命名规则。 在一个程序中数组名不能与其他变量名、数组名同名。 方括号中常量表达式表示数组的长度,如a5表示数组a有5个元素。 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。 允许在同一个类型说明中,定义多个数组和多个变量。 例如:int a,b,c,d,k110,k220;,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用(2)一维数组的存储 数组元素代表内存中的一个存储单元。编译或运行时,系统在内存中为数组分配连续的存储单元存储数组元素。 例如,int a3; 定义了一个长度为3的整型数组a。即定义的数组a中有3个元素,这3个元素分别表示为a0、a1、a2,每个元素都是int类型。在程序运行时,系统在内存中为数组a分配3个连续的存储单元,2B3=6B,即用6B存储数组a。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用(3)一维数组的引用数组元素本质上是一种变量,其引用方法是数组名后跟一个下标。在程序代码中表示数组元素的一般形式为:数组名下标 如,int a3;那么a0表示数组a中下标为0的元素,a1表示数组a中下标为1的元素,a2表示数组a中下标为2的元素。其中: 下标表示元素在数组中的偏移量。注意数组元素的下标都是从0开始的。 C语言中,由于系统不做下标越界检查,越界也不会报错,因此程序中引用数组元素要注意不要越界。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用(3)一维数组的引用 下标可以是常量、变量或表达式,但其值必须是整型类型。例如,下述数组元素都是合法的。a5 ai+j ai+ 在语言中对于数值数组,只能逐个地使用数组元素,而不能一次引用整个数组。 对于被引用的数组元素,可以像普通变量一样进行其类型所允许的所有运算。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用【例4-1】 存放字符的数组示例。程序代码如下:#include main() char ch5; int i; ch0=H; ch1=e; ch2=l; ch3=l; ch4=o; for(i=0;i0,那么就把tempscore赋值给score0,sum=sum+ score0,num+,再输入一个成绩赋值给tempscore,否则输入结束。第2次:如果tempscore0,那么就把tempscore赋值给score1,sum=sum+ score1,num+,再输入一个成绩赋值给tempscore,否则输入结束。第3次:如果tempscore0,那么就把tempscore赋值给score2,sum=sum+ score2,num+,再输入一个成绩赋值给tempscore,否则输入结束。直到输入的成绩为负。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用 由分析可知,属于重复运算,用循环结构实现。但循环次数随机,因此用while语句实现。其中,把数组元素的下标i作为循环变量,初值为0。循环条件为输入的成绩大于0。循环体为tempscore赋值给scorei,sum=sum+ scorei,num+,scanf(%f,& tempscore)。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用scanf(%f,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用 在实现第步的过程中,定义整型变量count,初值为0,用来存放不低于平均分的学生个数。第1次:score0和平均分aver比较,如果score0大于平均分aver,count+。第2次:score1和平均分aver比较,如果score1不小于平均分aver,count+。第3次:score2和平均分aver比较,如果score2 不小于平均分aver,count+。第i次:scorei-1和平均分aver比较,如果scorei-1不小于平均分aver,count+。最后一次:scorenum -1和平均分aver比较,如果scorenum -1 不小于平均分aver,count+。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,1一维数组的定义、存储和引用 由分析可知,属于重复运算,用循环结构实现。以数组元素的下标作为循环变量,初值为0,终止值为num -1,循环变量增量为1。对应的循环体是scorei和平均分aver比较,如果scorei大于平均分aver,count+次数随机,因此用for语句实现。 for(i=0;i=aver) count+,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,2一维数组的初始化 给数组赋值的方法除了用赋值语句给数组元素逐个赋值外,还可采用初始化方法赋值。 数组初始化是指在数组定义的同时给数组元素赋初值。 数组初始化的一般形式为:类型说明符 数组名常量表达式=值,值,值; 其中,在 中的各数据值即为各数组元素的初值,各值之间用逗号间隔。 例如,int a10= 0,1,2,3,4,5,6,7,8,9 ; 等价于int a10;a0=0;a1=1;a9=9;,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,2一维数组的初始化语言中数组初始化的说明: 可以只给部分元素赋初值。 当 中值的个数少于元素个数时,只给前面部分元素赋值。 例如,int a10=0,1,2,3,4;等价于int a10;a0=0;a1=1;a4=4; 而未初始化的部分元素自动赋0。即 a5=0; a6=0; a9=0;如果只定义,而不初始化,则数组元素的值是随机的。例如,int a10;printf(%d,%d,a0,a1) ;输出的结果可能是-90 1386。 只能给元素逐个赋值,不能给数组整体初始化。 例如,给十个元素全部赋1值,只能写为int a10=1,1,1,1,1,1,1,1,1,1; 而不能写为int a10=1;,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,2一维数组的初始化语言中数组初始化的说明: 如给全部元素初始化,则在数组说明中,可以不给出数组元素的个数。 例如,int a5=1,2,3,4,5; 可写为int a=1,2,3,4,5;,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-4】 一维数组的输入输出。输入一个一维数组,正序、逆序方式输出。算法分析:定义一个长度为5的float类型的一维数组a5。 输入一维数组a5。 正序方式输出一维数组。 逆序方式输出一维数组。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法在实现第步的过程中,数组不能作为整体进行赋值,只能逐个给数组元素赋值。第1次:输入实数赋值给a0。第2次:输入实数赋值给a1。第3次:输入实数赋值给a2。第i次:输入实数赋值给ai-1。第5次:输入实数赋值给a4。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法 以上过程属于重复运算,用循环结构实现。把数组元素下标作为循环变量i,初值为0,终止值为4,i的增量为1,每次对应的循环体为输入实数赋值给ai。因此,可以用for语句实现。 for(i=0;i5;i+) scanf(%f, 实现第、步的过程与第步类似,这里不再重复。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-5】 输出Fibonacci数列的前40个数。算法分析:Fibonacci数列,即1 1 2 3 5 8 13 21 。即数列中前两个数分别是1,从第3个数开始,每个数都是前2个数之和。用整型数组fib40来存放Fibonacci数列的前40个数。其中,fib0=1,fib1=1,那么由定义可知:fib2= fib0+ fib1fib3= fib1+ fib2fib4= fib3+ fib3fibi= fibi-2+ fibi-1fib39= fib37+ fib38,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-5】 输出Fibonacci数列的前40个数。可以看出,问题属于重复运算,采用循环结构实现。将数组元素下标作为循环变量i,初值为2,终止值为39,增量为1,循环体为fibi= fibi-2+ fibi-1,所以用for语句实现。for(i=2;i=39;i+) fibi= fibi-2+ fibi-1;,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-6】 输入5个整数,用冒泡排序法将它们升序排序并输出。算法分析:冒泡排序法的解题思路是,将相邻的两个数进行比较,如果前一个数比后一个数大,就交换两个数,否则不交换,从而把最大的数放在最后。任意给定5个整数,如6 3 9 5 2,其排序过程如下。其中,带下划线的数据项表示当前参与比较并已完成交换的数据项,“”中的数表示已排好序的数。初始数据为6 3 9 5 2。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-6】 输入5个整数,用冒泡排序法将它们升序排序并输出。第一轮:第1次:6 3 9 5 2 第1、2个数比较,如前者比后者大,交换。得到3 6 9 5 2;第2次:3 6 9 5 2 第2、3个数比较,如前者比后者大,交换。得到3 6 9 5 2;第3次:3 6 9 5 2 第3、4个数比较,如前者比后者大,交换。得到3 6 5 9 2;第4次:3 6 5 9 2 第4、5个数比较,如前者比后者大,交换。得到3 6 5 2 9;第一轮将5个数比较4次,得到数据中的最大值9并排到了最后一位,第二轮应该将剩下的4个数中的最大数移到9的前面。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-6】 输入5个整数,用冒泡排序法将它们升序排序并输出。第二轮:第1次:3 6 5 2 9第1、2个数比较,如前者比后者大,交换。得到3 6 5 2 9;第2次:3 6 5 2 9第2、3个数比较,如前者比后者大,交换。得到3 5 6 2 9;第3次:3 5 6 2 9第3、4个数比较,如前者比后者大,交换。得到3 5 2 6 9;第二轮将4个数比较3次,得到其中的最大值6,第三轮应该将剩下的3个数中的最大数移到6的前面。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-6】 输入5个整数,用冒泡排序法将它们升序排序并输出。第三轮:第1次:3 5 2 6 9第1、2个数比较,如前者比后者大,交换。得到3 5 2 6 9;第2次:3 5 2 6 9第2、3个数比较,如前者比后者大,交换。得到3 2 5 6 9;第三轮将3个数比较2次,得到其中的最大值5,第四轮应该将剩下的2个数比较,只需比较1次,就可以将其中的大者移到后面。至此,经过4轮比较,就可以将5个任意排列的数据按升序排好。,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法【例4-6】 输入5个整数,用冒泡排序法将它们升序排序并输出。以上是5个数排序,从排序过程可以推出:对n个数进行冒泡排序,要经过n-1轮比较。第一轮:比较n-1次第二轮:比较n-2次第三轮:比较n-3次第i轮:比较n-i次第n-1轮:比较1次,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法 由此可知,n个数进行冒泡排序,可以用循环结构完成。循环轮数i作为循环变量,循环变量的初值为1,最大值为n-1,增量为1,循环体为比较n-i次,可以用for语句实现。for(i=1;i=n-1,i+); /比较n-i次;而循环体“比较n-i次”,就是比较第一个数、第二个数、第n-i+1个数,从中得到最大数并放在最后。因此,,C 语 言 程 序 设 计 项 目 教 程,4.1 一维数组,3一维数组的应用与冒泡排序法第1次:第1、2个数比较,如前者比后者大,交换;第2次:第2、3个数比较,如前者比后者大,交换;第3次:第3、4个数比较,如前者比后者大,交换;第j次:第j、j+1个数比较,如前者比后者大,交换;第n-i次:第n-i、n-i+1个数比较,如前者比后者大,交换。从以上分析可见,循环体“比较n-i次”又是一个循环结构,用for语句实现。循环次数j作为循环变量,循环变量j的初值为1,终止值为n-i,增量为1。循环体为第j、j+1个数比较,如前者比后者大,交换。因此,用冒泡排序法实现数据排序,可以用循环嵌套实现。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,1二维数组的定义与存储(1)二维数组的定义前面介绍的数组只有一个下标,称为一维数组,那么有两个下标的数组就称为二维数组。在实际问题中有很多量是二维的或多维的。班级学生的各科成绩如表所示。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,1二维数组的定义与存储在数学上,通常将具有这种二维结构的数据用矩阵进行处理。矩阵是一组排列成m行n列的有序数据。上面的成绩数据用矩阵表示如下。87 77 90 68 8988 99 91 86 9476 87 77 89 88其中,这个矩阵有3行,5列,每个数据称为元素,如第二行第一列的元素是87,共有15个元素。以上矩阵可以用二维数组来存储。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,1二维数组的定义与存储语言允许构造多维数组。多维数组有多个下标,本小节只介绍二维数组,多维数组可由二维数组类推而得到。 二维数组定义的一般形式是:类型说明符 数组名常量表达式1常量表达式2 其中常量表达式1表示第一维下标的长度,即表示有多少行,所以又称行下标。常量表达式2表示第二维下标的长度,即表示有多少列,所以又称列下标。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,1二维数组的定义与存储(2)二维数组的存储 与一维数组相同,在编译或运行阶段,系统在内存中为二维数组分配连续的存储单元存储数组元素。 二维数组在内存中的存储顺序有两种。一种是按行排列,即存储一行之后顺次存储第二行,依次存储。另一种是按列排列,即存储一列之后再顺次存储第二列,依次存储。在语言中,二维数组是按行排列的。即存放a0行,再存放a1行,再存放a2行,依次存储。每行中的元素也是依次存放。例如,int a34; 那么在运行阶段,系统为这个二维数组分配存储空间,依次存放数组元素。即存放顺序为a00、a01、a02、a03、a10、a11、a12、a13、a20、a21、 a22、a23。 在运行程序时,系统在内存中为a数组分配12个连续的存储单元,由于数组a定义为int类型,每个元素占用两个字节的内存空间,2B12=24B,即用24B存储二维数组a。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,1二维数组的定义与存储二维数组的定义说明: 类型说明符指的是数组的类型,实际上也是数组元素的数据类型,二维数组中的每个元素都是同一种数据类型。 数组名是用户定义的标识符,命名时要符合标识符的命名规则。 表示行下标、列下标的常量表达式分别用于指定数组的行数、列数,二者均为常量表达式。 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。 允许在同一个类型说明中,定义多个一维数组、多个二维数组和多个变量。 例如,int a,b,c,d,k110,k220,a35,b59;,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,2二维数组的引用二维数组的元素引用形式为:数组名行下标列下标 例如,a34 表示a数组中第3行第4列的元素。注意:与一维数组相同,行下标、列下标都是从0开始,而不是从1开始。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,2二维数组的引用引用说明: 下标变量和数组定义在形式中有些相似,但这两者具有完全不同的含义。数组定义的方括号中给出的是行数或列数;而数组元素中的下标是该元素在数组中的位置,前者只能是常量或常量表达式,后者可以是整型常量,整型变量或整型表达式。 注意数组元素的行下标、列下标都从0开始。 行下标、列下标可以为常量、变量或表达式,但其值必须是整形。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,2二维数组的引用引用说明: 下标变量和数组定义在形式中有些相似,但这两者具有完全不同的含义。数组定义的方括号中给出的是行数或列数;而数组元素中的下标是该元素在数组中的位置,前者只能是常量或常量表达式,后者可以是整型常量,整型变量或整型表达式。 注意数组元素的行下标、列下标都从0开始。 行下标、列下标可以为常量、变量或表达式,但其值必须是整形。 在语言中只能逐个地使用数组元素,而不能一次引用整个数组。 对于被引用的数组元素,可以像普通变量一样进行其类型所允许的所有运算。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,2二维数组的引用【例4-7】 用二维数组存储表4-1中的数据并输出。程序代码如下:#include main() int i,j,score35; score00=87;score01=77;score02=90;score03=68;score04=89; score10=88;score11=99;score12=91;score13=86;score14=94; score20=76;score21=87;score22=77;score23=89;score24=88; for(i=0;i3;i+) for(j=0;j=4;j+) printf(%5d,scoreij); printf(n); ,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,2二维数组的引用 数组是一种构造类型。二维数组可以看做是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。因此,一个二维数组也可以分解为多个一维数组。语言允许这种分解,如二维数组a34,可分解为三个一维数组,其数组名分别为a0、a1、a2。 对这三个一维数组不需另作定义即可使用。这三个一维数组都有4个元素,例如,一维数组a0的元素为a00,a01,a02,a03。 必须强调的是,a0,a1,a2不能当作数组元素使用,这些都是一维数组名。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,3二维数组的初始化 与一维数组相同,给二维数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化方法赋值。 方法一:按行给二维数组赋初值。例如,int a22= 80,75,61,65 ;等价于int a22;a00=80; a01=75; a10=61;a1 1=65; 方法二:按在内存中的存放顺序给二维数组赋初值。例如,int a22= 80,75,61,65;等价于int a22;a00=80; a01=75; a10=61;a1 1=65; 这两种赋初值的结果是完全相同的。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,3二维数组的初始化二维数组初始化的说明: 可以只对部分元素初始化,未赋初值的元素自动取0值。例如,int a33=1,2,1; 是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后等价于各元素的值为:1 0 0 2 0 0 1 0 0 int a 33=2,1,5;,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,3二维数组的初始化赋值后等价于各元素的值为:2 1 5 0 0 0 0 0 0 如果只定义,而不初始化,则数组元素的值是随机的。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,3二维数组的初始化 只能给元素逐个赋值,不能给数组整体初始化。例如给十个元素全部赋1值,只能写为int a25=1,1,1,1,1,1,1,1,1,1; 而不能写为int a25=1; 如对全部元素初始化,则第一维的长度可以不给出。例如,int a33=1,2,3,4,5,6,7,8,9; 可以写为int a3=1,2,3,4,5,6,7,8,9; 系统自动确定行数为3。,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,3二维数组的初始化【例4-8】 初始化二维数组的程序示例。#include main() int i,j; int a22= 80,75,61,65 ; int b22= 8,7,6,5; int c33=1,2,1; int d33=2,1,5; int e3=1,2,3,4,5,6,7,8,9; int f22; printf(数组a:n);,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,3二维数组的初始化【例4-8】 初始化二维数组的程序示例。for(i=0;i2;i+) for(j=0;j=1;j+) printf(%10d,aij); printf(n); printf(数组b:n); for(i=0;i2;i+) for(j=0;j=1;j+) printf(%10d,bij); printf(n); printf(数组c:n);,C 语 言 程 序 设 计 项 目 教 程,4.2 二维数组,3二维数组的初始化【例4-8】 初始化二维数组的程序示例。for(i=0;i=2;i+) for(j=0;j=2;j+) printf(%10d,cij); printf(n); printf(数组d:n); for(i=0;i=2;i+) for(j=0;j=2;j+) printf(%10d,dij); printf(n); printf(数组e:n);,C 语 言 程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论