C语言-函数(二):函数的类型及结构化程序设计

一、函数的类型
函数原型声明中的类型就是函数的类型,一般会通过return语句返回一个数据,这个数据的类型可以是char、int、double等等,其类型与函数的类型应一致。还有一种类型是void类型,这种类型表明该函数不返回任何数据,该类型的函数的调用只是让它产生某些作用而已。
不返回结果的函数定义:

void 函数名(形参表)		/*函数首部*/
{
	函数实现过程			/*函数体*/
}

该类函数的类型为void,可以理解为空类型,它表示不返回结果,函数体中可以使用没有表达式的return语句,也可以不使用return语句。若使用return语句,则return语句后不加任何表达式,否则会报错。void类型的函数不返回任何值,但是该函数的过程会产生某些副作用,例如输出、等待等。
不返回结果的函数定义中,void不能省略;否则,函数类型被默认定义为int。
void类型的函数,如果省略了return语句,当函数中所有语句执行完后,遇到大括号后会自动返回到主调函数;如果不省略return语句,则在return语句结束函数后返回到主调函数。这种函数由于没有返回结果,所以不能出现在表达式中,通常都是独立调用。
不返回结果的函数在定义、调用、参数传递、函数声明上,思路与返回结果的函数完全相同,只不过是函数类型变成了void。它适用的场合主要是把一些确定的、相对独立的程序功能封装成函数。主函数通过调用不同的函数,体现算法步骤,而各步骤的实现有相应函数完成,从而简化函数结构,体现结构化程序设计的思想。

例:数字金字塔

#include <stdio.h>

void pyramid(int n);	/*函数声明*/

int main(void)
{
	int n;
	
	printf("Enter n:");
	scanf("%d", &n);
	pyramid(n);			/*调用函数,输出n行数字金字塔*/
	
	return 0;
}

void pyramid(int n)		/*函数定义,输出n行数字金字塔*/
{
	int i, j;
	
	for (i=1; i<=n; i++){		/*需要输出的行数*/
		for (j=1; j<=n-i; j++){	/*输出每行左边的空格*/
			printf(" ");
		}
		for (j=1; j<=i; j++){	/*输出每行的数字*/
			printf("%d ", i);	/*%d后面有1个空格*/
		}
		putchar('\n');
	}
}

Enter n:6
       1
      2 2
     3 3 3
    4 4 4 4
   5 5 5 5 5
  6 6 6 6 6 6

该例中pyramid()就是一个不返回结果的函数,它的功能是在屏幕上输出数字金字塔,不做运算,没有运算结果,也不需要返回值。

二、结构化程序设计思想
结构化程序设计强调程序设计的风格和程序结构的规范化,提倡清晰的结构,其基本思路是将一个复杂问题的求解过程划分为若干阶段,每个阶段要处理的问题都容易被理解和处理。包括按自顶向下的方法对问题进行分析、模块化设计和结构化编码3个步骤。适合规模较大的程序设计。

1、自顶向下分析问题的方法
自顶向下分析问题的方法,就是把大的复杂的问题分解成小问题后再解决。面对一个复杂的问题,首先进行上层(整体)的分析,按组织或功能将问题分解成子问题,如果子问题仍然十分复杂,再做进一步分解,直到处理对象相对简单、容易解决为止。当所有的问题都得到了解决,整个问题也就解决了。在这个过程中,每一次分解都是对上一层问题进行的细化和逐步求精,最终形成一种类似树形的层次结构,来描述分析的结果。
例如,开发一个学生成绩统计程序,输入一批学生的5门课程的成绩,要求输出每个学生的平均分和每门课程的平均分,找出平均分最高的学生。
按自顶向下、逐步细化的分析上述问题,按功能将其分解为4个子问题:成绩输入、数据计算、数据查找(查找最高分)和输出成绩,其中数据计算又分解为计算学生平均分和计算课程平均分2个子问题,其层次结构如下图所示。

按照自顶向下的方法分析问题,有助于后续的模块化设计与测试,以及系统的集成。

2、模块化设计
经过问题分析,设计好层次结构图后,就进入模块化设计阶段了。在这个阶段,需要将模块组织成良好的层次系统,顶层模块调用其下模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能。
模块化设计时要遵循模块独立性的原则,即模块之间的联系应尽量简单。体现在:
(1)一个模块只完成一个指定的功能。
(2)模块之间只通过参数进行调用。
(3)一个模块只有一个入口和一个出口。
(4)模块内慎用全局变量。
模块化设计使程序结构清晰,易于设计和理解。当程序出错时,只需改动相关的模块及其连接。模块化设计有利于大型软件的开发,程序员们可以分工编写不同的模块。
在C语言中,模块一般通过函数来实现,一个模块对应一个函数。在设计某一个具体的模块时,模块中包含的语句一般不要超过50行,这既便于编程者思考与设计,也利于程序的阅读。如果该模块功能太复杂,可以进一步分解到低一层的模块函数,以体现结构化的程序设计思想。
如对上图学生成绩统计程序的模块化设计:
(1)设计7个函数,每个函数完成一项功能,代表一个模块。包括:主函数main()、成绩输入input_stu()、数据计算calc_data()、计算学生平均分avr_stu()、计算课程平均分avr_cor()、数据查找(查找最高分)highest()和输出成绩output_stu()。
(2)模块间的调用关系为:主函数main()依次调用函数input_stu()、calc_data()、highest()和output_stu(),函数calc_data()中分别调用函数avr_stu()和avr_cor(),完成数据计算的功能。

3、结构化编码主要原则
(1)经模块化设计后,每一个模块都可以独立编码。编程时应选用顺序、选择和循环3种控制结构,对于复杂问题可以通过这3种结构的组合、嵌套实现,以清晰表示程序的逻辑结构。
(2)对变量、函数、常量等命名时,要见名知义,有助于对变量含义或函数功能的理解。如求和用sum做变量名,求阶乘函数取名fact等,忌贪图方便取名a、b、c、x、y等。
(3)在程序中增加必要的注释,增加程序的可读性。序言性注释一般放在模块的最前面,给出模块的整体说明,包括标题、模块功能说明、模块目的等;状态性注释一般紧跟在引起状态变化语句的后面予以必要说明。
(4)要有良好的程序视觉组织,利用缩进格式,一行写一条语句,呈现出程序语句的阶梯方式,使程序逻辑结构层次分明、结构清晰、错落有致、更加清晰。
(5)程序有良好的交互性,输入有提示,输出有说明,并尽量采用统一整齐的格式。

参考 C语言程序设计(第4版)/何钦铭,颜晖
例题及课后习题参考程序https://gitee.com/sgxgitee/mooc-c

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值