用函数实现模块化程序设计(二)

用函数实现模块化程序设计(二)

 

一、函数的嵌套调用

C语言的函数定义是互相平行、独立的。即函数不能嵌套定义,但可以嵌套调用函数。即调用一个函数的过程中,又可以调用另一个函数

执行过程,如图:

例子:输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。

解题思路:

main中调用max1函数,找4个数中最大者

max1中再调用max2,找两个数中的大者

/* 输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。 */

#include "stdio.h"

void main()

{

int max1(int a,int b,int c,int d); /*对max1的声明*/

int a,b,c,d,max;

printf("请输入四个数字:");

scanf("%d,%d,%d,%d",&a,&b,&c,&d);

max=max1(a,b,c,d); /*调用max1函数,得到其中最大值,赋值给max*/

printf("max=%d \n",max);

return 0;

}

int max1(int a,int b,int c,int d)/*定义max1函数*/

{

int max2(int a,int b); /*max2的声明*/

int m;

m=max2(a,b); /*调用max函数,找出a和b的最大值*/

m=max2(m,c); /*调用max函数,找出m和c的最大值*/

m=max2(m,d); /*调用max函数,找出m和d的最大值*/

return(m); /*函数返回值是4个数的最大的*/

}

int max2(int a,int b)/*定义max2函数*/

{  if(a>=b)

return a;

else /*函数返回值是a和b中的大的*/

return b;

}

二、函数的递归调用

概念:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

例如:

int f(int x)

{

int y,z;

z=f(y);

return (2*z);

}

在调用f函数过程中,又调用f函数

练习1有5个学生坐在一起,问第5个学生多少岁?他说比第4个学生大2岁,问第4个学生岁数,他说比第3个学生大2岁,问第3个学生,又说比第2个学生大2岁,问第2个学生,说比第1个学生大2岁,最后问第1个学生,他说是10岁,请问第5个学生多大

解题思路:要求第5个年龄,就必须先知道第4个年龄

要求第4个年龄必须先知道第3个年龄

以此类推age(5)=age(4)+2

age(4)=age(3)+2

……..       age(n)=age(n-1)+2

#include <stdio.h>

void main()

{

int age(int n);

printf("第五个人的年龄:%d\n",age(5));/*输出年龄*/

}

int age(int n)/*求年龄的递归函数*/

{

int c;/*变量c用做存放函数的返回值的变量*/

if(n==1)

c=10;

else

c=age(n-1)+2;/*执行age函数过程中又调用age函数*/

return(c);

}

运行结果:18

当主函数的位置在age函数以后,主函数不用再对age函数进行声明

age函数共被调用5次,其中四次是在age函数中调用,也就是递归调用4次,另一次是在主函数中使用的。

练习2:用递归方法求n!。

解题思路:递归的思路跟递推是相反的,是直接从目标出发解决,要求n!必须知道n-1,才能求出n!=(n-1)!*n。所以递归公式为:

n!=1         (n=1或n=0)

n!=n*(n-1)!   (n>1)

/*用递归方法求n!*/

#include <stdio.h>

int main()

{int fac(int n);/*对被调函数fac声明*/

int n;  int y;

printf("请输入n的值:");

scanf("%d",&n);

y=fac(n);/*调用fac函数*/

printf("%d!=%d\n",n,y);

return 0;

}

int fac(int n)/*定义fac函数*/

{

int f;

if(n<0)

printf("数据错误");/*如果输入的n<0,则不正确*/

else if(n==0||n==1)

f=1;/*当n=1或n=0时等于1*/

else  f=fac(n-1)*n;/*递归调用fac*/

return(f);/*f就是n!*/

}

/*再求n!的时候一定要记得int数值范围,防止溢出*/

三、内部函数与外部函数

1)内部函数概念:如果一个函数只能被本文件中其他函数所调用,它称为内部函数

在定义内部函数时,在函数名和函数类型的前面加static,即:static 类型名 函数名(形参表)

2)外部函数概念:如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数,可供其他文件调用。

如函数首部可以为extern int fun (int a, int b)

如果在定义函数时省略extern,则默认为外部函数

四、进制之间的转换

十进制转换为——>二进制:如6的二进制,算法

结果就为:0110,注意:结果要从下往上写。

二进制转化为——>十进制:如0110的十进制等于:22*1+21*0+20*0=6。

简而言之:十进制转二进,除2取余数;二进制转换为十进制,乘以2的幂数。

十进制--->八进制

10进制数转换成8进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成8。

十进制--->十六进制

10进制数转换成16进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成16。

  • 十进制:0-9,满10进1。
  • 八进制:0-7,满8进1,用0开头表示。
  • 十六进制:0-9,A-F,满16进1,用0x开头表示。

习题:

/*9、 编程实现将任意的十进制整数转换成任意R进制数(R在2-16之间)。(C语言)*/

#include <stdio.h>

void main()

{

    //定义整型变量s,r分别代表十进制数跟r进制数

    int s,r,a;

     int i;

     //定义数组用来存放转换所得数据

    int cs[100];

    //提示用户输入数据

    printf("请输入一个十进制整数:");

    //接收用户输入

    scanf("%d",&s);

    printf("请输入需要转换的进制数(2-16之间):");

    scanf("%d",&r);

    if(r<2||r>16){

    printf("输入超出范围\n");

    }else{

    //十进制转换任意进制都是:十进制/任意进制取余

    for(i=0;s!=0;i++){

    cs[i]=s%r;

    s=s/r;

    }

}

    //数组遍历的逆向打印

   for(a=i;a>=0;a--){

    printf("%d",cs[a]);

    /*最终的结果不太正确,前几个数为乱码,具体自己也找不出原因在呢里*/

    }

}

时间: 2024-12-19 10:47:40

用函数实现模块化程序设计(二)的相关文章

Delphi基本之pascal语法(第五章.函数与过程程序设计)

第五章.函数与过程程序设计一.函数(包括标准函数和自定义函数) 1.函数的定义 格式:FUNCTION 函数名(<形参表>):返回值类型: VAR <变量说明> BEGIN <函数体> END [注]:1.形参表每个参数都写明其类型: 2.有且只有一个返回值,并且要将返回值赋值给函数名. [例]:求五边形的面积 function area(a,b,c:real):real; var p:real; begin p:=(a+b+c)/2; area:=sqrt(p*(p-

模块化程序设计

转自:http://www.softwarehistory.net/h/ChengxuShejiJichu/ 第 9 章 模块化程序设计 9 .1 模块化程序设计概念 人类在解决复杂问题时普遍采用的策略是“分而治之,各个击破”.程序设计人员在设计比较复杂的应用系统软件时,采用的也是这样的策略,即将复杂的任务分解成若干个子任务或者模块,再分别设计每个子任务/ 模块,正好像搭积木.修房子一样,整个程序是由一个个模块组成,这就是模块化程序设计的概念. 1 .自顶向下的设计方法 对比较复杂的程序设计问题

写个函数用来对二维数组排序

29.写个函数用来对二维数组排序(新浪) Foreach有两种语法: 语法一:foreach($arr as $value){ Echo $value; } 语法一:foreach($arr as $key=>$value){ Echo $key . "=>" . $value; } 使用foreach遍历二维数组 与数组排序有关的函数: ?  sort():对数组元素的值升序排列,不保留索引关系 ?  rsort():对数组元素的值降序排列,不保留索引关系. ?  aso

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

JavaScript的匿名函数和模块化的使用方法

对于开发人员来说,很多时候我们都会涉及到JavaScript的使用,而在使用过程中,最令人沮丧的就是变量没有相应的使用范围. 在开发中,对于任何变量.数组.函数.对象等,只要不在函数的内部,都会被默认为是全局的,意味着页面上的其他脚本都可以访问它,并可进行重写覆盖. 对于不必要放在函数内部的变量,我们要如何保证不被其他代码访问并重写覆盖呢?这时就需要将变量放在一个匿名函数的内部,定义完后立即调用,例如,在JavaScript中按如下方式编写,将会产生三个全局变量和两个全局函数: var name

【二】在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。 ```java public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. */ public static void main(String[] args) { int[][] arr =

SQL Server 第四堂课,创建存储过程。存储过程是一组编译在单个执行计划中的transact-SQL语句。存储过程相当于C#函数,可以允许模块化程序设计,允许更快执行如果某操作需要大量transct-SQL代码或需要重复执行,将在创建存储过程中对其进行分析和优化。

select *from fruit use shuiguo --存储过程格式 create proc 存储过程名 --输入参数:当调用存储过程时,所需要输入的数据 --输出参数:从存储过程中赋值后带出数据 as --存储过程内容 return 返回值 go exec 返回值=存储过程名 参数一,参数二,....参数N --进销存存储过程 alter proc Jinchuhuo --定义函数名,相当于C#语言里的 public int 函数名 @ids varchar(50), --定义变量,

数组和字符串与模块化程序设计方法与函数

eg: ATM机系统: #include<stdio.h>#include<stdlib.h>#include <string.h>int main(void){  char a[20],kh1[20],mm1[20];  char kh[20]="admin";  char mm[20]="123chen";  int i;  for(i=0;i<3;i++){   printf("请输入卡号:"); 

OpenGL一些函数详解(二)

OpenGL ES顶点数据绘制技巧 在OpenGL中,绘制一个长方体,需要将每个顶点的坐标放在一个数组中.保存坐标时有一些技巧(由于字母下标不好表示,因此将下标表示为单引号,如A1将在后文中表示为A' ): (1)将对立面坐标保存在相邻的位置,如坐标的保存顺序为:前面(A'ABB'),后面(D'DCC'),上面(D'A'B'C'),下面(DABC),左面(D'A'AD),右面(C'B'BC).因为对立面的坐标除了其垂直的那根轴的坐标相反以外,其他坐标值一样:如前面和后面(垂直于z轴),x和y的坐