C语言基础-第五课-函数

1   函数

1.1   函数的原型和调用

在使用函数前必须定义或者声明函数


double circle(double r);

int main()

{

double length = circle(10);

printf("length = %f\n", length);

return 0;

}

double circle(double r)

{

return 2 * 3.14 * r;

}

1.2   函数的形参与实参

在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间需要传递数据。

在定义函数时函数名后面括弧中的变量名称为“形式参数”,简称形参。在调用函数时,函数名后面括号中的变量或表达式称为“实际参数”,简称实参。

1形参在未出现函数调用时,他们并不占用内存单元,只有在发生函数调用的时候形参才被分配内存,函数调用完成后,形参所占的内存被释放

2实参可以是变量,常量或者表达式

3在定义函数时,一定要指定形参的数据类型

4形参与实参的数据类型一定要可兼容

5在C语言中,实参与形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传递给实参。

如果函数的参数是个数组,那么是可以通过形参修改实参的值的

1.3   函数的返回类型与返回值

1函数的返回值通过函数中的return获得,如果函数的返回值为void可以不需要return语句。

2函数return语句中的返回值数据类型应该与函数定义时相同。

3如果函数中没有return语句,那么函数将返回一个不确定的值。

1.4   main函数与exit函数与函数的return语句


int test1()

{

printf("111111\n");

//return 0;

exit(0);//在子函数中调用exit同样代表程序终止,但在子函数中调用return只是子函数终止,程序正常执行

printf("222222\n");

}

int main()

{

test1();

printf("AAAAAA\n");

exit(100);//exit是C语言的库函数,调用exit的结果就是程序终止

return 100;//在main函数中调用exit与调用return是一样的

printf("CCCCCCC\n");

return 0;//main函数return代表程序终止

printf("BBBBBB\n");

}

1.5   多个源代码文件程序的编译

1.5.1   头文件的使用

如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型。

如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了。把函数声明放入头文件是很好的习惯。

1.5.2   #include与#define的意义

#include就是简单的文件内容替换

#define就是简单的文本替换而已

1.5.3   #ifndef与#endif

#ifndef的意思就是条件预编译,如果#ifndef 后面的条件成立,那么就预编译从#ifndef开始到#endif之间的代码,否则不会去预编译这段代码

1.6   函数的递归

函数可以调用自己,这就叫函数的递归


void recurse(int i)

{

if (i > 0)

{

recurse(i - 1);

}

printf("i = %d\n", i);

}

int main()

{

recurse(10);

return 0;

}

1.6.1   递归的过程分析


void up_down(int  n)

{

printf("in %d, location %p\n", n, &n);

if (n < 4)

up_down((n + 1));

printf("out %d, location %p\n", n, &n);

}

int main()

{

up_down(1);

return 0;

}

有n个人排成一队,问第n个人多少岁,他回答比前面一个人大2岁,再问前面一个人多少岁,他回答比前面一个人大2岁,一直问到最后问第一个人,他回答10岁


int age(int n)

{

int i;

if (n == 1)

i = 10;

else

i = age(n - 1) + 2;

return i;

}

10进制数转化为二进制数的例子

234在十进制下为2 * 10的2次方 + 3 * 10的1次方 + 4*10的0次方。

奇数的二进制最后一位一定是1,偶数的二进制最后一位一定是0。

可以通过 number % 2 得到二进制形式的最后一位,如果要将一个完整的整数转化为二进制就需要用到递归函数。

在递归调用之前,计算 number % 2的值,然后在递归调用语句之后进行输出,这样计算出的第一个数值反而在最后一个输出。

为了得出下一个数,需要把原数除以2,这种计算相当于十进制下把小数点左移一位,如果此时得出的数是偶数,,则下一个二进制的数值是0,如果得出的是奇数,那么下一个二进制数为1。

直到被2除的结果小于2,就停止递归。


void to_binary(unsigned int n)

{

unsigned int i = n % 2;

if (n >= 2)

to_binary(n / 2);

printf("%c", i + 0x30);

}

斐波那契数列例子

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

第0项是0,第1项是第一个1。

这个数列从第2项开始,每一项都等于前两项之和。


int fib(int n)

{

if (n == 0)

return 0;

if (n == 1)

return 1;

if (n > 1)

return fib(n - 1) + fib(n - 2);

}

1.6.2   递归的优点

递归给某些编程问题提供了最简单的方法

1.6.3   递归的缺点

一个有缺陷的递归会很快耗尽计算机的资源,递归的程序难以理解和维护。

时间: 2024-10-04 06:56:46

C语言基础-第五课-函数的相关文章

C语言基础课程 第一课 Linux环境配置小实战httpserver

?? C语言基础课程 第一课 Linux环境配置小实战httpserver 首先环境需要的是redhat虚拟机操作系统 打开redhat 防火墙 2.将WWW(HTTP)勾选上 3.点击apply 点击是 4.切换到root用户 输入正确的root密码 5. 启动http服务 6.输入ifconfig 查看当前ip 痛 7.通过分析我们知道 他是一个局域网的ip   windows可以通过net 或者 主机模式与Linux进行通信 如果不想改变本地ip地址的话  我们需要改变虚拟机的ip地址 和

C语言基础:数组作为函数参数传递演示源码

将做工程过程中常用的内容片段记录起来,如下内容内容是关于C语言基础:数组作为函数参数传递演示的内容,应该能对小伙伴也有好处. #include <stdio.h> void show_array(int values[], int number_of_elements) { int i; printf("About to display %d valuesn", number_of_elements); for (i = 0; i < number_of_elemen

Go 语言基础(五) 之 进阶

内存分配 Go 同样也垃圾收集,也就是说无须担心内存分配和回收. Go 有两个内存分配原语,new 和 make.它们应用于不同的类型,做不同的工作, 可能有些迷惑人,但是规则很简单. 1.用 new 分配内存 内建函数 new 本质上说跟其他语言中的同名函数功能一样: new(T) 分配了零值填充的 T 类型的内存空间, 并且返回其地址,一个 *T 类型的值.用 Go 的术语 说,它返回了一个指针,指向新分配的类型 T 的零值. 有一点非常重要: new 返回指针. 这意味着使用者可以用 ne

python基础(五)函数

一.函数概念 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method. 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 二.使用函数的好处 1.简化代码 2.提高代码的复用性 3.代码可扩展 三.py

[Java入门笔记] Java语言基础(五):数组

简介 数组可用用于存储存储多个数据,Java的数组要求所有的数组元素具有一种相同的数据类型.一旦数组初始化完成,数组在内存中的空间被固定下来,长度不可改变,即使把数组的元素清空,所占用的空间依然被保留. 生活案例:博物架 每一个物品架都是相同类型的物品,长度不变,即使把物品下架,物品架依然不会改变. 定义数组 使用数组4步走: 1.声明数组 Java中支持两种格式的数组定义格式: 类型[] 变量名; 类型 变量名[]; 例: int[] a; int b[]; //两种方法都行,不过建议使用第一

C语言基础-第五章

流程控制 1.顺序结构 顺序结构是指程序将按照书写的顺序一步步执行程序. 2.选择结构 2.1但分支结构语句 if(表达式){语句} 2.2双分支结构 if(表达式){}else if{} else{} 2.3多分支结构语句 switch() { case 常量:语句 break;  case .... break; default:语句 break; } 2.4条件运算符和条件表达式 max=(a>b) ? a:b; a是否大于B 如果条件成立那么就取A值,如果条件不成立就去B 3.循环结构

Day05_JAVA语言基础第五天

1.函数(掌握) 1.概念(掌握) 定义在类中,有特定功能的一小段程序 2.格式(掌握) 修饰符 返回类型 函数名(参数类型 形式参数,...){ 函数体: return 返回值; } 解释: A 修饰符: public static B 返回值类型 :就是数据类型 C 函数名:见名知意,如果一个单词,首字母小写,如果多个单词组成,从第二个单词开始首字母大写 D 参数类型 :数据类型 E 形式参数 :接受实际参数的变量 F 实际参数 :就是实际参与运算的变量 G 函数体:实现功能的代码 H 返回

Python基础(五)-函数

函数: 1.定义与使用: def 函数名(参数): ... 函数体 ... 返回值 ## def:表示函数的关键字 函数名:函数名称,根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数提供数据 返回值:函数执行完毕后,可以给调用者返回结果

C语言基础-第四课-数组与字符串

1   数组 1.1   一维数组定义与使用 int array[10];//定义一个一维数组,名字叫array,一共有10个元素,每个元素都是int类型的 array[0] = 20; array[1] = 30; array[9] = 80; //array[10] = 100;//错误,没有 array[10]这个元素 1.2   数组在内存的存储方式 数组在内存中就是一段连续的空间,每个元素的类型是一样的 1.3   一维数组初始化 int array[10] = { 100, 1, 5