嵌套循环:
计算1!+2!+3!+······+n!的值,我们一般自定义一个新函数进行计算,如下图:
除此之外,其实还有一种方式能解决这个问题,那就是嵌套循环。
其思路为:sum=sum+第i项
累加求和的程序段为:
sum=0;
for(i=1;i<=n;i++){
sum=sum+i!
}
又可以写成:
sum=0;
for(i=1;i<=n;i++){
item=i!;
sum=sum+item;
}
所以完整的程序为:
函数的定义:
函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。例如,scanf()、printf()等为库函数,由C语言系统提供定义,编程时只要直接调用就行;但是有些函数,需要用户自己定义,属于自定义函数。
从函数实现计算功能角度来看,C语言中称其为函数参数。f(r,h)计算后有结果值,在C程序中必然为某一种数据类型,称其为函数类型。
函数定义的一般形式为:
函数类型 函数名(形式参数表)
{
函数实现过程
}
1.函数首部:
函数首部由函数类型、函数名和形式参数表组成,位于函数定义的第一行。函数首部中,函数名是函数整体的称谓,需用一个合法的标识符表示。函数类型指函数结果返回的类型,一般与return语句中表达式的类型一致。形参表中给出函数计算所要用到的相关已知条件,以类似变量定义的形式给出,其格式为:
类型1 形参1,类型2 形参2,···类型n,形参n
形参表中各个形参之间用逗号分隔,每个形参前面的类型必须分别写明。函数的形参数量可以是一个,也可以是多个,或者没有形参。
注:
函数首部后面不能加分号它和函数体一起构成完整的函数定义。且正确表示为 double cylinder(double r,double h)而非double r,h。
2.函数体:
函数体体现函数的实现过程,由一堆大括号内的若干条语句组成,用以计算,或完成特定的工作,并用return语句返回运算的结果。
函数的调用:
1.函数调用过程:
任何C程序执行,首先从主函数main()开始,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后将返回主函数,然后再从原先暂停的位置继续执行。
2.函数调用的形式:
函数调用的一般形式为:
函数名(实际参数表)
实际参数(简称实参)可以是常量、变量和表达式。
3.参数传递:
函数定义时,位于其首部的参数被称为形参,如r和h。主调函数的函数被称为实参。形参除了能接受实参的值外,使用方法与普通变量类似。形参和实参必须一一对应,两者数量相同,类型尽量一致。程序运行遇到函数调用时,实参的值依次传给形参,这就是参数传递。
4.函数结果返回:
函数结果返回的形式如下:
return 表达式;
先求解表达式的值,再返回其值。一般情况下表达式的类型与函数类型应一致,如果两者不一致,以函数类型为准。return语句的作用有两个:一是结束函数的运行;二是带着运算结果(表达式的值)返回主调函数。
5.函数原型声明:
C语言要求函数先定义后调用,就像变量先定义后使用一样。如果自定义函数被放在主调函数的后面,就需要在函数调用前,加上函数原型声明(或称为函数声明)。
函数声明的目的主要是说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。函数声明的一般格式为:
函数类型 函数名(参数表);
即与函数定义中的第一行(函数首部)相同,并以分号结束。
自定义函数并调用计算五边形面积:
因此,可以总结出使用自定义函数的程序有以下几个优点:
(1)程序结构清晰,逻辑关系明确,程序可读性强;
(2)解决相同或相似问题时不用重复编写代码,可通过 调用函数来解决,减少代码量;
(3)利用函数实现模块化编程,各模块功能相对独立,利用“各个击破”降低调试难度。
判断一个数是否为完全平方数:
不返回结果的函数:
之前的函数都是起计算(或判断)作用,最终有一个函数结果返回。在很多程序设计中,调用函数不是为了得到某个运算结果,而是要让它产生某些作用。如下图的输出数字金字塔,就是如此。
不返回结果的函数定义:
void 函数名(形参表)
{
函数实现过程
}
函数类型为void,表示不返回结果,函数体中可以使用没有表达式的return语句,也可以省略return。void类型的函数虽然不直接返回一个值,但它的作用通常以屏幕输出等方式体现。(void不能省略,否则,函数类型被默认定义为int。)
结构化程序设计思想:
1.自顶向下分析问题的方法:
这个方法,就是把大的复杂的问题分解成小问题后再解决。面对一个复杂的问题,首先进行上层(整体)分析,并分解为子问题,若子问题还复杂,继续分解直到处理对象相对简单、容易解决为止。如课本P110页的“学生成绩统计程序的层次结构图”便是如此。
2.模块化设计:
经过问题分析,设计好层次结构图后,就进入这个阶段。在这个阶段,需要做到:
- 一个模块只完成一个指定的功能
- 模块之间只通过参数进行调用
- 一个模块中只有一个入口和出口
- 模块中慎用全局变量
3.结构化编码主要原则:
1.模块化设计后,每一个模块都可以独立编码。
2.对变量、函数、常量等命名时,要见名知义,有助于对变量含义或者函数功能的理解。
3.在程序中添加必要的注释,增加程序的可读性。
4.要有良好的程序层次分明、结构清楚、错落有致和更加清晰。
5.程序要清晰易懂,语句结构要简单直接。在不影响功能和性能时,做到结构清晰第一,效率第二。
6.程序要有良好的交互性,输入有提示,输出有说明,并且尽量采用统一整齐的输出。
局部变量:
C语言中把定义在函数内部的变量称为局部变量,局部变量的有效作用范围局限于所在的函数内部。形参是局部变量。
使用局部变量可以避免各个函数之间的变量相互干扰。如下图的函数complex_prod()和complex_add()使用了同名的形参,且与值函数实参变量变量也同名,但由于分属不同函数,它们有各自不同的变量实体和使用范围,不会互相干扰。这一特征使得C语言在结构化程序设计中非常有用。
除了作用于函数的局部变量外,C语言还允许定义作用于复合语句中的局部变量,其有效使用范围被局限于复合语句内,一般用作小范围内的临时变量。
局部变量一般定义在函数或复合函数语句的开始处,标准C规定其不能定义在中间位置。
全局变量:
局部变量虽保证了函数的独立性,但程序设计有时还要考虑不同函数之间的数据交流,及各函数的某些同意设置。当一些变量需要被多个函数共同使用时,参数传递虽然是一个办法,但必须通过函数调用才能实现并且函数只能返回一个结果,这会使程序设计受到很大的限制。为了解决多个函数间的变量共用,C语言允许定义全局变量。
定义在函数外而不属于任何函数的变量称为全局变量。全局变量的作用范围是从定义开始到程序所在文件的结束,它对作用范围内所有的函数都起作用。其他见书p113.
本周有意思的题目(这是我打过最长的代码):
2021.11.20
今天,回看了这篇文章,感觉自己上一题的做法很幼稚,所以做了改进。
这便引进了一种排大小的方法:
本周学习内容到此为止,
其他漏下的习题我会另发文章补上。
如有错误,欢迎指出,谢谢。