printf(\解:16 3. void main() { int x=3,y=9; x=x^y; y=x^y; x=x^y; printf(\解:9,3 4. #include void swp(int *x,int *y) { *x=*x^*y; *y=*x^*y; *x=*x^*y; } void main() { int a,b,i; for(i=0;i<4;i++){ scanf(\swp(&a,&b); 82 printf(\运行时输入: 9 8 1 23 –9↙ 4↙ –5↙ –1↙ 解:-9,9 4,8 -5,1 -1,23 四、编程题 1.输入一个整数,并输出该数的机内码。 解:#include void main() { int a; scanf(“%d”,&a); printf(“%xH”,a); } 2.输入一个整数,将其低 8 位全置为 1,高 8 位保留原样,并以十六进制输出该数。 解:#include void main() { int a; scanf(“%d”,&a); a|=0xff; printf(“%xH”,a); } 3.输入一个字符串,删除字符串中的所有非汉字的字符,并输出该字符串。 解:#include #include void main() { char str[81]; int i; gets(str); for(i=0;str[i]!=?\\0?;) if((str[i]&0x80)==0) strcpy(str+i,str+i+1); else i++; puts(str); } *4. 对文本的简单加密与解密。输入一个文本及任意一个密码值,对该文本加密后,输出密 文;重新输入密值后,输出解密后的原文。 解:#include 83 void main() { char s[81]; int m1,m2,i; printf(“请输入要加密的文本:\\n”); gets(s); // 输入原文 printf(“请输入密码(1~255) :\\n”); scanf(“%d”,&m1); // 输入密码 for(i=0;s[i]!=?\\0?;i++) s[i]^=m1; // 对原文加密 printf(“密文:\\n%s\\n”,s); // 输出加密文 printf(“请重新输入密码(1~255) :\\n”); scanf(“%d”,&m2); // 输入密码 for(i=0;s[i]!=?\\0?;i++) // 解密 s[i]^=m2; printf(“解密后的原文:\\n%s\\n”,s); // 输出解密文 if(m1!=m2) { printf(“密码无效!\\n”); printf(“解密后的文本不是原文本!\\n”); } } 习 题 11 一、写出下列 fopen 函数调用所打开文件的读写方式与文件存储格式 1.fpt = fopen(\,\。 解:新建文本文件 2.fpt = fopen(\,\。 解:新建二进制文件 3.fpt = fopen(\,\。 解:可读写文本文件 4.fpt = fopen(\,\。 解:追加记录二进制文件 5.fpt =
fopen(\,\。 解:新建可读写文本文件 二、填空题 1.fopen 函数的返回值是 。 解:文件读写的首地址或 NULL。 2.文件打开方式为“r+” ,文件打开后,文件读写位置在 解:文件的第一个记录前。 3.文件打开方式为“a” ,文件打开后,文件读写位置在 解:文件的最后一个记录后。 或 。 4.表达式“fgetc(fpn)”的值为 84 。 。 解:所读入字符的 ASCII 值或文件结束标志 EOF。 或 。 5.表达式“fgets(a,10,fpn)”的值为 解:字符串 a 的地址或 NULL。 6.函数 fscanf 的返回值为 或 。 解:所读入的数据个数或 EOF。 7.函数 fread 的返回值为所读入数据的个数或 。 解:0 。 8.表达式“fscanf(fpn,\,&x)”的值为-1 时,函数 feof()的值为 解:1 9.文本文件 a.dat、b.dat 中每行存放一个数且均按从小到大存放。下列程序将这两文件中数 据合并到 c.dat,文件 c.dat 中数据也要从小到大存放。请填空将程序补充完整、正确(若文 件 a.dat 数据为 1、
6、9、18、27、35,文件 b.dat 数据为 10、23、25、39、61,则文件 c.dat 中数据应为 1、6、9、10、18、23、25、27、35、39、61) 。 #include #include void main() { FILE *f1,*f2,*f3; int x,y; if((f1=fopen(\文件 a.dat 不能打开!\\n \文件 b.dat 不能打开!\\n \if(( )==NULL) { printf(\文件 c.dat 不能打开!\\n \while(!feof(f1)&&!feof(f2)) if( ) { fprintf(f3,\{ fprintf(f3,\
while(!feof(f2)){ fscanf(f2,\
fprintf(f3,\解:①f3=fopen(\③ x #include void main() 85 { char name[9],na[9]; int score,sc,i,pt1,pt2,flag;; FILE *p1; if((p1=fopen(\文件不能打开!\\n\scanf(\读入第一个人的姓名、成绩并写入文件
fprintf(p1,\读入其他人的姓名、成绩 rewind(p1); //将读写位置移动到文件头
while(fscanf(p1,\–13,1); pt1=ftell(p1); //确定数据的插入位置 ; pt2=ftell(p1); //确定文件尾部位置 for(i=pt2-13;i>=pt1; i=i-13) { fseek(p1,i,0); fscanf(p1,\
fprintf(p1,\键盘输入数据已插入,标志位置 0 break; } if( ) { //若数据未插入,则在文件末尾插入 //移动文件读写位置到文件末尾
fprintf(p1,\解:①flag=1 ④ flag==1 ② fseek(p1,0,2) ③ fprintf(p1,\⑤ fseek(p1,0,2) 三、编程题 1.输入若干同学的姓名、学号、三门功课成绩,写入到磁盘文件中(文件名自定) 。 解:#include #include struct stu { char name[9],num[9]; int sc[3]; }; void main() { FILE *fp; struct stu x; if((fp=fopen(“a.txt”,”w”))==NULL) { printf(“不能打开文件 a.txt !”); exit(0); } while(scanf(“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2])!=EOF)
fprintf(fp,“%s %s %d %d %d\\n”,x.name,x.num,x.sc[0],x.sc[1],x.sc[2]); fclose(fp); } 86 2.编程,顺序读入题 1 所建立磁盘文件中各个同学的姓名、学号、成绩,显示输出。 解:#include #include struct stu { char name[9],num[9]; int sc[3]; }; void main() { FILE *fp; struct stu x; if((fp=fopen(“a.txt”,”r”))==NULL) { printf(“不能打开文件 a.txt !”); exit(0); }
fscanf(fp,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); while(!feof(fp)) { printf(“%s %s %d %d %d\\n”,x.name,x.num,x.sc[0],x.sc[1],x.sc[2]);
fscanf(fp,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); } fclose(fp); } 3.编程,输入一个同学的学号,从题 1 所建立的磁盘文件中删除该同学的信息。 解:#include #include #include struct stu { char name[9],num[9]; int sc[3]; }; void main() { FILE *fp1,*fp2; struct stu x; char num[9]; gets(num);
if((fp1=fopen(“a.txt”,”r”))==NULL) { printf(“不能打开文件 a.txt !”); exit(0); } if((fp2=fopen(“b.txt”,”w”))==NULL) { printf(“不能打开文件 b.txt !”); exit(0); } fscanf(fp1,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); while(!feof(fp1)) { if(strcmp(x.num,num)!=0)
fprintf(fp2,“%s %s %d %d %d\\n”,x.name,x.num,x.sc[0],x.sc[1],x.sc[2]);
fscanf(fp1,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); 87 } fclose(fp1); fclose(fp2); remove(“a.txt”); rename(“b.txt”,”a.txt”); } 4.编程,读入若干行字符(每行不超过 80 个) ,写入文本文件(文件名自定) 。 解:#include #include void main() { FILE *fp; char str[81],name[80]; printf(“请输入文件名:”); gets(name); if((fp=fopen(name,”w”))==NULL) { printf(“不能打开文件%s !”,name); exit(0); } while(gets(str)!=NULL) { fputs(str,fp); fputc(?\\n?,fp); } fclose(fp); fp=fopen(name,”r”); while(fgets(str,80,fp)!=NULL) puts(str); fclose(fp); } 5.编程,合并文件,将第二个文本文件的所有字符顺序添加到第一个文本文件之后,变成 一个文件。 解:#include #include void main() { FILE *fp1,*fp2; char file1[80],file2[80]; char ch; printf(“请输入第一个文件名(例如 a.txt) :\\n”); gets(file1); printf(“请输入第二个文件名(例如 b.txt) :\\n”); gets(file2); if((fp1=fopen(file1,”a”))==NULL) { printf(“不能打开文件%s !\\n”,file1); exit(0); } if((fp2=fopen(file2,”r”))==NULL) { printf(“不能打开文件%s !\\n”,file2); exit(0); } while((ch=fgetc(fp2))!=EOF) fputc(ch,fp1); 88 fclose(fp1); fclose(fp2); } 6.编程,修改题 4 所建立的文本文件,在每一个字符“.”后面增加一个空格符。 【提示】参考例 11.8,逐个读入字符写入到临时文件,当读到“.”时多写一个空格符到临 时文件。 解:#include #include void main() { FILE *fp1,*fp2; char str[81],name[80],c; printf(“请输入文件名:”); gets(name); if((fp1=fopen(name,”r”))==NULL) { printf(“不能打开文件%s !”,name); exit(0); } if((fp2=fopen(“d:\\\\ls.txt”,”w”))==NULL) { printf(“不能打开文件 d:\\\\ls.txt!”); exit(0); } while((c=getc(fp1))!=EOF) { fputc(c,fp2); if(c==?.?) putc(? ?,fp2); } fclose(fp1); fclose(fp2); remove(name); rename(“d:\\\\ls.txt”,name); fp1=fopen(name,”r”); while(fgets(str,80,fp1)!=NULL) puts(str); fclose(fp1); } 89