




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三课:文件操作与习题课1、 *文件操作:在很多时候,我们在进行大量运算时,为防止意外情况出现(比如断电,内存不足等),需要保存运算的临时结果并在程序再开时读取之;或是为以文件形式输入输出一些要求的数据。这时,我们就需要用到文件操作。#ifndef _FILE_DEFINEDstruct _iobuf char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; ;typedef struct _iobuf FILE;#define _FILE_DEFINED#endif文件操作有个基础的数据类型FILE,FILE在stdio.h中的定义见右。右方代码并不要求掌握,其中struct将会在数据结构初步中讲到。#ifndef,#define,#endif等属于C语言预处理范畴,只在有特殊用到的程序中会进行解释,并不会在课中讲到。如果想查阅相关信息,C语言书中一般会有相关章节。从右边我们了解到:FILE的本质是一个叫_iobug的结构体。内部有关于字串指针,暂时文件名,文件缓存、缓存大小等信息。相关函数:文件打开关闭函数:fopen和fclose字符读写函数:fgetc和fputc字符串读写函数:fgets和fputs数据块读写函数:fread和fwrite格式化读写函数:fscanf和fprinf例1:常用写文件函数使用示例:#include void main()FILE* fp;fp = fopen(1.txt,wb);fprintf(fp,%sn,A file output example.);fputs(Hope you will like it.n,fp);fputc(1,fp);fclose(fp);运行结果:注:1.fopen的用法为:FILE* 返回文件指针fopen(char* 文件名, char* 控制命令)。控制命令wb的作用是:用二进制(b)方式打开只读文件(w)。2. fclose的用法为:flose(FILE* 待关闭的文件指针)。3. fprintf(FILE* 待写的文件指针, char* 输出字串模板, 字串模板参数)。其中字串模板及字串模板参数与printf中的参数用法一致。4. fputs(char* 待输出字符串, FILE* 待写的文件)。将待写字符串写到待写文件中。5. fputc(char/int 待输出字符, FILE* 待写的文件)。将待写字符写入待写文件中。6. *fwrite(待写信息指针,待写块大小,待写块数,待写文件指针)主要在结构体中使用,现在暂不研究。7. 文件使用完成后一定要关闭(fclose),否则其它进程将无法读写该文件,也有可能引起很多稀奇古怪的异常。例2:常用读文件操作实例#include void main()FILE* fp;char s24;fp = fopen(1.txt,rb);fread(s,sizeof(char),23,fp);s23 = 0;printf(t%sn,s);fgets(s,24,fp);printf(t%sn,s);s1 = fgetc(fp);printf(t%sn,s);fclose(fp);运行结果:注:1.fopen的控制命令rb,作用是以二进制方式只读打开。2. fread的用法是fread(接收信息指针,读取块大小,读取块数,待读文件指针),将文件指针在文件中的指向位置开始向后读取读取快大小*读取块数的信息,并往接收指针指向的地址上覆写。3. fgets的用法为fgets(char* 信息接收字符串, FILE* 待读文件指针)。4. fgetc的用法为char/int 读取到的字符(FILE* 待读文件指针)。5. fscanf一般用得较少,就不做介绍了本节相关的文件操作只作了解,相关具体使用将在以后有所讲解。2、 习题课:(1) 第一章习题:1. 闰年问题。问题分析:判断闰年的标准是:不被4整除的不是闰年,剩余余的不被100整除的是闰年,剩余的不被400整除的不是闰年,被400整除的是闰年。即:被4整除是被100整除是被400整除是是闰年否非闰年否是闰年否非闰年以上是按年份规划的。按图上要求,很容易用3个if语句写出相关程序。但同时,问题也可以按结果规划:是闰年被4整除且不被100整除、被400整除非闰年不被4整除、被100整除且不被400整除此时,用1个if语句就可以了。第一个表格对应的程序:#include void main()int year;bool leap;printf(请输入年份:);scanf(%d,&year);if (year%4)leap = false;elseif(year%100)leap = true;elseif (year%400)leap = false;elseleap = true;if (leap)printf(%d年是闰年。n,year);elseprintf(%d年不是闰年。n,year);第二个表格对应的程序:#include void main()int year;bool leap;printf(请输入年份:);scanf(%d,&year);if (year%4=0 & year%100!=0)|(year%400=0)leap = true;elseleap = false;if (leap)printf(%d年是闰年。n,year);elseprintf(%d年不是闰年。n,year);运行结果:2. 输出符号菱形,上三角行数为输入。如:输入:3输出:* * * *问题分析:首先,要看出整个菱形的组成。菱形的组成元素:空格 ,符号*,换行符n。菱形的组成分布:可以认为由一个与输入数行数相等的正三角与比输入数少一行的倒三角组成。第二部:对正三角每行分析:记输入数为L,则易见:第一行的空格数为L-1个,符号数为1个,1个换行。第二行的空格数为L-2个,符号数为3(2*2-1)个,换行。最后一行(第L行),空格数为0(L-L)个,符号数为(2*L-1)个,换行。所以,对第i行可以很容易地得出:空格L-i个,符号(2*i-1)个,换行。即:行号空格数符号数换行符数1L-11 (2*1-1)12L-23 (2*2-1)1iL-i2*i-11L0 (L-L)2*L-11按表能很容易地用for循环输出每个行所需的东西。至于下三角,将行号从L-1输出到1就已经出来了。程序代码:#include void main()int L,i,j;printf(请输入行数:);scanf(%d,&L);for (i=1;i=L;i+)for (j=0;jL-i;j+)printf( );for (j=0;j0;i-)for (j=0;jL-i;j+)printf( );for (j=0;j2*i-1;j+)printf(*);printf(n);读者应该注意到了,语句块:for (j=0;jL-i;j+)printf( );for (j=0;j2*i-1;j+) printf(*);printf(n);反复出现,其中需要输入的参数为L,i,其作用为打印某行。由于以上的特性,可以用第一课讲义的相关知识将其封装为函数。程序代码:#include void printline(int L,int i)int j;for (j=0;jL-i;j+)printf( );for (j=0;j2*i-1;j+)printf(*);printf(n);void main()int L,i;printf(请输入行数:);scanf(%d,&L);for (i=1;i0;i-)printline(L,i);运行结果:3. 将16进制转换为2进制的转换器。如:输入:AE81输出:1010111010000001问题分析:这道题是很典型的字符串替换题。对这种题,一般两种做法:switch,数组。由于并不要求储存,直接在while里用getchar输入字符再输出就可以了。switch程序代码: #include void main()char c;while (c=getchar()!=n)switch(c)case 0: printf(0000);break;case 1: printf(0001);break;case 2: printf(0010);break;case 3: printf(0011);break;case 4: printf(0100);break;case 5: printf(0101);break;case 6: printf(0110);break;case 7: printf(0111);break;case 8: printf(1000);break;case 9: printf(1001);break;case A:/大A与小a输出一致,以下同。case a: printf(1010);break;case B:case b: printf(1011);break;case C:case c: printf(1100);break;case D:case d: printf(1101);break;case E:case e: printf(1110);break;case F:case f: printf(1111);break;default: printf( );break;/其它字符全部输出空格printf(n);数组程序:#include void main()char* s17 = 0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111, ;char c;int v;while (c=getchar()!=n)if (0=c & c=9)/输入09,变为数字09v = c-0;else if (a=c & c=f) /输入af,变为数字1015v = c-a+10;else if (A=c & c=F) /输入AF,变为数字1015v = c-A+10;else/处理其它字符v = 16;printf(%s,sv);printf(n);运行结果:4. 输出1000以内的所有素数。问题分析:本题也有两种做法。大计算量和较大储存量。一般程序是大计算量的:在2sqrt(n)中,如果n不能被所有数整除,输出n。这样写编写很简单,但运算量较大。#include #include #define N 1000void main()int n,i,lim;bool f;for (n=1;n=N;n+)f = true;lim = int(sqrtf(n);for (i=2;i=lim;i+)if (n%i=0)f = false;break;if (f)printf(%d ,n);printf(n);由于素数还有一个性质:只要不被除1和自己外所有素数整除就是素数。可以利用这条性质,将已算出的素数存在数组中,能节省很大的计算量:#include #define N 1000#define SN 200void main()int sSN;/用于存素数bool f;int n,i,sn;s0 = 1;sn = 1;/记录已存的素数数for (n=2;n=N;n+)f = true;for (i=1;isn;i+)/对n,查找是否于所有其它素数互素if (n%si=0)f = false;break;if (f)/n若与素数数组中的所有其他数互素ssn+ = n;/则将n记录在素数数组中,并将素数总数加1for (i=0;isn;i+)printf(%d ,si);printf(n);运行结果:5. 编写并测试函数min。要求:输出两个数输入,输出两数最小值。问题分析:这只是基础的函数使用,没有难度。程序代码:#include int min(int a, int b)return ab?a:b;void main()int a = 19, b = 11, c = 3;printf(min(a,b) = %dn,min(a,b);printf(min(b,c) = %dn,min(b,c);printf(min(a,c) = %dn,min(a,c);printf(min(a,b,c) = %dn,min(min(a,b),c);运行结果:(2) 第二章习题:1. 打印7行杨辉三角。问题分析:作为杨辉三角,有两种做法:纯计算,储存计算。杨辉三角有通式:C(列数,行数),即【行数!/(列数!)*(行数-列数)!】,这种方法比较简单,不需要储存,但计算量较大。#include #define N 7void main()long T;/用于储存临时结果int i,j,k; /i为行数,j为列数for (i=0;i=N;i+)for (j=0;j=i;j+) /按组合算T = 1;for (k=j+1;k=i;k+) /(j+1)(j+2).(i)T*=k; /-for (k=1;k=i-j;k+) /(1)(2)(3).(i-j)T/=k; /1到j已被约去printf(%4ld ,T);printf(n);储存计算的方法就简单多了,只用把每行的结果记录下来就可以了。每行的第i个数是它上一行第i-1个数和第i个数的和,若该书不存在则取0。这样需要一个(N+1)*(N+1)的数组,并且数组中只有一半左右的空间会被用到,其他空间都会白白浪费。希望读者在看完以下程序后,能自己完成一个优化程序,即不用乘法,通过一部分运算来削减储存开销,此题留作课后习题。程序代码:#include #define N 8void main()int sNN;int i,j;int a,b;s00 = 1;for (i=1;iN;i+)for (j=0;j=i;j+)a = j!=0?si-1j-1:0;b = j!=i?si-1j:0;sij = a + b;for (i=0;iN;i+)for (j=0;j=i;j+)printf(%4d ,sij);printf(n);运行结果:2. 输出1000000以内所有素数。本题出的目的是比较第1章4题两算法的运算速度,算法见上,就不再赘述了。3. 30位正整数的加法。问题分析:本题中,数据不可能存储在现有的数据结构里,但如果想到用数组将各位分开存储,本题就豁然开朗了。程序代码:#include #define N 8/每个int装4位void main()int aN,bN,rN;int i,C;for (i=0;iN;i+)ai = 0;bi = 0;char c;bool pf = false;while (c=getchar()!=n)if (!pf&0=c&c=9)for (i=0;iN;i+)ai*=10;a0+=c-0;for (i=0;iN-1;i+)C = ai/10000;ai%=10000;ai+1+=C;if (c=+)pf = true;if (pf&0=c&c=9)for (i=0;iN;i+)bi*=10;b0+=c-0;for (i=0;iN-1;i+)C = bi/10000;bi%=10000;bi+1+=C;C = 0;for (i=0;i0;i-);printf(%d,ri-);while (i=0)printf(%04d,ri-);printf(n);运行结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高铁站台安全知识培训课件
- 集安市2025-2026学年七年级下学期语文月考模拟试卷
- 电路基础自锁知识培训课件
- 电芯厂消防知识培训课件
- 高边坡施工安全知识培训课件
- 电脑贴膜专业知识培训课件
- 高血压病课件
- 电脑知识培训活动课件
- 电脑知识培训实施方案课件
- 智慧化工园区数字孪生应用方案
- 课件:《中华民族共同体概论》第十五讲:新时代与中华民族共同体建设
- 北师大版(2024新版)七年级上册数学第一章《丰富的图形世界》大单元整体教学设计
- 2025届高考语文一轮总复习:120个文言实词
- 食品产业高质量发展发展目标
- 恶性肿瘤微量营养素缺乏与补充
- QB∕T 8045-2024 聚对苯二甲酸乙二醇酯(PET)结构泡沫板材
- 初中英语校本教材
- 2024年内蒙古丰镇市招聘社区工作者26人历年重点基础提升难、易点模拟试题(共500题)附带答案详解
- 生态环境执法大练兵知识考试题库(含答案)
- “案”说刑法(山东联盟)-知到答案、智慧树答案
- 《职业道德与法治》开学第一课(导言)(课件)-【中职专用】中职思想政治《职业道德与法治》高效课堂课件+教案(高教版2023·基础模块)
评论
0/150
提交评论