在维基百科中对函数的定义为:子程序
*在计算机科学中,子程序(Subroutine,procedure,function,routtine,method,subprogram,callable unit),是一个大型程序中的某部分代码,由一个或者多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。
*一般会有输入参数并有返回值,提供对过程的封装和对细节的隐藏。这些代码通常被集成为软件库
库函数:C语言中把常用的功能,进行了封装,封装成一个一个的函数,提供出来使用:比如printf
C语言并不是直接去实现库函数1,而是提供了C语言标准的和库函数的约定 比如函数的参数 返回值 名字 功能
库函数的实现是靠编译器去实现。
1.当我们在学习编程的过程中,我们总是会发现我们频繁的使用某一个功能,比如printf,scanf等
2.在编程过程中,我们为了快速的实现某一些功能,比如实现计算一个数的n次方,我们就就会使用到pow,而不是自己再去复制粘贴这么一段功能代码
所以:
像上面描述的基础功能,他们并不是业务性的代码。我们在开发的过程中,每个学者或者程序员都有可能遇到,为了提高可移植性和提高程序的效率,C语言提供了一系列的库函数,方便编程者进行开发。
推荐一个网址:www.cplusplus.com ,进入过后我们点击c library,就可以看到很多函数库了。
点击常用的stdio.h文件,就可以找到一些我们常用的函数。
C语言常用的库函数:
// IO函数 输入输出函数 scanf printf getchar putchar
// 字符串操作函数 strlen strcmp
// 字符操作函数 islower isupper
// 内存操作函数
// 时间/日期函数
// 数学函数
// 其他库函数
关注:
1.函数的返回值类型
2.函数的参数个数和参数的返回值类型
3.关注函数的功能
4.每个函数下面也有使用用法举例大家可以直接拷贝代码直接上手体验这个库函数的使用过程。下面我举例一个函数
有的时候,我们自己想要实现的功能没有库函数的时候,但是多个文件中又要使用到。那么我们就可以把自己的这个功能模块封装成一个函数。自己随时取用就行。自定义函数的形式是什么样的呢?
ret_type fun_name(para1, *)
{
statement://语句项}
ret_type 返回类型
fun_name 函数名
para1 函数参数
举个例子,我们要实现一个加法函数,实现两个数相加
ret_type 返回类型 我们如果想要返回一个结果,两个数相加的结果是整型,那么返回值就是int
fun_name 函数名 函数名最好根据功能来,我们实现加法函数,命名为Add
para1 函数参数 函数参数我们是不是要实现两个数相加呀在函数内部,那么我就需要两个数来接收。 两个数都是整型数字那么参数类型就是int ,两个参数可以写为:
int x int y
我们看一下效果:
附上源码大家可以体验效果:
int Add(int x,int y)
{
int sum = 0;
sum = x + y;
return sum;//把结果返回
}
int main()
{
int a = 1;
int b = 2;
int ret = Add(a, b);//调用Add函数
printf("%d", ret);
return 0;
}
什么是函数的声明:
1.告诉编译器一个函数叫什么,参数是什么,返回类型是什么。但是函数具体存在不存在,函数声明决定不了。
比如:
int Add(int x,int y);
但是后面有没有Add函数的具体实现,要看后面的代码,这个声明只是告诉编译器这里有个Add函数。
2.函数的声明一般要出现在函数使用之前,要先声明后使用。编译器要先知道有这个函数,等用到的时候才会去找到这个函数的实现。
函数的定义是指函数的具体实现,交待函数的功能实现。
真实传给函数的参数(一般是调用函数时,写入的参数)
实参可以是变量、常量、表达式、函数等。
不管是什么类型的变量,再进行函数调用时,实参都必须有确定的值
形式参数是指函数名后括号中的变量,因为形式参数只有在函数调用时才会实例化(分配内存单元),所以叫形式参数,形式参数当函数调用完成之后就会自动销毁。所以形式参数只在函数中有效。
(引出函数调用的规则)
我们来看上述函数例子:
我想封装一个函数用于实现两个数值的交换:
我们发现了一个问题
我们实际参数x,y两个数的数值并没有进行交换,函数调用过后,交换的是形式参数a,b两个数的数值。这是怎么回事呢?
我们知道创建变量的实质是分配内存空间,每个内存空间都有自己的地址。
当我们在进行函数传参的时候按照上面的例子来看,我们只是把值传递给了 形式参数,相当于我的代码出了问题我把我的代码拷贝一份给老师,老师在他的电脑上调试运行成功了,但是我电脑上的代码并没有改变。
附上源码,大家体验一下效果,在函数调用我们来看一下解决办法:
void Swap(int a, int b)
{
int temp = 0;
temp = a;
a = b;
b = temp;
printf("a = %d,b = %d\n", a, b);
}
int main()
{
int x = 0;
int y = 0;
printf("请输入要交换大小的两个数:\n");
scanf("%d %d", &x, &y);
Swap(x, y);
printf("x = %d,y = %d\n", x, y);
return 0;
}
函数的形参和实参分别占用不同的内存块,对形参的影响不会实参,此时形参是实参的一份临时拷贝。
可以看看4.3这里
*传地址调用是吧函数外部创建变量的内存地址传递给函数参数的一种调用方式
*这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
我们来看一下如何用传地址形式传递参数来改变4.3中的错误。
void Swap(int* a, int* b)
{
int temp = 0;
temp = *a;
*a =* b;
*b = temp;
printf("a = %d,b = %d\n", *a, *b);
}
int main()
{
int x = 0;
int y = 0;
printf("请输入要交换大小的两个数:\n");
scanf("%d %d", &x, &y);
Swap(&x, &y);
printf("x = %d,y = %d\n", x, y);
return 0;
}
当我们把地址传给自定义函数时,就可以直接操作我们的x,y了附上源码大家可以试一下
函数与函数之间是可以相互调用的
就像上面的例子中,我们的加法Add函数和交换函数中又调用了输出函数printf
int Add(int x, int y)
{
int sum = 0;
sum = x + y;
return sum;//把结果返回
}
void Swap(int* a, int* b)
{
int temp = 0;
temp = *a;
*a =* b;
*b = temp;
printf("a = %d,b = %d\n", *a, *b);
int ret = Add(*a, *b);//嵌套调用Add函数
printf("%d\n", ret);
}
int main()
{
int x = 0;
int y = 0;
printf("请输入要交换大小的两个数:\n");
scanf("%d %d", &x, &y);
Swap(&x, &y);
printf("x = %d,y = %d\n", x, y);
return 0;
}
值得注意的是函数可以嵌套调用但是不可以嵌套定义
请看:
函数的链式访问:把一个函数的返回值作为另外一个函数的参数
程序调用自身的编程技巧称为递归
递归的思想:大事化小
递归的两个必要条件:
1.存在限制条件,当满足这个条件时,递归就不再继续了
2.每次调用递归过后就会越来越接近这个限制条件
当递归不能跳出就会出行死循环
我们用一个实例来感受和理解一下递归。
上面的图基本说明了原理,下面结合源码理解:
#include<stdio.h>
double minepow(int n,int k)
{
if (k == 0)
{
return 1;
}
else if (k > 0)
{
return n * minepow(n, k - 1);
}
else
{
return 1 / (minepow(n, -k));
}
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d", &n, &k);
double ret = minepow(n, k);
printf("%lf", ret);
return 0;
}
这里类型是double,是因为指数为负的时候,打印的是小数
系统分配给程序的栈空间是有限的,但是如果出现了死循环或者死递归,会导致一直开辟栈空间,最终空间耗尽。这样的现象叫做栈溢出。
y以上就是本期内容,后续会慢慢填补不足之处,也希望得到大家的指正。
文章浏览阅读828次,点赞15次,收藏12次。首先,我们从一个问题开始( ̄∇ ̄)/为什么需要程序员?早期的计算机程序是硬件化的,即使用各种门电路组装出一个固定的电路板,这个电路板只能用于执行某个特定的程序,如果需要修改程序功能,就要新组装一个电路板。而一位叫做冯诺依曼的老爷子的出现,提出了一种指令数据化的思想,使得程序和数据一样,可以存储起来,组合调用,至此,程序脱离了电路板的桎梏,成为了可以人为组合的指令集,程序员应运而生。当然,我们需要郑重地介绍下这位冯老爷子,1903年12月28日—1957年2月8日),原名),出生于的籍与的奠基者,在和。_栈式指令集与冯诺依曼
文章浏览阅读247次。springboot基于SpringBoot的创意项目众筹平台的设计与开发。springboot疫情期间中小学生作业线上管理系统设计与实现。jsp基于Web的鲜花采购及预定系统的设计与实现ssh。ssm基于vue技术的汽车维修检测系统设计与实现。ssm基于JAVA的OA办公系统的设计与实现。_php 相册管理系统源码
文章浏览阅读433次,点赞2次,收藏2次。摘 要本文讲述了基于B/S模式的SSH技术的电脑配件在线销售系统的设计与实现。所谓的电脑配件在线销售系统是通过网站推广互联企业的电脑配件和技术服务,并使客户随时可以了解企业和企业的产品,为客户提供在线服务和订单处理功能。从长期的战略目标来说,电脑配件在线销售网站不仅是电脑配件和服务的推广,而是通过Internet、企业内部网和企业外部网,将买家与卖家、厂商和合作伙伴紧密结合在了一起,因而消除了时间与空间带来的障碍。电脑配件在线销售提供了多种检索途径,可以从分类、新品、特价等途径进行检索,快捷准确._《基于java毕业设计的电脑配件购物商城设计与实现-csdn博客》
文章浏览阅读1.1w次。今天群里有人在处理小数点方面出了点问题,趁机回顾下保留小数点的方式,这里介绍2种,利用BigDecimal类及DecimalFormat类。package com.huayu.java91up;import java.math.BigDecimal;import java.text.DecimalFormat;/** * Create by zxb on 2017/4/17 */_实体类初始化时保留两位小数
文章浏览阅读690次,点赞17次,收藏10次。比如两个数:100和120,通常我们求平均值时是(100+120)/2 = 110, 如果我们说第一个数的权值为1,第二个数的权值为2,那么平均数是(100*1+120*2)/(1+2)=113.3,这就是加权平均了。abcd四个叶子结点的权值为7,5,2,4. 这个7,5,2,4是根据实际情况得到的,比如说从一段文本中统计出abcd四个字母出现的次数分别为7,5,2,4. 说a结点的权值为7,意思是说a结点在系统中占有7这个份量.实际上也可以化为百分比来表示,但反而麻烦,实际上是一样的.
文章浏览阅读34次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读1.1w次,点赞2次,收藏15次。 每一种语言都有一组基本的语法约定,POWERBUILDER也不例外。 (1)断行、续行与多条语句 通常情况下,powerbuilder的一条语句是写到一行上的,该条语句在书写完毕之后,按键转到下一行,开始写下一句的内容。也就是说,在PowerBuilder中,使用键作为一行的结束。在PowerBuilder语句比较长的情况下,为了方便阅读,可以使用续行符号把一条语句写到几_powerbuilder
文章浏览阅读126次。1.max_element()函数和min_element()函数,就是找最大值最小值,数组:int position=max_element(a,a+n)-a;//返回在数组中的下标int data=*max_element(a,a+n);//返回值容器: int position=max_element(v.begin(), v.end())-v.begin(); int it..._int b = max_element(a, a+4) - a;
文章浏览阅读885次。android系统中的log定向本文转载自:http://blog.csdn.net/knock/article/details/5511255 为了调试,必须要将log怎么打印的搞清楚,于是有了以下的分析。我们通常在程序中插入LOGD(..),LOGE(..)之类的语句,但什么情况下可以查看这些打印消息呢?首先,来到定义处:system/core/include/cutils___android_log_print 重定向
文章浏览阅读543次。#include #include #include #define maxn 1000using namespace std;int ans[maxn],a[maxn],len;int Search(int data){//我们要找到的是最小的那个>=mid的ans的位置 int l=0,r=len,mid; while(l _nlgzl
文章浏览阅读2.6k次。入门级300词汇量,适合小学高年级(五年级,六年级)、初一,分上、中、下三册,共27本。上册共10本,附赠MP3光盘一张1、《生存游戏》2、《侠盗罗宾汉》3、《白色巨石》4、《红酋长的赎金》5、《吸血鬼猎手》6、《逆戟鲸》7、《雾都疑案》8、《亚瑟王传奇》9、《亚瑟王朝里的美国人》10、《把钱拿出来!》中册共9本,附赠MP3光盘一张1、《监控录像》2、《红红的玫瑰..._书虫雾都疑案好词好句
文章浏览阅读46次。Worksheets("数据").Cells(i, 20).Value = Worksheets("替换品名").Cells(j, 2)hr = Worksheets("替换品名").Range("B65536").End(xlUp).Row。dr = Worksheets("数据").Range("T65536").End(xlUp).Row。If Worksheets("数据").Cells(i, 20) "" Then。data = Worksheets("数据").Cells(i, 20)