C语言程序设计案例教程 教学课件 ppt 作者 廖湖声 叶乃文 周珺 第5章_程序的组织结构

上传人:E**** 文档编号:89346090 上传时间:2019-05-23 格式:PPT 页数:48 大小:243.50KB
返回 下载 相关 举报
C语言程序设计案例教程 教学课件 ppt 作者  廖湖声 叶乃文 周珺 第5章_程序的组织结构_第1页
第1页 / 共48页
C语言程序设计案例教程 教学课件 ppt 作者  廖湖声 叶乃文 周珺 第5章_程序的组织结构_第2页
第2页 / 共48页
C语言程序设计案例教程 教学课件 ppt 作者  廖湖声 叶乃文 周珺 第5章_程序的组织结构_第3页
第3页 / 共48页
C语言程序设计案例教程 教学课件 ppt 作者  廖湖声 叶乃文 周珺 第5章_程序的组织结构_第4页
第4页 / 共48页
C语言程序设计案例教程 教学课件 ppt 作者  廖湖声 叶乃文 周珺 第5章_程序的组织结构_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《C语言程序设计案例教程 教学课件 ppt 作者 廖湖声 叶乃文 周珺 第5章_程序的组织结构》由会员分享,可在线阅读,更多相关《C语言程序设计案例教程 教学课件 ppt 作者 廖湖声 叶乃文 周珺 第5章_程序的组织结构(48页珍藏版)》请在金锄头文库上搜索。

1、5.3 自定义函数,5.2 标准函数,5.1 函数概述,5.4 函数与数组的应用实例,5.5 递归算法与递归函数,第5章 程序的组织结构,5.1 函数概述,结构化程序设计方法的核心是自顶向下,逐步求精,具体的实现策略是将复杂的问题逐步分解成相对简单的子问题,这样将有利于降低解决问题的难度,提高程序开发的效率。将一个问题分解成若干个子问题的过程称为模块化。 在C程序中,模块用函数实现。函数是构成C程序的基本单位。它由函数首部和函数体两个部分组成,函数首部包含函数的返回类型、函数名称和参数表的声明,函数体包含实现特定功能所需要执行的语句序列。,5.2 标准函数,C语言提供了很多标准函数,它们被放置

2、在一起,形成了一个标准函数库。 函数原型 函数原型是指不包含函数体的函数声明。 C语言规定,所有的函数必须先定义后调用。对于标准函数而言,由于它们的定义已经在C语言提供的标准函数库中,所以,人们在调用它们的时候,只需要在程序的前面利用编译预处理命令include将相应的函数原型加入到程序中就可以了。,例1:根据给定的两个坐标点(x1,y1)和(x2,y2),计算两点之间的距离。,问题分析 计算两点之间距离的公式为 d=,在这个公式中含有平方和开平方的运算,可以直接利用C语言提供的标准函数实现这两个运算。,算法描述,#include #include main( ) int x1, y1, x2

3、, y2; double distance; printf(“nEnter 2 coordinates(x1,y1,x2,y2)n“); scanf(“%d%d%d%d“, ,程序代码,例2:掷骰子游戏。 骰子是一个有六个面的正方体,每个面分别印有16之间的小圆点代表点数。假设这个游戏的规则是:两个人轮流掷骰子6次,并将每次投掷的点数累加起来。点数多者获胜;点数相同平局。 请编写程序,模拟这个游戏的过程,并给出玩100盘之后,谁是最终的获胜者。,随机数的产生及应用实例,问题分析 由于每个人掷骰子所得到的点数是随机的,所以需要借助随机数发生器,每次产生一个16之间的整数,以此模拟玩者掷骰子的点数

4、。 为了计算在每盘中,甲、乙两人所掷的点数,需要定义两个int型变量d1,d2,用于作为记录每个人投掷点数的累加器。 为了记录每个人的获胜盘数,需要再定义两个int型变量c1,c2,用于记录每个人获胜的盘数。,算法描述,#include #include main() int d1, d2, c1, c2, i, j; c1 = c2 = 0; /* 初始化 */ randomize( ); /* 初始化随机数产生器 */ for (i=1; id2) c1+; /* 累加获胜盘数 */ else if (d1c2) /* 输出最终获胜者信息 */ printf(“nThe first win

5、.“); else if (c1c2) printf(“nThe second win.“); else printf(“They tie.“); ,程序代码,5.3 自定义函数,函数的定义 基本格式 () ; 例: double distance(int x, int y) double d; d = sqrt(x*x+y*y); return d; ,C语言规定,一个函数可以有返回值,也可以没有返回值。如果有返回值,返回值的类型在函数名前声明,并在函数体中利用return 语句将返回值返回;如果没有返回值,在函数名前声明void。默认的返回类型是int。 函数名不但应该符合C语言的自定义标

6、识符命名规范,还应该“见名知意”。 参数表是函数之间交换信息的接口。既可以通过它将外界的数据传递给函数,也可以通过它将函数的操作结果带出函数。如果形式参数属于一维数组类型,无须指出一维数组的元素个数。 函数体是函数的核心部分,在这里列出了需要执行的语句序列。,函数的调用 函数调用语句的基本格式为: (); 实在参数与形式参数的数据类型和个数一一对应。,函数的返回值 在声明函数的时候,函数名前使用了保留字void,说明这个函数没有返回值;否则,这个函数执行完毕后,应该返回一个相应类型的数值。 return 表达式;,参数的传递 定义函数时所给的参数被称为形式参数,这是由于当函数没有处于执行状态时

7、,系统并不为这些参数分配存储空间,换言之,这些参数此时并不存在,只是用来说明在调用这个函数时需要在这个位置向函数提供的数据类型,因此,在调用函数之后,参数传递需要经历两个基本步骤:首先,根据形式参数的声明格式,为每一个形式参数分配存储空间;然后再将实在参数的值赋给对应的形式参数。,例3:输出乘法口诀表。 乘法口诀表又被称为“九九表”,是一种小学生在学习乘法运算时需要熟背的一个口诀表。它是一个9行9列的二维表格,加上一个行标题和一个列标题,显示出来应该是10行10列。,自定义函数的应用实例,问题分析 行与行之间可以采用若干个“=”或“-”字符表示表格之间的线段,为此,可以定义一个函数,专门用来连

8、续地显示若干个字符,以避免在每次需要显示线段的时候,都重复地书写相应的语句序列。,#include void drawLine(int n,char ch); /* 连续显示n个ch字符 */ main() int i,j; printf(“n 9.9 tablen“); /* 显示表名 */ drawLine(30, =); /* 显示每列的标题 */ printf(“n 1 2 3 4 5 6 7 8 9“); drawLine(30, =); for (i=1; i=9; i+) /* 显示每行的内容 */ printf(“n%3d“, i); for (j=1; j=9; j+) pr

9、intf(“%3d“, i*j); if (i9) drawLine(30, -); else drawLine(30, =); ,void drawLine(int n, char ch) /*连续显示n个ch字符*/ int i; putchar(n); /*换行*/ for (i=1; i=n; i+) putchar(ch); /*连续显示n个字符ch*/ ,例4:计算 要求精确度达到10-6。,问题分析 在这个公式中,第i项的分子是xi;分母是i!。为了便于计算每一项的数值,设计了两个函数power( )和factorial( ) 分别用来完成计算xi和i!的任务。另外,为了更好地体

10、现模块化的设计思路,再设计一个函数e( ) 用于计算ex。,算法描述,#include long power(int x, int y); long factorial(int n); double e(int x); main( ) int x; printf(“nEnter x:“); scanf(“%d“, ,程序代码,long factorial(int n) /* 计算n! */ int i; long f = 1; for (i=2; i= 1E-6 ); /* 精度的检查 */ return result; ,程序代码,5.4函数与数组的应用实例,计算最长文本行 所谓文本行是指以

11、换行符n作为结束标志的文本序列。,例5:从键盘输入一组文本行,求出最长行并且输出。,问题分析 从问题的求解要求可知,没有必要保存输入的所有文本行。只需保存已经输入各行中的最长行,以及刚输入的当前行。 设计一个专门用于计算最长文本行的函数void readline(char maxline )。其实现过程为:一边输入文本行保存于数组line、一边与当前最长的文本行长度进行比较。如果新输入的文本行更长,则更新记录最长文本行的信息,最后得到的最长文本行将通过参数带出去。,算法描述,#include #include void readline(char maxline ); main() char

12、maxline80=“; readline(maxline); /* 输入并计算最长行 */ printf(“nThe longest line is:n“); puts(maxline); /* 输出最长行 */ ,程序代码,void readline(char maxline ) /* 输入并计算最长文本行 */ char line80; int maxlength; maxlength=0; /*初始化*/ line0=0; printf(“nEnter text lines:n“); do int n; gets(line); /*输入文本行*/ n = strlen(line); i

13、f (nstrlen(maxline) /*与记录的最长文本行进行比较*/ maxlength = n; /*更新记录最长文本行的信息*/ strcpy(maxline, line); while (n0); ,程序代码,冒泡排序 为了便于查找、统计,排序是一种经常需要进行的操作。排序的方法有很多种,上一章中介绍的简单选择排序是一种基于选择手段实现的排序方法。 冒泡排序的基本思路是不断地将所有相邻数据进行比效,如果前面的数据大于后面的数据(ajaj+1),就将两个位置的数据进行交换,最终实现将所有的数据按照非递减的顺序重新排列的目的。,问题分析 将整个待排序的数据序列划分成有序区域和无序区域。

14、初始状态有序区域为空,无序区域包括所有待排序的数据。 对无序区域从前向后依次对相邻的两个数据进行比较,若逆序则将其交换,从而使得较小的数据像泡沫一样“飘浮”(向前),较大的数据“下沉”(向后)。 每经过一趟冒泡排序,都会使无序区域中的最大数据进入有序区域。如果有n个数据等待排序,则最多经过n-1趟冒泡排序就可以将所有的数据排列好。,例6:冒泡排序。,算法描述,#include #include #define NUM 10 void input(int value ); void output(int value ); void sort(int value ); main( ) int va

15、lueNUM; /* 存储待排序的数据数列 */ input(value); output(value); sort(value); output(value); void input(int value ) /* 输入待排序数据 */ int i; printf(“nEnter %d integers:“,NUM); for (i=0; iNUM; i+) scanf(“%d“, ,程序代码,void output(int value ) /* 输出显示数据数列 */ int i; printf(“n“); for (i=0; i=1; i-) /* 控制排序趟数 */ for (j=0; jvaluej+1) /* 如果两个相邻数据逆序,交换 */ temp = valuej; valuej = valuej+1; valuej+1 = temp; ,程序代码,5.5 递归算法与递归函数,概述 n!其含义为1234(n-1) n。从这个数学公式中可以发现, n!等于n与(n-1)!的乘积。即将计算n! 的过程分解成n与(n-1)!的乘积;这样分解的子问题除了n的值以外,与原问题具有相同的特征,所以求解子问题的基本方

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号