c博客06-2019-结构体&文件
1.本章学习总结(2分)
1.1 学习内容总结
结构体如何定义、成员如何赋值
结构类型定义的一般形式
struct 结构名 {
类型名 结构体成员名1;
类型名 结构体成员名2;
类型名 结构体成员名3;
...
类型名 结构体成员名n;
};
成员的赋值
以课本例9-1为例
结构变量可以通过结构成员操作符“.”对其某个成员进行引用,如s1.average、max.average;
如果两个结构变量的类型相同,也可以直接赋值,如max=s1,将一个结构变量的所有成员值都复制给另一个。
结构体数组排序做法
以课本例9 - 2为例
选择排序法
大致与数组相同
for (i = 0; i < n - 1; i++)
{
index = i;
for (j = i + 1; j < n; j++)
if (students[j].average > students[index].average)//唯一的不同点
index = j;
运用temp进行交换
}
结构体指针怎么用
结构指针就是指向结构类型变量的指针
例:
struct student s1 = { 101,"zhang",78,87,85 }, * p;
p = &s1;
第一条语句定义了struct student类型的变量s1并初始化,另外还定义了一个结构指针变量p;
第二条语句使结构指针p指向结构变量s1。
有了结构指针的定义,既可以通过结构变量s1直接访问结构成员,
也可以通过结构指针变量p间接访问它所指向的结构变量中的各个成员。
(1)用* p访问结构成员
如:
(*p).num = 101;
(*p)中的括号必不可少,因为"."的优先级高于"*"
(2)用指向运算符->访问指针指向的结构成员
如:
p->num = 101;
结构指针作为函数参数
课本为例
例9 - 3
int update_score(struct student* p, int n, int num, int course, int score);
其中第一个形参就是结构指针
对应的实参是结构数组名students。
即将结构数组students的首地址值传递给结构指针p。
经过参数传递后,在函数update_score()中就可以通过结构指针p对结构数组students中的数据进行间接访问操作。
使用结构指针作为函数参数只要传递一个地址值,就可以吧结构成员传过去,极大提高参数传递的效率
共用体、枚举类型做法
共用体
一般声明形式:
union 联合名
{
成员声明;
成员声明;
成员声明;
...
成员声明;
}变量列表;
联合中的所有成员共享同一块内存空间,c语言编译程序保证分配给联合的内存能容纳其最大的成员变量。
如果要声明联合变量,可以在联合定义的时候,在结束的分号之前加上这些变量名,
也可以在定义联合之后使用如下形式的语句声明联合变量:
union 联合名 变量列表;
编程者应该保证访问联合变量时采用的成员变量和最后一次向其中存入值时采用的成员变量相同。
在声明联合变量的时候,可以使用大括号括起来的值初始化联合的一个成员变量,
如果联合变量是一个全局变量,初始化表达式必须是一个常量表达式。
同类型的联合变量可以用于初始化另一个联合变量,如:
uniom shared swap1 = swap;
枚举法
一般定义形式:
enum 枚举名{枚举值1,枚举值2,...}变量列表;
变量列表本身是可选的,它代表一组该类型的变量(也可以同时初始化)。
如果要声明一个枚举变量(假定该枚举类型已经在前面定义过),可以采用如下方式:
enum 枚举名 变量列表;
某个枚举变量的值只能是定义是列出的枚举值之一。
文件读写,文件中数据如何读进结构体数组
c程序对文件的处理采用缓存文件系统的方式进行,程序与文件的数据交换通过该缓冲区来进行。
c语言文件操作统一以文件指针方式实现。
定义文件类型指针的格式为:
FILE* fp;
FILE是文件类型定义符,fp是文件类型的指针变量。
每个文件都有自己的FILE结构和文件缓冲区,FILE结构中有一个curp成员,
通过fp->curp可以指示文件缓冲区数据存取的位置。
文件操作具有顺序性的特点,前一个数据取出后u,下一次将顺序取后一个数据,fp->curp会发生改变。
用c语言编写文件操作的程序要遵循如下步骤:
(1)定义文件指针;
(2)打开文件:文件指针指向磁盘文件缓冲区;
(3)文件处理:文件读写操作;
(4)关闭文件。
1.2 本章学习体会
这两周要忙于英语四级考试和高数测试,所以在本周课后几乎没怎么去打代码;
再加上文件和结构体部分相比之前的指针等部分复杂程度更高,所以对于文件和结构体部分的掌握程度非常低,
导致这次的大作业,做起来十分费时,费力,还做不好。
代码量计算:700左右(未算大作业),未完成。
2.综合作业--“我爱成语”(8分)
头文件介绍:
users.h(用户登入信息)
idiom.h(成语系统所要用的结构体和函数)
函数实现文件介绍:
文件1:users.cpp
用户信息:
文件功能:用于用户登入的用户名与密码的检验
主要思路:打开文件user.txt,将输入的用户名和密码与文件中的用户名和密码进行比对
文件2:idiom.cpp
文件功能:完成登入界面,成语数量的统计,成语意思的查询
主要思路:
登入界面(输出用户可选的选项):
成语个数的统计(遍历文件,进行逐一计数):
成语意思查询(在文件中进行逐一比对,找到文件中所具有的成语,输出成语意思,否则,输出未找到):
查看成语系统中所有的成语及其意思(遍历文件,逐一输出):
成语填空(用穷举法,把每个空出现的位置的可能性全部列出来):
文件3:idiomMain.cpp
文件功能:完成函数的调用和成语接龙小游戏
用户函数:
成语查询函数:
成语接龙小游戏(输入一个成语,存储该成语的末尾的字,进入文件比对首位,找到则输出,否则,输出未找到):
查询系统中所有成语及其意思:
成语填空:
退出程序:
2.2.运行结果
1.登入界面:
2.游戏界面:
成语接龙:
成语查询:
成语填空:
全部成语及意思查询:
退出:
2.3大作业总结
1.碰到问题及解决办法
Q1:用户登入界面的清屏
A1:用system("cls"),完成清屏;
Q2:成语查询功能,找不到成语意思
A2:询问助教与同学,发现原本的成语计数的函数出现错误;
Q3:无法进行成语接龙
A3:将输入的成语用数组存放,将成语的尾部进入文件查找;
2.小结:
对于本次大作业,完成度较低,充分暴露了对于这部分知识掌握程度极低,这次的大作业,我前后重写了三遍,越写思路越乱(感觉是重写多遍,心态崩了),
尤其是成语查询和成语接龙部分(心态爆炸的起点),对于成语查询的调试阶段,一直卡在成语个数的统计部分,导致后面的部分调试不到(应该是对调试部分的掌握程度不足),成语接龙部分的成语在文件中查询比对,原本想用指针,却无从下手,改用数组,依旧写了好久,调试无果。
总的来说,在这次大作业上花的时间不足(备战四级阶段,没怎么敲代码),这次的大作业给我敲了个警钟,要复习之前所学的所有知识(掌握程度不足),新的知识需要实践训练,代码不能不敲,不然容易遗忘和生疏,这次的大作业也算是课设前的一个提醒,课设不能再重复本次的错误了。