1.本章学习总结

1.1 学习内容总结

  • 结构体的定义、成员的赋值:

    结构体的一般定义形式(单独定义):
  1. struct 结构名
  2. {
  3. 类型名 结构体成员名1;
  4. 类型名 结构体成员名2;
  5. ...
  6. 类型名 结构体成员名n;
  7. };

struct是定义结构类型的关键字,在struct之后,自行命名一个结构名,它必须是一个合法的C标识符,struct与结构名两者合起来共同组成结构类型名,如struct student

结构体的定义形式还有混合定义:

  1. struct 结构名
  2. {
  3. 类型名 结构体成员名1;
  4. 类型名 结构体成员名2;
  5. ...
  6. 类型名 结构体成员名n;
  7. }结构变量名1,结构变量名2;

还有无类型名定义:

  1. struct
  2. {
  3. 类型名 结构体成员名1;
  4. 类型名 结构体成员名2;
  5. ...
  6. 类型名 结构体成员名n;
  7. };

前者与单独定义形式的实质是一样的,而后者定义结构变量时省略了结构名,所以也导致了变量不能再增加,否则重新定义结构体,不推荐使用。

有关typedef定义结构体:

  1. typedef struct 结构名
  2. {
  3. 类型名 结构体成员名1;
  4. 类型名 结构体成员名2;
  5. ...
  6. 类型名 结构体成员名n;
  7. }STRUCT;

用typedef定义,则上面的STRUCT==struct+结构名,这样子之后定义结构体变量的时候,就可以用STRUCT来简化代码了。因此推荐使用typedef。

成员的赋值:

在C语言中,用结构成员操作符‘.’来引用成员;格式为:结构变量名.结构成员吗,比如stu.num或stu.name

引用成语后,对成员的赋值方法与同类型的变量完全相同,比如:

  1. stu.num=119;
  2. strcpystu.name,"hello");
  • 结构体数组排序做法:

结构体数组的排序,其实就是数组的排序,可以用常见的选择法与冒泡法排序

(比如将students[n]中按照students中的num排序)

1、冒泡法(把最大的沉下去):

使用两层循环

  1. for(i=1;i<n;i++)//外循环n-1次
  2. {
  3. for(j=0;j<n-1-i;j++)
  4. {
  5. if(students[j].num>students[j+1].num) 交换students[j]与students[j+1];
  6. }//内循环结束后,将有一个最大值“沉”到未排序的最下面
  7. }

两层循环后即可得到有序的重构数组students[n];

2、选择法(先选择最大的,然后按照顺序排下来):

这里也是要用到两层循环

  1. for(i=1;i<n;i++)
  2. {
  3. for(j=0;j<n-i;j++)
  4. {
  5. 如果student[MaxIndex].num<students[j].num;则交换MaxIndexj; //历遍数组,找出最大的值所在下标
  6. }
  7. //交换students[MaxIndex]与students[n-i]; //将最大的元素与(未排序)下标最大的数组元素交换
  8. }

两层循环后即可得到有序的重构数组students[n];

  • 结构体指针的用法:

    作为函数参数:函数传递参数方面,由于结构体所包含的参数较多,如果直接传递结构体,则需要传递非常多的字节,效率不高,而如果用结构体指针传递一个指向结构体的指针,则只需要传递8个字节(一个地址)。用法同函数的参数传递。

用结构体指针访问结构成员:

1、用p访问:

如:(
p)->num=110;

其中p表示的是p指向的结构变量,注意,(p)中的括号是必不可少的,因为‘’运算符的优先级低于‘.’运算符,若没有括号,则p.num等价于*(p.num),含义发生变化,会产生错误。

2、用指向运算符->访问:

如:p->num=110;

上面两种公式得到的效果是一样的。但我们通常用指向运算符->;

  • 共用体、枚举类型做法

    • 共用体概念:使用同一段内存单元存放不同类型的变量,或者说使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。(实际上很少用到,因为现代电脑内存单元都很充足)

      共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。共用体占用的内存等于最长的成员占用的内存。

      定义与声明:
  1. union Data{
  2. int n;
  3. char ch;
  4. double f;
  5. };
  6. union Data a, b, c;
  • 枚举类型:

    枚举类型的一般定义形式为:

    enum typeName{ valueName1, valueName2, valueName3, ...... };

    其中的数据枚举值默认从 0 开始,往后逐个加 1;但我们也可以改变它的首元素对应的值,比如:

    enum typeName{ valueName1=2, valueName2, valueName3, ...... };

    这样枚举值就从 2 开始了.

定义枚举变量:enum typeName a, b, c;

当然也可以在定义枚举类型的同时定义变量,就像结构体的混合定义。

有了枚举变量,就可以把列表中的值赋给它了:

比如:

  1. enum week{ Mon , Tues, Wed, Thurs, Fri, Sat, Sun };
  2. enum week a = Mon, b = Wed, c = Sat;
  • 文件读写,文件中数据如何读进结构体数组:

    文件读写,就要用到文件打开函数:fopen()和文件关闭函数fclose()了,文件读取的时候记得考虑文件打开失败的情况

    配合读进结构体数组,比如:
  1. FILE *fp;
  2. int i=0;
  3. if((fp=fopen("abc.txt","r+"))==NULL)
  4. {
  5. printf("打开文件失败");
  6. exit(0);
  7. }
  8. //读进结构体数组:
  9. while(!feof(fp))
  10. {
  11. fscanf(fp,"%d%s%d",&student[i].num,student[i].name,&student[i].score);
  12. i++;
  13. }

文件读取函数完整形式:fopen(char *filename,char *type);

这里char *type为打开文件的操作形式

其中字符型文件:

"r" 只读;

"w" 清空文件内容,只写;

"a" 追加;

"r+" 以读/写方式打开一个已存在的文件;

"w+" 以读/写方式建立一个新的文本文件 ;

"a+" 以读/写方式打开一个文件进行追加 ;

二进制文件:

"rb" 只读;

"wb" 清空文件内容,只写;

"ab" 追加 ;

"rb+" 以读/写方式打开一个二进制文件;

"wb+" 以读/写方式建立一个新的二进制文件 ;

"ab+" 以读/写方式打开一个二进制文件进行追加 ;

1.2 本章学习体会

  • 以前的那些编程,总感觉距离现实生活中的应用有点远,没有实际应用。学习到文件以后,感觉有了点可以在现实生活中操作的感觉,比如利用绝对路径删除某一个文件、修改某一个文件,让我想到了黑客的感觉,也觉得距离C语言的精髓更近了。由于打开、操作文件时会遇到一些系统崩溃或者系统异常的问题,所以同时也觉得文件这部分内容需要更加的小心去操作,要更细心,这是以前编程从未想过的问题。
  • 这两周代码量:785行。

2.综合作业--“我爱成语”

c博客06-结构体&文件的更多相关文章

  1. c语言博客作业--结构体&文件

    1.本章学习总结 1.1思维导图 1.2.本章学习体会 本章学到了结构体如何构建,用typedef进行重定义结构体,结构指针,访问结构体的方式等. 文件:文件的读取,文件读写的几个函数,基本了解了文本 ...

  2. C语言博客作业06——结构体&文件

    C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...

  3. C语言博客作业--结构体,文件

    1.本章学习总结(2分) 1.1 学习内容总结 (1)结构体如何定义.成员如何赋值 结构体的一般形式为:      struct  结构体名     {      数据类型 成员名1:      数据 ...

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

    1.本章学习总结 1.1 学习内容总结 结构体如何定义.成员如何赋值: 1.常见的定义: struct student { int num; char name[20]; }stu; //2.采用ty ...

  5. C语言第十次博客作业--结构体

    一.PTA实验作业 题目1: 结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 求出每名学生的总分 定义i,j循环变量 for i=0 to n for j=0 to 3 p[i].su ...

  6. C语言博客作业-结构体

    一.PTA实验作业 6-2 按等级统计学生成绩 1. 本题PTA提交列表 2. 设计思路 定义i,count存放不及格人数 for i=0 to n-1{ 判断 score的值的范围 if 100&g ...

  7. C语言博客作业—结构体

    一.PTA实验作业 题目1:结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 void calc //函数calc求出p指针所指的结构体数组中 n 名学生各自的总分 { 定义循环变量i: ...

  8. 【技术博客】Laravel5.1文件上传单元测试

    Laravel5.1文件上传单元测试 作者:ZGJ 在软工第三阶段中,我彻底解决了上一阶段一直困扰我的文件上传单元测试问题,在这里做一个总结. 注:下文介绍中,方法一方法二实现简单但有一定的限制条件( ...

  9. C语言文件读写(结构体文件)

    有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) xiaoming ...

随机推荐

  1. eclipse没有打断点,项目确仍然要进入断点的问题。

    eclipse没有打断点,却仍然每次debug项目启动时都进入一个断点,很烦人,经在网上查阅发现是勾选了下图中红框中所示的几个选项,把这几项去掉之后就自动不进入断点页面了,经分析这几个选项的大概意思是 ...

  2. 线上服务器CPU彪高的调试方式

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/2fee7b91-f ...

  3. Python之利用Whoosh搭建轻量级搜索

      本文将简单介绍Python中的一个轻量级搜索工具Whoosh,并给出相应的使用示例代码. Whoosh简介   Whoosh由Matt Chaput创建,它一开始是一个为Houdini 3D动画软 ...

  4. python 多线程编程之使用进程和全局解释器锁GIL

    本文主要介绍如何在python中使用线程. 全局解释器锁: python代码的执行是由python虚拟机(又名解释器主循环)进行控制的.python中,主循环中同时只能有一个控制线程在执行,就像单核C ...

  5. 如何利用PS将照片背景替换为白色

    需求:将照片中的蓝底换成白底: 操作步骤: 1.打开图片,点击背景图层: 2.利用套索,选中除背景外的区域: 3.右键,反选: 4.填充为“白色”,确定,保存:

  6. FlowPortal:流程节点定义有误,合流节点"合流"没有对应的聚焦节点

    FB版本:6.00c 报错: 流程节点定义有误,合流节点"合流"没有对应的聚焦节点 解决办法:分流和合流之间的节点不能有其他节点汇入.调整如下后,成功保存.

  7. 闲鱼hu超赞,有赞必回,24小时在线!咸鱼互赞超赞留言评

    有没有在闲鱼上卖东西没有浏览量的人! 我们来一起互赞互相提高彼此宝贝的浏览量,从而更快的促进交易! 我打算建个群,我们可以一起交流下哈! 需要的进入QQ群   : 530980712

  8. (办公)记事本_Linux常用的文件操作命令

    参考尚硅谷的谷粒学院的linux教程:http://www.gulixueyuan.com/course/300/task/7080/show 好吧,其实一个命令他要是讲超过20分钟,我就去看菜鸟教程 ...

  9. 微言Netty:分布式服务框架

    1. 前言 几年前,我就一直想着要设计一款自己的实时通讯框架,于是出来了TinySocket,她是基于微软的SocketAsyncEventArgs来实现的,由于此类提供的功能很简洁,所以当时自己实现 ...

  10. ReactNative: 使用网页组件WebView组件

    一.简介 在移动端开发中,很多时候需要嵌入一个网页来帮助实现某一个活动,这方式大大提高了活动快速迭代的灵活性,在RN中,同样也这么处理这种情况的.其实,这种混合式开发称为Hybird APP,它们就是 ...