c语言解析系列(4)函数
来源:互联网 发布:最幸福的人网络歌手 编辑:程序博客网 时间:2024/06/05 04:36
E函数
函数只要“有一个接口,一个出口”,就可以把复杂的程序连接起来。它为程序化大为小,实现模块化,避免了程序的繁长,为团队之间协作完成某一复杂的工程提供了便利的途径,高效快捷,既提高了团队协作能力,又锻炼了个人能力。所以说学会函数很重要。
函数的定义
1没有返回值
Void 函数名(参数)
{
函数体
}
2有返回值
函数返回值类型名 函数名(参数)
{
函数体
Return (调用函数后的处理结果)
}
1:其实第二种包含第一种,这只是我的理解,第一种返回值类型为空而已,第二种用的更多,有代表性,就把这两个单独列出来了。
2:参数可以有,也可以为空。函数作为简化程序的一部分,要尽量做到有接口,有出口。
3:函数要尽量做到见名知意。当被调用函数过多时,可以快速知道该函数的作用,避免了思绪的混乱。
4:被调用函数尽量写在main()函数之前。若放在main()之后,需要事先在main()里做声名,有点麻烦,视个人习惯而定。
在函数的调用过程中,要注意的问题。
1):调用函数时函数名要对应。
想调用函数求两者中的最大值应调max(a,b),不要掉min(a,b),只是最低级的错误。
2):实参与形参的对应。
形参与实参的个数的要相同,并且形参和实参的类型要一致。在调用函数之后,在调用函数内,形参也可以作为一个已知数据使用。
3):返回值的对应
调用函数时,函数的返回值类型要和经过程序处理之后的数据类型一致。对于有返回值的函数,在main()函数中还要接收返回值,不能有去无回。(这里实际上还涉及到强制类型转化的知识)
4)关于函数的嵌套调用。
以求三个数最大值为例,可以这样用。
M=max(a,max(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;
}
- c语言解析系列(4)函数
- c语言解析系列(5)指针
- C语言学习笔记系列(4)I/O函数
- 函数指针解析(C语言)
- 函数指针解析(C语言)
- C语言str函数系列
- C语言str函数系列
- C语言str函数系列
- C语言str函数系列
- C语言str系列函数
- C语言字符串函数解析
- C语言时间函数解析
- C语言中变参函数解析
- 配置文件解析函数(C语言)
- 配置文件解析函数(C语言)
- C语言realloc函数解析
- c语言解析系列(1)输入和输出
- c语言解析系列(2)选择语句
- c语言解析系列(1)输入和输出
- 剑指offer-->面试题6 重建二叉树
- c语言解析系列(2)选择语句
- TCL语言相关
- c语言解析系列(3)循环和数组
- c语言解析系列(4)函数
- eclipse中的各种调试
- c语言解析系列(5)指针
- java_abstract factory
- Android 相对布局:RelativeLayout
- c语言解析系列(6)用户建立自己的数据类型
- Android 创建其他应用的上下文对象
- VS-Addin
- c语言解析系列(7)文件和动态内存分配和指向它的指针变量