C语言博客作业--结构体,文件
1.本章学习总结(2分)
1.1 学习内容总结
(1)结构体如何定义、成员如何赋值
结构体的一般形式为:
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
:
数据类型 成员名n;
};
a.结构体的定义及赋值:
先定义结构体类型再定义变量名,这是C语言中定义结构体类型变量最常见的方式。
struct 结构体名
{
成员列表;
};
struct 结构体名 变量名;
b.直接定义结构类型变量:
struct //没有结构体名
{
成员列表;
}变量名;
/*这是第一类结构体的形式,有结构体名,有结构体变量*/
struct str2{
int a;
int b;
};
/* 这是第二类结构体的形式,有结构体名,无结构体变量 */
typedef struct {
int a;
int b;
}STR3;
/* 这是第三类结构体的形式,把结构体重定义为STR3 */
typedef struct str4{
int a;
int b;
}STR4;
(2) 结构体数组排序做法
在对结构体数组排序时,首先确定排序数组的关键字,并且在排序过程中不是交换关键字的顺序,而是交换这个结构的地址,从而使结构体数组有序。举个例子:
#include<stdio.h>
typedef struct { //结构体 定义时尽量放main()外面---方便
int grade;
int age;
char name[10];
}Student;
int main()
{
int i, j;
Student temp;
Student student[3] = {
{550,19,"小红"},
{700,20,"tom"},
};
Student* p = student;
for (i = 1; i <= 2; i++)
{
for (j = 0; j <= 3 - i - 1; j++)//大-->小
{
if ((p + j)->grade < (p + j + 1)->grade)
{
temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;//注意 temp 的类型为Student
/*
temp=(p+j)->grade;
(p+j)->grade = (p+j+1)->grade;
(p+j+1)->grade = temp;
错误代码 why? 注意 整体交换
*/
}
}
}
/*以表的形式输出*/
printf("姓名 年龄 分数 \n\n");//表头
for (i = 0; i <= 2; i++)
{
printf("%-4s %4d %4d\n", (p + i)->name, (p + i)->age, (p + i)->grade);
}
getchar();
return 0;
(3)结构体指针怎么用
应该注意,结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储.
定义指向结构体类型变量的指针变量:
struct stu *p1, *p2 ;
定义指针变量p1、p2,分别指向结构体类型变量。引用形式为:指针变量→成员;做一个简单的应用吧。输入一个结构体类型变量的成员,并输出:
#include <stdlib.h>
#include<stdio.h>
struct data
{
int day;
int month;
int year;
};
struct stu
{
char name[20];
long num;
struct data birthday;
};
int main()
{
struct stu* student;
student = (stu*)malloc(sizeof(struct stu));
printf("Input name,number,year,month,day:\n");
scanf("%s", student->name);
scanf("%ld", &student->num);
scanf("%d%d%d", &student->birthday.year, &student->birthday.month, &student->birthday.day);
printf("\nOutputname,number,year,month,day\n");
/*打印输出各成员项的值*/
printf("%20s%10ld%10d//%d//%d\n", student->name, student->num, student->birthday.year, student->birthday.month, student->birthday.day);
}
程序中使用结构体类型指针引用结构体变量的成员,需要通过C提供的函数malloc()来为指针分配安全的地址。函数sizeof()返回值是计算给定数据类型所占内存的字节数。
指针所指各成员形式为:
student->name
student->num
student->birthday.year
student->birthday.month
student->birthday.day
共用体、枚举类型做法
共用体是一种多变量共享存储空间的构造类型,它允许几种不同的变量共用同一存储空间。共用体和结构体的区别:1.结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)。结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间。共用体不能赋初值。
枚举类型是指变量的值可以全部列出,定义一个枚举变量后,变量的值确定在定义之中。它和结构体、共用体的区别在于,枚举元素是常量,只能在定义阶段赋值。文件读写,文件中数据如何读进结构体数组
1.2 本章学习体会
- 学习体会:本章的学习个人认为比较的综合,也比较难。刚开始学习的的时候不是太懂。但是通过做这个大作业,我把之前不懂得地方进行了巩固,学习到了很多东西。所以,学习C的过程就是要理论与实际相结合的过程。实际操作的部分更重要。我记得网络工程导论曹老师说过一句话,学任何的科目,不管会不会,先做起来,在过程中遇见不会的问题继续学习,这样才会真正学到知识。这次大作业,确实也是这个样子;
- 代码量 1602
2.综合作业--“我爱成语”(8分)
2.1.文件介绍
2.1.1头文件介绍
- 头文件LoginCheck.h
介绍头文件有哪些结构体及函数声明,他们的功能是什么?可以列表格,更清晰直观
| 结构体名 | 结构体功能 |
|---|---|
| typedef struct SYSUSER | 分别储存文本中的用户名信息和他的密码 |
| 函数名 | 函数功能 |
|---|---|
| void LoginInterface(SYSUSER IdiomLover,FILE *fp); | 登录界面; |
| int CheckUser(SYSUSER IdiomLover,FILE *fp); | 使用者账号密码验证; |
头文件代码截图

- 头文件HandleInformation.h
介绍头文件有哪些结构体及函数声明,他们的功能是什么?可以列表格,更清晰直观
| 结构体名 | 结构体功能 |
|---|---|
| typedef struct IDIOM | 分别储存文本中的成语信息和他的释义 |
| 函数声明 | 函数功能 |
|---|---|
| void EnterInterface(); | 欢迎菜单界面; |
| IDIOM* HandleIdiomDate(IDIOM idiom[], FILE* fp); | 成语文件信息处理; |
| int GameInterface(IDIOM *idiomPtr); | 游戏界面; |
| int IdiomGame(IDIOM* idiomPtr); | 成语游戏模块 |
| char *HandleIdiom(IDIOM *idiomPtr,int i); | 成语处理,就是挖空什么的; |
| int CheckAnwser(char *anwser, IDIOM *idiomPtr,int i); | 检查成语是否正确; |
| void IdiomDictionary(IDIOM* idiomPtr); | 成语字典; |
| void QueryRank(); | 查询排名; |
头文件代码截图

2.2.2函数实现文件介绍。
- 文件1:成语游戏.c
介绍文件功能及设计思路。- 文件功能:main()函数所在的cpp文件,主要负责调用各部分功能模块,让程序成为一个整体;

主要代码截图
- 文件2:Login.c
介绍主要函数代码及功能。- 文件功能:
(1)函数代码:

- 文件功能:
功能:登录信息界面;
(2)函数代码:

功能:核对用户输入的账户密码是否存在与密码文件中,从而判断是否为合法账户;
主要代码截图


- 文件3:idiom.c
- 思路介绍:这一部分是整个游戏最重要的功能实现区,主要分为四个大部分;
- (1)游戏界面信息处理;
- (2)对于成语文件的分装处理,即将成语与他的释义分开装进结构体数组中去;
- (3)出题系统,进行成语的挖空处理并将题目输出;
- (4)检查配对系统,不仅对游戏题目的答案进行匹配查看是否正确,也完成成语字典的功能;
- (5)排名查询系统;
- 思路介绍:这一部分是整个游戏最重要的功能实现区,主要分为四个大部分;
主要代码截图







2.2.3运行结果
1.登录界面


2.游戏界面



3.排名界面
2.3大作业总结
1.碰到问题及解决办法
| 碰到的问题 | 解决方法 |
|---|---|
| 成语进行分装的时候内存储存冲突,变量周围值被修改 | “strcpy(idiom[j++].content,(str+1+i))” 改为strcpy(idiom[j].content, (str+1+i));j++; |
| 排名系统解决方案 | 正在解决中 |
| 如何返回上级菜单 | 同一个函数中用goto语句,不同函数中再调用上一级函数; |
2.小结
通过完成这一次大作业,我学会了很多的东西,将过去没有理解的东西理解清楚了。同时,我觉得做程序真的是一件快乐的事情,尤其是你的程序能成功地运行,并且功能实现的比较完整的时候。还有体验到了程序员的辛苦,害。
C语言博客作业--结构体,文件的更多相关文章
- c语言博客作业--结构体&文件
1.本章学习总结 1.1思维导图 1.2.本章学习体会 本章学到了结构体如何构建,用typedef进行重定义结构体,结构指针,访问结构体的方式等. 文件:文件的读取,文件读写的几个函数,基本了解了文本 ...
- C语言博客作业-结构体
一.PTA实验作业 6-2 按等级统计学生成绩 1. 本题PTA提交列表 2. 设计思路 定义i,count存放不及格人数 for i=0 to n-1{ 判断 score的值的范围 if 100&g ...
- C语言博客作业—结构体
一.PTA实验作业 题目1:结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 void calc //函数calc求出p指针所指的结构体数组中 n 名学生各自的总分 { 定义循环变量i: ...
- C语言第十次博客作业--结构体
一.PTA实验作业 题目1: 结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 求出每名学生的总分 定义i,j循环变量 for i=0 to n for j=0 to 3 p[i].su ...
- C语言博客作业06——结构体&文件
C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...
- C语言博客作业6---结构体&文件
C语言博客作业6---结构体&文件 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容.如下图所示: 1.2.学习体会 描述本周学习感受,也可以在这里提出你不理解地方.对 ...
- C语言|博客作业10
问题 回答 C语言 博客作业10 这个作业要求在哪里 作业要求 我在这个课程的目标是 熟练循环语句的用法 这个作业在哪个具体方面帮助我实现目标 pta作业 参考文献 <C语言程序设计> 1 ...
- C语言博客作业5--指针
C语言博客作业5--指针 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容,如下图所示: 1.2本章学习体会及代码量学习体会 1.2.1学习体会 描述本周学习感受,也可以在这里 ...
- C语言博客作业4--数组
C语言博客作业4--数组 1.本章学习总结 1.1思维导图 请以思维导图总结本周的学习内容,如下图所示: 1.2本章学习体会及代码量学习体会 1.2.1学习体会 描述本周学习感受,也可以在这里提出你不 ...
随机推荐
- 如何在Job中获取 IOC applicationcontext
如何在Job中获取 IOC applicationcontext https://segmentfault.com/q/1010000008002800 SpringBoot之整合Quartz调度框架 ...
- .net Aop 实现原理
本文实现所有继承BaseModel的类都通过代理拦截 using System; using System.Reflection; using System.Collections.Generic; ...
- 2019 前程无忧java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.前程无忧等公司offer,岗位是Java后端开发,最终选择去了前程无忧. 面试了很多家公司,感觉大部分公司考察的点 ...
- Python进阶(五)----内置函数Ⅱ 和 闭包
Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...
- JS去除字符串中的中括号
var str = '这是一个字符串[html]语句;[html]字符串很常见'; alert(str.replace(/\[|]/g,''));//移除字符串中的所有[]括号(不包括其内容) //输 ...
- swiper-动态更改数据后轮播点击或拖动失效
出现的问题: 1.swiper不能自动切换(设置了autoplay). 2.数据不匹配(需要加载的数据以改变,但是swiper里面的数据出现错误). 3.数据匹配过后,永远切换不到第一条数据. 4.根 ...
- 归并排序python实现源码
将开发过程经常用到的一些代码片段收藏起来,下面的资料是关于归并排序python实现的代码,应该能对码农们有一些用. def mergesort(arr): if len(arr) == 1: retu ...
- 【Python】模块和包
模块 模块的概念 1. 每一个以扩展名 `py` 结尾的 `Python` 源代码文件都是一个 模块 2. 模块名 同样也是一个 标识符,需要符合标识符的命名规则 3. 在模块中定义的 全局变量 .函 ...
- mysql replace into 实现存在则更新,不存在则插入
测试用的mysql数据库: 新建测试表: CREATE TABLE `test` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `text` varchar(2 ...
- Oracle UNDO块
过程:开始一个事务--通过事务信息找到UNDO块头的所在的段名及数据文件号等--转储UNDO header--在事务表中对应槽位找到前镜像dba--转储数据块--找到对应记录得到bdba--转储数据块 ...