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
其使用是
这里不需要标签 tag 因为如果每次都是 struct tag来定义结构体变量的话就太麻烦了 所以引入typedeftypedef struct { member-list member-list member-list ... }variable-list;
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 - 使用:若一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
- 注:枚举如果第一个元素不进行定义 则默认初始化为0 后面的元素依次+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-结构体&文件的主要内容,如果未能解决你的问题,请参考以下文章