函数(一)

1、函数是什么?

看看在维基百科中的定义:
在计算机科学中,子程序(也就是函数)(英语:Subroutine, procedure, function, routine, method,
subprogram, callable unit),是一个大型程序中的某部分代码,由一个或多个语句块组
成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软
件库。
在这里插入图片描述

这段话貌似很难理解,但是经过本篇博客的介绍,大家就会对函数有一个大概的了解了。

2、C语言中函数的分类

2.1库函数

为什么要有库函数呢?
C语言的库函数并不是C语言本身的一部分,它是由编译程序根据一般用户的需要,编制并提供用户使用的一组程序。C的库函数极大地方便了用户,同时也补充了C语言本身的不足。在编写C语言程序时,使用库函数,既可以提高程序的运行效率,又可以提高编程的质量。
简单来说就是把一些可以实现各种功能且好的代码封装成函数,存储在库函数中,形成便准库,供大家使用。

2.1.1 C语言常用的库函数

以下是常用库函数的分类:
IO函数(输入输出函数)
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数

2.1.2 函数的原型(返回类型、函数名、参数)

举个例子,比如printf函数:
在这里插入图片描述
返回类型:int
函数名:printf
参数:const char* format

2.1.3 可以学习库函数的网站

1、cplusplus网站
2、c++网站
3、微软的软件MSDN,可以在官网下载

2.2自定义函数

2.2.1 为什么要有自定义函数?

库函数的功能是有限的,需要程序员设计自定义函数实现不同的功能

在这里插入图片描述

2.2.2 函数的基本组成
//函数的组成
ret_type fun_name(para1,...)
{
    statement;//语句项
}

//ret_type 返回类型
//fun_name 函数名
//para1  参数
2.2.3 设计两个函数(求最大值、交换数)

1、求两个数中的最大值

//设计一个函数求两个数中的较大值
#include<stdio.h>
int get_max(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int a=0;
    int b=0;
    scanf("%d %d",&a,&b);
    int m=get_max(a,b);
    printf("%d",m);
    return 0;
}

2、交换两个整数

//函数的功能是交换两个数的值
#include<stdio.h>
void Swap(int* x,int* y)
{
    int temp=*x;
    *x=*y;
    *y=temp;
}
int main()
{
    int a=0;
    int b=0;
    scanf("%d %d",&a,&b);
    printf("交换前:%d %d",a,b);
    Swap(&a,&b);
    printf("交换后:%d %d",a,b);
}
//当函数调用的时候,实参传递给形参,这是形参只是实参的一份临时拷贝,对形参的改变不影响实参
//当需要改变实参的值时,需要传指针类型的参数

3、函数的参数

3.1实参

可以是常量、变量、表达式、函数等,但是必须是一个确定的值

3.2形参

当没有调用函数的时候,形参不会占用内存空间
函数调用完之后,形参会自动销毁,因此,形参只能在函数内部使用
可以在函数内改变全局变量了,但是这样写不好,且全局变量一旦修改就可能出问题,要少用全局变量

4、函数的调用

4.1传值调用

函数的形参和实参分别占用不同的内存空间,对形参的修改不会影响实参

4.2传址调用

函数外部创建的内存地址传递给函数内部
对形参的修改可以修改实参

5、函数知识的练习

5.1判断100~200之间的素数

#include<stdio.h>
#include<math.h>
int is_prime(int n)
{
    int j=0;
    for(j=2;j<=sqrt(n);j++)
    {
        if(n%j==0)
        return 0;            
    }
    return 1;
}
int main()
{
    int i=0;
    for(i=100;i<=200;i++)
    {
        //判断i是否是素数
        if(is_prime(i)==1)
        printf("%d ",i);    
    }
    return 0;
}
//判断是否是素数,只要看2到这个数的开平方

5.2判断是不是闰年

#include<stdio.h>
int is_leap_year(int n)
{
    return ((n%4==0&&n%100!=0)||n%400==0);
}
int main()
{
    int y=0;
    for(y=1000;y<=2000;y++)
    {
        if(is_leap_year(y)==1) 
            printf("%d ",y);   
    }
    return 0;
}

5.3整形有序数组的二分查找

//写函数实现一个整形有序数组的二分查找
#include<stdio.h>
int binary_search(int arr[], int k, int sz)
{
    int left = 0;
    int right = sz -1;
    while(left <= right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] < k)
        {
            left = mid + 1;            
        }
        else if (arr[mid] > k)
        {
             right = mid - 1;       
        }
        else
        {
            return mid;    
        }    
    }
    return -1;//找不到
}
int main()
{
    int arr[]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int k = 7;
    //找到了返回下标,找不到返回-1
    int pos = binary_search(arr, k, sizeof(arr)/sizeof(arr[0]));
    if ( -1 == pos)
        printf("找不到\n");
    else
        printf("找到了,下标是:%d",pos);                       
    return 0;
}
//所谓二分,并不是两个数的值的平均值,而是它们的下标的平均值

5.4每调用一次函数,num的值就增加1

//方法一
#include<stdio.h>
void Add(int *p)
{
    (*p)++;//如果写成*p++,先是p++再是解引用        
}
int main()
{
    int num = 0;
    Add(&num);
    printf("%d\n", num);
    return 0;
}

//方法二
#include<stdio.h>
int Add(int n)
{
    return n+1;
}
int main()
{
    int num = 0;
    num = Add(num);
    printf("%d\n",num);        
}

当函数的返回类型不写明的时候,编译器默认函数为int型

6、结语

到此为止,你是否对于函数有了新的认识呢?函数的知识并不难,但内容也不少,在下一期中,小书将和大家进一步探讨函数,把绝大部分的函数知识吃透!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值