当前位置: 首页 > news >正文

作业Day2: 多文件编译; 思维导图

目录

①文件代码 及其所需头文件分析

main.c文件

1.h文件

1.c文件

②运行结果:

③代码分析

结构体成员 数据类型的设定:

信息录入函数

信息删除

成绩排序

信息显示

自定义初始化函数

④思维导图:​编辑


①文件代码 及其所需头文件分析

作业:

定义一个数组,用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】

   1>封装函数   录入5个学生信息

   2>封装函数   显示学生信息

   3>封装函数  删除第几个学生信息,删除后调用显示学生信息函数 显示

   4> 封装函数 按照学生的成绩 进行降序,降序后调用显示学生信息函数 显示

 要求:多文件编译完成。

头文件、源文件、测试文件(mian)

main.c文件

使用的函数中有printf:需要包含头文件:#include<stdio.h>

使用了自定义函数:需要包含头文件:#include"1.h"

#include<stdio.h>
#include"1.h"int main(int argc, const char *argv[])
{struct student std[5];Init(std,0);//初始化所有学生信息Display(std,5);//显示学生信息:检查初始化结果printf("\n");Input(std,5);//成绩录入Display(std,5);//显示学生信息:查看录入结果Delete(std);//删除学生成绩printf("\n");Sort(std,5);//排序Display(std,5);//显示学生信息:查看录入结果return 0;
}

1.h文件

使用 #ifndef 和 #endif; 防止重复声明

头文件存放自定义函数的声明;

自定一函数中右结构体,本头文件存放结构体声明;

#ifndef __1_H__
#define __1_H__
//结构体声明
struct student
{char name[32];//姓名char sex[12];//性别int age;//年纪int score;//分数
};//函数声明
void Init(struct student *s,int i);
void Input(struct student *std,int i);
void Display(struct student *s,int i);
void Delete(struct student *std);
void Sort(struct student *std,int i);#endif

1.c文件

文件内容:编写的自定义函数

文件所需头文件:

        使用了printf函数:需要头文件#include<stdio.h>

        使用了strcpy函数:需要头文件#include<string.h>

        使用了结构体:需要包含#include”1.h“ 或者 不引入头文件情况下,仅声明结构体

#include<stdio.h>
#include<string.h>//结构体声明
struct student
{char name[32];//姓名char sex[12];//性别int age;//年纪int score;//分数
};//初始化
void Init(struct student *s,int i)
{if(i==0)//初始化所有元素{  for(int j=0;j<5;j++){strcpy((s+j)->name,"未录入");strcpy((s+j)->sex,"不详");(s+j)->age=-1;(s+j)->score=-1;}   }else//否则仅初始化第i个{strcpy((s+i)->name,"未录入");strcpy((s+i)->sex,"不祥");(s+i)->age=-1;(s+i)->score=-1;}
}void Input(struct student *std,int i)
{for(int j=0;j<i;j++){printf("请输入学生姓名:");scanf("%s",(std+j)->name);printf("请输入学生年纪:");scanf("%d",&(std+j)->age);printf("请输入学生性别:");scanf("%s",(std+j)->sex);printf("请输入学生分数:");scanf("%d",&(std+j)->score);}
}
//信息显示
void Display(struct student *s,int i)
{for(int j=0;j<i;j++)printf("姓名:%s 年纪:%d 性别:%s 分数:%d\n",(s+j)->name,(s+j)->age,(s+j)->sex,(s+j)->score);
}
//信息删除
void Delete(struct student *std)
{int i=-1;printf("\n需要删除第几位学生的信息?:");scanf("%d",&i);i--;//将位置i之后的学生信息往前搬运for(int j=i-1;j<4;j++){std[j]=std[j+1];}//最后一位与倒数第二位信息相同;需要初始化为"未录入"Init(std,4);//调用信息显示Display(std,5);
}void Sort(struct student *std,int i)
{struct student temp;//冒泡排序for(int j=0;j<i;j++)//决定轮数{for(int k=0;k<i-1-j;k++)//每轮比较的次数{if(std[k].score<std[k+1].score)//大的放前面,降序排列{temp=std[k];std[k]=std[k+1];std[k+1]=temp;}}}
}

②运行结果:

显示初始化的结果

Display(std,5);//显示学生信息:检查初始化结果

录入以及显示录入的结果

Input(std,5);//成绩录入

Display(std,5);//显示学生信息:查看录入结果

ede272477a704c4d88245fcd2a7d6a60.png

c3af56188cb147569b00c3dafa2d4d63.png

删除对应的学生成绩:并显示结果

Delete(std);//删除学生成绩

排序,并查看结果;

Sort(std,5);//排序

Display(std,5);//显示学生信息:查看录入结果

③代码分析

结构体成员 数据类型的设定:

姓名:使用字符数组存储字符串;

年龄:整型int

性别:男女,使用字符数组接收;

分数:一般为小数,使用是float或者double;这里为了美观,取整型int;

//结构体声明
struct student
{char name[32];//姓名char sex[12];//性别int age;//年纪int score;//分数
};

信息录入函数

传入参数:结构体指针;需要录入学生信息的个数

思路:

     根据输入的个数决定循环的轮数

     访问结构体成员的方式:传入的是结构体指针:可以使用->

      注意字符串的录入方式!!

void Input(struct student *std,int i)
{for(int j=0;j<i;j++){printf("请输入学生姓名:");scanf("%s",(std+j)->name);printf("请输入学生年纪:");scanf("%d",&(std+j)->age);printf("请输入学生性别:");scanf("%s",(std+j)->sex);printf("请输入学生分数:");scanf("%d",&(std+j)->score);}
}

信息删除

传入参数:结构体指针;需要删除信息的学生位置i

思路:

        输入需要删除第几位学生的信息,将之后的信息整体向前搬运;

        最后一个信息赋值为”未录入“

//信息删除
void Delete(struct student *std)
{int i=-1;printf("\n需要删除第几位学生的信息?:");scanf("%d",&i);i--;//将位置i之后的学生信息往前搬运for(int j=i-1;j<4;j++){std[j]=std[j+1];}//最后一位与倒数第二位信息相同;需要初始化为"未录入"Init(std,4);//调用信息显示Display(std,5);
}

成绩排序

传入参数:结构体指针;需要排序的个数

思路:

        比较结构体成员中,成绩的大小;根据成绩排序;

        使用冒泡排序;

void Sort(struct student *std,int i)
{struct student temp;//冒泡排序for(int j=0;j<i;j++)//决定轮数{for(int k=0;k<i-1-j;k++)//每轮比较的次数{if(std[k].score<std[k+1].score)//大的放前面,降序排列{temp=std[k];std[k]=std[k+1];std[k+1]=temp;}}}
}

信息显示

传入参数:结构体指针;需要显示学生信息的个数

思路:略

//信息显示
void Display(struct student *s,int i)
{for(int j=0;j<i;j++)printf("姓名:%s 年纪:%d 性别:%s 分数:%d\n",(s+j)->name,(s+j)->age,(s+j)->sex,(s+j)->score);
}

自定义初始化函数

传入参数:结构体指针;需要初始化学生的位置i

思路:

当传入的参数为0时,将传入的结构体全部初始化;

当传入的参数不为0时,根据传入的参数,将第i位初始化;

注意字符串复制给另一个字符串使用strcpy函数!

//初始化
void Init(struct student *s,int i)
{if(i==0)//初始化所有元素{  for(int j=0;j<5;j++){strcpy((s+j)->name,"未录入");strcpy((s+j)->sex,"不详");(s+j)->age=-1;(s+j)->score=-1;}   }else//否则仅初始化第i个{strcpy((s+i)->name,"未录入");strcpy((s+i)->sex,"不祥");(s+i)->age=-1;(s+i)->score=-1;}
}

④思维导图:


http://www.mrgr.cn/news/79859.html

相关文章:

  • flutter实现如何 检测键盘的显示和隐藏状态
  • 计算机视觉与医学的结合:推动医学领域研究的新机遇
  • scala的泛型类
  • 知行之桥EDI系统V2024 12月9111版本更新
  • 数仓报表需要支持历史数据和实时数据的整合的场景要如何处理
  • AI实现葡萄叶片识别(基于深度学习的葡萄叶片识别)
  • HBuilderX(uni-app)Vue3路由传参和接收路由参数!!
  • 自动驾驶控制与规划——Project 1: 车辆纵向控制
  • 【Redis源码】网络模型
  • hbuilder 安卓app手机调试中基座如何设置
  • 微信原生小程序---生成海报并分享,保存本地
  • ssd202d-badblock-坏块检测
  • 【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
  • 嵌入式驱动开发详解15(电容触摸屏gt9147)
  • C# 实现 10 位纯数字随机数
  • 我们来学mysql -- 探讨win安装方式(安装篇)
  • LabVIEW实现MQTT通信
  • Blue Ocean 在Jenkins上创建Pipeline使用详解
  • 频域滤波中默认的边界条件——补零与不补零(答作者问)
  • 电脑怎么设置通电自动开机(工控机)
  • OpenMMlab导出MaskFormer/Mask2Former模型并用onnxruntime和tensorrt推理
  • 【实现多网卡电脑的网络连接共享】
  • Edge SCDN的独特优势有哪些?
  • 简单的多网卡选择指定网卡ip注册
  • 数据仓库工具箱—读书笔记01(数据仓库、商业智能及维度建模初步)
  • 善于运用指针--函数与指针