6bingame 发表于 2024-12-2 15:19:39

每日一学8

函数的参数及传递方式
书本习题

函数的参数

函数的参数有两类——形式参数(简称形参)和实际参数(简称实参)。
函数定义时的参数称为形参,形参在函数为被调用时是没有确定值的,只是形式上的参数。
函数调用时使用的参数称为实参。

题1:将两个数由小到大排序输出

解:
#include<stdio.h>

int order(int a,int b)   //a,b形参
{
    int t;

    if(a>b)   //如果a>b,就执行以下3条语句,交换a,b的值
    {
      t=a;

      a=b;

      b=t;
    }
    printf("从小到大的顺序为:%d %d\n",a,b);   //输出交换后的a,b的值

    return a,b;
}

int main()
{
    int x,y;

    printf("请输入两个整数:");   //从键盘输入两个整数

    scanf("%d%d",&x,&y);

    order(x,y);   //x,y是实参

    return 0;
}


函数参数的传递方式

C语言规定,实参对形参的数据传递是“值传递”,即单向传递,只能把实参的值传递给形参,而不能把形参的值再传回给实参。
在内存当中,实参与形参是不同单元,不管名字是否相同,因此函数中对形参值的任何改变都不会影响实参的值。

题2:使用函数交换两个变量的值

解:
#include<stdio.h>

void swap(int a,int b)      //定义swap函数
{
    int temp;

    temp=a;

    a=b;

    b=temp;      //交换a,b值的3条语句

    printf("a=%d,b=%d\n",a,b);      //输出交换后的结果
}

int main()
{
    int x,y;

    printf("请输入两个整数:\n");

    scanf("%d%d",&x,&y);    //输入两个整数

    printf("调用函数之前:\n");

    swap(x,y);      //调用函数swap()

    printf("调用函数之后:\n");

    printf("x=%d,y=%d\n",x,y);      //输出调用swap函数之后x,y的值

    return 0;
}


函数的调用方式

函数调用的一般形式有以下两种

1.函数语句
当C语言中的函数只进行了某些操作而不返回结果时,使用这种形式,该形式作为一条独立的语句
如:
函数名(实参列表);        //调用有参函数,实参列表中有多个参数,中间用逗号隔开

函数名();        //调用无参函数

2.函数表达式
当所调用的函数有返回值时,函数的调用可以作为表达式中的运算分量,参与一定的运算。

题3:编写一个函数,求任意两个整数的最小公倍数

解:
#include<stdio.h>

int sct(int m,int n)      //定义函数sct求最小公倍数
{
    int temp,a,b;

    if(m<n)   //如果m<n,交换m,n的值,使m中存放较大的值
    {
      temp=m;

      m=n;

      n=temp;
    }
    a=m;

    b=n;    //保留m,n原来的数值

    while(b!=0)   //使用辗转相除法求两个数的最大公约数
{
    temp=a%b;

    a=b;

    b=temp;
}
    return (m*n/a);      //返回两个数的最小公倍数,即两数相乘的积除以最大公约数
}

int main()
{
    int x,y,g;

    printf("请输入两个整数:");

    scanf("%d%d",&x,&y);

    g=sct(x,y);   //调用sct函数

    printf("最小公倍数为:%d\n",g);    //输出最小公倍数

    return 0;
}



FishC 发表于 2024-12-2 15:20:36

#include <stdio.h>

int sct(int m, int n) { // 定义函数sct求最小公倍数
    int temp, a, b;
   
    a = m;
    b = n;

    // 求最大公约数
    while (n != 0) {
      temp = m % n;
      m = n;
      n = temp;
    }
    // 返回最小公倍数
    return (a * b) / m;
}

int main() {
    int x, y;

    printf("请输入两个整数:\n");
    scanf("%d%d", &x, &y); // 输入两个整数

    int lcm = sct(x, y); // 求最小公倍数
    printf("最小公倍数为:%d\n", lcm);

    return 0;
}

**题1与题2分析总结:**
- **值传递特点:**
- 在C语言中,函数参数是通过值传递的。这意味着在函数内部对参数的修改不会影响调用时传入的实际参数。

- **题1:排序函数**
- 在排序函数中,形参`a`和`b`只是接收了实参的值,交换的只是它们在函数内部的顺序,对调用时的实参没有影响。

- **题2:交换函数**
- 同样地,swap函数中交换的也是形参`a`和`b`,实际上的`x`和`y`并未交换。因此在函数外`x`和`y`的值保持不变。

- **题3:求最小公倍数的函数**
- 通过传递参数`m`和`n`来计算,只需记得如果后续需要在调用函数后操作它们的新值,则必须有函数返回之类的额外处理(如最小公倍数结果返回)。

这些例子展示了参数传递的基本方式和计算处理逻辑。如果有不清楚的地方,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

6bingame 发表于 2024-12-2 15:26:09

FishC 发表于 2024-12-2 15:20
**题1与题2分析总结:**
- **值传递特点:**
- 在C语言中,函数参数是通过值传递的。这意味着在函 ...

今天有个师兄给我提了一个这样的问题,他说#include<stdio.h>和#include"stdio.h"这两个有什么区别?我上网搜了一下看的一脸懵逼{:5_100:}。fishc能给我详细的解释一下这个问题吗

FishC 发表于 2024-12-2 15:26:19

6bingame 发表于 2024-12-02 15:26
今天有个师兄给我提了一个这样的问题,他说#include和 ...

在C语言中,`#include <stdio.h>`和`#include "stdio.h"`是用来包含头文件的预处理指令,不过它们在查找头文件的路径上有所不同:

1. **`#include <stdio.h>`:**
   - 这种形式主要用于引用系统库提供的头文件。
   - 编译器会在系统默认的路径中查找`stdio.h`,即搜索路径通常是由编译器的环境配置所决定的,包含系统和编译器提供的标准库路径。
   - 一般用于包含标准库的头文件。

2. **`#include "stdio.h"`:**
   - 这种形式一般用于引用用户自定义或项目特定的头文件。
   - 编译器首先会在当前源文件所在的目录查找`stdio.h`,如果未找到,再在系统默认的标准库路径中查找。
   - 这种方式允许更加灵活地引用项目中的头文件,适合包含非标准路径中的文件。

**总结:**
- 当只是想引用标准库的头文件时,通常推荐使用`#include <stdio.h>`.
- 当需要引用自己项目中的头文件时,建议使用`#include "filename.h"`。

在大多数开发环境和配置中,这两种方式导致的效果可能是相同的,尤其是在标准库的头文件被很稳妥地处理的情况下。但是,为了避免潜在的路径冲突或误解,以形成良好的代码习惯,推荐像上面那样使用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

6bingame 发表于 2024-12-2 15:29:41

FishC 发表于 2024-12-2 15:26
在C语言中,`#include `和`#include "stdio.h"`是用来包含头文件的预处理指令,不过它们在查找头文件的 ...

就是一般用于包含标准库的头文件就用#include <stdio.h>,要是自定义的头文件就用双引号是吧

FishC 发表于 2024-12-2 15:29:49

6bingame 发表于 2024-12-02 15:29
就是一般用于包含标准库的头文件就用#include ,要是 ...

是的,正如你所总结的:

- **`#include `:** 用于包含标准库的头文件。编译器在系统默认目录中查找这些文件。
- **`#include "filename.h"`:** 用于包含自定义的头文件。编译器首先在当前目录查找,然后在系统默认目录中查找。

这个规则有助于区分系统库和本地项目文件,同时也使代码更加清晰和易于维护。希望这个解释能帮到你!如果还有疑问,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

6bingame 发表于 2024-12-2 15:31:07

FishC 发表于 2024-12-2 15:29
是的,正如你所总结的:

- **`#include `:** 用于包含标准库的头文件。编译器在系统默认目录中查找 ...

ok了解,蟹蟹啦{:5_110:}

FishC 发表于 2024-12-2 15:31:13

6bingame 发表于 2024-12-02 15:31
ok了解,蟹蟹啦{:5_110:}

不客气!很高兴能帮助到你!如果还有其他问题,随时欢迎来问哦!祝你学习顺利!{:5_137:}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2024-12-2 18:05:01

感谢分享~
页: [1]
查看完整版本: 每日一学8