Linux C语言基础 day8

目录

思维导图:

学习目标:

学习内容:

1. 字符数组

1.1 二维字符数组

1.1.1 格式

1.1.2 初始化

1.1.3 二维字符数组输入输出、求最值、排序

2. 函数

2.1 概念

关于函数的相关概念

2.2 函数的定义及调用

2.2.1 定义函数的格式

2.3 函数的分类

1. 无参无返回值函数

2、有参无返回值函数

3、无参有返回值函数

4、有参有返回值函数

例如:

课堂练习:

课外作业:


思维导图:


学习目标:

例如:

  • 一周掌握 C基础知识

学习内容:

1. 字符数组

1.1 二维字符数组

1.1.1 格式

        char 数组名[常量1][常量2];

        常量1:表示的是定义的字符串的个数

        参数2:表示的是每个字符串的最大长度+1

1.1.2 初始化

        1、单字符初始化:该方式跟二维整形数组一致

        2、字符串初始化:

                全部初始化:char arr[3][8] = {"apple", "banana", "orange"}; arr[0] arr[1] arr[2]

                特殊初始化:char arr[ ][8] = {"apple", "banana", "orange"}; //此时省略的第一维,会根据初始化字符串的个数确定

                部分初始化:char arr[5][8] = {"apple", "banana", "orange"}; //没有初始化的字符串 默认为空串

1.1.3 二维字符数组输入输出、求最值、排序

例如:

#include<stdio.h>
#include<string.h>
#define MAX 5
int main(int argc, const char *argv[])
{
    char arr[MAX][20]={""};
    char brr[MAX][20]={""};
    for (int i = 0; i < MAX; i++)
    {
        printf("请输入第%d个字符串:", i+1);
        scanf("%s", arr[i]);
    }
    //输出所有的字符串
    printf("目前的字符串分别是:");
    for(int i=0; i<MAX;i++)
    {
        printf("%s\t", arr[i]);
    }
    puts("");
    char max[20]={""};
    stpcpy(max,arr[0]);
    for(int i=0;i<MAX;i++){
        if(strcmp(max,arr[i])){
            strcpy(max,arr[i]);
        }
    }
    printf("最大字符串为:%s\n", max);
    //将所有字符串进行排序
    char temp[20]={""};
    for(int i=0;i<MAX;i++){
        for ( int j= 0; j < MAX-i; j++)
        {
            if(strcmp(arr[j],arr[j+1]) > 0){
                strcpy(temp,arr[i]);
                strcpy(arr[i],arr[i+1]);
                strcpy(arr[i+1],temp);
            }
        }
       
    }
     //输出排序后的结果
    printf("目前的字符串分别是:");
    for(int i=0; i<MAX;i++)
    {
        printf("%s\t", arr[i]);
    }
    puts("");
}

2. 函数

2.1 概念

        将能实现某些功能的代码封装成代码块,然后通过通过代码块的名字就能调用到该部分的代码,这样,在多次相同操作的场景下,可以减少由于重复代码导致的劳动量,这个代码块,就是函数,代码块的名字,就是函数名。

        例:strlen strcpy printf scanf atoi。

关于函数的相关概念

        主调函数:调用别的函数的函数叫做主调函数

        被调函数:被别的函数调用的那个函数称为被调函数

        形式参数:也称形参,定义函数时,括号里面的参数称为形参

        实际参数:也称实参,函数调用时,括号里面的参数称为实参

2.2 函数的定义及调用

2.2.1 定义函数的格式

        返回值类型 函数名(函数的形参列表){ 函数体; }

2.3 函数的分类

1. 无参无返回值函数

        该函数,仅仅只是单纯执行特定的代码,没有数据传入,也不需要返回结果,仅仅只是执行一个过程 函数定义格式: void 函数名(void) {} 例如:void print_menu(void);

2、有参无返回值函数

        该函数,需要主调函数传入给定的数据后,才能进行执行该功能,但是,执行结束后,没有返回结果 函数定义格式:void 函数名(形参列表) {} 例如:void print_arr(int arr[], int n);

3、无参有返回值函数

        该函数无需外界传入数据,直接执行内部语句,并且执行结束后,会向主调函数返回一个确定的数据 函数定义格式:返回值类型 函数名(void){} 例如:int getchar(void);

4、有参有返回值函数

        该函数需要外界提供对应的参数,执行函数体代码后,并向主调函数返回一个确定的值 函数定义格式:返回值类型 函数名(参数列表) {} 例如:int strlen(char *src);

例如:

#include<myhead.h>

//定义菜单函数
void print_menu()
{
        printf("\t\t======1、无参无返回值函数======\n");
        printf("\t\t======2、有参无返回值函数======\n");
        printf("\t\t======3、无参有返回值函数======\n");
        printf("\t\t======4、有参有返回值函数======\n");
        printf("\t\t======0、退出======\n");
}

//定义无参无返回值函数
void sum_1(void)
{
    int num,key;
    printf("请输入两个数:");
    scanf("%d%d", &num, &key);
    int sum = num + key;          //求两数的和
    printf("sum = %d\n", sum);
}

//定义有参无返回值函数
void sum_2(int m, int n)
{
    int sum = m+n;        //将传入的两个数据求和

    printf("sum = %d\n", sum);        //输出结果

}

//定义无参无返回值函数
int sum_3()
{
    int num,key;
    printf("请输入两个数:");
    scanf("%d%d", &num, &key);
    int sum = num + key;          //求两数的和

    //将求出的和值,返回值给主调函数使用
    return sum;
}

//定义有参有返回值函数
int sum_4(int m, int n)
{
    int sum = m+n;

    return sum;
}

/************************主程序****************************/
int main(int argc, const char *argv[])
{
    //做个菜单
    int menu = 0;
    while(1)
    {
        print_menu();           //调用菜单函数

        printf("请输入>>>");
        scanf("%d", &menu);
        getchar();

        //多分支选择
        switch(menu)
        {
        case 1:
            {
                sum_1();      //调用无参无返回值函数
            }
            break;

        case 2:
            {
                int num,key;         //这两个数据是主调函数中的
                printf("请输入两个数:");
                scanf("%d%d", &num, &key);    

                sum_2(num, key);        //调用有参无返回值函数

            }
            break;
        case 3:
            {
                //要求调用一个函数,不传递任何数据
                //并且要得到该函数的结果,由主调函数输出
                int sum = sum_3();      //无参有返回值函数调用

                printf("sum = %d\n", sum);
            }
            break;
        case 4:
            {
                int num,key;         //这两个数据是主调函数中的
                printf("请输入两个数:");
                scanf("%d%d", &num, &key);    
                
                int sum = sum_4(num, key);          //调用有参有返回值函数
                
                printf("sum = %d\n", sum);

            }
            break;
        case 0: goto END;
        default:printf("您输入的功能有误,请重新输入\n");
        }
    }

END:

    return 0;
}


课堂练习:

#include<stdio.h>
void print_menu()
{
        printf("\t\t======1、第一题======\n");
        printf("\t\t======2、第二题======\n");
        printf("\t\t======3、第三题======\n");
        printf("\t\t======0、退出======\n");
}
void max1(int num,int key){
    if(num > key){
        printf("最大值为%d\n",num);
    }else
    {
        printf("最大值为%d\n",key);
    }
    
}
int max2(){
    int a[5]={0};
    for (int  i = 0; i < 5; i++)
    {
        printf("请输入该数组的第%d个值",i+1);
        scanf("%d",&a[i]);
    }
    printf("\n");
    int max1=a[0];
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if(max1 < a[j]){
                max1=a[j];
            }
        }
    }
    return max1;
    
}
int con(int a,int b,int c){
    if((a+b)<=c || (a+c)<=b || (c+b)<=a){
        return -1;
    }else if (a==b && b==c && c==a)
    {
       return 2;
    }else if (a==b || b==c || c==a )
    {
       return 1;
    }else
    {
        return 0;
    }
}
int main(int argc, char const *argv[])
{
     int menu=0;
    while (1)
    {
    print_menu();
    printf("请输入>>>");
    scanf("%d", &menu);
    getchar();  
    switch(menu)
    {
    case  1:{
    int num,key;        
    printf("请输入两个数:");
    scanf("%d%d", &num, &key);
    max1(num,key);}
    break;
    case 2:
    {
    int max1=max2();
    printf("最大值为%d\n",max1);
    }
    break;
    case 3:
    {
        int x=0,y=0,z=0;
        while (1)
        {   
        printf("请输入三角形的三条边:");
        scanf("%d%d%d",&x,&y,&z);
        int a=con(x,y,z);
        if(a==-1){
            printf("不能构成三角形,请重新输入\n");
        }else if (a==0)
        {
            printf("构成普通三角形\n");
            break;
        }else if (a==1)
        {
            printf("构成等腰三角形\n");
            break;
        }else if (a==2)
        {
            printf("构成等边三角形\n");
            break;
        }
        }
        
    }
    break;
    case 0: goto END;
    default:printf("您输入的功能有误,请重新输入\n");
    }
    }
    END:
    return 0;
    }
 


课外作业:

完成学生管理系统

1> 使用菜单完成

2> 有学生的信息录入功能:输入学生个数,并将学生的姓名、分数录入

3> 查看学生信息:输出所有学生姓名以及对应的分数

4> 求出学习最好的学生信息:求最大值

5> 按姓名将所有学生进行升序排序

6> 按成绩将学生学生进行升序排序

要求每个功能使用函数完成

解析:

方法一:

#include<stdio.h>
#include<string.h>
#define MAX 50
char names[MAX][50];
int scores[MAX];
int count = 0;
void print_menu();                                 //菜单
void enterstu();                                        // 学生信息录入
void findstu();                                          // 查看所有学生信息
void findtopstu();                                  // 寻找学习成绩最好的学生
void sortnamestu();                             // 按姓名将学生进行升序排序
void sortscorestu();                                // 按成绩将学生进行升序排序


int main(int argc, char const *argv[])
{
   //做个菜单
    int menu = 0;
    while(1)
    {
        print_menu();           //调用菜单函数

        printf("请输入>>>");
        scanf("%d", &menu);
        getchar();

        //多分支选择
        switch (menu)
        {
        case 1:
        enterstu();
        break;
        case 2:
        findstu();
        break;
        case 3:
        findtopstu();
        break;
        case 4:
        sortnamestu();
        break;
        case 5:
        sortscorestu();
        break;
        case 0: goto END;
        default:printf("您输入的功能有误,请重新输入\n");
        }
    }
END:
return 0;
}

//菜单
void print_menu()
{
        printf("\t\t======1、学生信息录入======\n");
        printf("\t\t======2、查看学生信息======\n");
        printf("\t\t======3、查看成绩最好的学生(姓名加成绩)======\n");
        printf("\t\t======4、按姓名将所有学生就行升序排序======\n");
        printf("\t\t======5、按成绩将所有学生就行升序排序======\n");
        printf("\t\t======0、退出======\n");
}
// 学生信息录入
void enterstu(){
    printf("请输入学生个数:");
    scanf("%d",&count);//输入学生个数
    for(int i=0;i<count;i++){
    printf("输入第%d个学生姓名:",i+1);
    scanf("%s", names[i]);
    if (strcmp(names[i], "\n") == 0) {  //换行
        return;
    }
    printf("输入学生分数:");
    scanf("%d", &scores[i]);     
    }
}
// 查看所有学生信息
void findstu(){
    for(int i=0;i<count;i++){
        printf("学生姓名:%s成绩:%d\n",names[i],scores[i]);                //输出学生姓名以及对应的成绩
    }
    printf("\n");
}
// 寻找学习成绩最好的学生
void findtopstu(){
    int top = 0;
    for (int i = 0; i < count; i++)
    {
       if(scores[top] < scores[i] ){
           scores[top] = scores[i];                 //寻找成绩最高的学生
       }
    }
    printf("最好成绩学生姓名为:%s,成绩为%d。\n",names[top],scores[top]);                  //输出最好成绩的学生姓名和成绩
}
// 按姓名将学生进行升序排序
void sortnamestu(){
    char temp[MAX];
    int tempx=0;
    for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(strcmp(names[j],names[j+1]) > 0){               //进行交换三部曲
               strcpy(temp,names[j]);
               strcpy(names[j],names[j+1]);
               strcpy(names[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
      
    }
     findstu();
}
// 按成绩将学生进行升序排序
void sortscorestu(){
    char temp[MAX];
    int tempx=0;
    for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(scores[j] > scores[j+1]){                                    //进行交换三部曲
               strcpy(temp,names[j]);
               strcpy(names[j],names[j+1]);
               strcpy(names[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
    }
        findstu();   
}
 

方法二:

#include <stdio.h>
#include <string.h>

#define MAX 5

// 函数声明
void print_menu();
void enterstu(char students[][50],int scores[], int *count);
void findstu(char students[][50],int scores[], int count);
void findtopStu(char students[][50], int scores[], int count, int top);
void sortnamestu(char students[][50], int scores[], int count);
void sortscorestu(char students[][50], int scores[], int count);

int main() {
    char students[MAX][50];
    int scores[MAX];
    int count = 0;
    int top=0;
    int menu=0;

while(1)
    {
        print_menu();           //调用菜单函数

        printf("请输入>>>");
        scanf("%d", &menu);
        getchar();

        //多分支选择
        switch (menu)
        {
        case 1:
        enterstu(students,scores, &count);

        break;
        case 2:
        findstu(students,scores, count);
        break;
        case 3:
        findtopstu(students, scores, count, top);
        break;
        case 4:
        sortnamestu(students, scores, count);
        break;
        case 5:
        sortscorestu(students, scores, count);
        break;
        case 0: goto END;
        default:printf("您输入的功能有误,请重新输入\n");
        }
    }
END:
return 0;
}
//菜单
void print_menu()
{
        printf("\t\t======1、学生信息录入======\n");
        printf("\t\t======2、查看学生信息======\n");
        printf("\t\t======3、查看成绩最好的学生(姓名加成绩)======\n");
        printf("\t\t======4、按姓名将所有学生就行升序排序======\n");
        printf("\t\t======5、按成绩将所有学生就行升序排序======\n");
        printf("\t\t======0、退出======\n");
}
// 学生信息录入
void enterstu(char students[][50],int scores[], int *count) {
    printf("输入学生个数:");
    scanf("%d", count);
    for (int i = 0; i < *count; i++) {
        printf("输入学生 #%d 的姓名:", i + 1);
        scanf("%s", students[i]);
        printf("输入学生 #%d 的分数:", i + 1);
        scanf("%d", &scores[i]);
    }
}

// 查看所有学生信息
void findstu(char students[][50], int scores[],int count) {
    for (int i = 0; i < count; i++) {
        printf("姓名:%s 分数:%d\n", students[i], scores[i]);
    }
}

// 寻找学习最好的学生
void findtopstu(char students[][50], int scores[], int count, int top) {
    for (int i = 0; i < count; i++)
    {
       if(scores[top] < scores[i] ){
           scores[top] = scores[i];                 //寻找成绩最高的学生
       }
    }
    printf("最好成绩学生姓名为:%s,成绩为%d。\n",students[top],scores[top]);                //输出最好成绩的学生姓名和成绩
}

// 按姓名将学生进行升序排序
void sortnamestu(char students[][50], int scores[], int count) {
    char temp[MAX];
    int tempx=0;
   for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(strcmp(students[j],students[j+1]) > 0){               //进行交换三部曲
               strcpy(temp,students[j]);
               strcpy(students[j],students[j+1]);
               strcpy(students[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
      
    }
    printf("按姓名排序后的学生信息:\n");
    findstu(students, scores,count);
}

// 按成绩将学生进行升序排序
void sortscorestu(char students[][50], int scores[], int count) {
    char temp[MAX];
    int tempx=0;
   for (int i = 1; i < count; i++)
    {
       for (int j = 0; j < count - i; j++)
       {
           if(scores[j] > scores[j+1]){               //进行交换三部曲
               strcpy(temp,students[j]);
               strcpy(students[j],students[j+1]);
               strcpy(students[j+1],temp);
               tempx = scores[j];
               scores[j]=scores[j+1];
               scores[j+1]=tempx;
           }
       }
      
    }
    printf("按成绩排序后的学生信息:\n");
    findstu(students, scores,count);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据采集:如何使用八爪鱼采集BOSS直聘职位数据

大家好&#xff0c;我是水哥&#xff01; 今天给大家分享的是数据采集实战&#xff1a;使用「八爪鱼」第三方工具来采集 BOSS 直聘上的数据分析职位数据。 接下来&#xff0c;我们详细看一看。 不重复造轮子 在工作中&#xff0c;我们一定要形成一个认知&#xff0c;能用第…

最新浪子授权系统网站源码 全开源免授权版本

最新浪子授权系统网站源码 全开源免授权版本 此版本没有任何授权我已经去除授权&#xff0c;随意二开无任何加密。 更新日志 1.修复不能下载 2.修复不能更新 3.修复不能删除用户 4.修复不能删除授权 5.增加代理后台管理 6.重写授权读取文件 7.修复已经知道漏洞 源码下…

土壤分析仪:解密土壤之奥秘的科技先锋

在农业生产和生态保护的道路上&#xff0c;土壤的质量与状况一直是我们关注的焦点。土壤分析仪&#xff0c;作为现代科技在农业和环保领域的杰出代表&#xff0c;以其高效、精准的分析能力&#xff0c;为我们揭示了土壤的奥秘&#xff0c;为农业生产提供了科学指导&#xff0c;…

Java使用 MyBatis-Plus 的 OR

Java使用 MyBatis-Plus 的 OR 一、前言1. 简介2. OR 查询2.1 基础 OR 查询2.2 使用 Lambda 表达式简化 二、总结 一、前言 学习使用 MyBatis-Plus 的 OR 及高级语句是提升数据库操作效率和灵活性的关键步骤。MyBatis-Plus 是 MyBatis 的增强工具包&#xff0c;提供了许多便捷的…

【PTA天梯赛】L1-006 连续因子(20分)

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法刷题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录 题目题解题意步骤 总结 题目 题目链接 题解 题意 求解n的最长连续因子 和因子再相乘的积无关&#xff0c;真给绕进去了 步骤 双重循…

阿里云操作系统智能助手OS Copilot实验测评报告

简介&#xff1a;作为一名学生&#xff0c;阿里云操作系统智能助手OS Copilot对学生的帮助主要体现在提高学习效率、简化操作流程和优化系统管理等方面。通过其丰富的功能&#xff0c;从系统信息的快速获取到复杂的系统运维管理&#xff0c;OS Copilot都能为学生提供极大的便利…

硅谷甄选二(登录)

一、登录路由静态组件 src\views\login\index.vue <template><div class"login_container"><!-- Layout 布局 --><el-row><el-col :span"12" :xs"0"></el-col><el-col :span"12" :xs"2…

kali安装vulhub遇到的问题及解决方法(docker及docker镜像源更换)

kali安装vulhub&#xff1a; 提示&#xff1a;项目地址 https://github.com/vulhub/vulhub 项目安装&#xff1a; git clone https://github.com/vulhub/vulhub.git 安装docker 提示&#xff1a;普通用户请使用sudo&#xff1a; 首先安装 https 协议、CA 证书 apt-get in…

大模型日报 2024-07-10

大模型日报 2024-07-10 大模型资讯 CVPR 最佳论文候选 | NeRF 新突破&#xff0c;用启发式引导分割去除瞬态干扰物&#xff0c;无需额外先验知识 介绍 NeRF 研究中消除瞬态干扰物影响的新方法。 彻底改变语言模型&#xff1a;全新架构 TTT 超越 Transformer&#xff0c;ML 模型…

针对tcp不出网打——HTTP封装隧道代理(以CFS演示)

目录 上传工具到攻击机 使用说明 生成后门文件 由于电脑短路无法拖动文件&#xff0c;我就wget发送到目标主机tunnel.php文件​ 成功上传​ 可以访问上传的文件 启动代理监听 成功带出 后台私信获取弹药库工具reGeorg 上传工具到攻击机 使用说明 生成后门文件 pyt…

FFmpeg 初级操作—打印日志,文件目录操作

文章目录 日志输出操作文件的删除与重命名操作目录实现实现简单的ls命令—代码实现 日志输出操作 FFmpeg 提供了一套LOG操作&#xff0c;基本上和printf用法差不多&#xff0c;如下方所示 #include<stdio.h> #include<libavutil/log.h> int main(int argc, char …

文案策划新手必看:7大秘诀助你快速融入创意领域

从报社编辑到品牌策划和文案策划&#xff0c;这一转变虽有不少共通之处&#xff0c;但也有一些独到之处。 作为一名多年行业从业人员&#xff0c;以下是一些小建议&#xff0c;帮你在这个转型过程中游刃有余。 1、深入了解行业 得多读读行业报告、专业杂志、博客文章&#x…

和鲸科技荣耀入选2024 H1 「中国最具价值 AGI 创新机构 TOP 50」

以下文章来源于Founder Park&#xff0c;作者Founder Par 大模型的盛宴&#xff0c;不应该只属于那些无数光环加身的算法天才们。 模型的冰山一角下&#xff0c;是应用层的暗流涌动&#xff0c;这是一个更庞大&#xff0c;也更隐秘的蓝海。但发掘这一切的前提是&#xff0c;所…

【RHCE】NFS 实验

主服务器 下载nfs-utils软件包&#xff1a; 1.如果停⽌该服务&#xff0c;启动并启⽤该服务&#xff1a; systemctl enable - now rpcbind 2.要启动 NFS 服务器&#xff0c;并使其在引导时⾃动启动&#xff1a;systemctl enable - now nfs- server 3.配置防火墙&#xff0c;开…

力扣题解( 最长湍流子数组)

978. 最长湍流子数组 已解答 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正式地来说&#xff0c;当 arr 的子数组 A[i], A[i1], ..., A[j] 满足仅满…

pd虚拟机去虚拟化是什么意思?pd虚拟机去虚拟化教程 PD虚拟机优化设置

Parallels Desktop for Mac&#xff08;PD虚拟机&#xff09;去虚拟化是指在虚拟机&#xff08;Virtual Machine&#xff0c;简称 VM&#xff09;中禁用或减少虚拟化层的影响&#xff0c;使其表现更接近于物理机。这种操作通常用于提高虚拟机的性能或解决某些软件兼容性问题。具…

ASP.NET Core----基础学习04----Model模型的创建 服务的注入

文章目录 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a;&#xff08;1&#xff09;模型的创建&#xff08;2&#xff09;服务的注入 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a; &#xff08;1&#xff09;模型的创建 模型的基础类Student…

单测使用 mock 如何解决使用 @Value 注解注入的属性

在编写单元测试时&#xff0c;在不启动容器的条件下&#xff0c;如何对这种属性进行mock ? 项目代码 Service public class LoginServiceImpl {Value("${config.timeLimit}")private int timeLimit;......public Object login(User user) {...} } 单测代码 RunW…

python拆分Excel数据,自动发邮箱

import pandas as pd import poplib import email from email.header import decode_header from email.parser import Parser df = pd.read_excel("年假明细表.xlsx") depts = df["部门"].unique() for dept in depts: department_df = df[df[&q…

每日Attention学习9——Efficient Channel Attention

模块出处 [CVPR 20] [link] [code] ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 模块名称 Efficient Channel Attention (ECA) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional …