1、C语言程序设计技术10-Nov-22C语言程序设计技术语言程序设计技术(下下)第第1111讲讲 函数(函数(1)C语言程序设计技术10-Nov-22一一.函数的定义与调用函数的定义与调用1.函数的定义函数的定义 ()函数体函数体 C语言程序设计技术10-Nov-222.函数值函数值 非非void型函数的函数值必须用型函数的函数值必须用return语句返语句返回。回。C语言程序设计技术10-Nov-223.函数调用函数调用 ();例如:例如:c=2*max(13,25)m=max(a,max(b,c)C语言程序设计技术10-Nov-22说明:说明:(1)调用函数前,应对函数原型进行声明调用函数前
2、,应对函数原型进行声明(2)实参的个数必须与虚参个数相同,类型必实参的个数必须与虚参个数相同,类型必须匹配须匹配(3)实参可以是一个表达式,虚参只能是变量实参可以是一个表达式,虚参只能是变量(4)当虚参是一个指针或数组时,实参与虚参当虚参是一个指针或数组时,实参与虚参的值双向传递的值双向传递C语言程序设计技术10-Nov-22(5)函数不能嵌套定义,但可嵌套调用函数不能嵌套定义,但可嵌套调用(6)函数的实参类型与虚参类型不相同时将实函数的实参类型与虚参类型不相同时将实参转换为虚参的类型参转换为虚参的类型(7)函数的返回值与函数类型不相同时将返回函数的返回值与函数类型不相同时将返回值转换为函数值
3、的类型。值转换为函数值的类型。C语言程序设计技术10-Nov-22例例1(P106例例4-2).已知已知a=2a=2,b=3b=3,求,求a ab b的的值。值。C语言程序设计技术10-Nov-22#include#includevoid main(void)int add(int x,int y);int a=2,b=3,c;clrscr();c=add(a,b);printf(%d+%d=%dn,a,b,c);getch();C语言程序设计技术10-Nov-22 /*求和求和*/int add(int x,int y)int t;printf(x和和y的值分别是:的值分别是:%d,%d n
4、,x,y);t=x+y;x=2*x;y=2*y;printf(改变后的改变后的x和和y的值分别是:的值分别是:%d,%d n,x,y);return t;C语言程序设计技术10-Nov-22 二二.函数嵌套调用函数嵌套调用 在一个子函数中调用另一个函数称在一个子函数中调用另一个函数称为函数嵌套调用为函数嵌套调用C语言程序设计技术10-Nov-22例例2(P125例例4-14).从键盘输入一正整数从键盘输入一正整数limitlimit(limit=6limit=6),验证从),验证从6 6到到n n之间的之间的所有偶数都可以分解为两个奇素数之和。所有偶数都可以分解为两个奇素数之和。例如例如 98
5、=19+79C语言程序设计技术10-Nov-22#include#include#includevoid main(void)int prime(int m);int n,a,b,limit;C语言程序设计技术10-Nov-22 clrscr();while(1)printf(nInput 1 number(=6):n);scanf(%d,&limit);if(limit=6)break;C语言程序设计技术10-Nov-22 for(n=6;n=limit;n+=2)for(a=3;a=n/2;a+=2)if(prime(a)b=n-a;if(prime(b)printf(%d=%d+%dn,
6、n,a,b);break;getch();C语言程序设计技术10-Nov-22 /*判断一个数是否为素数判断一个数是否为素数*/int prime(int m)int i,k;k=sqrt(m)+1;for(i=2;ik;i+)if(m%i=0)return 0;return 1;C语言程序设计技术10-Nov-22C语言程序设计技术10-Nov-22第第1212讲讲 函数(函数(2)C语言程序设计技术10-Nov-22一一.函数递归调用函数递归调用 在一个函数中,如果直接或间接调用在一个函数中,如果直接或间接调用自己,则称为递归调用。自己,则称为递归调用。如:如:int f(int n)if
7、 (n1)return 0;return f(n-1)+n;C语言程序设计技术10-Nov-22例例1.逆序输出一个整数的各位数字。逆序输出一个整数的各位数字。C语言程序设计技术10-Nov-22#includevoid main(void)void printd(long n);long n;scanf(%ld,&n);printd(n);C语言程序设计技术10-Nov-22void printd(long n)if (n0)putchar(-);n=-n;putchar(n%10+0);if(n/10)printd(n/10);C语言程序设计技术10-Nov-22二二.局部变量和全局变量局
8、部变量和全局变量1.在函数内部定义的变量称为局部变量。在函数内部定义的变量称为局部变量。2.在函数外部定义的变量称为全局变量。在函数外部定义的变量称为全局变量。C语言程序设计技术10-Nov-22说明:说明:(1)局部变量只在函数内部起作用,函数结局部变量只在函数内部起作用,函数结束时,所占内存空间被释放束时,所占内存空间被释放(2)全局变量在定义它的全局变量在定义它的后面后面任一个函数中任一个函数中都起作用都起作用C语言程序设计技术10-Nov-22(3)全局变量与局部变量同名时,使用局部全局变量与局部变量同名时,使用局部变量。变量。(4)函数的虚参视同局部变量函数的虚参视同局部变量C语言程
9、序设计技术10-Nov-22例例2(P113例例4-7).分析程序运行结果。分析程序运行结果。C语言程序设计技术10-Nov-22#includeint y,z;void main(void)void abc(int x);int x;x=10;y=20;z=30;printf(ok1:x=%d y=%d z=%d n,x,y,z);abc(x);printf(ok2:x=%d y=%d z=%d n,x,y,z);C语言程序设计技术10-Nov-22void abc(int x)int y;printf(ok3:x=%d y=%d z=%d n,x,y,z);x=100;y=200;z=30
10、0;printf(ok4:x=%d y=%d z=%d n,x,y,z);C语言程序设计技术10-Nov-22例例3(P126例例4-15).输入输入100100个整型数,寻找个整型数,寻找其最大值和最小值。其最大值和最小值。C语言程序设计技术10-Nov-22#include#includeint Max,Min;void main(void)void find(int a,int n);int data100,i;C语言程序设计技术10-Nov-22 clrscr();for(i=0;i100;i+)scanf(%d,&datai);find(data,100);printf(Max=%d
11、,Min=%d,Max,Min);getch();C语言程序设计技术10-Nov-22 /*查找数组中的最大值和最小值查找数组中的最大值和最小值*/void find(int a,int n)int i;Max=Min=a0;for(i=1;iMax)Max=ai;if(aiMin)Min=ai;C语言程序设计技术10-Nov-22C语言程序设计技术10-Nov-22第第1313讲讲 指针(指针(1 1)C语言程序设计技术10-Nov-22一一.指针变量指针变量1.指针概念与定义指针概念与定义 表示某个变量所在内存地址的变量称为指针变表示某个变量所在内存地址的变量称为指针变量,简称为指针。量,
12、简称为指针。指针变量的说明方法:指针变量的说明方法:*;C语言程序设计技术10-Nov-22例:例:int a,*p,*p1=&a,*p2=p1;p,p1,p2都是指向整型数据变量的指针变量,其中都是指向整型数据变量的指针变量,其中p1,p2已指向变量已指向变量a。例:例:char*s;s 是指向字符型数据变量的指针。是指向字符型数据变量的指针。C语言程序设计技术10-Nov-222.指针运算符指针运算符(1)&取变量的地址取变量的地址 例例 p=&aC语言程序设计技术10-Nov-22(2)*取出或改变指针所指向的变量之值。取出或改变指针所指向的变量之值。例例 int*p,a;a=10;p=
13、&a;*p=*p+2;printf(%d,a);C语言程序设计技术10-Nov-22(3)+指针可以加上一个整型量,以便指向另一个指针可以加上一个整型量,以便指向另一个变量。变量。例:例:int d11,*p=&d4,*q;p+=3,q=p-2;C语言程序设计技术10-Nov-22(4)-两个同类型的指针可以进行减法运算。两个同类型的指针可以进行减法运算。例:例:int d100,*p1,*p2,m;p1=d;p2=&d8;m=p2-p1;m的值等于的值等于p1与与p2相距的整型变量的个数,相距的整型变量的个数,即即m=8。C语言程序设计技术10-Nov-223.说明说明(1)指针的类型与其代
14、表的变量的类型必须指针的类型与其代表的变量的类型必须相同。相同。例:例:int*p,i;float*pf,f;p=&i是合法的是合法的 而而p=&f是非法的是非法的C语言程序设计技术10-Nov-22(2)指针必须先赋值后使用。指针必须先赋值后使用。例如:例如:int *p;*p=*p+2;是非法的。是非法的。C语言程序设计技术10-Nov-22(3)数组名及函数名可代表其所在内存的开数组名及函数名可代表其所在内存的开始地址。始地址。(4)函数调用中的虚参使用指针时,将双向函数调用中的虚参使用指针时,将双向传递变量的值。传递变量的值。C语言程序设计技术10-Nov-22例例1(P146例例5-
15、11).交换两个变量的值。交换两个变量的值。C语言程序设计技术10-Nov-22#includevoid main(void)void swap(int *x,int *y);int i,j;printf(输入两个整数:输入两个整数:);scanf(%d%d,&i,&j);swap(&i,&j);printf(i=%d j=%d,i,j);C语言程序设计技术10-Nov-22void swap(int*x,int*y)int p;p=*x;*x=*y;*y=p;C语言程序设计技术10-Nov-22例例2.将三个数排序。将三个数排序。C语言程序设计技术10-Nov-22#includevoid
16、main(void)void sort(int*q1,int*q2,int*q3);int a,b,c;printf(输入三个整数:输入三个整数:);scanf(%d%d%d,&a,&b,&c);sort(&a,&b,&c);printf(%d,%d,%d,a,b,c);C语言程序设计技术10-Nov-22void sort(int*q1,int*q2,int*q3)void swap(int*x,int*y);if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);C语言程序设计技术10-Nov-22void swa
17、p(int*x,int*y)int p;p=*x;*x=*y;*y=p;C语言程序设计技术10-Nov-22C语言程序设计技术10-Nov-22第第1414讲讲 指针(指针(2 2)C语言程序设计技术10-Nov-22一一.指针与一维数组指针与一维数组设有定义:设有定义:int a100,*p指针赋值方法:指针赋值方法:p=&a0 或或p=a元素元素ai引用方法:引用方法:*(p+i)或或 pi C语言程序设计技术10-Nov-22例例1(P139例例5-5).用四种方法打印数组中的元用四种方法打印数组中的元素。素。C语言程序设计技术10-Nov-22#include#includevoid
18、main(void)int i,c=10,20,30,40;int*cp=c;clrscr();C语言程序设计技术10-Nov-22 for(i=0;i=3;i+)printf(“%d”ci);printf(“n”);for(i=0;i=3;i+)printf(“%d”,*(c+i);printf(“n”);C语言程序设计技术10-Nov-22 for(i=0;i=3;i+)printf(“%d”,cpi);printf(“n”);for(i=0;i=3;i+)printf(“%d”,i,*(cp+i);printf(“n”);getch();C语言程序设计技术10-Nov-22二二.指针与二
19、维数组指针与二维数组 设二维数组为设二维数组为int amn,指针变量为,指针变量为p1.指针变量指向二维数组首地址指针变量指向二维数组首地址指针说明方法:指针说明方法:int*p;指针赋值方法:指针赋值方法:p=&a00;元素元素aij引用方法:引用方法:*(p+n*i+j)C语言程序设计技术10-Nov-22例例2C语言程序设计技术10-Nov-22#includevoid main(void)int a23,*p;int i,j;p=&a00;for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,p+3*i+j);C语言程序设计技术10-Nov-22 for(i=
20、0;i2;i+)for(j=0;j3;j+)printf(“%4d”,*(p+3*i+j);printf(“n”);C语言程序设计技术10-Nov-222.指向数组的行指针变量指向数组的行指针变量(1)指针说明方法)指针说明方法 int (*p)n;(2)指针赋值方法)指针赋值方法 p=a;C语言程序设计技术10-Nov-22(3)第)第i行元素的首地址(即行元素的首地址(即 ai0的地址)的地址)*(p+i)或或 pi(4)元素)元素aij引用方法引用方法 *(*(p+i)+j)或或 *(pi+j)或或 pij 或或(*(p+i)j C语言程序设计技术10-Nov-22例例3(P141例例5
21、-7).用二维数组指针变量输出用二维数组指针变量输出二维数组中的每个元素。二维数组中的每个元素。C语言程序设计技术10-Nov-22#include#includevoid main(void)int a34=1,2,3,4,5,6,7,8,9,10,11,12;int(*p)4;int i,j;clrscr();p=a;C语言程序设计技术10-Nov-22 for(i=0;i3;i+)for(j=0;j4;j+)printf(%2d ,*(*(p+i)+j);printf(n);getch();C语言程序设计技术10-Nov-22三三.指针数组指针数组相同类型指针的集合称为指针数组。相同类型
22、指针的集合称为指针数组。C语言程序设计技术10-Nov-22例例4(P144例例5-10).输出数组的值。输出数组的值。C语言程序设计技术10-Nov-22#includevoid main(void)int a23=1,2,3,4,5,6,*p2;int i,j;p0=a0;p1=a1;for(i=0;i2;i+)for(j=0;j3;j+)printf(“%4d”,pij);printf(“n”);C语言程序设计技术10-Nov-22元素元素aij引用方法:引用方法:*(*(p+i)+j)或或 *(pi+j)或或 pij 或或(*(p+i)j C语言程序设计技术10-Nov-22C语言程序
23、设计技术10-Nov-22第第1515讲讲 指针(指针(3 3)C语言程序设计技术10-Nov-22一一.指针与字符数组指针与字符数组C语言程序设计技术10-Nov-22例例1 1(P143P143例例5-95-9).不断输入字符串不断输入字符串a a,直到它,直到它与已知字符串与已知字符串p p相等为止。若不相等,则提示相等为止。若不相等,则提示是比是比p p大还是小。大还是小。C语言程序设计技术10-Nov-22#include#includevoid main(void)char*p=12345678,a10,*pa,*pp,flag;clrscr();C语言程序设计技术10-Nov-2
24、2 while(1)gets(a);pp=p;pa=a;flag=m;while(*pp!=0)if(*pa*pp)flag=g;break;if(*papn);else printf(apn);printf(%s=%sn,p,a);getch();C语言程序设计技术10-Nov-22二二.函数与指针函数与指针一个函数可以返回一个指针值。一个函数可以返回一个指针值。C语言程序设计技术10-Nov-22例例2(P147例例5-12).求字符串的左子串。求字符串的左子串。C语言程序设计技术10-Nov-22#include#include#include#includevoid main(void
25、)char*left(char*s,int n);char*p,s100,s110;int n;strcpy(s,1234567890);gets(s1);n=atoi(s1);C语言程序设计技术10-Nov-22 p=left(s,n);gotoxy(1,1);printf(%sn%s,s,p);free(p);C语言程序设计技术10-Nov-22char*left(char*s,int n)char*t;int l;l=strlen(s)+1;t=malloc(l);strcpy(t,s);if(nl)tn=0;return t;C语言程序设计技术10-Nov-22例例3 将字符串中的每一
26、个字符循环向右移将字符串中的每一个字符循环向右移动若干位。动若干位。C语言程序设计技术10-Nov-22#include#include#includevoid main(void)void MoveStr(char*s,int n);char s101;int n;C语言程序设计技术10-Nov-22 printf(source:);gets(s);printf(How many column you want to move?);scanf(%d,&n);MoveStr(s,n);printf(result:%s,s);C语言程序设计技术10-Nov-22void MoveStr(char
27、*s,int n)char d,*p;int Lenth;Lenth=strlen(s);p=s+Lenth-1;d=*p;for(;ps;p-)*p=*(p-1);*p=d;n-;if(n)MoveStr(s,n);C语言程序设计技术10-Nov-22C语言程序设计技术10-Nov-22第第1616讲讲 结构与联合结构与联合 C语言程序设计技术10-Nov-22一一.结构结构1.结构体定义结构体定义struct =;C语言程序设计技术10-Nov-22例:例:struct date int year,month,day;C语言程序设计技术10-Nov-22例:例:struct student
28、 char name9,sex3;int age;struct date birthday;C语言程序设计技术10-Nov-222.结构体变量说明结构体变量说明(1)struct date int year,moth,day;struct date d1,d2;C语言程序设计技术10-Nov-22(2)struct date int year,moth,day;d1,d2;C语言程序设计技术10-Nov-22(3)struct int year,month,day;d1,d2;C语言程序设计技术10-Nov-223.结构体成员访问结构体成员访问.C语言程序设计技术10-Nov-22例例1(P1
29、59例例6-1).结构体在程序中的使用。结构体在程序中的使用。C语言程序设计技术10-Nov-22#include#include#includestruct student long num;char name20;char sex;float score;C语言程序设计技术10-Nov-22void main(void)struct student stu1;clrscr();stu1.num=200402L;strcpy(stu1.name,“ZhangHong”);stu1.sex=f;C语言程序设计技术10-Nov-22 stu1.score=92.5f;printf(“num=%l
30、d name=%sn”,stu1.num,stu1.name);printf(“sex=%c score=%5.2f”,stu1.sex,stu1.score);getch();C语言程序设计技术10-Nov-22二二.结构体与指针结构体与指针1.结构型指针变量说明结构型指针变量说明 struct *如:如:struct student*p;C语言程序设计技术10-Nov-222.成员引用成员引用 (*指针变量指针变量).成员名成员名或或 指针变量指针变量-成员名成员名C语言程序设计技术10-Nov-22例例2(P167例例6-7).计算一组学生的平均成绩和计算一组学生的平均成绩和不及格人数。
31、不及格人数。C语言程序设计技术10-Nov-22#include#includestruct student long num;char *name;char sex;float score;C语言程序设计技术10-Nov-22struct student stu5=200401L,Zhou ping,M,65.4,200402L,Zhang ping,M,72.5,200403L,Liu fang,F,95.5,200404L,Cheng ling,F,87,200405L,Wang ming,M,58.2,;C语言程序设计技术10-Nov-22void main(void)struct s
32、tudent*ps;void ave(struct student*ps);clrscr();ps=stu;ave(ps);getch();C语言程序设计技术10-Nov-22void ave(struct student*ps)int count=0,i;float ave,sum=0;for(i=0;iscore;if(ps-score60)count+=1;C语言程序设计技术10-Nov-22 printf(s=%fn,sum);ave=sum/5;printf(ave=%fncount=%dn,ave,count);C语言程序设计技术10-Nov-22三三.联联 合合 定义方法:定义方
33、法:union =;C语言程序设计技术10-Nov-22如如:union abc int i;char a,b;C语言程序设计技术10-Nov-22例例3(P172例例6-9).分析程序运行结果。分析程序运行结果。C语言程序设计技术10-Nov-22#includevoid main(void)union long i;int k;char c,s10;x;C语言程序设计技术10-Nov-22 x.i=0 x12345678L;printf(k=%xn,x.k);printf(c=%cn,x.c);printf(s=%xt%xt,x.s0,x.s1);printf(%xt%xn,x.s2,x.
34、s3);C语言程序设计技术10-Nov-22C语言程序设计技术10-Nov-22第第1717讲讲 顺序文件顺序文件 C语言程序设计技术10-Nov-22一一.文件分类文件分类1.按存取方式分类按存取方式分类(1)顺序文件)顺序文件 只能按顺序读取、改写文件中的数据只能按顺序读取、改写文件中的数据。若按读方式打开文件,则只能读取数据,而若按读方式打开文件,则只能读取数据,而不能修改数据。反之,若按写方式打开文件,不能修改数据。反之,若按写方式打开文件,则只能写数据,而不能读数据。则只能写数据,而不能读数据。C语言程序设计技术10-Nov-22(2)随机文件)随机文件 无论按何种方式打开文件,既能
35、读取数无论按何种方式打开文件,既能读取数据,也能修改数据。据,也能修改数据。C语言程序设计技术10-Nov-222.按存储格式分类按存储格式分类(1)文本文件)文本文件 这种文件在磁盘中存放时每个字符对应一这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的个字节,用于存放对应的ASCII码。例如,数码。例如,数5678的存储形式为:的存储形式为:ASCII码:码:00110101 00110110 00110111 00111000 十进制码:十进制码:5 6 7 8C语言程序设计技术10-Nov-22(2)二进制文件)二进制文件 二进制的编码方式来存放数据。例如,数二进制的编码方式来
36、存放数据。例如,数56785678的存储形式为:的存储形式为:00010110 0010111000010110 00101110只占二个字节。只占二个字节。C语言程序设计技术10-Nov-22二二.顺序文件存取方法顺序文件存取方法1.定义文件指针变量定义文件指针变量 FILE *fp fp为文件型指针。为文件型指针。C语言程序设计技术10-Nov-222.打开文件打开文件 FILE *fopen(char*fname,char*mode)mode常用值:常用值:w:写文本文件写文本文件 r:读文本文件读文本文件 wb 写二进制文件写二进制文件 rb 读二进制文件读二进制文件 wb+随机读、随
37、机读、写二进制文件写二进制文件 rb+随机随机读、写二进制文件读、写二进制文件C语言程序设计技术10-Nov-223.关闭文件关闭文件 fclose(fp);C语言程序设计技术10-Nov-224.输出字符串输出字符串 fputs(char*s,FILE *fp)将串将串s输出到文件输出到文件fp中中C语言程序设计技术10-Nov-225.读取字符串读取字符串 fgets(char*s,int n,FILE *fp)从文件从文件fp中读取中读取n-1个字符送到个字符送到s中。中。读到换行符(读到换行符(ASC码为码为10)时,将自动)时,将自动结束读取。结束读取。C语言程序设计技术10-Nov
38、-226.格式化输入与输出格式化输入与输出(1)fscanf(fp,格式串,数据格式串,数据)(2)fprintf(fp,格式串,数据)格式串,数据)C语言程序设计技术10-Nov-227.检测文件是否结束检测文件是否结束int feof(FILE*fp)文件结束时返回文件结束时返回1,否则返回,否则返回0。C语言程序设计技术10-Nov-22例例1.生成若干随机数并存储到磁盘中。生成若干随机数并存储到磁盘中。C语言程序设计技术10-Nov-22#include#include#includeint GetData(int d);void DisplayData(int d,int n);vo
39、id SaveData(int d,int n,char*fname);int LoadData(int*p,char*fname);C语言程序设计技术10-Nov-22void main(void)int n,d101;char s41;n=GetData(d);DisplayData(d,n);gets(s);SaveData(d,n,s);n=LoadData(d,s);if(n)DisplayData(d,n);C语言程序设计技术10-Nov-22int GetData(int d)int n,i;do printf(Input number of data:);scanf(%d,&n
40、);while(n1);for(i=1;in+1;i+)di=random(1000);return n;C语言程序设计技术10-Nov-22void SaveData(int d,int n,char*fname)FILE*fp;int i;fp=fopen(fname,w);if (!fp)printf(save fail);return;C语言程序设计技术10-Nov-22 for(i=1;in+1;i+)fprintf(fp,%d ,di);fclose(fp);C语言程序设计技术10-Nov-22int LoadData(int*p,char*fname)FILE*fp;int n;
41、fp=fopen(fname,r);if(!fp)printf(read fail);return 0;C语言程序设计技术10-Nov-22 n=0;while(!feof(fp)fscanf(fp,%d ,+p);n+;fclose(fp);return n;C语言程序设计技术10-Nov-22void DisplayData(int d,int n)int i;for(i=1;in+1;i+)printf(%-6d,di);if(i%10=0)printf(n);puts(n);C语言程序设计技术10-Nov-22C语言程序设计技术10-Nov-22第第1818讲讲 随机文件随机文件 C语
42、言程序设计技术10-Nov-22一一.二进制文件存取函数二进制文件存取函数 1.读取数据读取数据原型:原型:long fread(void*p,long size,long n,FILE*fp)功能:按照二进制数据格式读取功能:按照二进制数据格式读取n项数据(每项数据(每项数据占项数据占size个字节),存储到由指针个字节),存储到由指针p指向指向的存储区中。函数返回实际读取的数据项数。的存储区中。函数返回实际读取的数据项数。C语言程序设计技术10-Nov-22 2.存储数据存储数据 原型:原型:long fread(void*p,long size,long n,FILE*fp)功能:按照二
43、进制数据格式将指针功能:按照二进制数据格式将指针p指向的存指向的存储区中储区中n的的n项数据存储到文件中。函数返回项数据存储到文件中。函数返回实际存储的数据项数。实际存储的数据项数。C语言程序设计技术10-Nov-22例例1.生成一个二进制文件,然后修改其中的某生成一个二进制文件,然后修改其中的某一项。一项。C语言程序设计技术10-Nov-22#include#includeint GetData(int d);void DisplayData(int d,int n);void Save(int d,int n,char*fname);int LoadData(int*p,char*fnam
44、e);int CorrectData(char*fname);void main(void)int n,d10001;char s41;C语言程序设计技术10-Nov-22 n=GetData(d);DisplayData(d,n);printf(“Filename:);gets(s);Save(d,n,s);if(!CorrectData(s)return;n=LoadData(d,s);if(n)DisplayData(d,n);C语言程序设计技术10-Nov-22int GetData(int d)int n,i;scanf(%d,&n);for(i=1;in+1;i+)di=rando
45、m(1000);return n;C语言程序设计技术10-Nov-22void DisplayData(int d,int n)int i;for(i=1;in+1;i+)printf(%d ,di);puts(n);C语言程序设计技术10-Nov-22void Save(int d,int n,char*fname)FILE*fp;int i;fp=fopen(fname,wb);if(!fp)return;fwrite(&n,2,1,fp);for(i=1;in+1;i+)fwrite(&di,2,1,fp);fclose(fp);C语言程序设计技术10-Nov-22int Correct
46、Data(char*fname)char s21=Temp.txt;FILE*fpr,*fpw;int i,n,p,data,x;fpr=fopen(fname,rb);if(!fpr)return 0;fread(&n,2,1,fpr);C语言程序设计技术10-Nov-22 fpw=fopen(s,wb);if(!fpw)fclose(fpr);return 0;printf(correct which item,new data=);scanf(%d%d,&p,&data);if(pn)fcloseall();return 0;C语言程序设计技术10-Nov-22 fwrite(&n,2,
47、1,fpw);for(i=1;ip&!feof(fpr);i+)fread(&x,2,1,fpr);fwrite(&x,2,1,fpw);fread(&x,2,1,fpr);fwrite(&data,2,1,fpw);C语言程序设计技术10-Nov-22 for(i=p+1;in+1&!feof(fpr);i+)fread(&x,2,1,fpr);fwrite(&x,2,1,fpw);fclose(fpr);fclose(fpw);C语言程序设计技术10-Nov-22 fpr=fopen(s,rb);if(!fpr)return 0;fpw=fopen(fname,wb);if(!fpw)fc
48、lose(fpr);return 0;while(!feof(fpr)fread(&x,2,1,fpr);fwrite(&x,2,1,fpw);C语言程序设计技术10-Nov-22 fclose(fpr);fclose(fpw);return 1;C语言程序设计技术10-Nov-22int LoadData(int*p,char*fname)FILE*fp;int i,n;fp=fopen(fname,rb);if(!fp)return 0;fread(&n,2,1,fp);for(i=1;in+1&!feof(fp);i+)fread(+p,2,1,fp);C语言程序设计技术10-Nov-2
49、2 n=i-1;fclose(fp);return n;C语言程序设计技术10-Nov-22二二.随机文件随机文件 1.文件指针定位文件指针定位 原型:原型:int fseek(FILE*fp,long offset,int whence)功能:将文件指针移到由功能:将文件指针移到由whence所确定的位所确定的位置开始,偏移置开始,偏移offset个字节的位置处。定位个字节的位置处。定位成功时函数返回成功时函数返回0,否则返回非,否则返回非0值。值。C语言程序设计技术10-Nov-22 whence:0(或(或SEEK_SET):文件首:文件首 1(或(或SEEK_CUR):当前位置):当前
50、位置 2(或(或SEEK_END):文件末尾):文件末尾 C语言程序设计技术10-Nov-22例例2.修改二进制文件中的某一项。修改二进制文件中的某一项。C语言程序设计技术10-Nov-22int CorrectData(char*fname)FILE*fpr;int offset,n,p,data;fpr=fopen(fname,rb+);if(!fpr)return 0;fread(&n,2,1,fpr);C语言程序设计技术10-Nov-22 printf(which item,new data=);scanf(%d%d,&p,&data);if(pn)fcloseall();return