C语言学习笔记——函数(一)

简介: C语言学习笔记——函数

1.函数的介绍

  1. 为完成某一功能的程序指令(语句)的集合,称为函数
  2. 在C语言中,函数分为: 自定义函数、系统函数

2.函数的定义

2.1函数的基本语法

返回类型 函数名(形参列表){
    执行语句...; // 函数体 
    return 返回值; // 可选
}
  1. 形参列表:表示函数的输入
  2. 函数中的语句:表示为了实现某一功能代码块
  3. 函数可以有返回值,也可以没有,如果没有返回值,返回类型声明为 void

2.2函数的代码示例

#include<stdio.h>
double cal(int num1, int num2, char oper) {//申明一个四则运算函数
  double result = 0.0;//申明一个变量用于存放结果
  int error = 0;//用于判断输入的操作符是否错误
  switch (oper) {//判断oper的种类 + - * /
  case '+':
    result = (double)num1 + num2;//需要进行double的强制类型转换,否则会提示warning
    break;
  case '-':
    result = (double)num1 - num2;
    break;
  case '*':
    result = (double)num1 * num2;
    break;
  case '/':
    result = (double)num1 / num2;
    break;
  default://如果输入的四则运算符号,则提示错误
    error = 1;
    result = 0.0;
  }
  if (error == 0) {
    printf("%d %c %d = %f", num1, oper, num2, result);
  }
  else {
    printf("你的输入有误,请检查!");
  }
  return result;//返回result的值
}
void main() {
  int num1, num2;
  double result;
  char oper;
  printf("请输入数字1、数字2和操作符!");
  scanf_s("%d %d %c", &num1, &num2, &oper, sizeof(oper));
  result = cal(num1, num2, oper);
}

9540a7390df547d1bb27cc7bbce697df.png

3.头文件

3.1头文件的基本概念

  1. 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件: 程序员编写的头文件和 C 标准库自带的头文件
  2. 在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它
  3. #include 叫做文件包含命令,用来引入对应的头文件(.h 文件)。#include 也是 C 语言预处理命令的一种。#include 的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源 文件,这与复制粘贴的效果相同。但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错, 特别在程序是由多个源文件组成的时候。

3.2头文件代码示例

  1. 头文件myFun.h
double cal(int num1, int num2, char oper);

68c04aeeb62e4fddbe8e410d36047bf8.png

2.源文件myFun.c

#include<stdio.h>
double cal(int num1, int num2, char oper) {//申明一个四则运算函数
  double result = 0.0;//申明一个变量用于存放结果
  int error = 0;//用于判断输入的操作符是否错误
  switch (oper) {//判断oper的种类 + - * /
  case '+':
    result = (double)num1 + num2;//需要进行double的强制类型转换,否则会提示warning
    break;
  case '-':
    result = (double)num1 - num2;
    break;
  case '*':
    result = (double)num1 * num2;
    break;
  case '/':
    result = (double)num1 / num2;
    break;
  default://如果输入的四则运算符号,则提示错误
    error = 1;
    result = 0.0;
  }
  if (error == 0) {
    printf("%d %c %d = %f", num1, oper, num2, result);
  }
  else {
    printf("你的输入有误,请检查!");
  }
  return result;//返回result的值
}

3.使用myFun.h头文件计算

#include<stdio.h>
#include"myFun.h"
void main() {
  int num1, num2;
  double result;
  char oper;
  printf("请输入数字1、数字2和操作符!");
  scanf_s("%d %d %c", &num1, &num2, &oper, sizeof(oper));
  result = cal(num1, num2, oper);
}

ea85ec02ab3541289d8c1adf3a360f8d.png

3.3.头文件的注意事项和细节

  1. 引用头文件相当于复制头文件的内容
  2. 源文件的名字可以不和头文件一样,但是为了好管理,一般头文件名和源文件名一样
  3. include <>:引用的是编译器的类库路径里面的头文件,用于引用系统头文件
  4. include "":引用的是你程序目录的相对路径中的头文件,如果在程序目录没有找到引用的头文件则到编译器的类库路径的目录下找该头文件,用于引用用户头文件
  5. 引用 系统头文件,两种形式都会可以,include <> 效率高;引用 用户头文件,只能使用 include ""
  6. 一个 #include 命令只能包含一个头文件,多个头文件需要多个 #include 命令
  7. 同一个头文件如果被多次引入,多次引入的效果和一次引入的效果相同,因为头文件在代码层面有防止重复引 入的机制

4.函数调用过程

4.1.函数调用过程示例

#include<stdio.h>
void cal(int num1) {
  int count = num1 + 2;
  printf("count = %d\n", count);
}
void main() {
  int num2 = 7;
  cal(num2);
  printf("ok!\n");
}

cf88cbfdc9924972abcccfdad6815900.png

96d81b3b30be443fb7dba6ca7902c668.jpg

4.2.函数调用规则

  1. 当调用(执行)一个函数时,就会开辟一个独立的空间(栈)
  2. 每个栈空间是相互独立
  3. 当函数执行完毕后,会返回到调用函数位置,继续执行
  4. 如果函数有返回值,则将返回值赋给接收的变量
  5. 当一个函数返回后,该函数对应的栈空间也就销毁

5.函数的递归调用

5.1.递归调用的基本介绍

一个函数在函数体内又调用了本身,我们称为递归调用

5.2.递归调用代码示例

#include<stdio.h>
void test(int num) {
  if (num >= 7) {
    test(num - 1);
    printf("num = %d\n", num);
  }
}
void main() {
  test(9);
}

7ad1a84a883849f3a126d99a7080c12c.png

454d7593ebff4e7dab63544a27ec039e.jpg

5.3.递归调用需遵守的原则

  1. 执行一个函数时,就创建一个新的受保护的独立空间
  2. 函数的局部变量是独立的,不会相互影响
  3. 递归必须向退出递归的条件逼近,否则就是无限递归
  4. 当一个函数执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁

5.4.递归练习

  1. 有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。 当到第十天时,想再吃时(还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?
//有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!
//以后每天猴子都吃其中的一半,然后再多吃一个。 
//当到第十天时,想再吃时(还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?
#include<stdio.h>
int peachCount(int day, int peach) {
  if (day ==  1) {//当day==1的时候跳出返回总数
    return peach;
  }
  else {
    return peachCount(day - 1, 2 * (peach + 1));//如果day!=1则继续递归调用peachCount函数
  }
}
void main() {
  int peach = 1, day = 0;
  printf("请输入天数:");
  scanf_s("%d", &day);
  peach = peachCount(day, peach);
  printf("最初有%d个桃子", peach);
}

5a898ba4adfe4993ac5a653d5d8ef052.png2.已知 f(1)=3; f(n) = 2*f(n-1)+1; 请使用递归的思想编程,求出 f(n)的值?

//已知 f(1) = 3; f(n) = 2 * f(n - 1) + 1; 请使用递归的思想编程,求出 f(n)的值 ?
#include<stdio.h>
int cal(int n,int result) {
  if (n == 1) {
    return result;
  }
  else {
    cal(n - 1, 2 * result + 1);
  }
}
void main() {
  int num, result = 3;
  printf("请输入n=\n");
  scanf_s("%d", &num);
  result = cal(num, result);
  printf("f(n)的结果为:%d\n", result);
}

42addc46d0b947cfb80508d07a916498.png

//给你一个整数 n,求出它的斐波那契数是多少?
#include<stdio.h>
int f(int count) {
  if (count == 1 || count == 2) {
    return 1;
  }
  else {
    return f(count - 1) + f(count - 2);
  }
}
void main() {
  int count, result;
  printf("请输入要计算的第几个斐波那契数:");
  scanf_s("%d", &count);
  result = f(count);
  printf("%d", result);
}

3.f0bc94f608984b32b810b28d7a22343c.png


相关文章
|
9天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
36 6
|
27天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
31 6
|
2月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
44 10
|
1月前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
2月前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
68 7
|
2月前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
33 4
|
2月前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
2月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
32 0
|
2月前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
23 0
|
2月前
|
算法 C语言
factorial函数c语言
C语言中实现阶乘函数提供了直接循环和递归两种思路,各有优劣。循环实现更适用于大规模数值,避免了栈溢出风险;而递归实现则在代码简洁度上占优,但需警惕深度递归带来的潜在问题。在实际开发中,根据具体需求与环境选择合适的实现方式至关重要。
37 0