《第6章+数组--C语言大学实用教程ppt课件.ppt》由会员分享,可在线阅读,更多相关《第6章+数组--C语言大学实用教程ppt课件.ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第6 6 6 6C C2023/1/1C语言大学实用教程课件 制作人 苏小红2内容提要内容提要 数组类型;数组类型;数组类型;数组类型;向函数传递一维数组和二维数组;向函数传递一维数组和二维数组;向函数传递一维数组和二维数组;向函数传递一维数组和二维数组;常用算法:排序、查找、求最大最小值等;常用算法:排序、查找、求最大最小值等;常用算法:排序、查找、求最大最小值等;常用算法:排序、查找、求最大最小值等;用字符数组存取字符串;用字符数组存取字符串;用字符数组存取字符串;用字符数组存取字符串;使用字符串处理函数处理字符串使用字符串处理函数处理字符串使用字符串处理函数处理字符串使用字符串处理
2、函数处理字符串2023/1/1C语言大学实用教程课件 制作人 苏小红3C提供了一组基本类型:提供了一组基本类型:int、double等。除了基本等。除了基本数据类型,数据类型,还有一些组合的数据类型还有一些组合的数据类型,称为,称为构造构造数据类型数据类型。(书上。(书上18页)页)构造机制包括构造机制包括数组数组、指针、结构、联合。可、指针、结构、联合。可用它们组合数据对象,用它们组合数据对象,作为整体使用作为整体使用。2023/1/1C语言大学实用教程课件 制作人 苏小红4 组合的数据对象称为组合的数据对象称为复合数据对象复合数据对象。复合对。复合对象形成的类型称为象形成的类型称为复合数据
3、类型复合数据类型,组成部分称为,组成部分称为成成分分/成员成员/元素元素。可创建能存放复合类型数据的变量。可创建能存放复合类型数据的变量。这种变量这种变量可作为整体使用可作为整体使用,通过名字可以访,通过名字可以访问整个复合对象。问整个复合对象。也也可以访问复合数据对象的成分可以访问复合数据对象的成分,如:使用,如:使用成分的值或给成分赋值。成分的值或给成分赋值。本章介绍数组就是常见的组合机制。本章介绍数组就是常见的组合机制。2023/1/1C语言大学实用教程课件 制作人 苏小红5数组的用处数组的用处 保存大量同类型的相关数据的问题保存大量同类型的相关数据的问题保存大量同类型的相关数据的问题保
4、存大量同类型的相关数据的问题-例如,输入全班例如,输入全班例如,输入全班例如,输入全班3030个学生的成绩,并排出名次。个学生的成绩,并排出名次。个学生的成绩,并排出名次。个学生的成绩,并排出名次。-例如,矩阵运算,表格数据等。例如,矩阵运算,表格数据等。例如,矩阵运算,表格数据等。例如,矩阵运算,表格数据等。2023/1/1C语言大学实用教程课件 制作人 苏小红6为什么使用数组为什么使用数组 例子:要读入某班全体例子:要读入某班全体例子:要读入某班全体例子:要读入某班全体5050位同学某科学习成绩,然后进行位同学某科学习成绩,然后进行位同学某科学习成绩,然后进行位同学某科学习成绩,然后进行简
5、单处理(求平均成绩、最高分、最低分简单处理(求平均成绩、最高分、最低分简单处理(求平均成绩、最高分、最低分简单处理(求平均成绩、最高分、最低分)若用简单变量,需若用简单变量,需若用简单变量,需若用简单变量,需5050个不同变量名,要用很多个个不同变量名,要用很多个个不同变量名,要用很多个个不同变量名,要用很多个scanfscanf命令命令命令命令 int score1,score2,score50int score1,score2,score50;scanf(%d,%d,%d,&score1,&score2,&score3);scanf(%d,%d,%d,&score1,&score2,&sc
6、ore3);scanf(%d,%d,%d,&score4,&score5,&score6);scanf(%d,%d,%d,&score4,&score5,&score6);而用数组,可共用一个而用数组,可共用一个而用数组,可共用一个而用数组,可共用一个scanfscanf命令并利用循环结构读取命令并利用循环结构读取命令并利用循环结构读取命令并利用循环结构读取 int score50,i;int score50,i;for(i=0;i50;i+)for(i=0;i50;i+)scanf(%d,&scorei);scanf(%d,&scorei);保存大保存大量同类量同类型的相型的相关数据关数据2
7、023/1/1C语言大学实用教程课件 制作人 苏小红76.1 数组的概念、定义和使用数组的概念、定义和使用数组(数组(array)是多个)是多个同类型同类型数据对象的组合。数据对象的组合。一个数组汇集了多个数据项,一个数组汇集了多个数据项,数组元素数组元素。可从数组出发处理各元素,以统一方式处理一批可从数组出发处理各元素,以统一方式处理一批/所有所有元素,是元素,是数组数组和和一组独立变量一组独立变量的主要区别。的主要区别。为此需要:为此需要:数组描述,数组变量定义数组描述,数组变量定义数组使用,包括通过数组变量使用其元素数组使用,包括通过数组变量使用其元素数组实现,数组的存储方式数组实现,数
8、组的存储方式2023/1/1C语言大学实用教程课件 制作人 苏小红8 数组变量定义数组变量定义定义数组变量(定义数组变量(定义数组定义数组)时需说明:)时需说明:数组元素类型数组元素类型数组(变量)的元素个数数组(变量)的元素个数 元素个数也称数组元素个数也称数组大小大小或或长度长度。定义数组变量时,方括号内整型表达式说明元素个数,表达定义数组变量时,方括号内整型表达式说明元素个数,表达式应用式应用静态确定值静态确定值,可用字面量或枚举常量。,可用字面量或枚举常量。例,定义两个数组:例,定义两个数组:int a10;double a1100;数组定义可以与其他变量定义写在一起,如:数组定义可以
9、与其他变量定义写在一起,如:int a216,n,a325,m;2023/1/1C语言大学实用教程课件 制作人 苏小红9 定义定义定义定义 存储类型存储类型存储类型存储类型 数据类型数据类型数据类型数据类型 数组名数组名数组名数组名 整数整数整数整数1 1 整数整数整数整数2 2 整数整数整数整数n;n;a9a8a7a1a0数组首地址数组首地址intint a10;a10;定义一个有定义一个有定义一个有定义一个有1010个个个个intint型元素的数组型元素的数组型元素的数组型元素的数组 系统会在内存分配连续的系统会在内存分配连续的系统会在内存分配连续的系统会在内存分配连续的1010个个个个i
10、ntint空间给此数组空间给此数组空间给此数组空间给此数组 直接对直接对直接对直接对a a的访问,就是访问此数组的首地址的访问,就是访问此数组的首地址的访问,就是访问此数组的首地址的访问,就是访问此数组的首地址 使用使用使用使用a0a0、a1a1、a2a2、a9a9这样这样这样这样的形式访问每个元素。可以像使用普通变量的形式访问每个元素。可以像使用普通变量的形式访问每个元素。可以像使用普通变量的形式访问每个元素。可以像使用普通变量一样使用他们。一样使用他们。一样使用他们。一样使用他们。数组数组(Array)的实现的实现2023/1/1C语言大学实用教程课件 制作人 苏小红10 数组大小最好用宏
11、来定义,以适应未来可能的变化数组大小最好用宏来定义,以适应未来可能的变化数组大小最好用宏来定义,以适应未来可能的变化数组大小最好用宏来定义,以适应未来可能的变化#define#define SIZE 10 SIZE 10intint aSIZE;aSIZE;数组大小定义好后,将永远不变数组大小定义好后,将永远不变数组大小定义好后,将永远不变数组大小定义好后,将永远不变#includeinclude#define#define SIZE 10 SIZE 10mainmain()()intint aSIZE;aSIZE;2023/1/1C语言大学实用教程课件 制作人 苏小红11 也也可可定定义义外
12、外部部数数组组和和局局部部静静态态数数组组(用用static)。作用域与存在期与简单变量相同。作用域与存在期与简单变量相同。数组的外部说明不必描述数组大小。例:数组的外部说明不必描述数组大小。例:extern int a;extern double a1;下面函数里数组定义不合法:下面函数里数组定义不合法:void f(int m,int n)int bn;/*非法,编译时无法确定大小非法,编译时无法确定大小*/.新新 C99 标准支持这种定义,满足标准支持这种定义,满足 C99 的编译器很少的编译器很少2023/1/1C语言大学实用教程课件 制作人 苏小红12 根据数组的根据数组的根据数组的
13、根据数组的数据类型数据类型数据类型数据类型,为每一元素安排相同长度的存储单元,为每一元素安排相同长度的存储单元,为每一元素安排相同长度的存储单元,为每一元素安排相同长度的存储单元 根据数组的根据数组的根据数组的根据数组的存储类型存储类型存储类型存储类型,将其安排在内存的动态、静态存储区,将其安排在内存的动态、静态存储区,将其安排在内存的动态、静态存储区,将其安排在内存的动态、静态存储区或寄存器区或寄存器区或寄存器区或寄存器区 用用用用sizeofsizeof(a)(a)来获得数组来获得数组来获得数组来获得数组a a所占字节数所占字节数所占字节数所占字节数shortshort数组的存储结构数组的
14、存储结构 一维数组占用字节数一维数组占用字节数一维数组占用字节数一维数组占用字节数=数组长度数组长度数组长度数组长度 sizeof(sizeof(基类型基类型基类型基类型)2023/1/1C语言大学实用教程课件 制作人 苏小红13 数组使用数组使用 基本操作是基本操作是元素访问元素访问。元素顺序编号,。元素顺序编号,首元素序号首元素序号0,其余顺序编号。其余顺序编号。n元数组元素编号是元数组元素编号是0到到n-1。定义:。定义:int b100;元素编号为元素编号为0、1、2、。称为。称为下标下标或或指标指标。元元素素访访问问通通过过运运算算符符,优优先先级级最最高高,运运算算对对象象是是数数
15、组组名名和和括括号号里里表表示示下下标标的的表表达达式式。表表达达式式、语语句句里里的的 b3 称称为为下下标表达式。标表达式。例:有上面定义后,可写:例:有上面定义后,可写:b0=1;b1=1;b2=b0+b1;b3=b1+b2;99992023/1/1C语言大学实用教程课件 制作人 苏小红14 数数组组意意义义在在于于能能以以统统一一方方式式描描述述对对一一组组数数据据的的处处理理。下标表达式可用一般的整型表达式。如:下标表达式可用一般的整型表达式。如:bi=bi-1+bi-2;访访问问哪哪个个元元素素由由i值值确确定定。同同一一语语句句可可访访问问不不同同元元素素,可用在循环里访问一批元
16、素。可用在循环里访问一批元素。for(i=0;i 100;+i)bi+=a1i*a2i;/*假设数组都有定义假设数组都有定义*/循环中涉及到循环中涉及到300个基本数据对象。个基本数据对象。2023/1/1C语言大学实用教程课件 制作人 苏小红15对数组的多个或全部元素操作,常用对数组的多个或全部元素操作,常用for语句。语句。令变量遍历数组下标:令变量遍历数组下标:for(n=0;n 数组长度数组长度;+n).问题:问题:fib是是30个元素的数组,假设程序里写:个元素的数组,假设程序里写:for(n=2;n=30;+n)fibn=fibn-1+fibn-2;循环中试图访问循环中试图访问fi
17、b30,实际无此元素。,实际无此元素。用用超超范范围围的的下下标标访访问问称称为为越越界界访访问问,是是数数组组使使用用中中最最常常见见的的错错误误。使使用用大大于于最最大大下下标标的的下下标标,将将访访问问数数组组以以外外的的空空间间。那那里里的的数数据据是是未未知知的的。下下标标值值超超范范围围是是运运行行中中的问题的问题。2023/1/1C语言大学实用教程课件 制作人 苏小红16 C不检查数组元素访问的合法性,运行中出现越界不检查数组元素访问的合法性,运行中出现越界不会报错。不会报错。超范围访问是严重错误,后果无法预料超范围访问是严重错误,后果无法预料。在一些系统里越界访问在一些系统里越
18、界访问可能导致动态错可能导致动态错,系统强行,系统强行终止出错的程序。终止出错的程序。DOS 不检查非法访问,越界可能破坏不检查非法访问,越界可能破坏本程序的数据本程序的数据/程序本身程序本身/其他软件,甚至其他软件,甚至 DOS 系统。系统。编程者要保证数组下标值的合法性,保证不越界。编程者要保证数组下标值的合法性,保证不越界。2023/1/1C语言大学实用教程课件 制作人 苏小红17数组定义后的初值仍然是随机数,一般需要我们来初始化数组定义后的初值仍然是随机数,一般需要我们来初始化数组定义后的初值仍然是随机数,一般需要我们来初始化数组定义后的初值仍然是随机数,一般需要我们来初始化 定义数组
19、时可直接初始化。外部、局部静态或自动数定义数组时可直接初始化。外部、局部静态或自动数组都可在定义时进行初始化。组都可在定义时进行初始化。定义时初始化的例子:定义时初始化的例子:int b4=1,1,2,3;double ax6=1.3,2.24,5.11,8.37,6.5;int a5=0;int a=11,22,33,44,55;初值表达式必须是常量表达式初值表达式必须是常量表达式。对自动数组也一样。对自动数组也一样。数组初始化数组初始化2023/1/1C语言大学实用教程课件 制作人 苏小红18这种写法只能用于数组初始化,这种写法只能用于数组初始化,不能用在语句里不能用在语句里。若若定定义义
20、时时未未初初始始化化,外外部部和和局局部部静静态态数数组组的的元元素素自自动初始化为动初始化为0;自动数组不自动初始化自动数组不自动初始化。可可只只为为部部分分元元素素提提供供初初值值,其其余余元元素素将将自自动动置置0。初初始化表元素个数不得超过数组元素个数。例:始化表元素个数不得超过数组元素个数。例:int b14=1,2;b12、b13将给初值将给初值0。若若给给了了所所有有元元素素的的初初值值,可可以以不不写写数数组组大大小小而而只只写写方括号,元素个数由初值个数确定。例:方括号,元素个数由初值个数确定。例:int fib=1,1,2,3,5,8,13,21,34,55;这种写法能减少
21、维护负担,有利于程序修改。这种写法能减少维护负担,有利于程序修改。2023/1/1C语言大学实用教程课件 制作人 苏小红19 快速地随机访问快速地随机访问快速地随机访问快速地随机访问 一旦定义,不能改变大小一旦定义,不能改变大小一旦定义,不能改变大小一旦定义,不能改变大小数组的特点数组的特点2023/1/1C语言大学实用教程课件 制作人 苏小红20只能逐个对数组元素进行操作(字符数组例外)只能逐个对数组元素进行操作(字符数组例外)输入方法:输入方法:输入方法:输入方法:int a10,i;输入第输入第输入第输入第i i个数组元素:个数组元素:个数组元素:个数组元素:scanf(%d,&ai);
22、输入整个数组元素输入整个数组元素输入整个数组元素输入整个数组元素:for(i=0;i10;i+)scanf(%d,&ai);输出方法:输出方法:输出方法:输出方法:输出第输出第输出第输出第i i个数组元素:个数组元素:个数组元素:个数组元素:printf(%d,ai);输出整个数组元素:输出整个数组元素:输出整个数组元素:输出整个数组元素:for(i=0;i10;i+)printf(%d,ai);一维数组的输入和输出2023/1/1C语言大学实用教程课件 制作人 苏小红21举例:请登记某班级数学成绩,再输出举例:请登记某班级数学成绩,再输出举例:请登记某班级数学成绩,再输出举例:请登记某班级数
23、学成绩,再输出2023/1/1C语言大学实用教程课件 制作人 苏小红22#include#define ARR_SIZE 40main()float scoreARR_SIZE;int n,i;long numARR_SIZE;printf(Please enter total number:);scanf(%d,&n);/*从键盘输入学生人数从键盘输入学生人数n*/printf(“Please enter the number and score:n”);for(i=0;in;i+)/*分别以长整型和实型格式输入学生的学号和成绩分别以长整型和实型格式输入学生的学号和成绩*/scanf(%ld
24、%f,&numi,&scorei);printf(Your enter the number and score:n);for(i=0;in;i+)printf(%d%fn,numi,scorei);system(pause);2023/1/1C语言大学实用教程课件 制作人 苏小红23一维数组和多维数组一维数组和多维数组 一维数组一维数组一维数组一维数组 用一个下标确定各元素在数组中的顺序用一个下标确定各元素在数组中的顺序用一个下标确定各元素在数组中的顺序用一个下标确定各元素在数组中的顺序 可用排列成一行的元素组来表示可用排列成一行的元素组来表示可用排列成一行的元素组来表示可用排列成一行的元素
25、组来表示 如如如如 int a5;int a5;二维数组二维数组二维数组二维数组 用两个下标确定各元素在数组中的顺序用两个下标确定各元素在数组中的顺序用两个下标确定各元素在数组中的顺序用两个下标确定各元素在数组中的顺序 可用排列成可用排列成可用排列成可用排列成i i行,行,行,行,j j列的元素组来表示列的元素组来表示列的元素组来表示列的元素组来表示 如如如如 int b23;int b23;n n维数组维数组维数组维数组 用用用用n n个下标来确定各元素在数组中的顺序个下标来确定各元素在数组中的顺序个下标来确定各元素在数组中的顺序个下标来确定各元素在数组中的顺序 如如如如 int c324;
26、int c324;n3n3时,维数组无法在平面上表示其各元素的位置时,维数组无法在平面上表示其各元素的位置时,维数组无法在平面上表示其各元素的位置时,维数组无法在平面上表示其各元素的位置a0a0a1a1a2a2a3a3a4a4b00b00b01b01b02b02b10b10b11b11b12b122023/1/1C语言大学实用教程课件 制作人 苏小红24二维数组的定义二维数组的定义数据类型数据类型 数组名数组名常量表达式常量表达式常量表达式常量表达式;int a23;a0a1a-a00 a01 a02-a10 a11 a122023/1/1C语言大学实用教程课件 制作人 苏小红25【例一例一例
27、一例一】以下程序的运行结果是什么?以下程序的运行结果是什么?以下程序的运行结果是什么?以下程序的运行结果是什么?main()main()int a3=1,2,3,4,5,6,0;int a3=1,2,3,4,5,6,0;printf(%d,%d,%dn,a11,a21,a31);printf(%d,%d,%dn,a11,a21,a31);1 2 34 5 06 0 00 0 0结果:结果:5,0,0【例二例二】若若int a 3=1,2,3,4,5,6,7,则则a数组的第一维大小是多少?数组的第一维大小是多少?1 2 34 5 67 0 0二维数组的初始化示例二维数组的初始化示例2023/1/
28、1C语言大学实用教程课件 制作人 苏小红26数组的引用数组的引用数组名数组名 下标下标1 1 下标下标2 2 下标下标n n 下标都是从下标都是从下标都是从下标都是从0 0 0 0开始,养成从开始,养成从开始,养成从开始,养成从0 0 0 0开始查数的职业病开始查数的职业病开始查数的职业病开始查数的职业病 使用使用使用使用aaaa0 0 0 0 、a1a1a1a1、a2a2a2a2、a9a9a9a9这样的形式访这样的形式访这样的形式访这样的形式访问每个元素问每个元素问每个元素问每个元素 数组下标数组下标数组下标数组下标(index)(index)(index)(index)既可以是常量,也可以
29、是整型表既可以是常量,也可以是整型表既可以是常量,也可以是整型表既可以是常量,也可以是整型表达式,允许快速地随机访问达式,允许快速地随机访问达式,允许快速地随机访问达式,允许快速地随机访问.可以像使用普通变量一样使用他们可以像使用普通变量一样使用他们可以像使用普通变量一样使用他们可以像使用普通变量一样使用他们2023/1/1C语言大学实用教程课件 制作人 苏小红27数组的引用数组的引用数组名数组名 下标下标1 1 下标下标2 2 下标下标n n 下标越界是下标越界是大忌大忌!编译程序不检查是否越界编译程序不检查是否越界编译程序不检查是否越界编译程序不检查是否越界下标越界,将访问数组以外的空间下
30、标越界,将访问数组以外的空间下标越界,将访问数组以外的空间下标越界,将访问数组以外的空间那里的数据是未知的,不受我们掌控,可能带那里的数据是未知的,不受我们掌控,可能带那里的数据是未知的,不受我们掌控,可能带那里的数据是未知的,不受我们掌控,可能带来严重后果来严重后果来严重后果来严重后果2023/1/1C语言大学实用教程课件 制作人 苏小红28二维数组的存储结构二维数组的存储结构short int a23;a0a1a10 a11a12a00 a01a02存放顺序:存放顺序:先顺序存放第先顺序存放第0 0行的元素行的元素再存放第再存放第1 1行的元素行的元素a00a01a02a10a11a12所
31、以需要知道数组的每一行所以需要知道数组的每一行 有多少列,这样从有多少列,这样从起始地址开始,才能正确的读出数组的元素起始地址开始,才能正确的读出数组的元素按行存放按行存放2023/1/1C语言大学实用教程课件 制作人 苏小红29二维数组占用字节数二维数组占用字节数二维数组占用字节数二维数组占用字节数=第一维长度第一维长度第一维长度第一维长度 第二维长度第二维长度第二维长度第二维长度 sizeof(sizeof(基类型基类型基类型基类型)二维数组所占的存储空间的计算:二维数组所占的存储空间的计算:二维数组所占的存储空间的计算:二维数组所占的存储空间的计算:2023/1/1C语言大学实用教程课件
32、 制作人 苏小红30二维数组的输入和输出二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)(字符数组例外)int a23,i,j;输入方法:输入方法:输入方法:输入方法:输入第输入第i行第行第j列元素:列元素:scanf(“%d”,&aij);输入整个数组元素:输入整个数组元素:for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,&aij);输出方法:输出方法:输出方法:输出方法:输出第输出第i行第行第j列列元素:元素:printf(“%d”,aij);输出整个数组元素:输出整个数组元素:for(i
33、=0;i2;i+)for(j=0;j3;j+)printf(“%d”,aij);2023/1/1C语言大学实用教程课件 制作人 苏小红31如何使两个数组的值相等如何使两个数组的值相等main()int a4=1,2,3,4,b4;b=a;解决方法解决方法法法1:1:逐个元素赋值逐个元素赋值 b0=a0;b1=a1;b2=a2;b3=a3;法法2:2:通过循环赋值通过循环赋值 int i;for(i=0;i4;i+)bi=ai;原因原因:数组名表示数组的首地址数组名表示数组的首地址,其值不可改变其值不可改变!2023/1/1C语言大学实用教程课件 制作人 苏小红32如何使两个数组的值相等如何使两
34、个数组的值相等 如何使两个二维数组的值相等?如何使两个二维数组的值相等?如何使两个二维数组的值相等?如何使两个二维数组的值相等?通过双重循环赋值通过双重循环赋值 int a42=1,2,3,4,5,6,7,8;int b42;int i,j;for(i=0;i4;i+)for(j=0;j2;j+)bij=aij;2023/1/1C语言大学实用教程课件 制作人 苏小红33例例6.1 兔子繁殖问题兔子繁殖问题兔子繁殖问题兔子繁殖问题 打印每个月和年底时的总的兔子对数打印每个月和年底时的总的兔子对数打印每个月和年底时的总的兔子对数打印每个月和年底时的总的兔子对数 FibonacciFibonacci
35、数列数列数列数列 1 1 2 2 3 3 5 5 8 8 1313 2121 3434 5555 8989 144144 233233,2023/1/1C语言大学实用教程课件 制作人 苏小红34233144895534211385321总对数:总对数:89553421138532110小兔对数:小兔对数:1448955342113853211大兔对数:大兔对数:121110987654321月份:月份:图中图中图中图中蓝色实线蓝色实线蓝色实线蓝色实线表示大兔仍是大兔,表示大兔仍是大兔,表示大兔仍是大兔,表示大兔仍是大兔,红色实线红色实线红色实线红色实线表示小兔长成大兔;表示小兔长成大兔;表示小
36、兔长成大兔;表示小兔长成大兔;绿色虚线绿色虚线绿色虚线绿色虚线表示大兔生小兔。表示大兔生小兔。表示大兔生小兔。表示大兔生小兔。不难看出:不难看出:不难看出:不难看出:年末有大兔子年末有大兔子年末有大兔子年末有大兔子144144144144对,小兔子对,小兔子对,小兔子对,小兔子89898989对,总共对,总共对,总共对,总共144+89=233144+89=233144+89=233144+89=233对对对对深入观察:深入观察:深入观察:深入观察:上月有几对大兔子,这月就有几对小兔子,即:上月有几对大兔子,这月就有几对小兔子,即:上月有几对大兔子,这月就有几对小兔子,即:上月有几对大兔子,这
37、月就有几对小兔子,即:每月小兔子对数每月小兔子对数每月小兔子对数每月小兔子对数=上月大兔子对数上月大兔子对数上月大兔子对数上月大兔子对数每月大兔子对数每月大兔子对数每月大兔子对数每月大兔子对数=上月大兔子对数上月大兔子对数上月大兔子对数上月大兔子对数+上月小兔子对数上月小兔子对数上月小兔子对数上月小兔子对数综合综合综合综合有:有:有:有:每月大兔子对数每月大兔子对数每月大兔子对数每月大兔子对数=前两月大兔子对数之和前两月大兔子对数之和前两月大兔子对数之和前两月大兔子对数之和每月每月每月每月大兔子对数大兔子对数大兔子对数大兔子对数公式公式公式公式2023/1/1C语言大学实用教程课件 制作人 苏
38、小红35例例6.1#includeinclude#definedefine YEAR_MONTH 12 YEAR_MONTH 12mainmain()()intint fYEAR_MONTH+1=0,1,2;fYEAR_MONTH+1=0,1,2;intint month;month;forfor(month=3;month=YEAR_MONTH;month+)(month=3;month=YEAR_MONTH;month+)fmonth=fmonth-1+fmonth-2;fmonth=fmonth-1+fmonth-2;forfor(month=1;month=YEAR_MONTH;mon
39、th+)(month=1;month758875,所以,所以,所以,所以8888保留保留保留保留因为因为因为因为90889088,所以用,所以用,所以用,所以用9090替换替换替换替换8888由于由于由于由于9090分所在的数组编号是分所在的数组编号是分所在的数组编号是分所在的数组编号是2 2,记下该编号,记下该编号,记下该编号,记下该编号,去找到学号数组中的数组编号,并替换去找到学号数组中的数组编号,并替换去找到学号数组中的数组编号,并替换去找到学号数组中的数组编号,并替换88200801200803902023/1/1C语言大学实用教程课件 制作人 苏小红38例例6.2 打印最高分打印最高
40、分 从键盘输入学生人数从键盘输入学生人数从键盘输入学生人数从键盘输入学生人数n n;从键盘输入所有学生的学号和成绩分别存入数组从键盘输入所有学生的学号和成绩分别存入数组从键盘输入所有学生的学号和成绩分别存入数组从键盘输入所有学生的学号和成绩分别存入数组numnum和和和和scorescore 假设其中的一个学生成绩为最高假设其中的一个学生成绩为最高假设其中的一个学生成绩为最高假设其中的一个学生成绩为最高maxScore=score0;maxScore=score0;对所有学生成绩进行比较,即对所有学生成绩进行比较,即对所有学生成绩进行比较,即对所有学生成绩进行比较,即 for(i=1;in;i
41、+)for(i=1;i maxScorescorei maxScore则修改则修改则修改则修改maxScoremaxScore值为值为值为值为scoreiscorei 打印最高分打印最高分打印最高分打印最高分maxScoremaxScore2023/1/1C语言大学实用教程课件 制作人 苏小红39.main()main().forfor(i=0;in;i+)(i=0;in;i+)scanf(%ld%f,&numi,&scorei);scanf(%ld%f,&numi,&scorei);maxScoremaxScore =score0;=score0;forfor(i=1;in;i+)(i=1;
42、i maxScore)(scorei maxScore)maxScoremaxScore =scorei;=scorei;printf(maxScore=%.0fn,maxScore);printf(maxScore=%.0fn,maxScore);例例6.2 打印最高分打印最高分2023/1/1C语言大学实用教程课件 制作人 苏小红40.main()main().forfor(i=0;in;i+)(i=0;in;i+)scanf(%ld%f,&numi,&scorei);scanf(%ld%f,&numi,&scorei);maxScore=score0;maxScore=score0;ma
43、xNum=num0;maxNum=num0;forfor(i=1;in;i+)(i=1;i maxScore)(scorei maxScore)maxScore=scorei;maxScore=scorei;maxNum=numi;maxNum=numi;printf(maxScore=%.0fprintf(maxScore=%.0f,maxNum=,maxNum=%ld%ldn,maxScore,n,maxScore,maxNummaxNum););例例6.2 打印最高分及其打印最高分及其学生序号学生序号 用函数实现?用函数实现?用函数实现?用函数实现?2023/1/1C语言大学实用教程课件
44、 制作人 苏小红41#includeinclude#definedefine ARR_SIZE 40 ARR_SIZE 40float FindMax(float arr,int n);float FindMax(float arr,int n);mainmain()()floatfloat scoreARR_SIZE,maxScore;scoreARR_SIZE,maxScore;intint n,i;n,i;printf(Please enter total number:);printf(Please enter total number:);scanf(%d,&n);scanf(%d,
45、&n);printf(Please enter the score:n);printf(Please enter the score:n);forfor(i=0;in;i+)(i=0;in;i+)scanf(%f,&scorei);scanf(%f,&scorei);maxScore=FindMax(score,n);maxScore=FindMax(score,n);printf(maxScore=%.0fn,maxScore);printf(maxScore=%.0fn,maxScore);float float FindMax(float arr,int n)FindMax(float
46、arr,int n)floatfloat max;max;intint i;i;max=arr0;max=arr0;forfor(i=1;in;i+)(i=1;i max)(arri max)max=arri;max=arri;现场编程现场编程用函数实现打印最高分用函数实现打印最高分2023/1/1C语言大学实用教程课件 制作人 苏小红42关于函数的参数传递:关于函数的参数传递:关于函数的参数传递:关于函数的参数传递:对于一般变量作为函数的形式参数,调用函数的时候,对于一般变量作为函数的形式参数,调用函数的时候,对于一般变量作为函数的形式参数,调用函数的时候,对于一般变量作为函数的形式参数,调
47、用函数的时候,用用用用“单项值传递单项值传递单项值传递单项值传递”的方法来将的方法来将的方法来将的方法来将实参的值复制给形参实参的值复制给形参实参的值复制给形参实参的值复制给形参,形,形,形,形参有值后,参与计算,得出需要的值,而后随着调用的参有值后,参与计算,得出需要的值,而后随着调用的参有值后,参与计算,得出需要的值,而后随着调用的参有值后,参与计算,得出需要的值,而后随着调用的结束,结束,结束,结束,形参变量消失形参变量消失形参变量消失形参变量消失。int Average(int x,int y)int result;result=(x+y)/2;return result;main()
48、int a=12;int b=24;int ave;ave=Average(a,b);printf();数据传递执行顺序实参实参实参实参形参形参形参形参形参值在此处完成函形参值在此处完成函形参值在此处完成函形参值在此处完成函数运算,并消失数运算,并消失数运算,并消失数运算,并消失2023/1/1C语言大学实用教程课件 制作人 苏小红43但是如果用但是如果用但是如果用但是如果用数组数组数组数组作为函数的形式参数:作为函数的形式参数:作为函数的形式参数:作为函数的形式参数:由于每次调用函数,作为形式参数的数组,每次都由于每次调用函数,作为形式参数的数组,每次都由于每次调用函数,作为形式参数的数组,
49、每次都由于每次调用函数,作为形式参数的数组,每次都要要要要重新开辟重新开辟重新开辟重新开辟一块连续的存储空间,每次一块连续的存储空间,每次一块连续的存储空间,每次一块连续的存储空间,每次复制一堆的实参复制一堆的实参复制一堆的实参复制一堆的实参值,值,值,值,用完又用完又用完又用完又马上将内存还给系统马上将内存还给系统马上将内存还给系统马上将内存还给系统。需要的系统开销太大。需要的系统开销太大。需要的系统开销太大。需要的系统开销太大。因此,因此,因此,因此,C C程序设计语言规定,数组作形式参数时,不重程序设计语言规定,数组作形式参数时,不重程序设计语言规定,数组作形式参数时,不重程序设计语言规
50、定,数组作形式参数时,不重新开辟存储空间,而是用实际参数已有的空间。新开辟存储空间,而是用实际参数已有的空间。新开辟存储空间,而是用实际参数已有的空间。新开辟存储空间,而是用实际参数已有的空间。float float FindMax(float arr,int n)FindMax(float arr,int n)floatfloat max;max;intint i;i;max=arr0;max=arr0;forfor(i=1;in;i+)(i=1;i max)(arri max)max=arri;max=arri;此处虽然写成数组形式,但此处虽然写成数组形式,但此处虽然写成数组形式,但此处虽