IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言学习笔记——Day 03 函数 -> 正文阅读

[C++知识库]C语言学习笔记——Day 03 函数

一、函数是什么

维基百科中对函数的定义:子程序

在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。

函数的分类:

1、库函数;

2、自定义函数;

二、库函数

为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

C语言常用的库函数都有:
IO函数<stdio.h>
字符串操作函数<string.h>
字符操作函数
内存操作函数
时间/日期函数<time.h>
数学函数<math.h>
其他库函数

库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。

如何学会使用库函数?

不需要全部记住;只需要学会查询工具的使用:
MSDN(Microsoft Developer Network)
www.cplusplus.com
http://en.cppreference.com(英文版)
http://en.cppreference.com(中文版)

eg:strcpy函数:

#include <stdio.h>
#include <string.h>

int main()
{
    char arr1[] = "hello world!";
    char arr2[] = "你好,世界!";
    strcpy(arr1,arr2);//字符串拷贝函数
    printf("%s\n",arr1);
}

程序运行结果:

?memset函数:

#include <stdio.h>

int main()
{
    char arr1[] = "hello world!";
    memset(arr1,'-',5);
    printf("%s\n",arr1);
}

程序运行结果:

三、自定义函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。

1、函数的组成:

ret_type fun_name(para1)
{
    statemen;//语句项
}

//ret_type 返回类型
//fun_name 函数名
//para1 函数参数

?eg:写一个函数可以找出两个整数中的最大值。

#include <stdio.h>

//定义函数
int getmax(int x,int y)
{
    if(x>y){
        return x;
    }
    else{
        return y;
    }
}
int main()
{
    int a = 20,b = 10;
    //调用函数
    int max = getmax(a,b);
    printf("%d\n",max);
    return 0;
}

程序运行结果:

?eg:写一个函数可以交换两个整形变量的内容:

#include <stdio.h>

//函数的定义
void Swap(int* pa,int* pb)
{
    int temp = 0;
    temp = *pa;
    *pa = *pb;
    *pb = temp;
    return 0;
}

int main()
{
    int a = 10,b =20;
    //调用函数
    Swap(&a,&b);
    printf("a=%d b=%d\n",a,b);
    return 0;
}

程序运行结果:

四、函数参数

1、函数参数的分类

①实际参数;

②形式参数。

2、实际参数(实参)

真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

3、形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

当实参传给形参的时候,新参其实是实参的一份临时拷贝。对形参的修改不会改变实参的值。

五、函数调用

1、传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

2、传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

练习:

1. 写一个函数可以判断一个数是不是素数。

#include <stdio.h>
#include <math.h>

int is_prime(int n)
{
    int j;
    for(j = 2;j<sqrt(n);j++){
        if(n%j == 0){
            return 0;
        }
    }
    return 1;
}

int main()
{
    int i;
    for(i = 100;i<=200;i++){
        if(is_prime(i) == 1){
            printf("%d ",i);
        }
    }
    return 0;
}

?程序运行结果:

2. 写一个函数判断一年是不是闰年。

#include <stdio.h>

void is_leap_year(int year)
{
    if((year%4 == 0 &&year%100 != 0) || year%400 == 0){
        printf("%d是闰年!",year);
    }
    else{
        printf("%d不是闰年!",year);
    }
}

int main()
{
    int year1;
    printf("请输入需要判断的年份:");
    scanf("%d",&year1);
    is_leap_year(year1);
    return 0;
}

程序运行结果:

?3. 写一个函数,实现一个整形有序数组的二分查找。

//二分查找
#include <stdio.h>

int binary_search(int arr[],int n,int sz)//arr的本质是指针
{
    int left = 0;
    int right = sz-1;
    int mid;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(arr[mid] > n){
            right = mid-1;
        }
        else if(arr[mid] < n){
            left = mid+1;
        }
        else{
            return mid;
            break;
        }
    }
    return -1;
}

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int k = 7;
    int sz = sizeof(arr)/sizeof(arr[0]);
    int ret = binary_search(arr,k,sz);//arr传递的是数组首个元素的地址
    if(ret == -1){
        printf("找不到指定的数字。\n");
    }
    else{
        printf("找到了,下标是:%d\n",ret);
    }
    return 0;
}

4. 写一个函数,每调用一次这个函数,就会将num的值增加1。

#include <stdio.h>

void count(int* p)
{
    (*p)++;
}
int main()
{
    int num = 0;
    count(&num);
    printf("num = %d\n",num);//1
    count(&num);
    printf("num = %d\n",num);//2
    count(&num);
    printf("num = %d\n",num);//3
    return 0;
}

程序运行结果:

六、函数的嵌套调用和链式访问

函数和函数之间可以有机的组合。

1、嵌套调用:

#include <stdio.h>

void new_line()
{
    printf("hello world!\n");
}

void three_times()
{
    int i;
    for(i = 0;i<3;i++){
        new_line();
    }
}
int main()
{
    three_times();
    return 0;
}

?程序运行结果:

2、链式访问

把一个函数的返回值作为另外一个函数的参数。

int main()
{
    //方法一
    int len;
    len = strlen("abc");
    printf("%d\n",len);
    //方法二:链式访问
    printf("%d\n",strlen("abc"));
    return 0;
}

七、函数的声明和定义

1、函数声明:

①告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
②函数的声明一般出现在函数的使用之前。要满足先声明后使用。
③函数的声明一般要放在头文件中的。

2、函数定义:

函数的定义是指函数的具体实现,交待函数的功能实现。

#include <stdio.h>

//函数声明
int Add(int x,int y);

int main()
{
    int a = 10,b = 20;
    int sum = Add(a,b);//函数调用
    printf("sum = %d\n",sum);
    return 0;
}

//函数定义
int Add(int x,int y)
{
    return x+y;
}

程序运行结果:

?将函数定义写在函数调用之前就可以不用进行函数声明了。但是,函数声明仍有存在意义,把函数声明放入头文件.h文件中,把函数定义放在.c文件中,可实现分模块完成一个项目。

八、函数递归

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 13:50:50  更:2021-08-14 13:51:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 10:45:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码