C语言程序设计 课件 (张惠涛 )第7、8章 结构体、共用体和枚举类型;文件_第1页
C语言程序设计 课件 (张惠涛 )第7、8章 结构体、共用体和枚举类型;文件_第2页
C语言程序设计 课件 (张惠涛 )第7、8章 结构体、共用体和枚举类型;文件_第3页
C语言程序设计 课件 (张惠涛 )第7、8章 结构体、共用体和枚举类型;文件_第4页
C语言程序设计 课件 (张惠涛 )第7、8章 结构体、共用体和枚举类型;文件_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1234结构体类型的定义结构体类型变量结构体类型数组共用体第7章结构体、共用体和枚举类型5枚举类型结构体类型7.17.1.1结构体类型定义用途:把不同类型的数据组合成一个整体——自定义数据类型。结构体是一种复合数据类型。结构体类型定义的一般形式struct

结构体类型名

{

数据类型1成员名1;数据类型2成员名2;……….数据类型n成员名n;};7.1.1结构体类型定义实例:定义结构体类型,描述下列数据

(1)学生情况:包含学生的学号、姓名、性别、年龄、成绩,住址:

structstudent{intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[60];};

注:‘;’不能省7.1.1结构体类型定义(2)个人数据:包含姓名、性别、年龄、身高、体重、住址:structperson{charname[20];//姓名charsex;//性别intage;//年龄floatheight;//身高floatweight;//体重charaddr[60];//住址};

7.1.1结构体类型定义(3)日期结构体类型包括年、月、日:structdate{intyear;intmonth;intday;};(4)如职工信息结构体类型:structperson{charname[20];//姓名charaddress[60];//地址floatsalary;//工资floatcost;//扣款structdatehiredate;//入职日期};结构体类型定义描述结构的组织形式,不分配内存7.1.2

结构体类型变量

structstudent{int

num;charname[20];charsex;

intage;floatscore;charaddr[40];};structstudentstu1,stu2;

1.结构体变量的定义(1)先定义结构体类型,再定义结构体变量7.1.2

结构体类型变量(2)定义结构体类型的同时定义结构体变量例:structstudent{int

num;charname[20];charsex;

intage;floatscore;charaddr[40];}stu1,stu2;struct结构体名{

成员说明列表;

}变量名列表;

1.结构体变量的定义7.1.2

结构体类型变量例

struct{int

num;charname[20];charsex;

intage;floatscore;charaddr[40];}stu1,stu2;struct{

成员说明表列;

}变量名表列;

1.结构体变量的定义(3)直接定义结构体变量注:这种方式后续无法再定义这个类型的其他变量7.1.2

结构体类型变量注

意结构体类型与结构体变量概念不同1.类型:不分配内存;变量:分配内存。2.类型:不能赋值、存取、运算;变量:可以。3.结构体可嵌套。4.结构体成员名与程序中变量名可相同,不会混淆。

structstudent{int

num;charname[20];charsex;

intage;floatscore;structdatabirthday;charaddr[40];}stu1,stu2;structdate{intyear;intmonth;intday;};7.1.2

结构体类型变量

2.结构体变量的初始化structstudent/*定义结构数据体类型*/{charnum[8];charname[20];charsex;charaddr[40];}stu1={"202203001","zhangsan",'M',"zhufengstreet"};//定义结构体变量stu1,并赋初值例:或者studentstu2={"202203002","lisi",'M',"zhufengstreet"};//定义结构体变量stu2,并赋初值

3.结构体变量的使用(1)结构体变量的引用一般形式为:

结构体变量名.成员名例如,stu1.num表示引用结构体类型structstudent变量stu1中的num成员,因该成员的类型为int型,所以可以对它施行任何int型变量可以施行的运算。例如:stu1.num=20312;7.1.2

结构体类型变量还有一种引用形式为:

指针变量名->成员名例如,如下变量定义:structnode{floatx;node*next;}p,u,*pt;7.1.2

结构体类型变量

3.结构体变量的使用(1)结构体变量的引用pt=&p;p.x=12.2;p.next=&u;p.next->x=-23.7;u.next=NULL;12.2&u-23.7NULLpu&ppt

3.结构体变量的使用7.1.2

结构体类型变量(2)结构体变量的输入与输出C语言不能把一个结构体变量作为一个整体进行输入或输出,应该按成员变量输入输出。例如,若有一个结构体变量:

struct

{charnum[8];charname[20];intage;

charaddr[40];

}stu1={″2022001″,″WangWei″,″18″,″ZhufengStreet288″};应该如何输出stu1变量?

输出stu1变量,应该使用如下方式:

printf(″%s,%s,%d,%s\n″,stu1.num,,stu1.age,stu1.addr);

输入stu1变量的各成员值,则用:

scanf(″%s%s%d%s″,stu1.num,,&stu1.age,stu1.addr);结构体类型数组7.2

与定义普通数组一样,在结构体数组名之后指定元素个数,就能定义结构体数组。例如:

structstudentstu[30];

structpersonemployee[100];

struct

{charname[20];

intnum;

floatprice;

floatquantity;

}part[100];访问结构体数组元素的成员的标记方法为:

结构体数组名[元素下标].结构体成员名7.2.1结构体类型数组的定义例如:part[10].price=8.99;printf(“%s”,part[3].name);例

structstudent{charnum[8];charname[20];charsex;intage;}stu[5]={{“2022101”,“张三”,‘M’,18},{“2022102”,“李四”,‘F’,18},{“2022103”,“王五”,‘M’,19},{“2022104”,“周六”,‘F’,19},{“2022105”,“张三”,‘M’,18}};全部初始化时数组维数可以省略。7.2.2

结构体类型数组的初始化例

structstudent{intnum;charname[20];charsex;intage;}stu[5]={{……},{……},{……}};部分初始化,如上所示,只对数组前三个元素赋初值。7.2.2

结构体类型数组的初始化(1)引用结构体数组元素的成员。例如:students[i].num这是序号为i的数组元素中的num成员。如果数组已如上初始化,且i=2,则相当于students[2].num,其值为”2022103”。(2)可以将一个结构体数组元素赋给同一结构体类型数组中的另一个元素,或赋给同一类型的变量。例如:structstudentstudent[3],stu1;现在定义了一个结构体数组student,它有3个元素,又定义了一个结构体变量stu1,则下面的赋值合法。stu1=student[0];student[2]=student[1];student[1]=stu1;7.2.3

结构体数组的使用(3)结构体数组元素的输入与输出不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成员对象进行输入输出。例如:scanf(“%s”,student[0].name);printff(“%s”,&student[0].num);7.2.3

结构体数组的使用结构体类型指针7.37.3.1指向结构体变量的指针指向结构体变量的指针的定义形式:struct类型名*指针变量名;例如structdate*pd,date3;pd=&date3;使用结构体指针变量引用成员形式(*结构体指针名).成员名结构体指针名->成员名structdate{intyear;intmonth;intday;};(*pd).monthpd->monthdate3.month7.3.1指向结构体变量的指针总结:结构体成员变量引用方式①结构体变量.成员名②(*p).成员名③p->成员名其中,->称为指向运算符。7.3.2指向结构体数组元素的指针一个指针变量可以指向一个结构体数组元素,也就是将该结构体数组的数组元素地址赋给此指针变量。例如:struct{inta;floatb;}arr[3],*p;p=arr;此时使p指向arr数组的第一个元素,“p=arr;”等价于“p=&arr[0];”。若执行“p++;”则此时指针变量p此时指向arr[1],指针指向关系如图所示。pp++arr[0]arr[1]arr[2]共

型9.47.4.1共用体类型共用体也称为联合体数据类型,可把不同类型的数据项组成一个整体,这些不同类型的数据项可以共用一个共同体空间,且在内存中所占用的起始单元是相同的。

1.共用体类型定义

共用体类型的定义形式与结构体类型的定义形式相同,只是其类型关键字不同,共用体的关键字为union。一般形式为union共用体类型名{

成员说明列表};7.4.1共用体类型的定义例如:unionresult{chargrade;floatscore;};共用体是多种数据值覆盖存储,几种不同类型的数据值从同一地址开始存储,但任意时刻只存储其中一种数据,而不是同时存放多种数据。

注意:

2.共用体变量定义

(1)先定义共用体类型,再定义共用体类型变量。例如:unionresult{chargrade;floatscore;};unionresultstu1,stu2;7.4.1共用体类型的定义

(2)在定义共用体类型的同时定义共用体类型变量。例如:

unionresult{chargrade;floatscore;}stu1,stu2;(3)定义共用体类型时,省略共用体类型名,同时定义共用体类型变量。例如:union{

chargrade;floatscore;}stu1,stu2;7.4.1共用体类型的定义

可以引用该共用体变量的某个成员,引用方式与引用结构体变量中的成员相似。例如,

stu1.grade,

stu1.score,一个共用体变量不能同时存放多个成员的值,而只能存放其中的一个值,这就是最后赋给它的值。例如:

stu1.grade=′D′;

stu1.score=61.00;共用体变量中最后的值是61.00。

注意:7.4.2共用体类型变量的使用

(1)共用体变量stu1所占的内存单元的字节数不是2个成员的字节数之和,而是等于2个成员中最长字节的成员所占内存空间的字节数,也就是说,stu1的2个成员共享4个字节的内存空间。7.4.2共用体类型变量的使用gradescore共用体成员所占空间示意图

(2)变量stu1中不能同时存在2个成员,只是可以根据需要用stu1存放一个字符数据,或存放一个浮点数。例如:stu1.grade=’A’;

stu1.score=100.00;7.4.2共用体类型变量的使用字符’A’占用了stu1的1个字节。2条赋值语句,如果按顺序执行,只有最后一个语句“stu1.score=100.00;“的结果保留下来,前面的字符’A’被100.00覆盖了。

(3)共用体一般不单独使用,通常作为结构体的成员,这样结构体可根据不同情况放不同类型的数据。7.4.2共用体类型变量的使用例如,需要把学生和教师的数据放在一起处理。学生和教师的数据相同的分量有:姓名、编号和身份。但也有不同的部分:学生需要保存10门课程的分数,分数用浮点数表示,教师则保存工作情况简介,用字符串表示。教师和学生的不同部分可以用共用体描述。例如:程序示例:unioncondition{floatscore[10];

charsituation[80];};structperson{charname[20];

charnum[10];

charkind;

unionconditionstate;}personnel[30];7.4.2共用体类型变量的使用例:利用共用体变量表示学生的期末成绩。#include<stdio.h>unionresult{ chargrade; floatscore;};structstudent{ char*num; char*name; unionresultr;}stu1,stu2;voidmain(){ stu1.num="202203001"; ="zhangjun"; stu1.r.score=86; stu1.r.grade='B';//覆盖了前面的分数赋值,stu1输出等级 stu2.num="202203002"; ="liming"; stu2.r.grade='C'; stu2.r.score=78;//覆盖了前面的等级赋值,stu2输出分数 printf("%s%s%c\n",stu1.num,,stu1.r.grade); printf("%s%s%.2f\n",stu2.num,,stu2.r.score);}枚

型7.57.5

枚举类型用枚举方法列举一组标识符作为枚举类型的值的集合。当一个变量具有这种枚举类型时,它就能取枚举类型的标识符值。枚举类型定义的一般形式为:

enum

枚举类型名{标识符1,标识符2,…,标识符n};定义一个枚举类型和枚举变量如下:enumcolorname{red,yellow,blue,white,black};enumcolornamecolor;变量color是枚举类型enumcolorname,它的值只能是red、yellow、blue、white、black。7.5

枚举类型同结构体和共用体类似,枚举类型变量的定义也有3种。(1)先定义枚举类型,再定义变量(2)定义枚举类型的同时定义变量(3)直接定义枚举类型变量7.5

枚举类型注

意枚举元素不是变量,不能改变其值。枚举元素作为常量,它们的值就是从0的序号。但不能将一个整数赋给枚举变量。枚举常量可以进行比较运算。枚举常量不是字符串。本章小结构造数据类型将多种不同数据类型、且相互关联的一组数据,组合成一个有机的整体来使用,构造数据类型的内存空间分配遵循前面所讲数据存储类型的规则,是C语言进行复杂数据处理的基础。本章是C语言程序设计的提高部分,要求重点掌握结构体类型、共用体类型和枚举数据类型的概念,掌握各自的定义、初始化及其引用方式,它们在程序设计中的应用。感谢观看第八章文件文件68.1文件基本概念及分类8.2文件类型指针8.3文件的打开与关闭8.4文件的读写8.5文件的定位8.6C语言学习之路8.7本章小结8.1文件基本概念及分类文件在计算机领域是一个重要的概念,它其实是指存储在计算机外存上的一组相关数据的有序集合。数据集合的名称就叫文件名,在系统当中是唯一的,是其本身的操作标志。前面的各章中涉及到的源程序文件、目标文件、可执行文件、库文件等等都可以叫作文件。C语言提供了强大的机制支持文件的各类操作。本章重点围绕ASCII码文件和二进制码文件进行学习。ASCII文件也叫文本文件,它在磁盘中存放时每个字节存储一个ASCII表示的字符。文本文件是可以直接阅读的,可使用记事本打开,其扩展名为.txt。二进制文件是按内存中的二进制的存储形式原样输出到磁盘上来保存,因此这类文件一般不能使用记事本直接打开来阅读其中内容。C系统在处理文件时,就把文件看成是字节流或二进制流,按字节进行处理。本章将重点讲解ANSIC规定文件系统及其标准输入输出函数。8.2文件类型指针所谓文件指针,实际上是指向结构体类型的指针变量,这个结构体中包含文件的信息,如缓冲区的地址,在缓冲区中当前存取的字符的位置,对文件是“读”还是“写”,是否出错,是否已经遇到文件结束标志等信息。此结构体类型名为FILE,可以由此类型来定义文件指针。定义文件类型指针变量的一般形式为: FILE*指针变量标识符;例如: FILE*fp;fp被定义为指向文件类型的指针变量,称为文件指针。文件指针用于指向多个文件,实际上是用于存放文件缓冲区的地址。在缓冲文件系统中可以进行文件的打开、关闭、读、写、定位等操作。结构类型名“FILE”必须大写。一般情况下对文件操作有3个步骤:打开文件,即在计算机内存中开辟缓冲区,用于存放被打开文件的相关信息;文件处理,包括读写、定位等操作;关闭文件,将缓冲区中的内容写回到磁盘,然后释放缓冲区。8.3文件的打开与关闭8.3.1文件打开函数fopen()fopen()函数用来打开一个文件,其调用的一般形式为:

文件指针名=fopen(文件名,打开文件方式)其中,“文件指针名”必须是被说明为FILE类型的指针变量;“文件名”是被打开文件的文件名,

以字符串常量或字符串数组的形式出现;“打开文件方式”是指文件的类型和操作要求。例如: FILE*fp; fp=("C:\\myfile.txt","wt");其意义是在C盘根目录下只写打开或建立一个文本文件myfile,只允许写数据操作,并使文件指针fp指向该文件。文件名字符串中两个反斜线“\\”中的第一个表示转义字符,第二个表示根目录。8.3文件的打开与关闭8.3.1文件打开函数fopen()打开文件的方式有12种,如下表所示打开方式文件类型含义“r”文本文件只读打开一个文本文件,只允许读数据“w”文本文件只写打开或建立一个文本文件,只允许写数据“a”文本文件追加打开一个文本文件,并在文件末尾写数据“r+”文本文件读写打开一个文本文件,允许读和写“w+”文本文件读写打开或建立一个文本文件,允许读写“a+”文本文件读写打开一个文本文件,允许读,或在文件末追加数据“rb”二进制文件只读打开一个二进制文件,只允许读数据“wb”二进制文件只写打开或建立一个二进制文件,只允许写数据“ab”二进制文件追加打开一个二进制文件,并在文件末尾写数据“rb+”二进制文件读写打开一个二进制文件,允许读和写“wb+”二进制文件读写打开或建立一个二进制文件,允许读和写“ab+”二进制文件读写打开一个二进制文件,允许读,或在文件末追加数据8.3文件的打开与关闭8.3.2文件关闭函数fclose()文件一旦使用完毕,要用关闭文件函数fclose()把文件关闭,以避免文件的数据丢失等情况发生。fclose()函数调用的一般形式是: fclose(文件指针);例如: fclose(fp);正常完成关闭文件操作时,fclose()函数返回值为0;返回非零值表示有错误发生。8.3文件的打开与关闭例8.1演示打开和关闭文本文件#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;if((fp=fopen("c:\\myfile.txt","wt"))==NULL){printf("打开文件失败\n");exit(0);}printf("打开文件成功!");//此处可替换为对文件的读写操作语句

if(fclose(fp)==0)printf("\n成功关闭文件!\n");elseprintf("\n未成功关闭文件!\n");system("pause");return0;}本程序演示了文件打开和关闭的过程。如果文件未成功打开,则打印“不能打开文件”,否则打印“文件被成功打开!”;如果文件成功关闭,则打印“成功关闭文件!”。正常情况下,该程序会在C盘根目录下以读写的方式建立myfile.txt文件,然后再把它关闭。8.4文件的读写8.4.1字符读写函数:fgetc()和fputc()1、fputc()功能是将多个字符写到文件中,一般形式为:fputc(字符数据,文件指针);例如:charc=‘a’;fput(c,fp);//其中fp是已经正确打开的可写文件的指针该语句将变量c的值写入fp所指向的文件中。2、fgetc()功能是从文件中读取多个字符,一般形式为:fgetc(文件指针);例如:charch;ch=fgetc(fp);表示从文件fp中读取多个字符,赋给变量ch,而fp的位置指针向前移动到下一个字符。8.4文件的读写8.4.1字符读写函数:fgetc()和fputc()例8.2演示向打开的文本文件中写入或读取一个字符#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch='a';charch1='b';//ch1初始值设置为’b’if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打开文件失败!\n");exit(0);}

printf("打开文件成功!\n");fputc(ch,fp);rewind(fp);//将文件指针重新指向文件开头

printf("ch1初始值为:%c\n",ch1);ch1=fgetc(fp);printf("ch1现在的值为:%c\n",ch1);

if(fclose(fp)==0)printf("关闭文件成功!\n");elseprintf("关闭文件失败!\n");system("pause");return0;}8.4文件的读写8.4.2字符串读写函数:fgets()和fputs()1、fputs()功能是向指定文件输出字符串,一般形式为:fputs(字符串,文件指针);2、fgets()功能是从文件中读字符串,一般形式为:fgets(字符串起始地址,字符数量,文件指针);例8.3演示向打开的文本文件中写入或读取字符串#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch[]=”helloworld”;charch1[30]=”abcdefg”;if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打开文件失败!\n");exit(0);

}printf("打开文件成功!\n");fputs(ch,fp);rewind(fp);//将文件指针重新指向文件开头printf("ch1初始值为:%s\n",ch1);fgets(ch1,4,fp);//从文件中取4-1=3个字符,留一个字节存放’\0’printf("ch1现在的值为:%s\n",ch1);

if(fclose(fp)==0)printf("关闭文件成功!\n");elseprintf("关闭文件失败!\n");system("pause");return0;}8.4文件的读写8.4.3数据块读写函数:freed()和fwrite()1、fread()函数的功能是从文件中读取数据块,一般形式为: fread(buffer,size,count,fp);关于fread()的几点说明:(1)fp是文件指针;buffer是一个指针,用来存放输出数据块的地址;size表示数据块的字节数;count表示要读取的数据块块数;(2)fread()函数的功能是从fp所指向文件的当前位置开始,一次读取size个字节,重复count次,并将读取的数据存放到从buffer开始的内存中;同时,将位置指针向前移动size*count个字节;(3)如果调用fread()函数成功,则函数返回值等于count。2、fwrite函数的功能是向文件写数据块,其调用的一般形式为: fwrite(buffer,size,count,fp);关于fwrite()的几点说明:(1)fp是文件指针;buffer是一个指针,用来存放将要读取数据块的地址;size表示一个数据块的字节数;count表示要写的数据块个数;(2)fwrite()函数功能是从buffer指定的地址开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中;同时,将位置指针向前移动size*count个字节。(3)如果调用fwrite函数成功,则函数返回值等于count。8.4文件的读写8.4.3数据块读写函数:freed()和fwrite()例8.4演示向打开的文本文件中写入或读取若干数据块#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch[]="Helloeveryone,howareyou?";charch1[30]="1234567890";if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打开文件失败!\n");exit(0);}

printf("打开文件成功!\n");fwrite(ch,5,3,fp);//从ch字符串中取3*5=15个字符的

//数据存入fp中rewind(fp);//将文件指针重新指向文件开头printf("ch1初始值为:%s\n",ch1);

fread(ch1,4,2,fp);//从fp中取2*4=8个字符的

//数据存入ch1字符数组中printf("ch1现在的值为:%s\n",ch1);

if(fclose(fp)==0)printf("关闭文件成功!\n");elseprintf("关闭文件失败!\n");system("pause");return0;}8.4文件的读写8.4.4格式化读写函数:fscanf()和fprinf()1、fprintf()函数只能向文本文件中输出数据。fprintf()函数和printf()函数相似,只是输出的内容将按指定格式存放到磁盘的文本文件中,而不是屏幕上。fprintf()函数的调用形式如下: fprintf(文件指针,格式控制字符串,输出项表);//参考printf()函数 fprintf(fp,"%d%d",x,y);//fp为以写入的方式正确打开的文件指针2、fscanf()函数只能从文本文件中按格式输出。fscanf()函数和scanf()函数相似,其输出的对象是磁盘上文本文件中的数据,而不是键盘的输入数据。fscanf()函数的调用形式如下: fscanf(文件指针,格式控制字符串,输出项表);//参考scanf()函数 fscanf(fp,"%d%d",&a,&b);

8.4文件的读写8.4.4格式化读写函数:fscanf()和fprinf()例8.5演示按指定格式向打开的文本文件中写入或读取一个字符#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch=’x’;charch1=’a’;if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打开文件失败!\n");exit(0);}printf("打开文件成功!\n");fprintf(fp,”%c”,ch);//向打开的文件中输出ch中的值’x’rewind(fp);//将文件指针重新指向文件开头printf("ch1初始值为:%c\n",ch1);fscanf(fp,”%c”,&ch1);//从打开的文件中输入一个字符,保存到ch1中

//与scanf()用法一样,参数要使用&表示地址printf("ch1现在的值为:%c\n",ch1);if(fclose(fp)==0)printf("关闭文件成功!\n");elseprintf("关闭文件失败!\n");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论