C语言----函数(2)

简介: C语言----函数

C语言----函数(1)https://developer.aliyun.com/article/1544258

7.嵌套调用和链式访问

//假设我们某年某月有多少天
//只有闰年的2月有29天,需要对y判断是否是闰年
 
//函数只有两种返回
//是闰年
//不是闰年
int  is_leap_year(int y)
{
    if(((y%4==0)&&(y%100!=0)||(y%400==0)))//闰年的判断,
        return 1;//如果是闰年就返回1
    else
        return 0;//不是闰年就返回0
}
 
 
int get_days_of_month(int y ,int m)//接受年和月//这里我们需要返回一个整型
{
    int days[] = {0,  31,28,31,30,31,30,31,31,30,31,30,31 };
    //             0  1  2  3  4  5  6  7  8  9  10  11      下标
    int day = days[m];
    if (is_leap_year(y) == 1 && m==2)//如果是闰年就返回一,表示为真的,并且m是二月
    {
        day++;//闰年二月的时候,天数+1,为29天
    }
    return day;//如果不是二月就返回day
 
 
}
 
 
 
int main()
{
    int month = 0;
    int year = 0;
    scanf("%d %d", &year, & month);
    //计算某年某月有多少天
    int day =get_days_of_month(year, month);//这个函数传了年和月
    printf("%d\n", day);
    return 0;
}
 
 
 
//main函数调用get_days_of_month去计算某年某月有多少天
//get_days_of_month这个函数内部又要通过is_leap_year判断输入的数是否是闰年
//17行的==1可以不写
 
 
 
 
 
做出改变,用布尔类型来做:
bool  is_leap_year(int y)    //布尔类型,判断真假
{
    if (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)))//闰年的判断,
        return true;//如果是闰年就返回true
    else
        return false;//不是闰年就返回false
}
所谓链式访问就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问
 
int main()
{
    //printf("%d", printf("%d", printf("%d ", 43)));//输出结果是4321
    /*int r = printf("hehe");
    printf("%d\n", r);*///输出结果是hehe4,返回的是4个字符
 
    printf("%d", printf("%d ", printf("%d ", 43)));
    //printf("%d", 43)这个打印出来的是43,打印两个字符返回值是2
    //printf("%d", printf("%d", 2));
    //printf("%d", 2)   再屏幕上打印2,打印一个字符返回值是1
    //printf("%d", 1);打印就是1
    //所以最终的结果是4321
    /*先打印43,再打印2,最后打印1*/
    //如果在中间和后面的两个printf里面的%d后面添加一个空格,输出结果就不一样了,变为43 3 2
    //这种情况的话最先的打印是43加一个空格,返回3个字符
    //然后第二次打印就是打印3和一个空格,返回2个字符
    //然后就变成了printf("%d",2),打印2
    //最终结果就变成43 3 2
    return 0;
}

8.函数的声明和定义

函数或者变量都要满足,先声明后使用

声明后面要加分号,定义后面不用加分号

//函数的定义是一种特殊的声明
/*int  is_leap_year(int y);*///函数的声明,只要函数提前声明了,不管函数定义在前面还是后面,都能使用
int  is_leap_year(int );//函数声明的另一种写法,在声明内容中形参的名字是可以不用写的
 int main()
 {
     int year = 0;
     scanf("%d", year);
     if (is_leap_year(year)==true)//函数的调用
     {
         printf("%d 是闰年", year);
     }
     else
     {
         printf("%d 不是闰年", year);
     }
 
 
 
     return 0;
}
 
 //函数的定义
 int  is_leap_year(int y)    //布尔类型,判断真假
 {
     if (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)))//闰年的判断,
         return 1;//如果是闰年就返回true
     else
         return 0;//不是闰年就返回false
 }
新创建一个源文件add.c
新创建一个头文件add.h
源文件add.c放函数的定义实现
头文件add.h放函数的声明
如果要使用的话,就写出头文件打代码
#include "add.h"
写出这行代码,头文件就能正常使用了
 
这样就把函数的声明和定义拆散了,函数定义放在.c文件
函数声明放在头文件
 
我们要把add.h和add.c当做一个模块,只要想使用这个模块,包含头文件即可

把大型复杂的程序,拆分成多个文件的好处

1.团队协作

2.代码模块化,逻辑更加清晰

3.代码的隐藏

局部变量的作用域就是变量所在的局部范围
 
 
 
//int main()
//{
//    {
//        int a = 100;//定义的a只在这个括号内使用,出了这个括号就用不了了 
//        printf("1 a=%d\n", a);
//    }
//    //printf("2 a=%d\n", a);
//
//
//    return 0;
//}
int main()
{
    int a = 100;//把a的定义放在外围的括号内处于这个括号的打印都能用
    {
        //定义的a只在这个括号内使用,出了这个括号就用不了了 
        printf("1 a=%d\n", a);
    }
    printf("2 a=%d\n", a);
 
 
    return 0;
}
全局变量的作用域是整个工程
 
 
 
int a = 100;
int main()
{    
    {
 
        printf("1 a=%d\n", a);
    }
    printf("2 a=%d\n", a);
    return 0;
}
static是静态的意思,可以用来:
1.修饰局部变量
2.修饰全局变量
3.修饰函数
 
extem是用来声明外部符号的
 
 
 
 
ertem:
在ass.c定义int a = 100;这就是定义的全局变量
 
 
 
 
//extern是用来声明外部符号的
笔记.c
extern int a;//变量的声明
int main()
{    
    {
 
        printf("1 a=%d\n", a);
    }
    printf("2 a=%d\n", a);
    return 0;
}
add.c
int a = 100;
 
extern是声明外部符号的,只要这个符号是来自外部的,只要用extern 就可以调用了
 
声明一各变量的方式,知道类型和名字就行了
//void test()//进入函数
//{
//    int a = 1;/*将a赋值为1局部变量*/
//    a++;//a直接新创建一个值
//    printf("%d", a);
//}
//
//int main5()
//{
//    for (int i = 0; i < 5; i++)//i从0开始,循环5次
//    {
//        test();
//    }
//    return 0;
//}
//为什么这个函数输出是2
//因为每次调用test函数的时候,我们就会定义一次a并赋值为1,然后就是2,
//第二轮循环也一样,在每个循环的开始a都是以1出现的,所以最后打印的结果就是5个2
 
 
 
 
void test()//进入函数
{
    static int a = 1;//在局部变量前面加static\
    //输出结果截然不同,结果为:23456
    a++;
    printf("%d", a);
}
 
int main()
{
    for (int i = 0; i < 5; i++)//i从0开始,循环5次
    {
        test();
    }
    return 0;
}
//为何在局部变量前面添加static后,结果变得不一样了
//static修饰局部变量改变了变量的声明周期
//在test函数中没有static的话,局部变量 是进入这个函数开始,出去这个函数生命周期结束
//没有被static修饰,局部变量的位置是在栈区的,进入这个函数生成,出去这个函数销毁
//被static修饰修饰的变量就不放在栈区了,就放在静态区了,static修饰修饰的变量叫静态变量
//存储在静态区的变量和全局变量一样的,声明周期就和程序的生命周期一样了
//但是本代码中的a的作用域不变,
//ststic修饰的变量,在第二轮循环的时候,使用的变量就是上一次留下来的,而不是新建的变量
 
//如何使用static去修饰变量
//:未来一个变量出了函数,我们还想保留值,等下次进入函数继续使用,就可以使用static去修饰这个变量

//如何使用static去修饰局部变量

//:未来一个变量出了函数,我们还想保留值,等下次进入函数继续使用,就可以使用static去修饰这个变量

// 将全局变量放到其他文件
//函数要先声明再使用,变量也一样
//一个全局变量,要想在其他文件中使用,只需要用extern声明外部符号,就可以使用了
//全局变量是默认带有外部链接属性的,只要用extern引用就行了
extern int g_val;//对变量进行声明
int main()
{
    printf("%d\n", g_val);
 
 
 
    return 0;
}
//但是如果想引用其他文件夹的全局变量,但是这个全局变量被static修饰了,
//  那么这个全局变量就不能被引用
 
 
//static修饰全局变量的时候,改变了全局变量的链接属性
//使得外部链接属性,变成了内部链接属性
//这种变量只能在自己所在的.c文件中使用,其他的.c文件中无法使用
 
//使用建议:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,
// 就可以使用static修饰
//函数在另一个文件
 
 
//extern Add(int, int);//声明外部符号就可以使用了
//函数也具有外部链接属性的,只要在其他的.c文件中正确的声明,也可以直接使用
 
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    int c = Add(a, b);
    printf("c=%d\n", c);
    return 0;
}
 
//Add(int x, int y)//static修饰函数,让函数外部链接属性变为内部链接属性
// 只能在自己所在的.c文件中使用,其他.c文件中无法使用
//{
//    return x + y;
//}
目录
相关文章
|
17天前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
18 1
一文彻底搞清楚C语言的函数
|
2月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
52 3
|
2月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
34 2
|
2月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
96 16
|
2月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
64 1
|
2月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
68 24
|
2月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
84 23
|
2月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
102 15
|
3月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
84 9
|
3月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
78 6