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

自定义函数

简述:


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进行数据类型的转换,转换的规则和赋值时自动数据类型转换的规则相同。

你可能感兴趣的:(函数,C语言,提高)