文章目录

  • 函数的声明与定义
    • 函数的声明
    • 函数的定义
  • 简单的练习题
    • 写一个函数可以判断一个数是不是素数
    • 写一个函数实现二分查找
    • 写一个函数,每调用一次这个函数,就会将 num 的值增加1。

函数的声明与定义

函数的声明

函数的声明概念和作用如下

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

我们在代码中为大家演示函数声明的具体用法

int main()
{int num1 = 20;int num2 = 10;int max = get_max(num1, num2);printf("%d", max);return 0;
}int get_max(int x, int y)
{return(x > y ? x : y);
}

还是之前使用函数求解两个数的最大值的代码,这次我们把自定义函数放在了主函数之后,我们让代码跑起来

虽然我们也可以得到我们的结果但是编译器会有一条警告

他说我们的“get_max"未定义,这里我们就需要使用函数的声明来消除这个警告。

当我们的自定义函数在主函数之后,我们要调用自定义函数时,需要使用函数的声明,在调用之前告诉编译器有这样一个函数,这就是:函数声明一般出现在函数的使用之前,要满足先声明后使用。

函数的定义

顾名思义函数的定义就是函数的具体实现,交代函数的功能实现。当我们了解到了函数声明与定义,那么在日常的工作中我们应该怎样去写函数的声明和定义呢?在日常工作中一定不会向上面的代码一样去声明函数,函数的声明和定义一定是分开的。例如

我们可以看到这个源文件里面并没有定义get_max()这个函数,也没有函数的声明,但是我们执行代码依然可以得到我们想要结果这是为什么呢?原因是,我们将函数的声明和定义分成了两个部分,在不同的位置进行书写


这样写的好处是,可以将我们的需求分成多个模块进行编写,最后将他们并在一起就可以达到我们想要的效果,关于这方面我们在以后的学习当中在与大家详细的分享,今天大家只要知道什么是函数的声明和定义就好了。

简单的练习题

经过我们的分享,相信大家对函数也有了一定的认识,今天我们带领大家练习几个题目,来回顾一下之前的知识。

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

在之前的练习中我们也写过这样的题目,那么如何使用函数实现呢?

int prime_number(int x)
{int j = 0;for (j = 2; j < x; j++){if (x % j == 0){return 0;}}if (j == x){return 1;}
}
int main()
{int num = 0;printf("输入一个数:");scanf("%d", &num);int i = prime_number(num);if (1 == i){printf("%d是素数", num);}else{printf("%d不是素数",num);}
}

思路分析:首先我们创建变量用于接收我们输入的待判断数,将这个数传给自定义函数,进行判断如果返回值为1那么就是素数,自定义函数实现判断部分,如果是素数就返回1,不是就返回0。

写一个函数实现二分查找

//使用函数实现整形有序数组的二分查找
int binary_search(int arr[])
{int left = 0;int sz = sizeof(arr) / sizeof(arr[0]);int right = sz - 1;int k = 0;printf("请输入要查询的数组元素:");scanf("%d", &k);while (left <= right){int mid = (right - left) / 2 + left;if (k > arr[mid]){left = mid + 1;}else if (k < arr[mid]){right = mid - 1;}else{return mid;}}if (left > right){return -1;}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int num = binary_search(arr);if (num == -1){printf("找不到了");}else{printf("找到了,下标为%d", num);}return 0;
}

思路分析:我们首先创建一个整形有序数组,将数组传给自定义函数进行寻找,如果可以找到则返回待查值的数组下标,如果招不到返回-1,通过返回值进行选择输出,给出用户对应提示。写完后我们执行我们的代码


我们发现,查找数组当中存在的元素时,提示我们找不到,这是哪里出现了问题呢?我们在调试中寻找答案

我们发现原来是我们的right的值出现了错误,数组当中明明有10个元素,right应该等于9,为什么变成1了呢?答案就在于,数组在传递参数的时候不会把整个数组都进行传递,只需要传递数组的首元素地址就可以找到数组当中的任意元素了,所以在数组传递参数时不仅仅可以使用上面int binary_search(int arr[])这样的写法,还可以写成int binary_search(int *arr),后者比较难理解,但是揭露了本质,数组传递参数其实是数组首元素的传递。所以我们将我们的代码进行更改:

//使用函数实现整形有序数组的二分查找
int binary_search(int arr[], int sz)
{int left = 0;int right = sz - 1;int k = 0;printf("请输入要查询的数组元素:");scanf("%d", &k);while (left <= right){int mid = (right - left) / 2 + left;if (k > arr[mid]){left = mid + 1;}else if (k < arr[mid]){right = mid - 1;}else{return mid;}}if (left > right){return -1;}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);int num = binary_search(arr, sz);if (num == -1){printf("找不到了");}else{printf("找到了,下标为%d", num);}return 0;
}

我们将right()这个变量的值放在主函数当中求出,之后传递给自定义函数就可以实现我们的需求了。

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

通过题目我们知道了,需要定义一个函数来使主函数当中数的值+1,这样函数内外需要建立一定的联系,我们使用传址调用

#include<stdio.h>
void add(int* pnum)
{*pnum = *pnum + 1;
}int main()
{int num = 0;add(&num);printf("%d", num);return 0;
}

C语言详解系列——函数的认识(4)函数的声明与定义,简单练习题相关推荐

  1. C语言详解系列——函数的认识(5)函数递归与迭代

    文章目录 函数递归 函数的迭代 函数递归 什么是函数递归?函数自己调用自己的编程技巧我们称为递归,函数递归通常会把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量 ...

  2. C语言详解系列——综合练习,猜数字小游戏

    文章目录 题目需求 思路分析 rand()库函数随机数的生成 游戏的试玩 题目需求 今天与大家分享一个简单的猜数字小游戏,当作我们前面学习的一个综合练习,我们的需求是: 1.可以自动生成一个1-100 ...

  3. C语言详解系列——分支语句详解if、switch

    文章目录 什么是语句 if语句 悬空else switch语句 break的使用 default 的使用 在之前的分享中,我们了解到了c语言是结构化的程序设计语言.分为顺序结构,选择结构,循环结构三大 ...

  4. C语言 详解如何编写闪烁显示字符串的函数

    如果要实现指定字符串在标准输出流(一般为显示器)上闪烁,可以定义如下函数: void bput(const char*s,int appe,int disa,int repe) 字符串s出现appe秒 ...

  5. C语言详解系列——goto语句的讲解和循环语句的简单练习题

    文章目录 goto语句 一些简单的练习题 打印三的倍数 从大到小输入 打印素数 最大公约数 打印闰年 goto语句 顾名思义goto语句就是去到任何我们想去的语句,当我们写了很长的一段代码时,我们想要 ...

  6. 【C语言详解】——常见字符和字符串函数及其模拟实现

    本文主要介绍一些常见的字符和字符串函数及其模拟实现 所需要的头文件 #include<string.h> 目录 1.求字符串长度 strlen 1.1模拟实现 strlen(三种方法) 2 ...

  7. C语言详解系列——循环语句详解(1)while语句的语法结构

    文章目录 while语句 break continue while语句 之前的学习中我们了解到了if语句的用法,这个语句只会执行一次,但在我们的生活当中有许多事情是需要重复去做的,那我们应该怎么实现呢 ...

  8. C语言详解系列——循环语句详解(3)do while语句的语法结构

    文章目录 do while语句 do while语句中的break和continue break continue do while语句与while语句的不同点 简单练习 do while语句 之前的 ...

  9. C语言详解系列——循环语句详解(2)for语句的语法结构

    文章目录 for语句 break与continue 关于if语句的建议 关于for循环的变种写法 一道笔试题 for语句 在之前的学习中我们已经了解到了循环结构中while语句的用法,那么为什么我们还 ...

最新文章

  1. Android Studio 简介
  2. ERROR: JVMPI, an experimental interface, is no longer supported.
  3. springBoot 在线心理咨询管理系统
  4. 使用Nomad构建弹性基础架构: 作业生命周期
  5. DL之PerceptronAdalineGD:基于iris莺尾花数据集利用Perceptron感知机和AdalineGD算法实现二分类
  6. 机器学习 训练验证测试_测试前验证| 机器学习
  7. js根据给定的日期计算当月有多少天
  8. HCIE-Security Day7:6个实验理解目的NAT
  9. 【车间调度】基于matlab改进的鲸鱼算法求解双目标柔性车间调度问题【含Matlab源码 026期】
  10. 联想微型计算机a20,联想乐player A20
  11. ai面试的优缺点_面试官:因为这一步,我淘汰了90%的应届生
  12. RAID磁盘阵列详解
  13. html画圆中有个正方形,Adobe Illustrator CS6中绘画圆形及正方形的操作使用方法
  14. 学术英语阅读与写作3:introduction引言
  15. UI设计师都在用的4款UI设计软件
  16. 计算机fn的作用,必看干货!笔记本电脑fn键的作用
  17. iPhone14 /ios16不能使用蜂窝网络(浏览器提示“未激活蜂窝数据网”)
  18. 【渝粤教育】电大中专药物化学基础 (2)_1作业 题库
  19. 为什么工厂要实现自动化、智能化?
  20. 小白学习,歌词解析(半成品)

热门文章

  1. 庖丁解牛——深入解析委托和事件
  2. gigaset812说明书_详细的电话机使用说明书
  3. [面试笔试整理1]:深度学习机器学习面试问题准备(必会)
  4. 测试类型(αβ测试 、AB测试)
  5. 空格折叠(幽灵折叠)
  6. 安装系统-win 10
  7. 文字点选验证码的破解方法~
  8. VRTK_Artificial Rotator(人工旋转器)脚本属性详解
  9. 公网IP/内网IP:
  10. 北京住房公积金联名卡查询使用