c博客06-2019-结构体&文件
Posted kevin2001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c博客06-2019-结构体&文件相关的知识,希望对你有一定的参考价值。
1.本章学习总结
1.1 学习内容总结
1.1.1.结构体如何定义、成员如何赋值:
- 结构体的定义可以直接用
struct 类型名
然后加大括号,里面包含结构体元素,也可以用typedef struct
然后大括号,里面包含结构体元素,最后在大括号后分号前加上类型名。 - 结构体成员的赋值可以用下标法,也可以用指针法。例如结构体指针
*p
,对其中成员的赋值可以用p[i].num
,也可以用p->num
进行引用后再赋值。
1.1.2.结构体数组排序做法
- 可以定义一个用来比较的结构体指针,还得定义一个结构体变量用来当作排序时的数据中介。然后将该指针指向原有的结构体数组,然后根据类型判断是直接比较大小还是用字符串比较函数
strcmp
进行比较,选择是用冒泡排序法还是选择排序法。
1.1.3.结构体指针怎么用
- 首先得定义一个结构体类型的指针,然后对结构体指针进行调用的时候要注意调用的方式。如果是下标法的话直接用
p[i].num
这种方法就行。 - 如果是指针法的话就要注意运算的顺序了。像
p.num
就是错误的引用方法。(*p).num
才是正确的。 - 如果是用指针法引用的话要注意引用完之后指针要自增,如果是下标法的话下标自增就可以。但要注意数组范围,不要越界。
1.1.4.共用体、枚举类型做法
- 结构体的使用和结构体相似,只不过是在定义时把
struct
改为union
,但是初始赋值只能赋一个变量的值; - 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
- 结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
- 共用体做法常见的有老师学生表。即结构体里面在定义一个结构体成员
student&teacher
,该结构体里面含两个成员:teacher
和student
,调用时需要在嵌套一层,即:p[i].student&teacher.student
。 - 枚举类型做法常见的有对一个星期的定义:
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
如果在大括号内对Mon
进行初值定义Mon=1
的话,那么后面的值自动往后递增1,即Tues=2,Wed=3,Thurs=4,Fri=5,Sat=6,Sun=7
。 - 枚举类型如果不对大括号内的内容进行初值定义的话,那就默认第一个元素为0,其余元素往后逐个加1.
1.1.5.文件读写,文件中数据如何读进结构体数组
- 文件读写主要根据文件的打开方式来判断。例如打开方式“r”就只能读不能写;“w”只能写;“a”只能追加文件内容;“r+”可以对已有文件进行读写;“w+”可以建立新文件进行读写;“a+”可以对文件进行读、写、追加。
- 文件中的数据要读进结构体需要用到文件读取函数。常见的文件读取函数有:
fgetc
:一次读取一个文件中的字符;fgets
:一次从文件中读取一串字符串;fscanf
:按照文件的控制格式读取数据;fread
:以数据块方式读取文件内容。 - 例如从文件中读取成语可以用:
fgets(idiom,100,fp)
,其中,idiom
是字符型数组。
1.2 本章学习体会
- 学习感受:学习了结构体才真正感受到c语言的方便性,运用结构体可以高效地解决许多普通数组无法解决的问题;而学习文件的用法可以帮助我们更好地处理和读取系统数据,这对以后的工作很有帮助。
- 算上大作业的话,这两周代码量大概在1500行左右,
勉强达标。
2.综合作业--“我爱成语”
2.1.文件介绍
头文件介绍:
1.idiom.h
- 结构体及函数声明:
结构体或函数 | 类型 | 功能 |
---|---|---|
IDIOMS | struct | 读取存放成语及意思 |
RANK | struct | 读取存放游戏得分 |
sysUser | struct | 读取存放用户名密码 |
CheckUser | int | 验证用户名密码是否正确 |
ListMenu | void | 程序主菜单 |
FindIdiom | int | 成语字典,输入一个成语然后输出其意思 |
Updata | int | 向成语数据库中追加成语和成语意思 |
IdiomGame | void | 成语填空游戏 |
rank | void | 查询所有用户得分情况 |
encourage | void | 在用户回答错误时随机输出一条激励语 |
praise | void | 在用户回答正确时随机输出一条表扬语 |
recordScore | void | 在用户完整做完一次题目后向得分文档中写入用户的得分情况 |
- 头文件代码截图:
函数实现文件介绍:
1.idiom.c
- 文件功能:定义头文件中所声明的部分基本函数:成语字典、数据添加和登录系统。
- 设计思路:将程序的基本功能存放在这里面,然后分别定义即可。
- 主要代码截图:
2.idiomMain.c
- 文件功能:主要用来调用程序中各个函数来完成程序所具有的功能。
- 设计思路:先得打开文件才能调用文件中的内容,打开文件后进行一次判断,判断文件是否打开成功。如果有新写入的数据要先关闭文件后再打开文件才能查询到最新写入的数据。
- 主要代码截图:
3.game.c
- 文件功能:定义头文件中关于成语游戏的函数:写入得分函数、激励语函数、表扬语、查询得分函数、成语挖空填空函数。
- 设计思路:首先要先随机读取一个成语,然后将挖空后的成语和括号
()
重新组成一个字符数组作为题目输出。将被挖掉的字重新组成一个字符数组作为正确答案,比较用户答案和正确答案。 - 主要代码截图:
2.2.运行结果:
1.登录界面:
2.游戏界面:
3.排名界面:
4.查找界面:
5.添加成语:
2.3大作业总结:
1.碰到的问题及解决办法:
问题 | 解决办法 |
---|---|
一开始对结构体还是不够熟悉,老是内存访问错误 | 多看看书上的代码和网上别人的代码加上自己写写代码熟悉一下之后就减少了相关错误的出现 |
写成语字典的时候因为文件整理出问题,导致个别成语无法正常输出输入和查找 | 能力有限实在找不出问题在哪,只好忍痛将个别成语删除了 |
在写分数写入函数的时候,不知道如何获取当前系统时间 | 网上查 |
在知道如何获取系统时间后不知道如何将当前时间写入文档 | 由于我获取的系统当前时间是整型的,所以我只能一个一个地将时间转换为字符型数据后再将其写入文档 |
2.小结:
- 总的来说,这次的大作业写的
有点仓促,用的还是一些最基础最笨的方法和函数,而且也没有对用户得分进行排名。程序还有待改进。 - 我尝试过运用多个头文件,但是发现会有冲突,运行不了。由于我的
能力还是比较薄弱,所以只定义了一个头文件。 - 文件这一块的运用还是得再通过多多实践来增强。
以上是关于c博客06-2019-结构体&文件的主要内容,如果未能解决你的问题,请参考以下文章