如何设计函数?

函数:

一段具有某项功能的代码,是C语言中管理代码的单位。
把代码封装成一个个函数,可以方便的管理和调用代码。

函数分类:

    标准库函数:C语言标准为委员会为C语言以函数形式提供的一些基础功能,被封装在libc.so库中,使用时需要包含头文件,函数名(参数)即可以调用。int isalnum(int c);功能:当以是数字、字母字符返回真int isalpha(int c);功能:当c是字母时返回真int isdigit(int c);功能:当c是数字字符时返回真int islower(int c);功能:当c是小写字母时返回真int isupper(int c);功能:当c是大写字母时返回真int abs(int num);功能:返回num的绝对值以下函数被封装在libm.so库文件中。double sqrt(double x);功能:返回x的平方根double pow(double x, double y);功能:返回x的y次方double floor(double arg);功能:返回小于等于arg的最大整数double ceil( double num );功能:返回大于等于num的最小整数double fabs(double arg);功能:返回arg的给对值void srand(unsigned seed);功能:设置随机种子int rand(void);功能:返回一个随机数rand()%(b-a)+a time_t time( time_t *time);功能:返回自19701月1日 00:00:00 到当前时间过了多少秒。int system(const char *command);功能:调用系统命令练习4:获取10个[100,1001)的随机数。for(int i=0;i<10;i++){srand(time(NULL));rand()%(1001-100)+100; //相当于[100,1000]}练习5:随机出一组双色球彩票号。6红:1~331蓝:1~16
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main(int argc,const char* argv[])
{time_t t;time(&t); /*获取time_t类型的当前时间*/srand(time(NULL));printf("红:");for(int i=0; i<6; i++){printf("%d ",rand()%(33-1+1)+1);}printf("\n蓝:");printf("%d ",rand()%(16-1+1)+1);/*用gmtime将time_t类型的时间转换为struct tm类型的时间按,//没有经过时区转换的UTC时间然后再用asctime转换为我们常见的格式 Fri Jan 11 17:25:24 2008*/printf("\n---- %s\n",asctime(gmtime(&t)));//转化成常见字符串printf("---- %s\n",ctime(&t));return 0;
}
    系统函数:是操作系统以函数接口形式提供的一功能,这些功能包括:内存管理、信号处理、文件IO、文件管理、 进程管理、进程通信、线程管理、线程同步、网络通信。第三库函数:一些开源或收费的第三代码。glog 日志记录JSON 序列化反序列化MD5 验证XML 配置文件解析 自定义函数:为了更好的管理代码、减少冗余把代码封装成函数。函数声明:函数声明的目的是为了告诉其它代码函数的调用格式。返回值类型 函数名(类型1 变量名1,类型2 变量名2,...);1、C语言中函数名一般全部小写,用下划线分隔。2、如果不需要参数建议写void,不要空着。3、如果不需要返回值就写void。隐式声明:当调用函数时没有定义,编译器会猜测函数的格式,参数列表会根据调用时提供的数据(实参)猜测,返回值会猜成int类型。函数定义:返回值类型 函数名(类型1 变量名1,类型2 变量名2,...){函数休;return val;}函数调用:函数名(实参);返回值会放在调用的位置,可以立即显示,也可以用变量记录下来。

函数传参:

1、形参变量属于它所在的函数,出了该函数就不能再用。
2、实参与形参之间是以赋值的形式传递数据的(值传递)。
3、return 其实是把数据放置到一个公共区域(函数和函数调用者),如果不写return语句,该区域中就是一个随机的垃圾数据。
4、数组作为函数的参数时,长度会丢失,需要额外增加一个变量把数组的长度也传递过去。
5、数组的传递是"址传递",函数和函数调用者可以共享数组。
练习1:实现函数,找出数组中的最大值。
#include <stdio.h>
#include <stdlib.h>int max_arr(int arr[],int len)
{int max = arr[0];for(int i=1; i<len; i++){if(arr[i] > max){max = arr[i];}}return max;
}int main(int argc,const char* argv[])
{int arr[10] = {};for(int i=0; i<10; i++){arr[i] = rand() % 1000;printf("%d ",arr[i]);}printf("\n%d\n",max_arr(arr,sizeof(arr)/sizeof(arr[0])));
}
练习2:实现一个函数,对数组进行排序。
练习3:实现一个函数,查找数组是否存在某个值,如果存在返回该值在数组中的下标。
int find_arr(int arr[],int len,int val);
#include <stdio.h>
#include <stdlib.h>void sort(int arr[],int len)
{for(int i=0; i<len-1; i++){for(int j=i+1; j<len; j++){if(arr[i] > arr[j]){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}}
}int find(int arr[],int len,int val)
{/*for(int i=0; i<len; i++){if(arr[i] == val){return i;}}*/int l = 0 , r = len-1;while(l<=r){int p = (l+r)/2;if(arr[p] == val){return p;}if(arr[p] > val){r = p-1;}else{l = p+1;}}return -1;
}
int main(int argc,const char* argv[])
{int arr[10] = {};for(int i=0; i<10; i++){arr[i] = rand() % 100;printf("%d ",arr[i]);}printf("\n");sort(arr,10);for(int i=0; i<10; i++){printf("%d ",arr[i]);}printf("\n%d\n",find(arr,10,49));
}

设计函数的准则:

1、一个函数最好只解决一个问题,这样可以降低出错率,提高可读性。
2、最好不依赖其它函数(降低耦合度)。
3、数据由调用者提供,结果也样返回给调用者(通用性)。
4、要考虑调用者提供的非法数据,可以通过返回值方式告诉调用者,或者把可能出现的情况在注释中写明。 

进程映像:

程序:存储磁盘上的可执行文件(二进制文件、脚本文件)。
进程:正在系统中运行的程序。
进程映像指的就是进程的分布情况:
text 代码段 存储是二进制指令,常量数据,权限是只读,强制修改会产生段错误。
data 数据段 初始化过的全局变量
bss  静态数据段 未初始化的全局变量,程序运行时会被清理为0。
stack 栈 局部变量、块变量 会随着程序运行不断申请、释放 由系统管理
heap 堆 由程序员手动管理 特点就是够大 

局部变量和全局变量:

局部变量:定义在函数内stack 函数调用开始到函数执行结束只能在函数内使用
全局变量:定义在函数外data(初始化)或bss(未初始化) main运行前定义完成程序结束才释放程序的任何位置都可以使用
局部变量可以和全局变量同名,但会屏蔽同名的全局变量,建议全局变量首字母大写。

存储介质:

按数据读取速度由慢到快:
硬盘-》内存-》高级缓存-》寄存器

速度上,寄存器>cache>RAM>ROM

类型限定符:

auto 用于定义自动分配、释放内存的变量(局部变量),不加就代表加。注意:全局变量不能用它修饰。C11 标准中用于自动类型识别auto num = 3.14;
extern声明变量,意思是此变量在别处已经定义,请放心使用。但只临时满过编译时间,链时如果找不到依然会报错。
static改变存储位置:改变局部变量的存储位置,由stack改为data或bss。被它修饰过程的局部变量也叫静态局部变量。延长生命周期:延长局部变量的生命周期。限制作用域:限制全局变量、函数只能在本文件内使用。可以全局变量、函数命名冲突,也可以防止被别人调用。
const"保护"变量不被显式修改。但是,如果补初始化过的全局变量、静态局部变量被const修饰,存储位置就会变成text。volatile如果变量值没有显式的修改,在使用这个变量时不从内存中读取,而继续使用上次读取的结果。变量被volatile修饰后,每次使用到这个变量时,都会从内存中读取。一般硬件编程时或多线程编程时使用。   volatile int num = 10;if(num == num){}register申请把变量的存储介质由内存改为寄存器,但由于寄存器有限不一定百分百成功。注意:寄存器变量不取地址。typedef类型重定义,定义变量时如果前面加上typedef变量名就变了这种类型(注意不是替换关系)。

函数递归:

函数自己调用自己的分行叫递归,会产生死循环。
递归可以实现分治这种算法,就是把一个复杂的大问题,分解成若干个相同的小分问题,直到问题全部解决。1、出口
2、解决一个小问题
3、调用自己如果计算第N项斐波那切数列。递归函数每调用一次都会在栈内存产生一份自己的拷贝,直到达到出口,才一层释放,因此使用递归非常耗费内存,与循环相比速度非常慢,能用循环解决的问题不要使用递归。递归优缺点:1、耗费内存、速度慢2、就是好理解、思路清晰。3、可以解决非线性的执行过程。

小练:

1、使用递归模拟汉诺塔的移动过程。2、全排列0~9。3、输入一个整数,计算0~9每个数字出现的次数。0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八个被现代科学证实的古老信条

近年来&#xff0c;现代科学证实了很多古代智慧中的教导和信念。几个世纪以来我们都知道这些信念能够帮助我们生活的幸福、健康和平衡。《赫芬顿邮报》将八个被现代科学证实的古老信仰整理如下。 1.帮助他人能让你更健康 近年来&#xff0c;现代科学证实了很多古代智慧中的教…

Hystix熔断解决雪崩问题

1.线程隔离&#xff0c;服务降级&#xff08;服务的消费方做降级处理&#xff09; 当服务繁忙时&#xff0c;如果服务出现异常&#xff0c;不是粗暴的直接报错&#xff0c;而是返回一个友好的提示&#xff0c;虽然拒绝了用户的访问&#xff0c;但是会返回一个结果。 这就好比去…

Docker 环境下如何 安装 Zookeeper

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 第一步&#xff1a;首先下载Zookeeper的镜像文件&#xff1a; 从仓库中pull 这个zookeeper镜像&#xff1a;docker pull jplock/zookeep…

office教程:教你Excel 怎么样使用信息函数

Excel如何使用信息函数信息函数专门用来返回某些指定单元格或区域的信息&#xff0c;例如获取文件路径、单元格格式信息或操作环境信息等。一&#xff0c;使用CELL函数返回引用单元格信息工作表中的每一个单元格都有对应的单元格格式、位置和内容等信息&#xff0c;在Excel中可…

【C基础】指针/指针运算/二级指针/函数指针

指针定义&#xff1a; 指针是一种数据类型&#xff0c;使用它可以用来定义指针变量&#xff0c;指针变量中存储的其实是整数&#xff0c;这种整数代表了内存的编号。指针的使用&#xff1a; 1、函数之间相独立&#xff0c;但有些时候需要共享变量。传参是值传递全局变量容易命…

中医养生 选对方法就成功一半

在医院门诊室&#xff0c;因为肠胃不适前来看病的林先生。问及他平时的养生之道&#xff0c;他笑谈&#xff0c;现在也正困惑着呢。 原来&#xff0c;最近他有两个朋友&#xff0c;在单位体检时分别被查出患有肾结石和胆囊炎&#xff0c;他本人最近也犯胃病。 最令人奇怪的一…

二叉查找树,红黑树

漫画算法&#xff1a;什么是红黑树&#xff1f;&#xff08;适合初学红黑树小白简单易懂&#xff09; 2018年09月14日 09:55:54 苏杭-Java工程师 阅读数&#xff1a;494———————————— 二叉查找树&#xff08;BST&#xff09;具备什么特性呢&#xff1f; 1.左子树上所…

如何在 CentOS 7上安装和使用 Docker Compose

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 介绍 Docker是一个很好的工具&#xff0c;但要真正充分利用它的潜力&#xff0c;最好是应用程序的每个组件都在它自己的容器中运行。对于…

WebSSH2安装过程可实现WEB可视化管理SSH工具

目录 Chrome web Secure Shell Extension gotty GateOne noVNCvncserver XtermjsSSH2nodejs nodejstty.js CheungSSH TriAquae https://github.com/Scirh/Python/tree/master/django https://www.smarthomebeginner.com/install-shellinabox-on-ubuntu/#64-bit https://gist.gi…

原码反码补码位运算,

进制转换&#xff1a; 十进制转二进制&#xff1a; 求余法&#xff1a;用2对数据求余&#xff0c;然后再对商继续求余&#xff0c;直到商为0结束&#xff0c;过程中产生的余数就是该数据的二进制(逆序)。 求权法&#xff1a;数据 - 2^(n-1) 如果可以减 第n位就是1&#xff0c;否…

一个人幸运的前提,是他有能力改变自己

很多时候&#xff0c;我们羡慕那些幸运的人&#xff0c;却看不到他们为此做出的努力和改变。 其实&#xff0c;一个人的幸运并不是偶然的&#xff0c;美国成功哲学家金洛恩说过这么一句话&#xff1a;“成功不是追求得来的&#xff0c;而是被改变后的自己主动吸引来的。” …

剑指Offer-正则表达式匹配(Python)

1 题干内容 请实现一个函数用来匹配包括.和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。 例如&#xff0c;字符串aaa与模式a.a…

Docker 制作镜像的方式

其它制作镜像的方式 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 除了标准的使用 Dockerfile 生成镜像的方法外&#xff0c;由于各种特殊需求和历史原因&#xff0c;还提供了一些其它…

【算法】快排

快速排序 其利用的思想就是分治思想&#xff0c;最开始先从数组中随机选择一个元素p&#xff08;为什么随机下面解释&#xff09;&#xff0c;然后以这个元素对数组中的元素进行分类&#xff0c;数组左侧都是小于p的元素&#xff0c; 右侧都是大于等于p的元素。这样就让数组分成…

【C基础】堆内存创建/释放和内存清理函数/内存泄漏

本期涉及到了较多的指针&#xff0c;没有彻底领悟的同学请翻阅之前的博文~ 一闪一闪亮晶晶&#xff0c;满天都是小星星*** 什么是堆内存&#xff1a; 是进程的一个内存段(text、data、bss、heap、stack)之一&#xff0c;由程序员手动管理&#xff0c; 特点就是足够大&#x…

19_05_01校内训练[polygon]

题意 把一个边长为1的正n边形放到一个正m边形中&#xff0c;要求m边形完全覆盖n边形&#xff0c;可以有交点&#xff0c;并且中心重合。求正m边形的最小边长&#xff0c;至少精确到6位。要求logn计算。 思考 先考虑m|n的情况。 我们知道&#xff0c;正m边形的边长与可行区域&am…

六度人脉 全球最高效的人脉法则(图)

六度人脉这一概念&#xff0c;在20世纪60年代由美国心理学家Stanley Milgram提出并验证。 所谓六度人脉&#xff0c;即地球上所有的人都可以通过六层以内的熟人关系链和其他人联系起来。 通俗地说&#xff1a;“最多通过六个人你就可以认识地球上任何一个陌生人。” SNS(社会…

[转]numpy中的np.max 与 np.maximum区别

转自&#xff1a;https://blog.csdn.net/lanchunhui/article/details/52700895 转载于:https://www.cnblogs.com/xianhan/p/10609319.html

JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)

今天在压力测试环境某一个服务出现crash了&#xff0c;经过一番检查&#xff0c;终于发现是由于JVM的Finalization Delay引起的&#xff0c;这个问题比较特殊&#xff0c;这里记录一下。 这个服务是用Java写的&#xff0c;主要完成的功能是根据特定的指令文件生成mp4文件&#…

win10 php7+apache2.4的配置以及遇到的问题及解决

首先进入PHP官网下载php7的版本,我下的是PHP7.1.28,在PHP的下载页面注意划红线和绿线的地方(我画的) 1.画了红线的意思是请使用由apache lounge提供的编译文件,也就是点进蓝色Apache lounge这里下载. 2.画了绿色的线的意思是用Apache的话你必须使用Thread Safe(线程安全)的PHP…