《c进阶指针结构体》PPT课件.ppt_第1页
《c进阶指针结构体》PPT课件.ppt_第2页
《c进阶指针结构体》PPT课件.ppt_第3页
《c进阶指针结构体》PPT课件.ppt_第4页
《c进阶指针结构体》PPT课件.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

C语言进阶,1.数据在内存中的存储,(2)地址:存储单元的编号,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,(1)变量定义:为变量分配存储单元,并记录变量名与存储单元地址之间的对应关系。,如:inti,j,k;i=3,j=6,k=9;,3,6,9,一、指针,(3)内容:存储单元中存放的数据,指针:变量在内存储单元的起始地址。指针变量:用来存放地址的变量。定义方法:基类型标识符*变量名;指向:通过地址建立起来的一种联系。,如:inti;/*定义了整型变量i*/int*p;/*定义指向整型变量i的指针变量p*/p=/*将变量i的指针赋给指针变量p*/指针变量p指向整型变量i。,2.指针的概念,变量名供用户使用,如i,j,k。存储单元地址供系统使用,如:2000,2002,2004。,3.变量的访问方式,直接访问:直接通过变量的地址或变量名(系统会自动将变量名转换成变量的地址)进行访问,如:scanf(“%d”,a,2000,间接访问:将变量的地址存放在一个指针变量中,通过指针变量对变量进行访问。inta,*p;p=,a,p,2000,78,2002,2000,78,4.指针运算符和指针变量的引用,取地址运算符号,(1)为指针变量赋值指针变量名=地址;例如p=注意:*p与a等价,指针变量的引用,main()inta,b,*p1,*p2,*p;scanf(“%d,%d”,例1使用指针将两个数按升序排序1,abp1p2p,20002002,2000,2002,5,3,这是两个指针变量的值进行交换,而不是两个变量a和b的值进行交换,应输出*p1和*p2,if(ab)p=p1;p1=p2;p2=p;printf(“min=%d,max=%dn”,a,b);,2002,2000,*p1,*p2);,例1使用指针将两个数按升序排序2,main()inta,b,*p1,*p2,t;scanf(“%d,%d”,abp1p2t,20002002,2000,2002,5,3,if(ab)t=*p1;*p1=*p2;*p2=t;printf(“min=%d,max=%dn”,a,b);,这是两个指针变量所指向的存储单元的值进行交换,是变量a和b的值进行交换,可直接输出a和b的值,3,5,5,结构体定义结构体类型变量的定义结构体类型变量的引用结构体类型变量的初始化结构体数组,二、结构体,有时需要将不同类型的数据组合成一个有机的整体,以便于引用。如一个学生录取有下面信息:学号/姓名/性别/年龄/地址等属性intnum;charname20;charsex;intage;charaddr30;,应当把它们组织成一个组合项,在这个组合项中包含若干个不同类型(当然也可以相同)的数据项。,(一)结构体概述,C语言允许用户自定义这样的结构类型,称为结构体。一个结构体类型的变量中可以独立存放多种类型的数据。,(二)结构体类型和结构体变量的定义,结构体类型是一种新的数据类型,系统没有确定的结构体类型,用户要根据需要,自定义某种特定的结构体类型,因此,结构体变量的定义与一般变量不同,需要先定义结构体类型后,再定义结构体变量。,一般形式:struct结构体名成员表列;,结构体名,类型名,成员名,1.结构体类型的定义,如:structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,例如:structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,structstudentstu1,stu2;,numnamesexagescoreaddr,stu1和stu2在内存中各占63个字节(4+20+1+4+4+30=63),(1)先定义结构体类型再定义变量名,2.结构体类型变量的定义,(2)在定义类型的同时定义变量,例如:structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,例如:structintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,(3)直接定义结构体类型变量,例如:structdate/*声明一个结构体类型date*/intmonth;intday;intyear;structstudent/*声明一个结构体类型student*/intnum;charname20;charsex;intage;floatscore;structdatebirthday;charaddr30;stud1,stud2;,(1)不能将一个结构体变量作为一个整体引用。,(三)结构体类型变量的引用方式,例如:structstudentintnum;charname20;floatscore;stu1=10001,“Liming”,90;printf(%d,%s,%fn,stu1);,structdate/*声明结构体类型date*/intmonth;intday;intyear;structstudent/*声明结构体类型student*/intnum;charname20;structdatebirthday;stud1;,(2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。,对结构体变量stud1,可以这样访问各成员:stud1.numstud1.birthday.month,例如:,(3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。,例如:stu2.score=stu1.score;sum=stu1.score+stu2.score;stu1.score+;scanf(%d%s%f“,用结构体变量表示学生数据(学号、姓名、成绩),运行程序,voidmain()structstudentcharnum6;charname10;intscore;stu;printf(“请输入学生的学号、姓名和成绩n);scanf(%s%s%d,stu.num,,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等)。如果有多个学生的数据需要处理,使用数组,这就是结构体数组。结构体数组的每个数组元素都是一个结构体类型数据,即每个元素都分别包括各个成员项。定义结构体数组的方法和定义结构体变量的方法相仿,只需说明其为数组即可。,(四)结构体数组,1.结构体数组的定义,格式1:先定义结构体类型,再定义结构体数组,例如:structstudentintnum;charname20;intscore;,系统为数组stu分配(4+20+4)*3=84个字节的存储单元,stu0,num(4),name(20),score(4),stu1,stu2,structstudentstu3;,格式2:在定义结构体类型的同时定义结构体数组,例如(格式2):structstudentintnum;charname20;intscore;stu3;,格式3:直接定义结构体数组,例如(格式3):structintnum;charname20;intscore;stu3;,用结构体数组来表示10个学生数据(学号、姓名、成绩),运行程序,voidmain()structstudentintnum;charname10;intscore;stu10;inti;for(i=0;i10;i+)printf(“请输入第%d个学生的学号、姓名和成绩n“,i+1);scanf(%d%s%d,(五)结构体数组的初始化,voidmain()structstudentintnum;charname10;intscore;stu3=101,zhang,92,10002,liu,71,10003,li,80;inti;printf(“学号t姓名t成绩n);for(i=0;i3;i+)printf(“%dt%st%dt,stui.num,,stui.score);printf(“n”);,主要内容:1.文件的概念2.文件类型的指针3.文件的打开和关闭4.文件的读写,三、文件,(一)文件的概念,文件:存储在外部介质(如:软盘、硬盘、光盘等)上的一个数据集合。数据文件:存储数据,例如c程序的运行结果.如dat、.txt数据文件的创建方式:(1)通过文字处理软件。Word、记事本、写字板等(2)通过程序语句创建。,文件系统中,关键的概念是“文件指针”。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。,(二)文件类型指针,typedefstructshortlevel;/*缓冲区“满”或“空”的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/shortbsize;/*缓冲区的大小*/unsignedchar*baffer;/*数据缓冲区的位置*/unsignedar*curp;/*指针,当前的指向*/unsignedistemp;/*临时文件,指示器*/shorttoken;/*用于有效性检查*/FILE;,C语言系统在stdio.h文件中有这样的文件类型定义:,(三)指向文件的指针,使用结构体FILE类型,可以定义若干个FILE类型的变量,以便存放若干个文件的信息。,例如:FILE*fp;定义了一个指针变量fp,它指向FILE类型结构体数据。通过该结构体变量中的信息能够访问某个文件。也就是说,通过文件指针变量能够找到与它相关的文件。如果有个文件,一般应设个指针变量,使它们分别指向个文件,以实现对文件的访问。,(四)文件的打开和关闭,文件在使用之前,应当先打开,使用之后应应关闭,以防数据被破坏。打开文件的函数:fopen(文件名,使用方式)关闭文件的函数:fclose(),例如:FILE*fp;fp=fopen(“E:operout.dat”,“w”);表示将E盘根目录下的operout.dat文件,按只写的方式打开。如果磁盘上有此文件,打开并将文件位置指针指向文件首;如果磁盘上无此文件,创建一个新文件并打开关闭文件:fclose(fp);关闭文件,就是打断指针与文件的关系,文件的使用方式与含义见下页:,文件使用方式含义“r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一个文本文件“a”(追加写)向文本文件尾增加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件ab“(追加)向二进制文件尾增加数据r+“(读写)为读/写打开一个文本文件w+”(读写)为读/写建立一个新的文本文件a+”(读写)为读/写打开一个文本文件rb+“(读写)为读/写打开一个二进制文件“wb+“(读写)为读/写建立一个新的二进制文件“ab+”(读写)为读/写打开一个二进制文件,关于文件的使用方式的说明,(1)用“r”方式打开的文件只能用于向计算机输入而不能用于向该文件输出数据,而且该文件应该已经存在,否则出错。(2)用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。(3)若希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件末尾。(4)+表示可添加,如果不能实现“打开”的任务,出错的原因可能是:用“r”方式打开一个并不存在的文件;磁盘故障,无法建立新文件等。)此时fopen函数将带回一个空指针值NULL(NULL在stdioh文件中已被定义为0)。,常用下面的方法打开一个文件:,if(fp=fopen(“E:file1,r)=NULL)printf(cannotopenthisfilen);exit(0);,(五)文件的读写,打开文件后,可对文件进行读写操作,包括以下几种:fgetc()函数:将一个字符由磁盘文件中读入到内存fputc()函数:将一个字符写入磁盘文件fread()函数:将数据块由磁盘文件读入到内存(二进制文件)fwrite()函数:将数据块写入磁盘文件(二进制文件)fscanf()函数:将数据由磁盘文件中读入到内存(ASCII文件)fprintf()函数:将数据写入磁盘文件(ASCII文件),(六)文件的读写,由于CPU只能与内存有直接数据交换,因此读出文件中的数据不能直接从文件到屏幕,而文件的写入操作也不能直接由键盘到文件,必须经过内存才能进行。,fscanf,printf,scanf,fprintf,文件的读操作一般包括:,文件的写入操作一般包括:,fscanf()函数格式化读文件函数(磁盘文件输入函数),格式:fscanf(fp,格式字符串,地址表列);功能:按格式字符串所指定的格式,将从fp所指定的文件中读出的数据写入到内存中。文件类型:ASCII码文件说明:fp所指向的文件必须在指定的位置存在并已使用fopen函数打开,且有数据可读。,fprintf()函数格式化写文件函数(磁盘文件输出函数),格式:fprintf(fp,格式字符串,输出项表);功能:按格式字符串指定的格式,向fp所指定的文件中写入数据。文件类型:ASCII码文件,例如:从键盘输入十个学生数据,写入到一个磁盘文件中,再从文件中读出这两个学生的数据显示在屏幕上。,#defineN10#includestructstudentintnum;charname10;intscore;stuN;,voidmain()FILE*fp;inti;if(fp=fopen(e:stu_list.dat,w)=NULL)printf(Cannotopenthisfile!);exit(0);,printf(ninputdata:n);for(i=0;iN;i+)scanf(%d%s%d,注意:stu_list.dat文件在e盘根目录即e:存在,否则不能读。,例如:求出刚才创建好的文件stu_list.dat中的学生的平均成绩,并把该平均成绩信息写入到e盘上的另一个磁盘文件aver.dat中。,#defineN10#includestructstudentintnum;charname10;intscore;stuN;,voidmain()FILE*fp;inti;if(fp=fopen(e:stu_list.dat,“r)=NULL)printf(Cannotopenthisfile!);exit(0);,for(i=0;iN;i+)fscanf(fp,%d,综合训练第三讲综合训练作业,上机时间安排:第12周2晚上19:3022:40第12周3晚上19:3022:40第12周6上午8:3011:10,一、C语言综合训练源程序要求已知在磁盘上有一个文本文件(stuin.dat),此文件存放了一组学生的成绩信息,按照如下格式(注意数据间空格间隔)存放:1001stuname1891002stuname2781003stuname360.1100stuname10087请按照如下要求编写程序:a.定义一个结构体类型数组,结构体类型含有学号、姓名和成绩三个域;b.将文本文件的内容读入到结构体数组中;c.显示成绩最高的人的学号、姓名和成绩(如果有相同的人要全部显示);d.显示成绩、高于、低于和等于平均成绩的人数;e.显示成绩为优秀(90100)、良好(8089)、中等(7079)、及格(6069)、不及格(059)的人数和所占百分比;f.将以上显示的信息存放到stuout.dat文件中;,/*读入数据并找出最高成绩*/for(i=0;i=max)max=stui.score;fclose(fp1);,2.数据处理/*(1)最高成绩信息放入Change数组*/j=0;for(i=0;i=90,3.将处理结果输出到显示器(1)显示成绩最高者的学号、姓名和成绩(如果有相同的人要全部显示):找出成绩最高的学生的学号、姓名和成绩存到数组change中,然后显示);,/*输出成绩最高的学生信息*/for(i=0;ij;i+)printf(nxuehao=%sxingming=%s,score=%3d,changei.num,,changei.score);,(2)显示成绩高于、低于和等于平均成绩的人数;(分别在变量gy、dd、dy中;显示成绩为优秀(90100)、良好(8089)、中等(7079)、及格(6069)、不及格(059)的人数;(分别在变量yx、lh、zd、jg、bjg

温馨提示

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

评论

0/150

提交评论