第7章批量数据处理程序设计_第1页
第7章批量数据处理程序设计_第2页
第7章批量数据处理程序设计_第3页
第7章批量数据处理程序设计_第4页
第7章批量数据处理程序设计_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计基础程序设计基础前几章前几章使用的变量都属于使用的变量都属于基本类型基本类型,例如整型、字符型、浮点型数据,这例如整型、字符型、浮点型数据,这些都是简单的数据类型。些都是简单的数据类型。对于有些数据,只用简单的数据类型对于有些数据,只用简单的数据类型是不够的,是不够的,难以难以反映出数据的反映出数据的特点特点,也难以有效地进行处理。也难以有效地进行处理。程序设计基础如果有如果有1000名学生名学生,每个学生有一每个学生有一个成绩,需要求这个成绩,需要求这1000名学生的平名学生的平均成绩。均成绩。用用s1,s2,s3,s1000表示每个学生表示每个学生的成绩,能体现的成绩,能体现内在联

2、系内在联系。C语言用方括号中的数字表示下标,语言用方括号中的数字表示下标,如用如用s15表示表示数组名数组名程序设计基础数组是一组数组是一组有序数据的集合有序数据的集合。数组中。数组中各数据的排列是有一定规律的,下标各数据的排列是有一定规律的,下标代表数据在数组中的序号代表数据在数组中的序号用一个用一个数组名数组名和和下标下标惟一确定数组中惟一确定数组中的元素的元素数组中的每一个元素都属于数组中的每一个元素都属于同一个数同一个数据类型据类型程序设计基础7.1 怎样定义和引用一维数组怎样定义和引用一维数组7.2 怎样定义和引用二维数组怎样定义和引用二维数组程序设计基础7.1.1 怎样定义一维数组

3、怎样定义一维数组7.1.2 怎样引用一维数组元素怎样引用一维数组元素7.1.3 一维数组的初始化一维数组的初始化7.1.4 一维数组程序举例一维数组程序举例程序设计基础定义一维数组的一般形式为:定义一维数组的一般形式为: 类型符类型符 数组名数组名常量表达式常量表达式;数组名的命名规则和变量名相同数组名的命名规则和变量名相同如如 int a10;数组名数组名程序设计基础定义一维数组的一般形式为:定义一维数组的一般形式为: 类型符类型符 数组名数组名常量表达式常量表达式;数组名的命名规则和变量名相同数组名的命名规则和变量名相同如如 int a10;数组数组长度长度程序设计基础定义一维数组的一般形

4、式为:定义一维数组的一般形式为: 类型符类型符 数组名数组名常量表达式常量表达式;数组名的命名规则和变量名相同数组名的命名规则和变量名相同如如 int a10;10个元素个元素:a0,a1,a2,a9每个元素的数据类型每个元素的数据类型a0 a1 a2 a3a7 a8 a9程序设计基础例:例:int a4+6; 合法合法int n=10; int an;不合法不合法程序设计基础在定义数组并对其中各元素赋值后,就在定义数组并对其中各元素赋值后,就可以引用数组中的元素可以引用数组中的元素注意:只能引用数组元素而不能一次整注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值体调用整个数组全部

5、元素的值程序设计基础引用数组元素的表示形式为:引用数组元素的表示形式为: 数组名下标数组名下标如如a0=a5+a7-a2*3 合法合法int n=5,a10;an=20;合法合法程序设计基础 例例7.1 对对10个数组元素依次赋值为个数组元素依次赋值为0,1, 2,3,4,5,6,7,8,9,要求按逆序输出。,要求按逆序输出。解题思路:解题思路:u定义一个长度为定义一个长度为10的数组,数组定义为整型的数组,数组定义为整型u要赋的值是从要赋的值是从0到到9,可以用循环来赋值,可以用循环来赋值u用循环按下标从大到小输出这用循环按下标从大到小输出这10个元素个元素程序设计基础#include in

6、t main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); return 0; 使使a0a9的值为的值为090123456789a0a1a2a3a4a5a6a7a8a9程序设计基础#include int main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); return 0; 先输出先输出a9,最,最后输出后输出a00123456789a0a1a2a3a4a5a6a7a8a9程序设计基础在定义数组的同时,给各数组元素赋值在定义数组的同时,给各数组元

7、素赋值int a10=0,1,2,3,4,5,6,7,8,9;int a10=0,1,2,3,4;相当于相当于 int a10=0,1,2,3,4,0,0,0,0,0;int a10=0,0,0,0,0,0,0,0,0,0;相当于相当于 int a10=0;int a5=1,2,3,4,5;可写为可写为 int a =1,2,3,4,5;程序设计基础 例例7.2 用数组处理求用数组处理求Fibonacci数列问题数列问题解题思路:解题思路:u例例5.8中用简单变量处理的,中用简单变量处理的,缺点缺点不能在内存不能在内存中保存这些数。假如想直接输出数列中第中保存这些数。假如想直接输出数列中第25

8、个数,是很困难的。个数,是很困难的。u如果用数组处理,每一个数组元素代表数列中如果用数组处理,每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组的一个数,依次求出各数并存放在相应的数组元素中元素中程序设计基础#include int main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(“n”); printf(“%12d”,fi); printf(n); return 0;程序设计基础 例例7.3 有有10个个整型数据整型数据,要求对它们按,要求对它们按

9、由小到大的顺序排列。由小到大的顺序排列。解题思路:解题思路:u排序的规律有两种:一种是排序的规律有两种:一种是“升序升序”,从小到从小到大;另一种是大;另一种是“降序降序”,从大到小,从大到小u把题目抽象为:把题目抽象为:“对对n个数按升序排序个数按升序排序”u采用起泡法排序采用起泡法排序程序设计基础985420895420859420854920854290854209大数沉淀,小数起泡大数沉淀,小数起泡a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序设计基础854209584209548209542809542089a0a1a2a3a4a

10、5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序设计基础542089452089425089420589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序设计基础420589240589204589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序设计基础204589024589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序设计基础for(i=0;iai+1) for(i=0;iai+1) for(i=0;iai

11、+1) for(i=0;iai+1) for(j=0;j5;j+)程序设计基础int a10; int i,j,t;printf(input 10 numbers :n);for (i=0;i10;i+) scanf(%d,&ai); printf(n);for(j=0;j9;j+)for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t;printf(the sorted numbers :n);for(i=0;i10;i+) printf(%d ,ai);printf(n);程序设计基础2456 1847 1243 1600 2346 27573045 2018 172

12、5 2020 2458 14361427 1175 1046 1976 1477 20181分队分队2分队分队3分队分队队员队员1 队员队员2队员队员3 队员队员4队员队员5队员队员6float pay36;程序设计基础7.2.1怎样定义二维数组怎样定义二维数组7.2.2怎样引用二维数组的元素怎样引用二维数组的元素7.2.3二维数组的初始化二维数组的初始化7.2.4二维数组程序举例二维数组程序举例程序设计基础二维数组定义的一般形式为二维数组定义的一般形式为 类型符类型符 数组名数组名常量表达式常量表达式常量表达式常量表达式; 如:如:float a34,b510;二维数组可被看作是一种特殊的一

13、维数组:二维数组可被看作是一种特殊的一维数组: 它的元素又是一个一维数组它的元素又是一个一维数组例如,把例如,把a看作是一个一维数组,它有看作是一个一维数组,它有3个元素:个元素: a0、a1、a2每个元素又是一个包含每个元素又是一个包含4个元素的一维数组个元素的一维数组程序设计基础a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a0a1a2程序设计基础a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23逻辑存储逻辑存储内存中的存储顺序内存中的存储顺序程序设计基础二维数组元素的表示形式为二维数组元素的表示形式为:

14、数组名下标下标数组名下标下标 b12=a23/2 合法合法for(i=0;i3;i+) printf(“%d,%dn”,ai0,a0i);合法合法程序设计基础int a34=1,2,3,4,5,6,7,8, 9,10,11,12;int a34=1,2,3,4,5,6,7,8,9,10,11,12;int a34=1,5,9;等价于等价于int a34=1,0,0,0,5,0,0,0, 9,0,0,0;int a34=1,5,6;相当于相当于int a34=1,5,6,0;程序设计基础int a34=1,2,3,4,5,6,7,8,9,10,11,12;等价等价于于:int a 4=1,2,3

15、,4,5,6,7,8,9,10,11,12;int a4=0,0,3, ,0,10;合法合法程序设计基础 例例7.4 将一个二维数组行和列的元素互换,将一个二维数组行和列的元素互换,存到另一个二维数组中。存到另一个二维数组中。654321a635241b程序设计基础解题思路:解题思路:u可以定义两个数组:数组可以定义两个数组:数组a为为2行行3列,存放指定列,存放指定的的6个数个数u数组数组b为为3行行2列,开始时未赋值列,开始时未赋值u将将a数组中的元素数组中的元素aij存放到存放到b数组中的数组中的bji元素中元素中u用嵌套的用嵌套的for循环完成循环完成程序设计基础#include in

16、t main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=0;j=2;j+) printf(%5d,aij); bji=aij; printf(n); 处理处理a的一行中各元素的一行中各元素处理处理a中某一列元素中某一列元素输出输出a的的各元素各元素a元素值赋给元素值赋给b相应元素相应元素程序设计基础 printf(array b:n); for (i=0;i=2;i+) for(j=0;jmax,则表示则表示a01是已经比过的数据中值最大的,是已经比过的数据中值最大的,把它的值赋

17、给把它的值赋给max,取代了,取代了max的原值的原值u以后依此处理,以后依此处理,最后最后max就是最大的值就是最大的值程序设计基础 for i=0 to 2 for j=0 to 3max=aijrow=Icolum=jaijmax真真 max=a00输出:输出:max,row,colum假假程序设计基础记行号记行号 int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6, -10,10,-5,2; max=a00; for (i=0;i=2;i+) for (j=0;jmax) max=aij; row=i; colum=j; printf(

18、max=%dnrow=%dn colum=%dn,max,row,colum);记记最大值最大值记记列列号号程序设计基础一个变量有地址,一个数组包含若干元素一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址,每个数组元素都有相应的地址指针变量可以指向数组元素(把某一元素指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)的地址放到一个指针变量中)所谓数组元素的指针就是数组元素的地址所谓数组元素的指针就是数组元素的地址程序设计基础可以用一个指针变量指向一个数组元素可以用一个指针变量指向一个数组元素 int a10=1,3,5,7,9,11,13,15,17,19; int

19、 *p; p=&a0;等价于等价于p=a;等价于等价于int *p=a;或或int *p=&a0;注意注意:数组名数组名a不代表整个数组,不代表整个数组,只代表数组首元素的地址。只代表数组首元素的地址。“p=a;”的作用是的作用是“把把a数组的首元素的地数组的首元素的地址赋给指针变量址赋给指针变量p”,而不是,而不是“把把数组数组a各元素的值赋给各元素的值赋给p”。程序设计基础在指针指向数组元素时,在指针指向数组元素时,允许允许以下运算:以下运算:u加一个整数加一个整数(用用+或或+=),如,如p+1u减一个整数减一个整数(用用-或或-=),如,如p-1u自加运算,如自加运算,

20、如p+,+pu自减运算,如自减运算,如p-,-pu两个指针相减,如两个指针相减,如p1-p2 (只有只有p1和和p2都都指向同一数组中的元素时才有意义指向同一数组中的元素时才有意义)程序设计基础(1) 如果指针变量如果指针变量p已指向数组中的一个元已指向数组中的一个元素,则素,则p+1指向同一数组中的下一个元素指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。指向同一数组中的上一个元素。 float a10,*p=a; 假设假设a0的地址为的地址为2000,则,则up的值为的值为2000up+1的值为的值为2004uP-1的值为的值为1996越界越界程序设计基础(2) 如果的初如果

21、的初值为值为&a0,则则p+i和和a+i就就是数组元素是数组元素ai的地址,的地址,或者说,它们或者说,它们指向指向a数组序号数组序号为为i的元素的元素a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9 程序设计基础(3) *(p+i)或或*(a+i)是是p+i或或a+i所指向所指向的数组元素,的数组元素,即即ai。a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9 *(p+i)程序设计基础(4) 如果指针如果指针p1和和p2都指向同一数组都指向同一数组 p2-p1的值的值是是4 不能不能p1+p2a0a1a2

22、a3a4a5a6a7a8a9p1p2 程序设计基础引用一个数组元素,可用下面两种方法:引用一个数组元素,可用下面两种方法: ()() 下标法,如下标法,如ai形式形式 ()() 指针法,如指针法,如*(a+i)或或*(p+i) 其中其中a是数组名,是数组名,p是指向数组元素的指针是指向数组元素的指针变量,其初值变量,其初值p=a程序设计基础 例例7.6 有一个整型数组有一个整型数组a,有,有10个元素,个元素,要求输出数组中的全部元素。要求输出数组中的全部元素。解题思路:引用数组中各元素的值有解题思路:引用数组中各元素的值有3种种方法:方法:(1)下标法下标法;(2)通过数组名计算通过数组名计

23、算数组元素地址,找出元素的值数组元素地址,找出元素的值;(3) 用指用指针变量指向数组元素针变量指向数组元素分别写出程序,以资比较分析。分别写出程序,以资比较分析。程序设计基础(1) 下标法。下标法。 #include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,ai); printf(%n); return 0; 程序设计基础(2) 通过数组名计算数组元素地址,找出元素的值通过数组名

24、计算数组元素地址,找出元素的值#include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,*(a+i); printf(n); return 0; scanf(%d,a+i);程序设计基础(3) 用指针变量指向数组元素用指针变量指向数组元素 #include int main() int a10; int *p,i; printf(“enter 10 integer numbers:

25、n); for(i=0;i10;i+) scanf(%d,&ai); for(p=a;p(a+10);p+) printf(“%d ”,*p); printf(n); return 0;for(p=a;p(a+10);p+) scanf(%d,p);for(p=a;p(a+10);a+) printf(“%d ”,*a); 错!错!程序设计基础用数组名作函数参数时,因为实参数组名用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一代表该数组首元素的地址,形参应该是一个指针变量个指针变量C编译都是将形参数组名作为指针变量来编译都是将形参数组名作为指针变量来处理的处理的

26、程序设计基础int main() void fun(int arr,int n; int array10; fun (array,10); return 0; void fun(int arr ,int n) fun(int *arr,int n)程序设计基础int main() void fun(int arr,int n; int array10; fun (array,10); return 0; void fun(int *arr,int n) 程序设计基础例例7.8 将数组将数组a中中n个整数按相反顺序存放个整数按相反顺序存放解题思路:将解题思路:将a0与与an-1对换,对换,将将a

27、4与与a5对换。对换。ji程序设计基础ji程序设计基础ji程序设计基础ji程序设计基础ji程序设计基础#include int main() void inv(int x ,int n); int i, a10=3,7,9,11,0,6,7,5,4,2; for(i=0;i10;i+) printf(“%d ”,ai); printf(n); inv(a,10); for(i=0;i10;i+) printf(“%d ”,ai); printf(n); return 0;程序设计基础void inv(int x ,int n) int temp,i,j,m=(n-1)/2; for(i=0;i

28、=m;i+) j=n-1-i; temp=xi;xi=xj;xj=temp; 程序设计基础例例7.9 改写例改写例7.8,用指针变量作实参。,用指针变量作实参。#include int main() void inv(int *x,int n); int i, arr10,*p=arr; for(i=0;i10;i+,p+) scanf(“%d”,p); inv(p,10); for(p=arr;parr+10;p+) printf(“%d ”,*p); printf(n); return 0;不可少!不可少!程序设计基础 例例7.10 用指针方法对用指针方法对10个整数按由大到个整数按由大到

29、小顺序排序。小顺序排序。解题思路:解题思路:u在主函数中定义数组在主函数中定义数组a存放存放10个整数,定义个整数,定义int *型指针变量型指针变量p指向指向a0u定义函数定义函数sort使数组使数组a中的元素按由大到小的中的元素按由大到小的顺序排列顺序排列u在主函数中调用在主函数中调用sort函数,用指针函数,用指针p作实参作实参u用选择法进行排序用选择法进行排序程序设计基础#include int main() void sort(int x ,int n); int i,*p,a10; p=a; for(i=0;i10;i+) scanf(“%d”,p+); p=a; sort(p,1

30、0); for(p=a,i=0;i10;i+) printf(“%d ”,*p); p+; printf(n); return 0;程序设计基础void sort(int x,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jxk) k=j; if(k!=i) t=xi;xi=xk;xk=t; void sort(int *x,int n)if (*(x+j)*(x+k) k=j;t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;程序设计基础指针变量可以指向一维数组中的元素,也指针变量可以指向一维数组中的元素,也可以指向多维

31、数组中的元素。但在概念上可以指向多维数组中的元素。但在概念上和使用方法上,多维数组的指针比一维数和使用方法上,多维数组的指针比一维数组的指针要复杂一些。组的指针要复杂一些。程序设计基础1. 多维数组元素的地址多维数组元素的地址int a34=1,3,5,7, 9,11,13,15,17,19,21,23;1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针程序设计基础a代表第代表第0行首地址行首地址a+1代表第代表第1行首地址行首地址a+2代表第代表第2行首地址行首地址1357911131517192123a0a1a2aa+

32、1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针行指针每加行指针每加1,走一行,走一行程序设计基础a+i代表行号为代表行号为i的行首地址(按行变化)的行首地址(按行变化)*(a+i)代表什么?代表什么?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针相当于相当于ai程序设计基础a0代表代表a00的地址的地址a0+1代表代表a01的地址的地址a0+2代表代表a02的地址的地址a0+3代表代表a03的地址的地址1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3

33、行指针行指针列指针列指针列指针每加列指针每加1,走一列,走一列程序设计基础a1代表谁的地址?代表谁的地址?a1+1代表谁的地址?代表谁的地址?a1+2代表谁的地址?代表谁的地址?a1+3代表谁的地址?代表谁的地址?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针程序设计基础ai+j代表谁的地址?代表谁的地址?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针代表代表aij的地址的地址*(ai+j)代表什么?代表什么?代表元素代表元素aij*(*(a+

34、i)+j)代表什么?代表什么?与与*(ai+j)等价等价程序设计基础例例7.11 二维数组的有关数据二维数组的有关数据(地址和值地址和值)#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23;程序设计基础 printf(“%d,%dn”,a,*a); printf(“%d,%dn”,a0,*(a+0); printf(“%d,%dn”,&a0,&a00); printf(“%d,%dn”,a1,a+1); printf(“%d,%dn”,&a10,*(a+1)+0); printf(“%d,%dn”,a2

35、,*(a+2); printf(“%d,%dn”,&a2,a+2); printf(“%d,%dn”,a10,*(*(a+1)+0); printf(“%d,%dn”,*a2,*(*(a+2)+0); return 0;程序设计基础2. 指向多维数组元素的指针变量指向多维数组元素的指针变量(1) 指向数组元素的指针变量指向数组元素的指针变量 例例7.12 有一个有一个34的二维数组,要求的二维数组,要求用指向元素的指针变量输出二维数组各用指向元素的指针变量输出二维数组各元素的值。元素的值。程序设计基础解题思路:解题思路:u二维数组的元素是整型的,它相当于整型变二维数组的元素是整型的,它

36、相当于整型变量,可以用量,可以用int*型指针变量指向它型指针变量指向它u二维数组的元素在内存中是按行顺序存放的二维数组的元素在内存中是按行顺序存放的,即存放完序号为,即存放完序号为0的行中的全部元素后,的行中的全部元素后,接着存放序号为接着存放序号为1的行中的全部元素,依此的行中的全部元素,依此类推类推u因此可以用一个指向整型元素的指针变量,因此可以用一个指向整型元素的指针变量,依次指向各个元素依次指向各个元素程序设计基础#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int *p; for(p=a0;pa0+12;p

37、+) if(p-a0)%4=0) printf(“n”); printf(“%4d”,*p); printf(n); return 0;控制换行控制换行逐个访问各元素时常用此类指针逐个访问各元素时常用此类指针程序设计基础(2) 指向由个元素组成的一维数组的指针指向由个元素组成的一维数组的指针变量变量 例例7.13 输出二维数组任一行任一列元素的输出二维数组任一行任一列元素的值。值。解题思路:假设仍然用例解题思路:假设仍然用例7.12程序中的二程序中的二维数组,例维数组,例7.12中定义的指针变量是指向中定义的指针变量是指向变量或数组元素的,现在改用指向一维数变量或数组元素的,现在改用指向一维数

38、组的指针变量。组的指针变量。程序设计基础#include int main()int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int (*p)4,i,j; p=a; printf(“enter row and colum:); scanf(“%d,%d”,&i,&j); printf(“a%d,%d=%dn”, i,j,*(*(p+i)+j); return 0;行指针行指针aij程序设计基础3. 用指向数组的指针作函数参数用指向数组的指针作函数参数一维数组名可以作为函数参数,多维数组一维数组名可以作为函数参数,多维数组名也可作函数参数。名也可

39、作函数参数。用指针变量作形参,以接受实参数组名传用指针变量作形参,以接受实参数组名传递来的地址。递来的地址。可以有两种方法:可以有两种方法:用指向变量的指针变量用指向变量的指针变量用指向一维数组的指针变量用指向一维数组的指针变量程序设计基础 例例7.14 有一个班,有一个班,3个学生,各学个学生,各学4门课,门课,计算总平均分数以及第计算总平均分数以及第n个学生的成绩。个学生的成绩。 解题思路:这个题目是很简单的。本例用指解题思路:这个题目是很简单的。本例用指向数组的指针作函数参数。用函数向数组的指针作函数参数。用函数average求总平均成绩,用函数求总平均成绩,用函数search找找出并输

40、出第出并输出第i个学生的成绩。个学生的成绩。程序设计基础#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,98; average(*score,12); search(score,2); return 0;score00的地址的地址程序设计基础void average(float *p,int n) float *p_end; float sum=0,aver; p_end=p+n-1

41、; for( ;p=p_end; p+) sum=sum+(*p); aver=sum/n; printf(average=%5.2fn,aver);6567706080879081909910098pp_endp+1程序设计基础void search(float (*p)4,int n) int i; printf(The score of No.%d are:n,n); for(i=0;i4;i+) printf(%5.2f ,*(*(p+n)+i); printf(n);6567706080879081909910098pp+2程序设计基础7.4.1数组元素作函数实参数组元素作函数实参7

42、.4.2数组名作函数参数数组名作函数参数7.4.3多维数组名作函数参数多维数组名作函数参数程序设计基础 例例7.9 输入输入10个数,要求输出其中值个数,要求输出其中值最大的元素和该数是第几个数。最大的元素和该数是第几个数。程序设计基础解题思路:解题思路:u定义数组定义数组a,用来存放,用来存放10个数个数u设计函数设计函数max,用来求两个数中的大者,用来求两个数中的大者u在主函数中定义变量在主函数中定义变量m,初值为,初值为a0,每次调用每次调用max函数后的返回值存放在函数后的返回值存放在m中中u用用“打擂台打擂台”算法,依次将数组元素算法,依次将数组元素a1到到a9与与m比较,最后得到

43、的比较,最后得到的m值值就是就是10个数中的最大者个数中的最大者程序设计基础#include int main() int max(int x,int y); int a10,m,n,i; printf(“10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n);程序设计基础 for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“largest number is %dn,m); printf(“%dth number.n“,n+1);int max(int x,int y)

44、return(xy?x:y); 程序设计基础除了可以用数组元素作为函数参数外除了可以用数组元素作为函数参数外,还可以用数组名作函数参数,还可以用数组名作函数参数(包括实包括实参和形参参和形参)用数组元素作实参时,向形参变量传用数组元素作实参时,向形参变量传递的是数组元素的值递的是数组元素的值用数组名作函数实参时,向形参用数组名作函数实参时,向形参 传递传递的是数组首元素的地址的是数组首元素的地址程序设计基础 例例7.10 有一个一维数组有一个一维数组score,内放,内放10个学生成绩,求平均成绩。个学生成绩,求平均成绩。解题思路:解题思路:u用函数用函数average求平均成绩,用数组名求平

45、均成绩,用数组名作为函数实参,形参也用数组名作为函数实参,形参也用数组名u在在average函数中引用各数组元素,求函数中引用各数组元素,求平均成绩并返回平均成绩并返回main函数函数程序设计基础#include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return

46、 0; 定义实参数组定义实参数组程序设计基础float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver);定义形参数组定义形参数组相当于相当于score0相当于相当于scorei程序设计基础 例例7.11 有两个班级,分别有有两个班级,分别有35名和名和30名学生,调用一个名学生,调用一个average函数,分别求函数,分别求这两个班的学生的平均成绩。这两个班的学生的平均成绩。程序设计基础解题思路:解题思路:u需要解决怎样用

47、同一个函数求两个不同长度的需要解决怎样用同一个函数求两个不同长度的数组的平均值的问题数组的平均值的问题u定义定义average函数时不指定数组的长度,在函数时不指定数组的长度,在形参表中增加一个整型变量形参表中增加一个整型变量iu从主函数把数组实际长度从实参传递给形参从主函数把数组实际长度从实参传递给形参iu这个这个i用来在用来在average函数中控制循环的次数函数中控制循环的次数u为简化,设两个班的学生数分别为为简化,设两个班的学生数分别为5和和10程序设计基础#include int main() float average(float array ,int n); float scor

48、e15=98.5,97,91.5,60,55; float score210=67.5,89.5,99,69.5, 77,89.5,76.5,54,60,99.5; printf(“%6.2fn”,average(score1,5); printf(“%6.2fn”,average(score2,10); return 0;程序设计基础float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);调用形式为调用形式为a

49、verage(score1,5)时时相当于相当于score10相当于相当于score1i相当于相当于5程序设计基础float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);调用形式为调用形式为average(score2,10)时时相当于相当于score20相当于相当于score2i相当于相当于10程序设计基础 例例7.12用选择法对数组中用选择法对数组中10个整数按由个整数按由小到大排序。小到大排序。解题思路:解

50、题思路:u所谓选择法就是先将所谓选择法就是先将10个数中最小的数与个数中最小的数与a0对换对换;再将再将a1到到a9中最小的数与中最小的数与a1对换对换每比较一轮每比较一轮,找出一个未经排找出一个未经排序的数中最小的一个序的数中最小的一个u共比较共比较9轮轮程序设计基础a0 a1 a2 a3 a4 3 6 1 9 4 1 6 3 9 4 1 3 6 9 4 1 3 4 9 6 1 3 4 6 9小到大排序小到大排序程序设计基础#include int main() void sort(int array,int n); int a10,i; printf(enter array:n); for

51、(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(The sorted array:n); for(i=0;i10;i+) printf(%d ,ai); printf(n); return 0; 程序设计基础void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk; arrayk=arrayi; arrayi=t; 在在sortisort9中,中,最小数与最小数与sorti对换对换

52、程序设计基础 例例7.13 有一个的矩阵,求所有有一个的矩阵,求所有元素中的最大值。元素中的最大值。解题思路:先使变量解题思路:先使变量max的初值等于的初值等于矩阵中第一个元素的值,然后将矩阵矩阵中第一个元素的值,然后将矩阵中各个元素的值与中各个元素的值与max相比,每次比相比,每次比较后都把较后都把“大者大者”存放在存放在max中,全中,全部元素比较完后,部元素比较完后,max 的值就是所有的值就是所有元素的最大值。元素的最大值。程序设计基础#include int main() int max_value(int array4); int a34=1,3,5,7,2,4,6,8, 15,

53、17,34,12; printf(“Max value is %dn”, max_value(a); return 0;可以省略可以省略不能省略不能省略要与要与形参数组第形参数组第二二维大小维大小相同相同程序设计基础int max_value(int array4) int i,j,max; max = array00; for (i=0;i3;i+) for(j=0;jmax) max = arrayij; return (max);要与实参要与实参数组第数组第二二维大小维大小相同相同程序设计基础输入输入5个整数,将它们存入数组个整数,将它们存入数组a中,再输入中,再输入1个数个数x,然后在

54、数组中查找,然后在数组中查找x,如果找到,如果找到,输出相应的位置,否则,输出输出相应的位置,否则,输出“Not Found”。输入:输入:2 9 8 9 6 9输出:输出:1输入:输入:2 9 8 9 6 7输出:输出:Not Found综合例题:综合例题:在数组中查找一个给定的数在数组中查找一个给定的数程序设计基础#include int main(void) int i, x; int a5; printf(Enter 5 integers: ); for(i = 0; i 5; i+) scanf(%d, &ai); printf(Enter x: ); scanf(%d, &

55、amp;x); for(i = 0; i 5; i+) if(ai = x) printf(Index is %dn, i+1); break; if(i= 5) printf(Not Foundn); return 0; Enter 5 integers: 2 9 8 1 9Enter x: 9Index is 1Enter 5 integers: 2 9 8 1 9Enter x: 7Not Found程序设计基础#include int main(void) int i, a10,n; void reverse(int p , int n); printf(Enter n: ); sca

56、nf(%d, &n); printf(Enter %d integers: , n); for(i = 0; i n; i+) scanf(%d, &ai); for(i=0, j=n-1; ij; i+, j-) t = ai; ai = aj; aj = t; for(i = 0; i n; i+) printf(%dt, ai);return 0; Enter n:10Enter 10 integers: 10 9 8 7 6 5 4 3 2 11 2 3 4 5 6 7 8 9 10综合例题:将数组元素逆序存放综合例题:将数组元素逆序存放程序设计基础7.5 动态创建数组

57、动态创建数组对内存的动态分配是通过系统提供的库函数对内存的动态分配是通过系统提供的库函数来实现的,主要有来实现的,主要有malloc,calloc,free这这3个函数。个函数。程序设计基础malloc函数函数其函数原型为其函数原型为 void *malloc(unsigned int size); u其作用是在内存的动态存储区中分配一个长度其作用是在内存的动态存储区中分配一个长度为为size的连续空间的连续空间u函数的值是所分配区域的第一个字节的地址,函数的值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置针指向该分配域的开头位置程序设计基础 malloc(

温馨提示

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

评论

0/150

提交评论