付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计中山大学数学与计算科学学院冯 伟2012-10-30 # include void main()int i;char a=I am a teacher.;char b=You are a student.;printf(The string a is: %sn,a);printf(The string b is: %sn,b);printf(Copy string a to string b .n);for(i=0;ai;i+) bi=ai; /ai!=0/bi=0; /注意:处理字符串结束符!printf(The string a is: %sn,a);printf(The s
2、tring b is: %sn,b);分析程序The string a is: I am a teacher.The string b is: You are a student.Copy string a to string b .The string a is: I am a teacher.The string b is: I am a teacher.nt.# include # define M 2int main() int i,j; float temp,aMM; printf(The square matrix size: %d, %dn,M,M); printf(Input
3、the original matrix elment value:n); for(i=0;iM;i+) for(j=0;jM;j+) scanf(%f, &aij); printf(Output the original matrix:n); for(i=0;iM;i+) for(j=0;jM;j+) printf(%8.4f, aij); printf(n); 分析程序 / The transpose of matrix. for(i=0;iM;i+) for(j=0;jM;j+) temp=aij, aij=aji, aji=temp; printf(Output the transpos
4、ed matrix:n); for(i=0;iM;i+) for(j=0;jM;j+) printf(%8.4f,aij); printf(n); return 0;/ 注意Error: 方阵转置两次相当于没转置The square matrix size: 2, 2Input the original matrix elment value:1 2 3 4Output the original matrix: 1.0000 2.0000 3.0000 4.0000Output the transposed matrix: 1.0000 2.0000 3.0000 4.0000 / The t
5、ranspose of matrix. for(i=0;iM;i+) for(j=0;j=i-1;j+) / for(j=0;j=i;j+)/ for(j=i;jM;j+) / for(j=i+1;jM;j+) temp=aij, aij=aji, aji=temp; printf(Output the transposed matrix:n); for(i=0;iM;i+) for(j=0;jM;j+) printf(%8.4f,aij); printf(n); return 0;The square matrix size: 2, 2Input the original matrix el
6、ment value:1 2 3 4Output the original matrix: 1.0000 2.0000 3.0000 4.0000Output the transposed matrix: 1.0000 3.0000 2.0000 4.0000# include # include # define M 3# define N 10void main() int i, j; char strMN+1,tempN+1; printf(Number of strings: %dn,M); printf(Maximal length of strings: %dn,N); for(i
7、=0;i0;i-) / 只需要由后向前排定(M-1)个就可以了 / 冒泡法寻找str0,.,stri共(i)个元素中的最大者, 放到stri中 / 需要由前到后连续的两两比较(i-1)次, 每次比较使较大的元素后移 for(j=0;j0) / 前后连续的两两比较, 使较大的元素后移 strcpy(temp,strj), strcpy(strj,strj+1), strcpy(strj+1,temp); printf(Output strings:n); for(i=0;iM;i+) puts(stri); / 等价 printf(%sn,stri)Number of strings: 3Max
8、imal length of strings: 10Input string 1EnglishInput string 2ChinaInput string 3FranceOutput strings:ChinaEnglishFrance分析程序/ 用冒泡法对M个数据中按照字典顺序由小到大排序(由后向前排序)for(i=0;iM-1;i+) / 只需要由后向前排定(M-1)个就可以了 / 冒泡法寻找str0,.,strM-1-i共(M-i)个元素中的最大者, 放到strM-1-i中 / 需要由前到后连续的两两比较(M-i-1)次, 每次比较使较大的元素后移 for(j=0;j(M-1-i);j
9、+) / 用冒泡法对M个数据中按照字典顺序由小到大排序(由后向前排序)for(i=0;iM-1;i+) / 只需要由后向前排定(M-1)个就可以了 / 冒泡法寻找str0,.,strM-1-i共(M-i)个元素中的最大者, 放到strM-1-i中 / 需要由前到后连续的两两比较(M-i-1)次, 每次比较使较大的元素后移 for(j=0;j(M-1-i);j+) / 用冒泡法对M个数据中按照字典顺序由小到大排序(由后向前排序)for(i=1;iM;i+) / 只需要由后向前排定(M-1)个就可以了 / 冒泡法寻找str0,.,strM-i-1共(M-i)个元素中的最大者, 放到strM-1-i
10、中 / 需要由前到后连续的两两比较(M-i-1)次, 每次比较使较大的元素后移 for(j=0;j(M-i);j+) 冒泡法排序的等价变化分析程序作 业 题(用结构化流程设计写C程序)(1). 打印出12012中的闰年,并统计闰年的个数。 (2). 打印出12012中的素数,并统计素数的个数。(3). 输入两个正整数m和n,求最大公约数和最小公倍数。(4). 打印出所有的水仙花数。(5). 求方程 a*x*x+b*x+c=0 的根。(6). 输入3个二维点的坐标,求它们围成的面积。试 验 报 告格式输入输出与结构化流程设计(四)模块化的函数设计 4.1 模块化函数设计思想 4.2 函数的定义及
11、使用 4.3 函数的参数传递 4.4 数组作为函数参数 4.5 函数的复杂调用 4.6 全局变量与局部变量 4.7 变量和函数的存储类别 4.8 编译预处理 4.1 模块化函数设计思想一、 C语言的函数式程序结构1. C语言设计程序的思路:编写函数,至少要编一个main()函数。2. C语言程序的执行(顺序串行程序):由main()函数的第一个花括号开始,依次执行后面的 语句,直到最后的花括号为止。其它函数只有在执行main()函数的过程中被调用时才能执行。3. 函数的概念:当需要完成某一个功能时,就用一个函数(标准库中的函数或用户设计的函数)。所谓函数就是完成特定功能的、能被重复使用的一段程
12、序。二、模块化程序设计的思想和方法将一个大的程序按功能分割成一些模块,使每一个模块都成为功能单一、结构清晰、接口简单、容易理解的小程序。模块化的函数设计可以使复杂问题简单化,它对于程序设计和程序阅读而言都是极为方便和重要的。4. 为什么使用函数: 使程序设计更加简单;使程序阅读更加简单;使程序可 以被多个人同时参与编制。5. 函数分类 用户角度(是否自己定义):系统函数(标准函数)和自定 义函数;函数形式(有无参数):无参函数和有参函数;函数形式(有无返回值):无返回值函数和有返回值函数。 C语言提供的支持模块化设计的功能1. 函数式的程序结构,每个函数都有各自独立的功能。2. 允许使用不同存
13、储类别的变量,以控制模块内部及外部的数据交换。 (1+2 = 函数封装)3. 编译预处理功能,为程序的调试、移植提供了方便。 模块化程序设计的方法1. 自顶向下方法(细化) 任何一个程序可以分解成多个小的程序(由大到小)。 先设计大程序,再设计小程序(由粗到细)。2. 自底向上方法(组装) 多个小程序可以有机组装而构成一个大的程序(由小到大)。 先设计小程序,再设计大程序(由细到粗)。4.2 函数的定义及使用一、函数的定义 数据类型 函数名(形参定义) 说明部分 语句部分 1、定义:1、“数据类型”可以是简单类型、构造类型等。2、“说明部分”指的是变量的说明或函数说明。3、“语句部分”,即可执
14、行语句。注意:C语言中“说明部分”与“语句部分”不能交叉。4、“形参定义”中的形参是一些变量,这些变量必须单独定义。如:int x,int y,float z,不能简写为int x,y,long z2、函数定义的进一步说明1. 函数的数据类型可以是void,void的涵义为“空类型”, 即无类型。2. 如果函数不是void型,则在函数中可以用return语句 把某个表达式的值传给(赋给)函数名。格式为: return 表达式;或 return(表达式);3. return后的表达式的类型必须与函数名前的数据类型 相同(类型一致)。4. 函数的定义头部(即第一行)不能加分号“; ”。二、函数的使
15、用自定义函数的使用与标准函数的使用是一样的。用法如下:函数名(实际参数列表)函数名(实际参数列表);或用在表达式中用作程序语句注意:(1)类型为void型的函数只能用作语句,而不能用在表达式中。(2)除了类型为void型或结构体型的函数外,其它函数都可以作表达式或语句使用。(3)实际参数可以是:变量、常量、表达式、函数等。函数调用的简单规则 如果在函数A中使用函数B,则称:函数A为主调用函数,函数B为被调用函数。函数调用过程的规则是:1. 函数必须先定义后才能使用。即被调用函数应该在 主调用函数之前定义,或者先说明后定义。2. 函数定义和说明(声明)是不同的。后者又称函数原型声明,使编译阶段能
16、对调用函数的合法性进行全面检查。3. 在使用函数时,实际参数与形式参数的个数必须相同,并且对应的数据类型必须相同。(个数、类型、顺序)4. 若函数定义前调用函数,则函数说明是必须的,函数原型声明的方法与变量定义类似。对被调用函数的函数原型声明若函数定义在函数调用之后,则必须进行函数说明。可以直接在所有函数之前或在main()函数内的说明部分说明函数原型。 例如可在main内说明add函数: void main() int add(int x,int y); /原型声明 int i=10,y=20,z; z=add(i,i+y); /函数调用 printf(“z=%d”,z); 注意:函数说明时
17、,形参中的变量名可以省略。 例如:int add(int,int);# include int max(int x,int y) /用户自定义函数 int z; /自定义函数的临时变量 printf(“x=%d,y=%dn”,x,y); /跟踪实参传递给形参的值 if(xy) z=x; else z=y; printf(“z=%dn”,z); /跟踪自定义函数的临时变量 return(z);void main ()/ int max(int,int); / 注意: 此时, 不需要函数原型声明,但加上也没关系! int a,b,c; printf(“please input two intege
18、rs: a,bn”); /输出提示语句 scanf(“%d,%d”,&a,&b); /键盘输入数据 printf(“a=%d,b=%dn”,a,b); /确认数据输入没有问题 c=max(a,b); /函数调用 printf(max=%dn,c); return;# include void main () int max(int,int); / 注意: 此时,必须要有函数原型声明,否则警告函数没有定义! int a,b,c; printf(“please input two integers: a,bn”); /输出提示语句 scanf(“%d,%d”,&a,&b); /键盘输入数据 pri
19、ntf(“a=%d,b=%dn”,a,b); /确认数据输入没有问题 c=max(a,b); /函数调用 printf(max=%dn,c); return;int max(int x,int y) /用户自定义函数 int z; /自定义函数的临时变量 printf(“x=%d,y=%dn”,x,y); /跟踪实参传递给形参的值 if(xy) z=x; else z=y; printf(“z=%dn”,z); /跟踪自定义函数的临时变量 return(z);# include void main () int max(int,int); / 注意: 此时,必须要有函数原型声明,否则警告函数没
20、有定义! int a,b,c; printf(“please input two integers: a,bn”); /输出提示语句 scanf(“%d,%d”,&a,&b); /键盘输入数据 printf(“a=%d,b=%dn”,a,b); /确认数据输入没有问题 c=max(a,b); /函数调用 printf(max=%dn,c); return;int max(int x,int y) /用户自定义函数 printf(“x=%d,y=%dn”,x,y); /跟踪实参传递给形参的值 if(xy) return x; else return y;函数定义中多个return语句的使用4.3
21、 函数的参数传递 参数是函数调用时进行数据交换的载体,参数包括实际参数(实参)和形式参数(形参)。实参是调用函数中的变量,形参是被调函数中的变量;调用过程中实现实参与形参的结合。函数的参数传递指的是把实参传递给形参的过程。所谓值传递,指的是主调函数把实参的值传给形参后,实参与形参的联系即告终止,称为“单向值传递”。在前面对add函数使用的传递情况如下:xy形参实参ii+yz=add(i, i+y);int add(int x, int y)3010函数单向传值调用的说明特点:(1) 形参与实参各占一个独立的存储空间;(2) 形参的存储空间是函数被调用时才临时分配的;(3) 函数返回时,形参的临
22、时存储区也被撤销。总结:函数中对形参变量的操作不会影响到调用函数中的实参变量,即形参值不能传回给实参。传值方式:函数只有一个入口实参传值给形参(单向),函数只有一个出口函数返回值。注意:函数的形参是在进入到函数内部时才自动建立,当执行完函数后,形参会自动释放(消除)。因此,形参的变化不会影响实参(实参向形参单向值传递)。1、将数组元素作为参数: (1) 和变量作为参数的用法相同; (2) 这种传送方式仍然是“值传送”方式,即只能从实参 传给形参,而不能从形参传给实参。2、将数组名作为函数参数: (1) 实参数组和形参数组应分别在它们所在函数中定义; (2) 当以数组名作参数时,采取的不是“值传
23、送”方式,而 是“地址传送”方式,传送的是“地址值”,实参数组 名和形参数组名共享(实参数组)地址。 (3) 以数组名作参数时,实参数组必须定义为具有确定长度 的数组,而形参数组可以不定义长度。4.4 数组作为函数参数 由于数组名是一个“地址常量”值,因此可以把数组名或某个数组元素的地址赋给作为实参赋给相应形参。同时,由于数组作为形参时,定义的数组元素个数并无实际意义,因此在形参定义中可省略形参表示数组元素个数,但是二维数组的列数不能省略(二维数组的基类型)。(a)一维数组作为形参 如: getarr(int arr20) getarr(int arr) /下标可省,表明数组不能省! 或: g
24、etarr(int arr, int n)(b)二维数组作为形参 如: getarr(int arr55) outarr(int arr5) /行下标可省,列下标不可省! 数组实参与形参传递示意内存空间 地址 元素 20FF00 a0 45FF02 a1 60FF04 a256FF06 a378FF08 a489FF0A a598FF0C a6100FF0E a7150FF10 a8120FF12 a9a实参a10形参arrnFF0010注意:传递完毕后,arr与a共同指向地址为FF00的一段内存地址,即此时,arr与a为同一数组。arr# include int main() float a
25、verage(float array ,int n); / (float ,int) float score_15=98.5,97,91.5,60,55; float score_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf(the average of class A is %6.2fn, average(score_1,5); printf(the average of class B is %6.2fn, average(score_2,10); return 0; float average(float array ,int
26、 n) int i; float aver, sum=array0; for(i=1;in;i+) sum+=arrayi; aver=sum/n; return(aver);# include int main() int max_value(int array4,int m) ; / (int 4,int) int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(Max value is %dn,max_value(a,3); return 0;int max_value(int array4,int m) int i,j,max; max=array00;
27、 for(i=0;im;i+) for(j=0;jmax) max=arrayij; return(max);选择法排序排序前1021223315781154第1步102122331578101541第2步121223315781015214第3步142233152281015217第4步147331522331015218.选择排序算法描述选择排序算法为:for(i=0;in-1;i+) 第i次找到第i个最小数的下标p; 交换Ai与Ap;找第i个最小数的下标的算法如下:1. 设p为最小数下标, 初始值为i;2. 让k从i+1到n变化, 重复: 如果AkAp, 则使p=k 3. 最小数的下标为
28、p。# include # define M 10int main() void sort(int a, int n); int aM,i; printf(Input %d integers:n,M); for(i=0;iM;i+) scanf(%d,&ai); sort(a, M); printf(The sorted array:n); for(i=0;iM;i+) printf(%dt,ai); printf(n); return 0;void sort(int a, int n) int i,j,k,temp; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+
29、) if(ajak) k=j; if(k!=i) temp=ak,ak=ai,ai=temp; return;请考虑选择法排序的等价变化的编程实现4.5 函数的复杂调用 如果程序main调用了A,函数A调用了B,而B又调用了C,C又调用了D。那么函数的执行过程是怎样呢?先来看一个简单的例子:int add(int x, int y) int d; d=x+y; return d;int mul(int x, int y) int d; d=x*y; return d;void main( ) int i,j,z; i=1; j=2; z=add(5,i+j); j=j+z; z=mul(i,j); printf(“z=%dn”,z);void main() a() b(int x) c( ) d( ) e( ) 1. a(); 2. 3. d=b(5)+10; 4. 5. e=c( ); 6. 7. d( ); 8. 9. e( ); 10. 11.12. 程序的执行过程如下:135791112108642函数嵌套调用 C语言不能嵌套定义,但可以嵌套调用,即在调用一个函数的过程中,又调用另一个函数。函数的递归调用函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮事务性培训
- 餐厅酒店服务礼仪培训
- 餐厅菜品培训
- 2026小松(中国)校招面试题及答案
- 2026中考冲刺动员大会校长发言稿:百日攻坚我们陪你全力以赴
- 餐厅服务培训总结
- 2025年针织学综合题库及答案
- 2025年心理学期末考试题库及答案
- 2026年耳鼻喉科护理实践指南知识竞赛题库及答案
- 考研复习方法总结
- 养老院春节安全培训内容课件
- 鼻眼相关解剖课件
- 中频电疗产品注册技术审查指导原则(2025年修订版)
- 跨学科视角下的食物地理研究
- 【《鼓式制动器的结构设计及三维建模分析》14000字(论文)】
- 渝20Q01 建设工程施工现场围挡及大门标准图集(2020版)DJBT50-133
- 【全球数据资产理事会】县域数据资产运营蓝皮书
- T/CBMCA 039-2023陶瓷大板岩板装修镶贴应用规范
- 时速公里动力集中鼓形电动车组培训设备中车唐山机车车辆
- 2024年高考一轮复习精细讲义第14讲圆周运动(原卷版+解析)
- DL∕T 5366-2014 发电厂汽水管道应力计算技术规程
评论
0/150
提交评论