收藏 分销(赏)

C语言程序设计三一.doc

上传人:xrp****65 文档编号:7439671 上传时间:2025-01-04 格式:DOC 页数:11 大小:83.50KB
下载 相关 举报
C语言程序设计三一.doc_第1页
第1页 / 共11页
C语言程序设计三一.doc_第2页
第2页 / 共11页
C语言程序设计三一.doc_第3页
第3页 / 共11页
C语言程序设计三一.doc_第4页
第4页 / 共11页
C语言程序设计三一.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、函数在C语言中一个较大的程序往往都是由多个模块构成,好处是:一可以对每个模块单独编制和调试,简化程序。二可由多人同时开发,加快软件的开发速度。三可使程序模块化,一个程序模块可供不同程序使用。四便于扩充软件新功能,即有良好的可维护性和可用性。C语言往往由多个函数构成,一个或多个函数对应一个功能模块。一:C程序的模块结构1一个C程序由一个具有固定名称的main()函数和若干个以标识符命名的其他函数组成。2C函数是一种独立性很强的程序模块,所有函数处于平等地位,不存在从属关系。3一个C程序中的函数可以集中存放在一个程序文件中,也可以分散在几个程序文件中。4函数间的逻辑关系是通过函数调用实现的。总是从

2、main()开始的,当一个函数调用另一个函数时,前一个函数称调用函数,后者为被调用函数。二:函数的定义和调用:函数分:标准库函数:是系统定义的,分别存放在不同文件中,用#include直接调用。用户自定义函数:用户为解决自己的问题建立的。一) 定义:定义的格式也有两种:K&R格式和ANSI格式。前者是早期编译系统使用的格式,后者是现代编译系统使用的格式。ANSI格式:存储类型 数据类型 函数名(形参表)形参类型说明;-如果是K&R格式函数体;如同样一个函数,两种定义格式如下:product(int a,int b)product (a,b)int c;int a,int b;c=a*b;int

3、 c;return(c) ;c=a*b; return(c );从上可看出:ANSI格式在形参表中即说明其名称又说明其类型,K&R格式只在形参中说明名称,而类型说明放在函数名和函数体左花括号之间。所以,目前用ANSI格式较多。定义时注意事项:1) 函数名:它是编译系统识别函数的依据,在名称和()之间不能有空格,函数名也是常量,代表该段程序代码在内存中的首地址,也叫函数入口地址。2) 函数的形参:形参用来建立函数之间的数据联系,放在函数名后边的括号里。当函数被调用时,形参接受来自函数中的实际参数。形参可以是变量、数组、指针、也可以是函数等。如果函数交换需要形参交换,则函数可以是无参函数。如:fl

4、oat sub(void)或float sub()3) 函数的返回值:函数运行结束时,将运行的结果返回到调用函数,称为函数的返回值。一般用return返回,也可不用。因为C语言规定,当被调用函数结束时,控制权将转回调用函数。4)函数的数据类型:指该函数返回值的类型,可以是char、int 、float、double、指针等。没有定义的默认是int。无值类型函数名前不加任何关键字,或加voidvoid print(float x,float y)void input(void)5)函数的存储类型:当一个程序文件中的函数允许被另一个程序文件中的函数调用时,可以将它定义成extern型,否则,就要定

5、义成static型。默认为extern型。6)函数体:是函数实现预定处理功能的语句集合,其形式与main()函数完全相同。二) 函数的调用:在完整的C程序中,各函数之间的逻辑关系是通过函数调用实现的。调用方式:即可以用函数名,也可以用指向函数的指针来调用函数。一般形式:函数名(实际参数表);有返回值的函数可以通过表达式的方式调用。如:main()int a,b,c;scanf(“%d%d”,&a,&b);c=sum(a,b);表达式调用printf(“%dn”,c);sum(int x,int y)return (x+y);当程序结束时,子函数sum的值x+y再返回主函数main()无返回值的

6、函数不能参加表达式的计算,只能以独立的表达式语句的方式被调用。Void p() printf(“c 2.0n”);main()printf(“Turbo “);p(); 表达式调句调用因为p()是个无参函数,所以main()不向p()传递数据。当一个函数调用另一个函数时,总是先暂停执行自己后边的语句,使程序控制转去执行被调用函数,当被调用函数执行完成后,再由调用函数接收程序控制权,继续执行先有中止后的命令。三) 函数的作用域:从作用的位置起,直到源程序文件的未尾。位置靠后的可直接调用前面的函数;前面的函数如调用后面的函数,除int、char外,必须进行函数说明后才能调用。函数说明:函数说明的一

7、般形式为:数据类型 函数名(形式参数表)如:float ff(int x,float y); 有完整的形参说明float ff(int,float);只说明形参的个数和类型float ff()不带形参的函数说明对函数作用域的影响:若说明在函数体内,则该函数作用域仅限于调用函数体内说明位置之后;若在函数体内说明,则被说明函数的作用域是从说明处开始直到整个源文件结束。三:用参数传递数据:函数之间的数据联系是通过数据传递实现的。传递的数据即可以是变量的值,也可以是变量的地址。数据传递的方式有:函数返回值、虚实结合、全局变量三种。一) 虚实结合的过程和特点。虚实结合适用于所有的有参函数,传递的数据可以

8、是变量、数组、指针、函数等。结合的过程:有参函数在被调用前,形参是没有值的,它的值要在调用时由调用它的函数通过实参传递过来,称为虚实结合。其过程就是调用函数将实参的值复制到被调用函数对应的形参中。实参的值即可是数据,也可是指针。特点:1形参是一种auto型的局部变量,与实参各自占用自己的存储单元,在虚实结合前,形参与实参并无联系,此时形参的值是不确定的,不能引用。2当函数被调用时,虚实才会结合。这时实参的值被复制到对应的形参中,形参有了初值,但当形参所在的函数运行结束时,形参所占的存储单元将被释放,其值也不复存在。3在虚实结合中,形参与实参不是靠名称相同来传递数据,而是在对应位置之间传递数据,

9、这就要求形参与实参在数据类型、个数和顺序上一一对应,否则就会出错。二) 变量的传递:分值传递和地址传递。值传递:当实参是变量、数组元素或表达式时,对应的形参必须是变量。虚实结合时,实参的值被复制到对应的形参中,形参获得实参的值后就终止与实参的联系。调用结束后,尽管形参的值发生了改变,但不会影响实参的值。这种传递是单向传递。读懂下列程序:main() int x,y,swap(int a,int b);scanf(“%d%d”,&x,&y);printf(“output in main before calling swap: x=%d,y=%dn”,x,y);swap(x,y);函数调用pri

10、ntf(“output in main after calling swap: x=%d,y=%dn”,x,y);swap(int a,int b)int t;t=a,a=b,b=t;变量交换printf(“output in swap:a=%d,b=%dn”,a,b);输出的结果是两次printf是一样的,如:123456地址传递:当实参是变量的地址或指向变量的指针时,对应的形参必须是指针变量。虚实结合时,形参获得实参中的地址值,从而成为指向实参所指向变量的指针,对参形的操作实际上是在实参所指向的存储单元中进行的,因此,形参的改变将导致对应的实参所指向的存储单元发生相同的变化。特点:可以在被

11、调用函数中直接对实参所指的存储单元进行访问和处理,从而实现了数据的双向传递。读懂下列程序:main()int x,y,swap(int *,int *);scanf(“%d%d”,&x,&y);printf(“output in main before calling swap: x=%d,y=%dn”,x,y);swap(&x,&y);printf(“output in main after calling swap: x=%d,y=%dn”,x,y);swap(int *a,int *b)int t;t=*a,*a=*b,*b=t;printf(“output in swap:a=%d,b

12、=%dn”,*a,*b);结果是:两次运行的printf输出值正好相反,如:123 456和 456 123文件文件:是一组相关数据的集合。按内容分为两类:一是程序文件,是源代码,二是数据文件,是程序运行时需要的原始数据及输出的结果。一) 文件的逻辑结构:是指按什么形式将一批数据组织成文件。按数据的组织方式,数据文件分:有结构文件和无结构文件。有结构文件又称记录式文件,是以记录为单位来保存数据,每个记录由若干个数据项组成,每个数据项都规定了固定的长度。如数据库文件就是典型的一种。无结构文件又称流式文件,是以字符流或二进制位流的形式保存数据,文件的以字节为单位,输入输出的数据流的开始和结束只受程

13、序控制而不受物理符号的控制。如C语言使用的就是流式文件。按数据的存储形式,数据文件分文本文件和二进制文件。文本文件也称ASII文件,是一种字符流文件,文件由一个个字符首尾相接而成,其中每个字符占1个字节,存放的是ASII码。如:25612,在内存中以二进制形式存放,占2个字节,而在文本文件中,它是以书写形式存放的,占6个字节,若要将该数写入文本文件,首先要将内存中2字节的二进制数转换成6个字符的ASII码;若要将该数从文本中写入内存,首先要将这6个字符转换成2字节的二进制数。文本文件优点是可以直接阅读,而ASCII码文件易移植,缺点是输入输出都要转换,效率低。二) 文件的存取方式:就是读与写的

14、过程。“读”就是将外部介质上的数据输入程序;“写”就是将程序的结果保存在个部介质上。读是使用文件的过程,而写是创建文件的过程,二者统称文件的存取。存取方式:顺序存取和随机存取。顺序存取:只能依先后次序存取文件中的数据,如在流式文件中,存取完第一个字节才能存取第二个字节。随机存取:也称直接存取,可以直接存取文件中指定的数据。如在流式文件中可以直接存取指定的第I个字节,不需要管第I-1个字节是否存取。可以进行顺序存取的是顺序文件,可以进行随机存取的是随机文件。在顺序文件中,记录的逻辑顺序和物理顺序相同,记录可以不等长,读出某一条记录的速度慢,不能直接对文件进行修改,适宜对文件进行顺序批量处理操作;

15、在随机文件中,每条记录等长,各数据项长度固定,每个记录有唯一的记录号。读写文件时按记录号直接读写指定的记录,适宜于随机读写某条记录的操作。三) 文件操作的步骤:C语言本身不提供文件的操作语句,而是由C编译系统以标准库函数的形式提供对文件操作的支持。这些函数都定义在stdio.h文件中。步骤一:打开文件。Fopen()函数,需要知道需要打开的文件名,使用文件方式(读、写),使用的文件指针。步骤二:文件读写。用文件输入输出函数进行读写。步骤三:关闭文件。Fclose()函数可以关闭。四) 文件指针:进行文件操作时用文件指针指向文件中当前操作的位置。当文件指针与某个文件连接后,用户就可以通过文件指针

16、而不是文件名来存取文件了。文件指针是由系统在标题文件stdio.h中定义的结构类型,名为FILE。定义文件指针的格式:FILE *fp1, *fp2;其中fp1和fp2是文件指针,由fopen()函数将其指向指定的文件。一个文件指针只能指向一个文件,打开几个文件就有几个文件指针,不允许几个指针同时指向同一个文件。打开文件:格式:FILE *fp;fp=fopen(fname,mode);其中,fname是要打开的文件名,可以是字符型常量、字符型数组或字符型指针,文件名可以带路径;mode表示文件的使用方式。文件打开后,fopen()返回是是文件在内存中的起始地址,将该地址赋给文件指针fp就建立

17、起文件指针fp和文件fname之间的连接,即fp指向了文件fname。为确保文件操作的正常进行,有时要检测文件是否正常打开,常用以下程序段来打开文件:if (fp=fopen(“fname”,”w”)= =NULL)printf(“cannot open filen”);exit(1);如果文件不能打开就显示can not open file,程序终止。如果打开成功程序就往下走。常用文件使用方式说明:w方式:只能用于向文本文件写数据。若指定的文件不存在,则创建该文件;若存在,则先删除文件中全部内容。文件打开时,文件指针指向文件开头。R方式:只能用于从文本文件中读数据。若指定的文件不存在,则出现

18、错误信息。A方式:用于向文件未尾添加数据。若文件存在,则打开并将文件指针指向文件文件未尾,新写入的内容被追加在原有数据之后;若文件不存在,则创建文件,这时指针指向的即是文件头,也是文件尾。R+,w+,a+方式:用于即可读也可写的方式打开文本文件。区别是:R+:用该方式打开文件后,若写入数据,则写入的内容只覆盖新数据需要的空间,其后的原有数据并不丢失。W+:用该方式打开文件后,文件原有的内容全部丢失,只能先向文件写入数据,然后再读出。A+:用该方式打开文件后,将文件内容保留。读时从文件开头读,写时则追加到文件未尾。关闭文件:文件操作完后应用fclose()关闭,以保证本次文件操作有效。格式:fc

19、lose(fp);fp是由fopen()函数打开文件时使用的文件指针。如成功,返回0值,否则返回非0值,文件关闭后,文件指针与文件名断开连接,文件指针可以再与别的文件连接。如下:#includeFILE *fp1, *fp2;Main()fp1=fopen(“text1.txt”,”w”);fp2=fopen(“text2.txt”,”r+”);fclose(fp1);fclose(fp2);五) 文件的读写操作:文本文件和二进制文件使用不同的文件输入输出函数。文本文件读写函数:1、 字符读写函数fgetc(),getc()和fputc(),putc()向文本文件写入一个字符函数fputc()

20、、putc()两者是完全等价的函数,它们都用来向指定的文本文件写入一个字符。格式:fputc(ch,fp);putc(ch,fp);其中ch为欲写入的字符,可是字符型常量或变量,fp为文件指针。如果写入成功,返回所写入的字符,否则返回EOF。EOF是C编译系统定义的文本文件结束标志,其值为1,十六进值表示为0xFF。练习:将字符X,Y,Z和EOF写入A盘根目录下的文件ex8-1.txt中。#includeFILE *fi;Main()if (fi=fopen(“a:ex8-1.txt”,”w”)=NULL)printf(“cannot open filen”);exit(1);fputc(X,

21、fi);fputc(Y,fi);fputc(Z,fi);fputc(0xff,fi);fclose(fi);程序运行时,先以“W”方式打开文件A盘根目录下的文件ex8-1,然后由fputc()写入XYZ到文件中,最后写入EOF并关闭文件。从文本文件读出一个字符函数fgetc()和getc()fgetc()和getc()也是完全等价的函数。格式:ch=fgetc(fp);ch=getc(fp);功能:从指定的文件读取一个字符,并赋给字符型变量ch。如果成功,返回读取的字符,如果读取错误或遇到EOF,则返回EOF。练习:从上述建立的文件ex8-1.txt中读出所有的字符并显示在屏幕上。#inclu

22、deFILE *fi;Main()char a;int I;if (fi=fopen(“a:ex8-1.txt”,”r”)=NULL)printf(“can not open filen”);exit(1);while (a=fgetc(fi)!=EOF)putchar(a);fclose(fi);运行时,程序用fgetc()读取文件中一个字符赋给变量a,并将a输出到屏幕上,遇到EOF时终止,而EOF将不显示。向文本文件写入字符串函数fputs():格式:fputs(s,fp);S是字符型数组名、字符型指针变量或字符串常量。Fp为文件指针。功能是将字符串s写入由fp指向的文件中,如果成功,返回

23、所写的最后一个字符,否则返回EOF练习:#includeFILE *fi;Main()char a11=“Beijing”,”shanghai”,”tianjin”,”chongqing”;Int I;If (fi=fopen(“a:ex8-2.txt”,”w”)=NULL)printf(“can not open filen”);Exit(1);For (i=0;i=3;i+)Fputs(ai,fi);Fclose(fi);运行时,以w形式打开文件ex8-2.txt,通过循环将数组a中的字符串写入文件,因a中存放的实际字符个数是否31个,所以文件长度为31字节,不是a 定义的大小。从文本文件

24、读出字符串函数fgets()格式:fgets(s,n,fp);其中,s是字符型数组名或字符串指针,n是指定读入的字符个数,fp是文件指针。功能是:最多读取n-1个字符,并将读入的字符串存入字符串指针s。当函数读取的字符达到指定的个数,或收到换行符,或收到结束标志EOF时,将在读取的字符后面自动添加一个0字符,如果成功,返回读取的字符串,否则返回空指针,这时,s中内容不确定。练习:从上例文件ex8-2.txt中读出各个字符串,并将其中第0、2、4、6号字符串显示在屏幕上。#includeFILE *fi;Main()char a711;Int I;If (fi=fopen(“a:ex8-2.tx

25、t”,”r”)=NULL)printf(“can not open filen”);Exit(1);For (i=0;i7;i+)fgets(ai,11,fi);If (i%2=0) 从文件中读取字符串Printf(“%s”,ai); 显示第0、2、4、6号字符串Fclose(fi);程序运行时,每次循环最多读取9个字符,若遇到换行符或EOF,则提前结束本次操作。格式读写函数fscanf()和fprintf()使用不同的格式转换说明符,可以读写不同类型的数据。1) 格式写文件函数fprintf()格式:fprintf(fp,format,arg1,arg2,argn);用来将输出项按指定的格式

26、写入指定的文本文件。Fp为文件指针,format为指定格式控制字符串,arg1为输出项,可以是字符、字符串、各种类型数值。如果成功,返回实际写入文件的字符个数,否则,出现错误,返回负数。Fprintf()中格式控制的使用与printf()相同。练习:将下列表中通讯录写入ex8_3.txt文件中。姓名电话号码电子邮件Liming27516483liWanglan26348762wen提示:将通讯录中的字符串存放在一个二维字符型数组中,然后用fprintf()函数将各个字符串写入文件,并在各个字符串之间预留一个空格字符,以便文件中的字符串能被另一个程序正确读出。#includeFILE *f;Ma

27、in()char pc13=“Liming”,”27516483”,”li”, “wanglan”,”26348762”, “wen”;int I;if (f=fopen(“a:ex8_3.txt”,”w”)=NULL)printf(“can not open file”);exit(1);for (I=0;I=9;I+=3)fprintf(f,”%s %s %s “,pcI,pcI+1,pcI+2);fclose(f);用fprintf()写入字符串时,一旦遇到字符串未尾的0字符就停止操作,一个字符串所需要的文件空间并不等于数组定义的大小,而是等于字符串的实际长度。2)格式读文件函数fsca

28、nf()格式:fscanf(fp,format,arg1,arg2,argn);作用:用来按格式从指定的文件中读取数。该函数从文件指针fp所指向的文件中读取数据,按格式控制字符串format所定的格式赋与输入项arg1,arg2,如果成功,返回读取项目的个数;如果失败,返回0。如果帅到文件未尾,返回EOF。例如:读出上例中的ex8_3.txt文件中内容#includemain()FILE *f;char pc1213;int I;if (f=fopen(“a:ex8_3.txt”,”r”)=NULL)printf(“can not open file”);exit(1);for (I=0;I=

29、9;I+=3)fscanf(f,”%s%s%s”,pcI,pcI+1,pcI+2);fclose(f);for (I=0;I=9;I+=3)printf(“NAME:%10s PHONE:%10s MAIL:%13sn”,pcI,pcI+1,pcI+2);注意:fscanf()从文件中读取数据时,是以制表符、空格字符或回车作为该数据项的结束标志,因此,在用fprintf()将数据写入文件时,一定要注意在数据之间留空格、制表符或回车符,否则用fsacnf()读取时就会出错。二进制文件的读写函数: 主要有fread()和fwrite()。无论是文本文件还是二进制文件,字符的表示形式都是相同的,因此

30、,fgetc(),fputc()fgets(),fputs()也可以用于二进制文件的读写。1) 写数据块函数fwrite()格式:fwrite(buf,size,count,fp);其中,buf是数组名或指向数组的指针,用于提供要写入文件的数据,size是无符号整型表达式,用于要写入的每个数据项的长度,count是整型表达式,用于指定数据项的个数,fp是文件指针。作用:向fp所指向的文件写入一个由buf指向的数据块,该数据块共有count个数据项,每个数据项有size个字节,如果成功,返回实际写入的数据项个数,若所写数据项少于实际需要的数据项,则出错。练习:从键盘输入50个整数,并将它们作为一

31、个数据块写入文件ex8_4.dat中。提示:用wb方式打开二进制文件,从键盘输入50个整数存放在数组sam中,用fwrite()将sam作为一个数据块写入文件中。#include#includeFILE *fp;Main()int sam50,I;If (!(fp=fopen(“a:ex8_4.dat”,”wb”)printf(“can not open filen”);Exit(1);For (i=0;i50;i+)Scanf(“%d”,&sami);Fwrite(sam,sizeof(sam),1,fp); 将数组sam作为一个数据块。Fclose(fp);2) 读数据块函数fread()

32、格式:fread(buf,size,count,fp);作用:从fp所指向的文件中,一次读出长度为size字节的count个数据项,然后存放在buf中。如果成功,返回实际读入的数据项个数,如果读出项比调用中所需项目少,则出错。作业:从上题中将ex8_4.dat文件中读取前10个整数存入数组b,并在屏幕上显示这10个数。3) 文件检测函数。检测文件结尾函数feof():在文本文件中,EOF是文件的结束标志,其值为-1,在二进制文件中-1可能就是个有效数据,不能作为结束标志,所以二进制文件用feof()作为文件的结束标志。格式:feof(fp);如果文件指针到文件未尾,则函数返回非0值,否则就返回

33、0值。检测文件读写出错函数ferror()格式:ferror(fp);若没有出错,返回0值,否则,返回非0值。如:if (ferror(fp)puts(“file error”);Exit(1);清除文件未尾和出错标志函数clearerr()用于将文件的出错标志和文件结束标志置为0。当调用的输入输出函数出错时,ferror()给出非0的标志,并一直保持此值,直到使用clearerr()函数时才重置为0格式:clearerr(fp);参考程序:用命令行方式将一个二进制文件的内容拷贝到另一个文件中。#includeFILE *IN,*OUT;Main(int argc,char *argv)cha

34、r ch;If (argc!=3)puts(“you forget to enter a file namen”);Exit(0);If (in=fopen(argv1,”rb”)=NULL)puts(“can not open filen”);Exit(0);If (out=fopen(argv2,”wr”)=NULL)puts(“can not open filen”);Exit(0);While(!feof(in)ch=fgetc(in); 读取一个字符If (ferror(in) 读错printf(“read errorn”);Clearerr(in); 清除出错出错标志Exit(1)

35、;Else fputc(ch,out); 写入一个字符If (ferror(out) 写错printf(”write errorn”);Clearer(out); 清除出错标志Exit(1);Fclose(in);fclose(out);如果程序起名为a.c,要拷贝的源文件为b.dat,目标文件c.dat,则在dos下用下列命令来执行:ca b.dat c.dat六) 文件的顺序存取和随机存取顺序存取时必须顺序写入和读出,而随机存取则可以按任意顺序写入和读出,一个文件是适合哪一种存取方式不在于它们是文本文件还是二进制文件,而在于文件中的记录长度是否相等,随机存取要求每个记录的长度必须相等,而顺序存取的记录可相等,也可不等。

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服