c博客06-2019-结构体&文件

Posted lily233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c博客06-2019-结构体&文件相关的知识,希望对你有一定的参考价值。

1.本章学习内容 技术图片

  • 结构体的定义和赋值 技术图片
    • 第一种定义 技术图片
      基础:一定要使用 struct 语句
    struct tag { 
      member-list
      member-list 
      member-list  
      ...
    };
    • tag 是结构体的昵称,标签
    • menber-list 是结构体成员,是标准的变量定义,例如 int i,float j,char str;一个结构体可以有不同类型的变量定义
      它的功能是 在使用这个结构体时有
      例如:
      struct tag s1
      struct tag s2

    • 第二种定义技术图片
      取名 typedef 我们一般创建结构体都是使用typedef
      其使用是
    typedef struct {
      member-list
      member-list 
      member-list  
      ...
    }variable-list;
    这里不需要标签 tag 因为如果每次都是 struct tag来定义结构体变量的话就太麻烦了 所以引入typedef
    variable-list 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。
    在定义结构体变量时 可以有
    例如:
    variable-list s1
    variable-list s2
    variable-list 由我们自己取名 尽量简洁~

总结:关键字struct和它后面的结构名一起组成一个新的数据类型名

  • 结构体数组 技术图片
    • 引入:一个结构体变量可以存放一组信息,那么如果有十组信息该如何存放呢?
      不可能是将上面程序复制粘贴十次的!这时候需要使用结构体数组,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项。
    • 例如:
      我这里定义了一个结构体
    typedef struct
    {
     int num;//学号
     char name[10];//姓名
     int math, english, computer;//三门成绩
     double average;//个人平均分
    }STU;
    我要存放十个学生的信息
    则结构体变量定义是 STU stu[10]
    这就定义了一个结构体数组,共有 10 个元素,每个元素都是一个结构体变量,都包含所有的结构体成员
    结构体数组的引用与引用一个结构体变量在原理上是一样的。只不过结构体数组中有多个结构体变量,我们只需利用 for 循 环一个一个地使用结构体数组中的元素。
    • 结构体数组的初始化
    • 类似数值数组
      例如:
      STU stu[10]={{1,"陈莉莉",12,90,50},{2,"郝厉害",50,65,100}}//定义同时初始化,未定义的都为0
结构体变量 学号 姓名 数学 英语 计算机 个人平均分
stu[0] 1 陈莉莉 12 90 50
stu[1] 2 郝厉害 50 65 100
stu[2] 0 0 0 0 0
…… 0 0 0 0 0
stu[9] 0 0 0 0 0
  • 结构体数组的排序做法 技术图片
    • 借用上面的例子,给十名同学按个人平均分的高低排序、并输出排序结果。
    • 注:字符串的复制 要使用库函数strcpy() 字符串的比较 要使用库函数strcmp 这里不涉及,补充知识
      这里涉及数组比较
    • 思路:
      技术图片
    • 例题 伪代码
    STU stu[10]={给十位同学赋值};
    for i=0 to 9
      stu[i].average=(stu[i].math+stu[i].english+stu[i].computer)/3
    end for//计算每个人的平均分
    STU *p=stu;
    for i=1 to 9
    for j=0 to 9-i
       if( (p+j)->average < (p+j+1)->average )//降序
           STU temp;//这要交换整个结构体所以temp类型是STU
           temp=*(p+j);
           *(p+j)=*(p+j+1);
           *(p+j+1)=temp;
       end if
    end for
     end for
     //按表输出
     printf("学号    姓名   个人平均分
    
    ");
     for i=0 to 9
     printf("%-4d%4s%4f",(p+i)->num,(p+i)->name,(p+i)->average);
     end for
  • 结构体指针 技术图片
    • 结构体指针指向结构体变量。 技术图片
      例如:STU s1={1,"陈莉莉",12,90,50};
      这里定义一个指针 STU *p
      p=&s1或者p=s1
      技术图片
    • 结构体指针的使用 技术图片

(1) 用*p访问结构成员。如:
(*p).math = 100;等价于s1.math=100

(2) 用指向运算符->访问指针指向的结构成员。如:
p->math = 100;//这是常用方法 也比较方便

  • 共用体、枚举类型做法 技术图片
    • 共用体:使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。技术图片
      定义:
    union   共用体名
      {
         成员表列;
       }变量表列;
    • 结构体类型变量所占内存长度是各成员占的内存长度之和。
    • 共用体类型变量所占内存长度等于最长的成员的长度
      两者用法差不多,但是其所占内存不同
      例如:
    union Data{
      int n;        // 占用 2字节 
      char ch;   // 占用 1 字节 
      float x;     // 占用 4 字节
     } ;

这个变量类型内存占4字节

struct Data{
    int n;        // 占用 2字节 
    char ch;   // 占用 1 字节 
    float x;     // 占用 4 字节
 } ;

这个结构体变量类型则占了2+1+4=7个字节的内存

  • 枚举类型 技术图片
    枚举类型:enum weekday {sun, mon, tue, wed, thu, fri, sat};
    枚举变量:enum weekday workday, week_end;
    • 注:枚举如果第一个元素不进行定义 则默认初始化为0 后面的元素依次+1
      没有指定值的枚举元素 它的值默认是前一个元素的值+1
    • 使用:若一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
  • 文件读写 技术图片
    • 文件的定义: FILE *FP
      对文件进行处理需要:
      1.定义文件指针
      2.打开文件 fp=fopen("stu.txt","r");
      3.文件读写
      fscanf(fp,"%s%s%d%d%d,p->……);
      或者
      fgets(str,100,fp);
      4.关闭文件
      fclose(fp);

以上是关于c博客06-2019-结构体&文件的主要内容,如果未能解决你的问题,请参考以下文章

c博客06-2019-结构体&文件

c博客06-2019-结构体&文件

c博客06-2019-结构体&文件

c博客06-2019-结构体&文件

c博客06-2019-结构体&文件

c博客06-2019-结构体&文件