1本讲内容结构体结构体类型定义的方法结构体变量的引用结构体数组文件文件的打开与关闭文件的读写21、结构体基本数据类型int、float、char…构造数据类型数组(各元素属于同一类型)但是很多时候,需要将不同类型的数据组成一个整体,以便于使用。这些组合在一个整体中的数据是相互联系的,如下图。10010LIFun18M90Wuhannumnameagesexscoreaddr3structstudent{charnum[5];charname[20];charsex;intage;floatscore;charaddr[30];};10010LIFun18M90Wuhannumnameagesexscoreaddr这样一种结构的定义:•struct关键字声明结构体类型时使用。它向系统声明这是一个“结构体类型”。•定义的一般形式struct结构体名{成员列表};•成员列表中各个成员在定义时都应该进行类型的声明•structstudent是一个类型名,它和基本数据类型int、float、char等一样,都可以用来定义变量。41.1结构体变量的定义步骤:先定义结构体类型再定义结构体变量①structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};②structstudentstu1,stu2;inta,b与普通变量的定义一样5stu1、stu2变量stu1和stu2都为structstudent类型的变量,即它们具有structstudent的结构10011Wangli20F67Chengdunumnameagesexscoreaddr10012Lijun19M80Beijingstu1stu2思考:这样结构的数据在内存中占多少个字节?61.2结构体变量的引用#includestdio.hvoidmain(){structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1;//结构体变量的定义scanf(%d,%s,%c,%d,%f,%s,&stu1.num,&stu1.name,&stu1.sex,&stu1.age,&stu1.score,&stu1.addr);printf(%d,%s,%c,%d,%f,%s\n,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.score,stu1.addr);}“.”成员运算符71.3结构体数组一个结构体变量可以存放一组数据(如学生的学号、姓名、成绩等数据),如果在应用的过程中需要50个学生的数据进行处理,显然要用数组,这就是结构体数组。结构体数组的定义先定义结构体类型再定义结构体数组(与普通数组的定义相同)8例:求3个学生各自成绩的平均分,并输出//先定义结构体#includestdio.hstructstudent{charnum[6];//学号charname[15];//姓名intscore[2];//2门课成绩floatavr;//平均分};9voidmain(){inti,j,sum;structstudentstu[3];//结构体数组,3个学生for(i=0;i3;i++){printf(stuNo:);scanf(“%s”,&stu[i].num);//输入学生学号printf(name:);scanf(“%s”,&stu[i].name);//输入学生姓名sum=0;for(j=0;j2;j++){printf(score%d,j+1);scanf(“%d”,&stu[i].score[j]);//输入学生2门课的成绩sum+=stu[i].score[j];}stu[i].avr=sum/2.0;//求学生平均分}10for(i=0;i3;i++)//输出各学生的信息printf(%s%s%d%d%d%f\n,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].avr);}111.4小节关于结构体变量定义的方法详见11.2章节关于结构体变量初始化的方法详见11.4章节认真阅读教材11.1~11.5章节内容122、文件2.1文件概述文件(file)一般指存储在外部介质上数据的集合根据数据的组织形式,文件可分为:ASCII文件(文本文件,.txt)存放字符的ASCII码二进制文件存放字符的二进制编码在此之前,所有的输入、输出都是以终端为对象,即从键盘输入,运行结果输出到终端在应用的过程中,常需要将运行的结果(最终数据或中间数据)保存起来,以后需要时再读入内存。这就需要用到磁盘文件。132.2文件类型指针每个被使用的文件都在内存中占用一个区,用来存放文件的相关信息(如文件的名字、状态及文件的当前位置等)。这些信息都存放在一个结构体变量FILE中。详见P33113.2此结构体类型由系统定义;通过文件指针变量能够找到与他相关的文件,从而进行文件的读写等操作。142.3文件的打开与关闭文件的打开(fopen函数)其调用方式通常为FILE*fpfp=fopen(文件名,使用文件方式)文件的关闭(fclose函数)fclose(文件指针)fclose(fp);详见P333152.4文件的读写fputc函数把一个字符写到文件上去fgetc函数从指定的文件读入一个字符fread函数从文件读一个数据块fwrite函数写一个数据块到文件fscanf函数fprintf函数注意:各函数的使用格式详见教材13.4fscanf、fprintf函数与scanf和printf相仿,都是格式化读写函数,只是对象不同,前者为文件,后者为终端162.5文件读写举例#includestdio.h//将一组数据写入temp.txt文件中voidmain(){FILE*fp;//定义文件指针inti,score[10]={90,3,40,50,20,100,98,34,70,85};if((fp=fopen(“temp.txt”,“w+”))==NULL)//文件打开成功如否判断{printf(error\n);exit(0);}for(i=0;i10;i++)fprintf(fp,“%d”,score[i]);//将数据输出到文件中fclose(fp);//关闭文件}17补充1:宏定义P2049.1不带参数宏定义#define标示符字符串用一个指定的标示符来代表一个字符串。e.g.#definePI3.14.159带参数的宏定义#define宏名(参数表)字符串e.g.#defineS(a,b)a*b…area=S(3,2);则area=6;思考:#defineN3#defineY(n)(2*N+2*n)z=2*(N*Y(3+1));则z=?18补2:指针作为函数的参数函数参数包括实参和形参,两者的类型要一致,可以是指针类型。如果实参是某个变量的地址,相应的形参就是指针。intmain(void){inta=1,b=2;int*pa=&a,*pb=&b;voidswap1(intx,inty),swap2(int*px,int*py),swap3(int*px,int*py);swap1(a,b);printf(“Aftercallingswap1:a=%db=%d\n”,a,b);a=1;b=2;swap2(pa,pb);printf(“Aftercallingswap2:a=%db=%d\n”,a,b);a=1;b=2;swap3(pa,pb);printf(“Aftercallingswap3:a=%db=%d\n”,a,b);return0;}调用哪个函数,可以交换main()中变量a和b的值?19例swap1()a12bx12y21swap1(a,b);voidswap1(intx,inty){intt;t=x;x=y;y=t;}20例swap2()swap2(&a,&b);voidswap2(int*px,int*py){intt;t=*px;*px=*py;*py=t;}abpxpy12值传递,地址未变,但存放的变量的值改变了2121例swap3()swap3(&a,&b);voidswap3(int*px,int*py){int*pt;pt=px;px=py;py=pt;}abpxpy12值传递,形参指针的改变不会影响实参22指针作为函数参数的应用swap2(&a,&b);voidswap2(int*px,int*py){intt;t=*px;*px=*py;*py=t;}要通过函数调用来改变主调函数中某个变量的值:(1)在主调函数中,将该变量的地址或者指向该变量的指针作为实参(2)在被调函数中,用指针类型形参接受该变量的地址(3)在被调函数中,改变形参所指向变量的值abpxpy1221Aftercallingswap1:a=1,b=2Aftercallingswap2:a=2,b=1Aftercallingswap3:a=1,b=223作业阅读教材p22910.3节数组与指针内容,要求掌握;复习本讲以前所学的知识