函数

函数三要素:函数名,参数,返回值

重点研究函数的输入输出

随机数函数

//产生一组随机数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL));//和随机函数一起连用
int randArr[10];
int count = 0;
while(1)
{
int num = rand()%10;//随机函数
randArr[count++] = num;
for(int i = 0;i < count-1;i++) {
if(randArr[i] == randArr[count-1]) {
count--;
break;
}
}
if(count == 10) {
break;
}
}
for(int i = 0;i < 10;i++) {
printf("%d\n",randArr[i]);
}
return 0;
}

[100,200]的随机数

rand()%100;//[0,99]
rand()%100+100;//[101,200]
rand()%101+100;//[100,200]

获取当前的时间

#include<stdio.h>
#include<time.h>
int main() {
time_t rawtime;//返回1970.1.1.0:00为起点作为参数
rawtime = time(NULL);
struct tm * timeinfo;//
timeinfo = localtime(&rawtime);
printf("year : %d\n",timeinfo->tm_year);
}

自定义函数

最大值函数

#include<stdio.h>
int main() {
int a = 3;
int b = 5;
int iMax = myMax(a,b);
printf("max value = %d\n",iMax);
}
int myMax(int i,int j) {
if(i > j)
return i;
else
return j;
//return i > j?i:j;
}

定义和申明的关系

定义在前,调用在后

定义在后,调用在前,此时需要向前申明。函数的特点是先声明,在调用。

#include<stdio.h>
int myMax(int i,int j) {
if(i > j)
return i;
else
return j;
//return i > j?i:j;
}
int main() {
int a = 3;
int b = 5;
int iMax = myMax(a,b);
printf("max value = %d\n",iMax);
}
#include<stdio.h>
int myMax(int i,int j);
int main() {
int a = 3;
int b = 5;
int iMax = myMax(a,b);
printf("max value = %d\n",iMax);
}
int myMax(int i,int j) {
if(i > j)
return i;
else
return j;
//return i > j?i:j;
}

形参与实参

形参:在函数定义或者是声明的时候的参数,声明中的参数可以省略,但参数类型不能省略。

实参:在函数调用的时候所传入的参数

入参中如果没有参数,可以用void表示,通常省略,如果没有返回值,即返回类型是void,此时void不可省略,若省略系统会默认返回一个类型

传值与传址

使用是有区别,本质上都是传递一个数值。

函数被调用之前,其所有的变量尚未开辟空间,调用时才开辟空间,空间消失结束语函数调用完毕。

#include<stdio.h>
void func(int a);//前向声明
int main() {
int a = 10;
func(a);
printf("main a = %d\n",a);
}
void func(int a) {
a++;
printf("func a = %d\n",a);
}
//func a = 11
//main a = 10
//传值函数调用参数的传递过程
#include<stdio.h>
void func(int * pa);
int main() {
int a = 10;
func(&a);//传址
printf("main a = %d\n",a);
return 0;
}
void func(int *pa) {//传进来的地址
(*pa)++;//对地址取内容再++
printf("func a %d\n",*pa);//11
}

两个数的交换

#include<stdio.h>
void mySwap(int a,int b);
void mySwap1(int *pa,int *pb);
int main() {
int a = 3,b = 5;
printf("a = %d,b = %d\n",a,b);// 3 5
mySwap(a,b);
printf("a = %d,b = %d\n",a,b);//3 5
mySwap1(&a,&b);//传入要交换的地址
printf("a = %d,b = %d\n",a,b);// 5 3
return 0;
}
void mySwap(int a,int b) {
int t = a;
a = b;
b = t;
//这里确实改变了
}
//实际并没有交换(传值的方式时间并没有发生交换)
void mySwap1(int *pa,int *pb) {//形参的形式是对传入的实参的地址取内容
int t = *pa;
*pa = *pb;
*pb = t;
}

地址对于不同作用域来说是开放的

传递一维数组

#include<stdio.h>
void disArray(int arr[10]);
int main() {
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("main sizeof(arr) = %d\n",sizeof(arr));//40
disArray(arr); return 0;
}
void disArray(int arr[10]) {//大小始终是4
printf("disArray sizeof(arr) = %d\n",sizeof(arr));//4
}
/*
<=>
void disArray(int *p) {
printf("disArray sizeof(arr) = %d\n",sizeof(p));
}
*/

数组的传递不可能通过拷贝的方式来传递,c语言基于效率的原因,在传递时,数组名仅当地址使用

数组的三要素:起始地址,步长(刻度),范围

数组名是一个指针,它包含了(起始地址,步长),但数组名没有里面没有包含范围,所以在传递一维数组的时候,要传数组名和范围。

#include<stdio.h>
void disArray1(int *p,int n);
int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10};
printf("main sizeof(arr) = %d\n",sizeof(arr));
disArray1(&arr[0],sizeof(arr)/sizeof(arr[0]));//传递给数组的首地址和范围大小 return 0;
}
void disArray1(int *p,int n) {
printf("disArray1 sizeof(arr) = %d\n",sizeof(p));//大小不变4
for(int i = 0;i < n;i++) {
printf("%d\n",*p++);
}
}

函数在结构设计或扩及功能设计的应用


#include<stdio.h>
#include<stdlib.h>
#include<time.h> void initArray(int *arr,int n);
void displayArray(int *arr,int n);
void sortArray(int * arr,int n);
void smallIdx(int startIdx,int * arr,int n)
void myswap(int *pa,int *pb); int main() {
int arr[10];
initArray(arr,10);
displayArray(arr,10);
printf("+++++++++++++++");
sortArray(arr,10);
displayArray(arr,10); return 0;
}
//随机产生10个数
void initArray(int *arr,int n) {
srand(time(NULL));
for(int i = 0;i < n;i++ ) {
*arr++ = rand()%100;
}
}
//输出数组
void displayArray(int *arr,int n) {
for(int i = 0;i < n;i++) {
printf("%2d\n",*arr++);
}
}
//排序
void sortArray(int * arr,int n) {
int idx;
for(int i = 0;i < n-1;i++) {
idx = smallIdx(i,arr,n);
if(idx != i) {
myswap(&arr[i],&arr[idx]);
}
}
}
void smallIdx(int startIdx,int * arr,int n) {
int idx = startIdx;
for(int i = startIdx+1,i < n;i++) {
if(arr[i] < arr[idx]) {
idx = i;
}
}
return idx;
} void myswap(int *pa,int *pb) {
*pa ^= *pb;
*pb ^= *pb;
*pa ^= *pb;
}

传递二维数组

#include<stdio.h>
void func(int(*p)[4],int n);
int main() {
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
func(arr,3);
return 0;
}
void func(int (*p)[4],int n) {//二维数组的传递
for(int i = 0;i < n;i++) {
for(int j = 0;j < 4;j++) {
printf("%3d",p[i][j]);
}
putchar(10);
}
}

函数的调用

函数之间是平行的,函数嵌套调用多了会挂掉,栈溢出

递归调用

直接调用或者间接调用自己的情形(recursive),递归是比较接近自然语言特性的调用方式,递归必须要用合理的出口,不然会挂掉

//有 5 个人坐在一起,问第 5 个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数,他说比第 3 个人大 2 岁。问第 3 个人,又说比第 2 个人大 2 岁。问第 2 个人,说比第 1 个人大 2 岁。最后问第 1 个人,他说是 10 岁。请问第 5 个人多大?
#include<stdio.h>
int getAge(int n);
int main() {
int age = getAge(5);
printf("age = %d\n",age); return 0;
} int getAge(int n) {
if(n == 1) {
return 10;
}else{
return getAge(--n) + 2;
}
}

递归起始条件getAge(n),有使递归趋于结束的语句getAge(--n)递归终止条件n == 1

书写结构:

递归返回 func(递归条件) {
if(递归终止条件)
return 终止处理;
else
return func(趋于递归终结的条件);
}

注意递归条件是否参与计算,如果参与计算,则趋于结束的条件不能++,或着--操作

#include<stdio.h>
int factorail(int n);
int main() {
int factorail = factorial(5);
printf("5! = %d\n",&factorail);
}
int factorail(int n) {
if(n == 0)
return 1;
else
return n*factorail(n-1);
//return n*factorail(--n);前面n参与了运算,不能使用--运算
}

C/C++(函数)的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

  10. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

随机推荐

  1. dedecms实现表单提交数据到指定的邮箱

    1.http://blog.csdn.net/webnoties/article/details/17219219 2.http://www.jz96.com/451.html 3.https://m ...

  2. 【C#Windows 服务】 《三》Timer设置

    一.工具: VS2015+NET Framework4.5. 二.操作: 1.计时器设置: 2.日志代码: 三.代码: 1.日志代码: 1 /// <summary> 2 /// Wind ...

  3. codeforces 400 C Inna and Huge Candy Matrix【模拟】

    题意:给出一个矩形的三种操作,顺时针旋转,逆时针旋转,对称,给出原始坐标,再给出操作数,问最后得到的坐标 画一下模拟一下操作就可以找到规律了 #include<iostream> #inc ...

  4. 转移顺序的艺术 luogu4394 + lougu2966 + luogu3537

    lougu4394: N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退 ...

  5. [转载][来自csdn]RTS和CTS是什么意思?

    原文链接: http://blog.csdn.net/zmq5411/article/details/6280332 这篇文章看着挺好,明白易懂,顺手转过来 34RTS和CTS是什么意思? 解释一:R ...

  6. HNU 12886 Cracking the Safe 二十四点的判断

    经典的一个题,今天竟然写跪了…… 题意: 给你4个数字,让你判断是否能通过四则运算和括号,凑成24点. 思路: 暴力枚举运算顺序和运算符. 代码: #include <iostream> ...

  7. python中的类与继承

    Class 类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object): pass Python 的编程习惯,类 ...

  8. 洛谷 P1604 B进制星球

    P1604 B进制星球 题目背景 进制题目,而且还是个计算器~~ 题目描述 话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球.因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2 ...

  9. Ubuntu常见报错及解决方式汇总

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...

  10. JSP编程技术5-购物车的实现-session会话对象

    首先十分感谢大家对我的文章的支持,我是个刚刚才找到自己方向的在校大学生,当然我的知识和能力有限,眼下正在努力恶补学习中.当我看到自己首次发表到CSDN首页的文章才几个小时阅读量就超过了100时,对我来 ...