学习笔记---自定义函数基础

来源:互联网 发布:esp8266与51单片机链接 编辑:程序博客网 时间:2024/04/25 05:25

自定义函数

简述:


C语言程序中,软件模块用函数实现


用于实现模块化程序设计:

1.将一个大的程序划分成若干程序模块,每个模块实现一定的功能么,以方便分工,或降低开发难度。


2.程序进行调试时,分别对每一模块进行调试,在较小的范围内查错并改正。


核心思想:

自顶向下,逐步求精。


优势:

降低程序的复杂度,使程序设计、维护、阅读、调试等操作简单化


函数三要素:

函数名、函数返回值、函数参数。

如:float f1(float x);

其中f1是函数名,f1前的float是函数返回值类型,float x是函数参数。



示例代码1:

#include <stdio.h>#include <stdlib.h>#include <math.h>/*求f1(x)=3*x^3+2*x^2-1*/float f1(float x){    float y;    y=3*x*x*x+2*x*x-1;    return y;}int main(){    float x,y;    scanf("%f",&x);    y=f1(x);//这个公式十分亲切    printf("x=%.3f,y=%.3f\n",x,y);    return 0;}
结果:



解析:

如上代码将通过x求y的过程封装入f1()这个函数,在需要使用这段代码时,只需要使用y=f(x);这种中学数学中使用了无数次的表示形式即可。


分类:


自定义函数类别:






由函数的参数分类:

无参函数:
主调函数不必为调用函数提供参数
形式: 
  类型标识符  函数名([void]){语句}

有参函数:
调用函数时,由主调函数向被调函数提供数据。
形式:
  类型标识符  函数名(形式参数表列){语句}


参数类别:

形式参数(形参)
在定义函数时,函数名后面括号中的变量

实际参数(实参)
在调用函数时,函数名后面括号中的参数(可以是一个表达式)

要点:

注1:实参变量对形参变量进行值传递(对形参的操作不会影响到实参)
注2:形参只能是变量(因为需要对形参赋值,可以参考赋值运算符的使用规则
注3:定义函数时指定形参,但并不分配存储单元。在函数调用时才会为其分配存储单元
注4:当函数调用结束时,函数中用到的非静态局部变量(大部分形式参数)占用的内存空间会被释放。
注5:因为每个函数都有专有的内存空间用于存储变量(局部变量),所以允许在不同的函数中使用相同的参数名




按函数返回值分类:

无返回值函数:

返回值为void类型,只完成某些操作。


有返回值函数:

返回值为函数定义(声明)时的数据类型

执行完毕返回return后的值。


return语句:

意义:

用于函数的返回,

形式:

return (表达式);

return 表达式;

return;


注:当有多个return语句时,执行到哪个,哪个起作用(直接返回)。


函数的返回:

包括:

1.执行流程的返回:由被调用函数返回到主调函数。

2.执行结果的返回:将被调用函数执行得到的结果带回主调函数。


要点:

1.无返回值的函数return语句可以省略,而有返回值的函数必须写return语句

2.旧的C语言标准中允许main函数无返回值(void),但最新的标准规定main函数必须要有一个整型的返回值(int)并且在正常结束时,返回一个0(return 0;  这里返回不同的值代表不同的状态,但这里不深入研究)

这是因为Linux之类的系统中要求程序必须给操作系统返回值,以方面识别程序的运行状态。为了提高代码的兼容性,最新的标准做出了这样的规定。

3.当返回的类型和定义的返回类型不匹配时,如:

long f1(float x){    float y;    y=3*x;    return y;}
系统会自动对返回值进行数据类型的转换,转换的规则和赋值时自动数据类型转换的规则相同。




进阶使用与要点


代码示例1:

#include <stdio.h>#include <stdlib.h>/*这个程序用于输出指定符号组成的三角图形*/void printchs(int,char);//这里在定义之前声明了这个函数的返回值类型、名字、参数类型和个数int main(){    int i,n;    char ch1,ch2;    printf("请输入金字塔层数:");    scanf("%d",&n);    getchar();    printf("请输入金字塔的组成字符:");    ch1=getchar();    getchar();    printf("请输入空白处的填充字符:");    ch2=getchar();    getchar();    for(i=0;i<n;i++)    {        printchs((n-i-1),ch2);        printchs((2*i+1),ch1);        printf("\n");    }    return 0;}void printchs(int m,char ch){    int j;    for(j=0;j<m;j++)    {        printf("%c",ch);    }}

结果:


解析:

注意!这里如果要用固定的字符,不能使用printchs((n-i-1),">");之类的!因为ch2的位置要求一个字符型的参数,而用双引号的话,就变成了字符串型的参数了!



代码示例2:

#include <stdio.h>#include <stdlib.h>/*这个程序用来测试自定义函数的使用*///先声明函数的返回值,名称,形式参数,使得后面的方法能够直接调用这些函数。这可以说是java中接口的雏形void printstars(void);//括号内的形式参数使用void表示无传入参数void printmessage();//void类型表示无返回值int max(int a,int b);//声明带参数的函数int min(int,int);//声明的时候,形式参数的名字可以不写int sum(int c,int d);//声明的时候的形式参数名可以和定义时的形式参数名不同,只要数据类型相同即可int main(){    printstars();//因为上方已经声明过这个函数的使用方式(名称、参数、返回值)    printmessage();//所以这里直接调用并不会出错    printstars();//即使函数还未定义    int a=5,b=8;    printf("max:%d\n",max(a,b));    printf("min:%d\n",min(a,b));    printf("sum:%d\n",sum(a,b));    return 0;}//这里才定义函数内部的方法,因为前面已经声明过这个函数,所以即使把定义放在这里,程序也不会出错void printstars(){    printf("********************\n");}void printmessage(){    printf("Hello , World!\n");}int max(int a,int b){    return a>b?a:b;}int min(int a,int b)//这个函数声明时并没有给形式参数命名{    return a<b?a:b;}int sum(int a,int b)//这个函数定义时的形式参数命名和声明时的形式参数命名不同{    return a+b;}
结果:



解析:

1.自定义函数在main函数外部声明,可以参考全局变量的声明。都是通过这种方式使得其有效性覆盖整个程序执行过程。


按函数返回值分类:

无返回值函数:

返回值为void类型,只完成某些操作。


有返回值函数:

返回值为函数定义(声明)时的数据类型

执行完毕返回return后的值。


return语句:

return (表达式);

return 表达式;

return;


当有多个return语句时,执行到哪个,哪个起作用(直接返回)。


函数的返回:

执行流程的返回:由被调用函数返回到主调函数。


执行结果的返回:将被调用函数执行得到的结果带回主调函数。


注:无返回值的函数return语句可以省略,而有返回值的函数必须写return语句。

注:旧的C语言标准中允许main函数无返回值(void),但最新的标准规定main函数必须要有一个整型的返回值(int) 并且在正常结束时,返回一个0(return 0;  这里返回不同的值代表不同的状态,但这里不深入研究)

这是因为Linux之类的系统中要求程序必须给操作系统返回值,以方面识别程序的运行状态。为了提高代码的兼容性,最新的标准做出了这样的规定。



注:当返回的类型和定义的返回类型不匹配时,如:

long f1(float x){    float y;    y=3*x;    return y;}
系统会自动对y进行数据类型的转换,转换的规则和赋值时自动数据类型转换的规则相同。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁宝宝认被子盖怎么办 小孩吃多了发烧怎么办 两岁宝宝拉蛔虫怎么办 吃了长蛆的东西怎么办 被蜱虫咬了又找不到虫子怎么办 木家具生黑虫子怎么办 吃了发霉的面包怎么办 种的韭菜有蛆怎么办 活狗身上长蛆虫怎么办 狗身上会有蛆虫怎么办 狗身上长满了蛆怎么办 房间墙上有很多小虫子怎么办 床上有许多小虫子怎么办? 店里有许多小虫子怎么办 房间潮湿有很多小虫子怎么办 家里潮湿墙上发霉长小虫怎么办? 房间有小飞虫子怎么办 狗被灭虫剂喷了怎么办 吃鸡玩久了手机屏幕很涩怎么办 超东卧室太阳晒怎么办 床头上的布破了怎么办 老年机全静音了怎么办 老年机手机不亮怎么办 70岁老人耳朵聋怎么办 血压太低了头晕怎么办 血压高忽然变低怎么办 血压高眼睛红了怎么办 高血压200降不下去.怎么办 高血压吃药降不下来怎么办 合肥房子卖了户口怎么办 吃了粽子胃难受怎么办 突然血压高怎么办需要吃药吗? 胃一阵阵疼然后拉肚子怎么办 橱子和墙壁不平怎么办 复印选项是英文不认识怎么办 防盗门锁与门框结合不好怎么办 仿瓷涂料墙壁脏了怎么办 油笔画到墙纸上怎么办 水笔画在墙纸上怎么办 屋里有股石灰味怎么办 厨房太阳对着晒怎么办