结构体与共用体 链表 编译预处理

2023-05-16

结构图和共同体
• 单科成绩分析统计程序
题目要求:1.输入学生个数、成绩
2.计算平均分、最高分、最低分
3.计算各个分数段人数并计算平均分
4.排序从高到低
在这里插入图片描述
在这里插入图片描述
刚开始计算各分段人数时是这样写的
在这里插入图片描述
排序是这样写的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现case2.case3根本不会运行,经过几天的焦头烂额发现错误很多
关键问题:

  1. cn[10]没有初始化,没有初始化的元素系统会赋予一个默认值,所以即便case2可运行,计算出来各个分数段的人数也不尽人意
  2. 一共有11个分数段:0-10,10-20……80-90,100。嗯。。还是不能自以为是
  3. 简化程序,case3写得过于繁琐
    • struct <结构标记> atruct date
    { {
    成员1; int year;
    成员2; int month;
    …… int day;
    成员n; };
    };
     定义结构体成员与定义变量类型相同,但是不能赋值
     结构体成员可以是变量、数组或另一个结构变量
     结构体定义可在函数内部和外部,意义和外部函数、内部函数相同
     定义结构类型只是规定了构成这种数据类型的模型,在编译的时候不会给他分配空间。所以不能对定义的结构体进行存取数据操作(赋值、运算),正如不能给int这些类型赋值。
    在这里插入图片描述
     在该定义之后的任意位置仍可用该结构体类型来定义其他变量,例:math.h
     类型定义和变量定义结合在一起,可再次使用,但可用于该结构类型引用的情况不多。
     结构体类型定义后无结构标记,只适用于一次变量定义。
     每个结构体变量在内存中所占的内存之和是其所包含的所有成员的字节值之和。且按照结构体类型定义中成员定义的顺序为各个成员安排内存空间。
     结构体变量的初始化
     结构体类型名 结构体变量={初始值表}
    struct student
    {
    char name[30];
    int age;
    };
    int main(void)
    {
    struct student str1(“Mary “,11);
    }
     注:
    初始值的顺序与结构体中成员的顺序必须相同
  4. 初始值的个数不能超过结构体中成员的个数
  5. 对于没有初始化的成员,按类型进行默认赋值;
    整数和符点数 0 字符和字符串 ‘/0’
  6. 只能在定义结构体变量时使用该初始化结构
     结构体变量成员的引用
    结构体变量名 .成员名
    注:C语言中只允许结构体成员进行算术运算、比较运算和输入输出运算。但是不允许逻辑运算。
     对结构体变量整体的引用
    引用限制:
  7. 可作为行参、实参或函数的返回值等进行函数的数据传递
  8. 当两个结构体变量的类型相同时,可以互相整体赋值
  9. 不允许对结构体变量的任何逻辑运算
    例:输入一个学生的基本信息,学号、姓名、性别、成绩、出生年月日
    在这里插入图片描述
     getchar();
  1. 与syatem (“pause”);意义相同,防止闪退;
  2. 用于两个连续读入的字符数组之间;
    当从键盘上输入时,输入的内容会存在缓冲区中,当按下enter键时,输入的内容就会存入目标中,此时缓冲区只留下了”enter”,如果不加getchar();系统就会把”enter”读入下一个字符输入值中。所以需要getchar();把”enter”读入,”enter”就不会影响下一字符数组的输入了。
     结构体数组
    数组:构成数组的元素类型和个数相同
    结构体数组:当数组元素类型全是结构体时,数组就叫结构体数组。如果把数组元素看成行,结构体看成列,结构体数组就是一个行列式。
    结构体数组的定义:
    一般形式:结构体类型名 结构体数组名[数组长度];
  3. struct <结构标记>
    {
    成员1;
    成员 2;
    };
    struct<结构标记> 数组名[数组长度];
  4. struct <结构标记>
    {
    成员 1;
    成员2;
    };数组名 [数组长度];
  5. struct
    {
    成员1;
    成员2;
    };数组名[数组长度];
     结构体数组的定义
    结构体类型名 结构体数组名[数组长度]={初始值表};
    注:
  1. 初始值的顺序和类型要与相对应的成员的顺序和类型相同。
  2. 一般将每个元素对应的成员用{}括起来
    结构体数组元素的引用
    结构体数组元素名[下标];
    结构体数组元素名[下标].成员名
    例:选票统计:设有三个班长”fu”、”lu”、”shou”,班中有m个人,每人只能选一个人的名字,再按票数从高到低的顺序输出个候选人的得票书。
    在这里插入图片描述
     getch()函数
    不回显函数,当键盘按下某个字符,函数自动读取,不用按回车键。
    包含在conio.h头文件中,非标准函数。
     Sleep()函数

Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。当函数设定的计时器到期,或者接收到信号、程序发生中断都会导致程序继续执行。
包含在windows.h头文件中
 kbhit()函数
检查控制台按键是否按下,如果按下返回非零值,否则返回0。
包含在conio.h头文件中
 \r 回车
光标回到行首,如果继续输出的话会覆盖原有的数据,不会换到下一行
 共用体
每个成员共用一段地址
与结构体类似,用union来声明
特点:

  1. 所有成员共用一段内存,一个共用体变量的内存长度等于其存储空间最长的成员长度。
  2. 共用体变量可以被赋予任意值,但每次只能给一个变量赋值,赋入的新值会覆盖旧值。
    例:一个班的体育成绩,男生测1000米成绩为x分x秒,女生测柔韧性(A、B、C、D)和仰卧起坐x个,将数据输入一张表格中,表中包括学号、姓名、性别、成绩,最后输出。
    在这里插入图片描述
    在这里插入图片描述
     枚举类型
    enum <枚举标记> {枚举常量1,枚举常量2……,枚举常量n};
    注:
  3. 在c语言中规定枚举常量的默认值依次等于0,1,2,3……枚举常量所表示的整形常量是前一个的值+1。
  4. 枚举常量所表示地整形数值不能相同。
    枚举常量的定义:与结构体定义相同,三种方式
    注:
  5. 枚举变量的值只能取枚举常量中的值,枚举变量可以给枚举变量赋值。
    enum study{Chinese,muth,English};
    enum study d1,d2;
    d1=Chinese;
    d2=(enum study)2;//d2=english
  6. 枚举变量可以比大小
    d1<d2;
  7. 枚举值不能直接输入输出,输入一般通过枚举常量转换输出switch
    例:已知红黄白蓝黑 5个不同颜色的小球,一次从袋中取出三个,求所有取 法
    在这里插入图片描述
     typedef语句
    typedef <已定义的类型名> <自定义的类型名>
    给已知的类型名起一个小名
    指针与链表
     在链表中,每个元素包含两个部分:数据部分、指针部分。数据部分用来存放这个元素包含的数据,指针部分指向下一个元素的地址。最后一个元素的指针指向NULL。
     静态链表
    数据单元存放链表结点,结点的链域指向下一个元素的位置,也就是下一个元素所在的数据单元的下标。
     单链表
    每个结点只有一个指针,每个结点之间都是单线联系,除了最后一个结点,每个结点的指针都指向下一个结点,称为单向线性链表,简称单链表。
    注:
  8. 单链表有一个head指针变量,存放第一个结点的地址,称为头指针。
  9. 每个结点包含一个数据域和指针域,数据域存放实际数据,指针域存放下一个结点的地址。所有结点都是单向联系环环相扣。
  10. 最后一个结点称为“表尾”结点,他的指针域存放NULL,指向表尾的指针称为尾指针。
  11. 链表个结点之间的关系由指针域决定,链表依靠指针相连不一定是一段连续的地址。链表可以无限延长,只需改变相关结点的链接关系。
    例:创建一个简单的链表,输入学生信息:姓名、学号
    在这里插入图片描述
    在这里插入图片描述
    链表的插入与删除:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

 循环链表
基于单链表,链表的最后一个结点指向头指针;链表创立是不需要创建一个头结点,只需让最后一个结点指向链表的头结点就好了。
 双向链表
每一个结点中有一个数据域和两个指针域,指针域分为左指针和右指针,分别指向左结点和右结点。
在这里插入图片描述
在这里插入图片描述
 例:建立两个带头结点的学生链表,每个结点的数据域包含姓名、学号、三门成绩,且链表按学号升序排列,将它们合为一个链表。
使用merge();函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编译预处理
• 文件包含处理
文件包含命令是以#inclulde开头的编译预处理命令,文件包含是指一个源文件可以将另一个源文件中的全部命令包含进来。
一般格式:
#include “文件名”:系统首先到当前目录下查找被包含文件,若没找到,再到系统指定的“包含文件目录”中查找。一般用户自己写的文件都用“”。
#include <文件名>:直接到系统包含的文件目录中查找
 宏定义
不带参数
格式:#define 标识符 字符串
字符串可以是常量、表达式、格式串
注:

  1. 宏定义不是C语句,行尾不加“;”
  2. 在输出语句中,“”中含有字符串中的字符,即使与宏同名,也不展开
  3. 宏定义允许嵌套
  4. 宏的作用域:从定义命令后到本文件结束。如要终止红定义的作用域,可以用#undef命令。
    带参数
    格式:#define(行参表) 字符串
    引用:宏明(实参表)
    注:
  5. 字符串中含有各个行参
  6. 定义带参数的宏时,宏明和左括号之间不能有空格,否则,C语言会将宏名后面的内容代替字符串。
  7. 使用带参数的宏时,如果实参为表达式,在宏定义时,字符串中的行参用()括起来。
     条件编译
    三种形式:
  8. #ifdef 标识符
    程序段1;
    #else
    程序段2;
    #endif
    功能: 对于已经被#define定义过的标识符,编译程序段1;否则编译程序段2。#else 和程序段2可以省略,此时对于没有被#define定义过的标识符不编译。
  9. #ifndef 标识符
    程序段1
    #else
    程序段2
    #endif
    功能:与#ifdef相反
  10. #if 常量表达式
    程序段1
    #else
    程序段2
    #endif
    功能:当表达式非0,编译程序段1;否则编译程序段2
    虚拟机
    • BIOS (Basic Input/Output System)
    加载在电脑硬件硬盘上最基本的软件代码
     UEFI启动
    优势:提高进入操作系统的启动速度
    支持图形化操作
    在这里插入图片描述
    在这里插入图片描述
    SATA(Serial Advanced Technology Attachment 串行高级技术附件)
    负责主板和大容量存储设备(如硬盘及光盘驱动器)之间的数据传输,主要用于个人计算机。
    优势:串行接口结构简单,支持热插拔,传输速度快,执行效率高
    SCSI(Small Computer SystemInterface小型计算机系统接口)
    一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统及接口的独立处理及标准,是一种智能的通用接口标准。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体与共用体 链表 编译预处理 的相关文章

随机推荐

  • ENV环境配置及其下载网络组件包问题

    准备工作 Env 工具包含了 RT Thread 源代码开发编译环境和软件包管理系统 从 RT Thread 官网下载 Env 工具 在电脑上装好 git xff0c 软件包管理功能需要 git 的支持 git 的下载地址为https gi
  • 芯片flash保护(解锁)

    报错结果 Error while accessing a target resource The resource is perhaps notavailable 就是无法下载程序 解决办法 1 下载ST LINK Utility 链接 x
  • 2.RTT-点灯大师的修炼

    1 创建工程模板 相信大家通过学习上一篇文章 1 RTT 环境搭建 现在能熟练的创建一个标准模板了 xff0c 如果不会就跳回去学习一下吧 链接 xff1a 1 RTT 环境搭建 嵌入式路上的流浪的博客 CSDN博客 建立好的工程模板编译并
  • 4.RTT-UART-中断接收及轮询发送

    本期博客开始分享RTT的UART xff0c 利用战舰V3的uart2来输入输出一些字符串 UART xff08 Universal Asynchronous Receiver Transmitter xff09 通用异步收发传输器 xff
  • 12.RTT-IIC设备-AHT10温湿度传感器

    本系列博客更新结束啦 xff01 完结啦 xff01 xff01 xff01 撒花 xff01 xff01 xff01 关于RTT的设备和驱动专题更新完毕啦 xff0c 本期是最后一期 一段学习旅途的结束意味着下一段学习冒险的开始 虽然本系
  • RTduino+sht31温湿度传感器

    本次博客使用的是STM32F103C8T6 xff0c 因为该BSP已经对接好RTduino了可以直接上手使用 一 RTduino简介 RTduino是RT Thread实时操作系统的Arduino生态兼容层 xff0c 为RT Threa
  • 一文揭秘字节跳动、华为、京东的薪资职级

    声明 xff1a 本文所有数字均不是官方数据 xff0c 为网络资料收集整理 字节跳动 01 全球员工总数 字节的员工数量目前超过5万人 图片来源 xff1a 字节范 02 岗位职级 字节跳动的职级研发序列一共10级 xff1a 字节跳动创
  • ESP_C3在ubuntu下运行RT-Thread

    1 clone源代码RT Thread git clone git 64 github com RT Thread rt thread git 2 开始搭建ESP IDF环境 进入源码到bsp文件夹下找到ESP32 C3 xff0c 开始配
  • uniapp中使用弹出层

    uniapp中使用弹出层 因为业务的需要 xff0c 需要弹出一个复选框 xff0c 使用uniapp中自带的框架 使用 xff1a 第一步 xff1a 下载下示例项目 xff0c 找到主要的文件夹 第二步 xff1a 将该文件夹放到组件的
  • 手写一个uniapp的步骤条组件

    span class token operator lt span template span class token operator gt span span class token operator lt span view span
  • uniapp中的分页

    数据量过多就会使用分页 第一种 xff1a API span class token comment 和data同级 span span class token function variable function onReachBotto
  • uniapp中生成随机的二维码并进行保存

    需求 xff1a 需要根据用户id的不同生成不同的二维码 xff0c 并进行本地保存 第一步 xff1a 下载插件 这里对于二维码的生成 xff0c 使用的是第三方插件weapp qrcode min js xff0c 主要用到的文件是 d
  • Pc端的基本Echarts

    Pc端的基本Echarts 双环传态图组件 span class token operator lt span template span class token operator gt span span class token oper
  • el-table表格的sortable排序的使用以及出现小数、%排序错乱

    前端实现排序 xff1a 只需要在表头上加上一个sortable属性即可 span class token tag span class token tag span class token punctuation lt span el t
  • 浏览器的回退和导航栏的选中转态不同步,路由在新窗口打开

    问题1 xff1a 浏览器的回退和导航栏的选中状态不能同步的问题 问题 xff1a 用户后退时候 xff0c 左边导航栏显示的还是上一个页面的导航 xff0c 但是路由和页面已经变了 span class token operator lt
  • 左右联动-左侧点击相应的位置,右侧随之滚动

    第一步 xff1a npm下载 npm install better scroll save 第二步 xff1a 局部注册 xff08 当前组件 xff09 span class token keyword import span BScr
  • 杂技-各种css小技巧

    渐变字体 background image webkit linear gradient bottom 379ED7 0FE2EE webkit background clip text webkit text fill color tra
  • 深入理解Kotlin无参构造函数

    Unsafe 创建实例 在java中 创建一个对象 其实主要就是3种方法 通过new 关键字来创建 这种是最常见的 通过反射构造方法来创建对象 这种也不少见 很多框架中都有使用 Unsafe类来创建实例 xff0c 这种情况非常少见 这里先
  • VScode 快捷键

    一 VScode 快捷键 这里主要记录是 VScode开发工具常用的快捷键 xff0c 以便提高工作效率 xff0c 以及今后方便查阅 xff01 xff01 xff01 SHIFT 43 ALT 43 I 在选定的每行末尾插入光标CTRL
  • 结构体与共用体 链表 编译预处理

    结构图和共同体 单科成绩分析统计程序 题目要求 xff1a 1 输入学生个数 成绩 2 计算平均分 最高分 最低分 3 计算各个分数段人数并计算平均分 4 排序从高到低 刚开始计算各分段人数时是这样写的 排序是这样写的 发现case2 ca