c语言解析系列(4)函数

来源:互联网 发布:最幸福的人网络歌手 编辑:程序博客网 时间:2024/06/05 04:36

E函数

函数只要“有一个接口,一个出口”,就可以把复杂的程序连接起来。它为程序化大为小,实现模块化,避免了程序的繁长,为团队之间协作完成某一复杂的工程提供了便利的途径,高效快捷,既提高了团队协作能力,又锻炼了个人能力。所以说学会函数很重要。

函数的定义

1没有返回值

Void  函数名(参数)

{

 函数体

}

2有返回值

函数返回值类型名 函数名(参数)

{

函数体

Return (调用函数后的处理结果)

}

1:其实第二种包含第一种,这只是我的理解,第一种返回值类型为空而已,第二种用的更多,有代表性,就把这两个单独列出来了。

2:参数可以有,也可以为空。函数作为简化程序的一部分,要尽量做到有接口,有出口。

3:函数要尽量做到见名知意。当被调用函数过多时,可以快速知道该函数的作用,避免了思绪的混乱。

4:被调用函数尽量写在main()函数之前。若放在main()之后,需要事先在main()里做声名,有点麻烦,视个人习惯而定。

在函数的调用过程中,要注意的问题。

1):调用函数时函数名要对应。

 想调用函数求两者中的最大值应调maxa,b),不要掉mina,b,只是最低级的错误。

2):实参与形参的对应。

  形参与实参的个数的要相同,并且形参和实参的类型要一致。在调用函数之后,在调用函数内,形参也可以作为一个已知数据使用。

3):返回值的对应

 调用函数时,函数的返回值类型要和经过程序处理之后的数据类型一致。对于有返回值的函数,在main()函数中还要接收返回值,不能有去无回。(这里实际上还涉及到强制类型转化的知识)

4)关于函数的嵌套调用。

 以求三个数最大值为例,可以这样用。

 M=maxamax(b,c)

 这是一个函数被用了两次,嵌套三次甚至更多次也是如此。

5)函数的递归调用

 以课本上求年龄为例。

 #include<stdio.h>

int age(int n)

{

    int c;

 if(n==1)//第一个人的年龄为十岁

  c=10;  

   else

   c=age(n-1)+2;//第二个比第一个大两岁,以后依次类推。

 return c;     

}

 

int main()

{

 printf("%d",age(5));//求第五个人的年龄

getch();   

return 0;   

}

6)函数与数组

 a:可以把数组传入函数中进行处理,只不过返回值只能有一个。

b:要想返回数组,可以再main()中传一个,处理以后再返回一个结果即可。c:要想返回一组数,可以用链表。链表很强大。

d:学会数组的使用,传结构体等就会手到擒来。

这是一个传结构体的例子,了解就可以。

有五个学生,每个学生的数据包括学号,姓名,三门课的成绩,从键盘输入五个学生的数据,要求打印出每个学生的平均成绩,以及最高分。

要求:用一个函数输入五个学生的数据;用一个函数求总平均分;用函数找出最高分学生数据,总平均分和最高分的学生的数据都在主函数中输出。

#include<stdio.h>

struct student

{

 int num;

 char name[20];

 double math;     

 double chinaese;

 double pe;

 double average;     

}s[5];//定义结构体数组

void action(struct student s[],int n)//传入结构体数组,求最大值

 {

    int i,m;

 double  max=s[0].average;

    for(i=1;i<n;i++)

  {

   if(s[i].average>s[0].average)

   max=s[i].average;

   m=i;

  }

  printf("max=%lf ",max) ;

 }

double add(struct student s[],int n) //传入结构体数组,求平均分

{

 int i;

 double sum=0,av;

 for(i=0;i<n;i++)

{ scanf("%d%s%lf%lf%lf",&s[i].num,s[i].name,&s[i].math,&s[i].chinaese,&s[i].pe);

 s[i].average=(s[i].math+s[i].chinaese+s[i].pe)/3;

 sum=sum+s[i].average;

}

 av=sum/5;

action(s,5);

return av;

}

int main()

{

 printf("average=%lf\n",add(s,5));

return 0;   

}

在函数的学习过程中还会涉及到“全局变量”和“局部变量”,以及变量的生存期、存储方式。

全局变量:在宏定义“#define n 100”中的“n”就是一个全局变量。类似的就是全局变量。

       从程序开始执行到程序的死亡,这之间全局变量一直在发挥着它的作用,它随程序生而生,随程序死而死。这也它的生存期,它的作用域是全部程序。全局变量全部放在静态存储区。

局部变量:它只在程序执行的某一阶段发挥作用,这时它活着,程序执行完这一段之后,它就死掉了。这也是它的生存期,局部变量在函数中出现的较多,这样的变量在函数中得到了完美的体现。它的存储类别有四种 auto(自动)、static(静态)、register(寄存器),extern(外部的) 

变量的存储方式:

 在内存中存储空间可分为,程序区,动态存储区和静态存储区三种。

  动态存储区存放以下数据:

  1:函数形式参数。

  2:函数中定义的没用关键字static声明的变量。

(3:函数调用时现场保护和返回地址。

有这样的一个例子,分析一下吧!

#include<stdio.h>

#define n 1

int a=10;

int main()

{

 int b=5,c=8,d=2,i;

    c=b+d;

    {

      int b=3,c=6;

     for(i=0;i<n;i++)

     {

       c=b+d;

        b=a-1;

        d=d-b;                     

     }       

    printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);     

    }   

   printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);

   getch();

   return 0;

}

原创粉丝点击