~1~哈尔滨工程大学《程序设计基础》实验报告综合实践实验时间:2017年06月10日哈尔滨工程大学计算机基础课程教学中心~2~一、实验题目:文本处理以题目给定的文件paper.txt为例,实现对任意文本文件的各项处理功能。二、功能要求:主函数提供功能菜单供用户选择,用户可以选择调用以下各个功能,也可以选择继续或退出程序。系统应提供以下功能:(1)浏览文件内容:将文件内容显示在屏幕上;(2)复制文本:先输入要复制文本的起始位置和字符个数,然后再输入要粘贴到的目的位置,实现粘贴。允许不断输入粘贴位置,实现多次粘贴,直到用户选择不再继续。每次粘贴后显示当前内容;(3)移动文本:输入要移动文本的起始位置和字符个数,以及要移动到的目的位置,实现文本的移动。移动后显示当前内容;(4)文本替换:输入要查找的文本和要替换为的新文本,实现整篇文本的替换,注意区分大小写。替换后显示当前内容;(5)统计单词个数和单词出现频度:统计并输出当前文本中单词的个数以及出现次数最多的前5个单词,不区分大小写。建议分工:主函数和(1)(5)------1人(2)------1人(3)------1人(4)------1人三、成员任务分工:四、运行环境:五、编程语言:六、成员完成工作:(一)成员1及其工作:姓名:学号:1、承担任务:设计了主函数提供功能菜单供用户选择,用户可以选择调用以下各个功能,也可以选择继续或退出程序。:浏览文件内容:将文件内容显示在屏幕上统计单词个数和单词出现频度:统计并输出当前文本中单词的个数以及出现次数最多的前5个单词,不区分大小写。;2、设计思想:一、主函数提供ABCDEF六个选项,加入while循环,使用户可以选择继续和退出。二、(1)函数将fgets与putchar相结合,循环打印文件中字符。三、(5)函数定义二维数组,横为具体单词;纵为单词个数(不包括重复单词),设置一个计数器,记录重复单词数量,排序,记录前五个。重复个数加总单词个数(无重复)减一,为单词个数。~3~3、定义的函数及其说明(写出每个函数的函数首部,并说明该................函数的功能.....及其各个形参的含义.........,.并图示函数间的调用关系...........)定义了两个函数,分别为(1)(5)函数voidlookup();voidstatistics();无形参,无函数间的调用关系;4、完成代码:154行完成代码行数:在附录A完整源代码中完成代码的行号范围:行号范围1:一行到六十二行行号范围2:二百四十一行到三百三十三行行号范围3:…………5、验证与结论:~4~~5~(二)成员2及其工作:1、承担任务:编写可以实现复制指定文本内容并粘贴在指定位置的程序。2、设计思想:以可写/可读的方式打开文件并扫入字符串1,并将需要复制的文件扫入字符串2,再将粘贴位置后的文本向后移动复制文本的长度,最后将粘贴文本替代粘贴位置后的文本即可。3、定义的函数及其说明(写出每个函数的函数首部,并说明该函数的功能及其各个形参的含义,并图示函数间的调用关系)本程序仅定义了一个copy函数,它是无返回值的函数,仅对源文本进行处理并源文本,并不向主函数返回任何值。4、完成代码:完成代码行数:44行在附录A完整源代码中完成代码的行号范围:行号范围1:63行---107行5、验证与结论:第一次粘贴:第二次粘贴:~6~最终形成的文本:程序可以实现指定文本的复制并且可以在指定位置进行粘贴。(三)成员3及其工作:1、承担任务:在对文本的处理中实现移动文本,功能为输入要移动文本的起始位置和字符个数,以及要移动到的目的位置,实现文本的移动。移动后显示当前内容。~7~2、设计思想:先将文本整体扫描到数组里,再将需要移动的文本通过for循环扫描到另一个数组里,通过多个for循环将剩下的文本和要移动的文本进行相应的移动,最后通过文件写入,将更改好顺序的文本从文件起始位置写入到文件中,并在屏幕上打印出来。3、定义的函数及其说明(写出每个函数的函数首部,并说明该函数的功能及其各个形参的含义..............................,.并图示函数间的调用关系...........)定义的函数“move”,完成任意文本文件指定位置的文字移动到指定的位置,并完成文本文件的重新顺序排列和写入。4、完成代码:完成代码行数:54行在附录A完整源代码中完成代码的行号范围:行号范围1:110行——164行5、验证与结论:(四)成员4及其工作:1、承担任务:实现程序文本替换功能。2、设计思想:首先,要对于文件中的文本进行变动,使用数组会非常简便,主要要先确定用户所想要查找的文本的位置,以及要替换的文本大小,接着空出正好的长度,再将文本直接插入,抵消原文本即可达到替换的效果。3、定义的函数及其说明:定义了一个replace函数,它的作用是替换需要的文本,它是无返回值的函数,仅对源文本进行处理并返回源文本,并不向主函数返回任何值。4、完成代码:完成代码行数:70行在附录A完整源代码中完成代码的行号范围:行号范围1:168行——138行~8~5、验证与结论:(1)、验证:对易与office单词混淆的of单词进行测试:对文本进行替换:(2)、结论:该程序可以实现对指定文本的替换并且可以在指定位置进行替换。~9~附录A:完整代码#includestdio.h1#includestdlib.h2#includestring.h3#defineM500004//定义M500005#defineN206//定义N207intmain()8{9voidcopy();10voidlookup();11voidmove();12voidreplace();13voidstatistics();14charx;15while(1)16{17printf(\nwhatdoyouwanttodo?\n\n);18printf(浏览内容,请输入'A'\n);19printf(复制文本,请输入'B'\n);20printf(移动文本,请输入'C'\n);21printf(替换文本,请输入'D'\n);22printf(统计单词个数和单词出现频率,请输入'E'\n);23printf(结束程序,请输入'F'\n);24printf(请输入:);25scanf(%c,&x);26getchar();27//输入的\n去除28if(x=='A')29lookup();30if(x=='B')31copy();32if(x=='C')33move();34if(x=='D')35replace();36if(x=='E')37statistics();38if(x=='F')39exit(0);40}41}4243~2~44voidlookup()45{46charch;47//定义文件指针48FILE*fp;49fp=fopen(d:\\paper.txt,r+);50while(ch!=EOF)51//将文本内容输入到屏幕上52{5354ch=fgetc(fp);55putchar(ch);56}5758}59606162voidcopy()63{64intg=0,k=0,f=0,i,j=0,m,n,x,y;65charch,str1[M],str2[10000];/*str1为源文本,str2为粘贴文本*/66FILE*fp;67fp=fopen(D:\\paper.txt,r+);/*以可读/可写的方式打开目标文件*/68fread(str1,M,1,fp);/*将源文本扫描到str1中*/69i=0;70while(str1[i]!='\0')/*计算文本中字符数量g*/71{72g++;73i++;74}75str1[g-2]='\0';76printf(请输入需要复制的文本的开始位置和文本长度\n);77scanf(%d%d,&m,&n);/*m为需要复制的文本的开始位置,n为需要复制的文本的长度*/78for(i=m-1;in+m-1;i++)79{80str2[j]=str1[i];81j++;82}83do{84printf(请输入需要粘贴的位置\n);85scanf(%d,&y);/*y为需要粘贴的开始位置*/86for(i=g+k*n-1;iy-1;i--)/*将粘贴位置后的文本向后移动复制文本的长度*/87~3~{88str1[i+n]=str1[i];89}90for(i=y;in&&fn;i++)/*将复制的文本写入到源文本粘贴位置后*/91{92str1[i]=str2[f];93f++;94}95k++;/*记录粘贴次数*/96f=0;/*使f再次归零,以便于下一次粘贴*/97printf(%s\n,str1);/*显示出处理后的文本*/98fseek(fp,0,0);/*将文件指针指向文本最开始位置*/99fwrite(str1,g+k*n,1,fp);/*将处理后的文本写入,并覆盖原未处理的文本*/100printf(需要粘贴请输入1,不需要请输入0\n);/*重复判断是否需要粘贴文本*/101scanf(%d,&x);102}while(x);103fclose(fp);/*关闭文件*/104fflush(stdin);105return;106}107108109voidmove()110{111intg=0,f=0,i=0,j=0,m,n,k,y,q;112charch,str1[M],str2[500],str3[500];/*str1为源文本,str2为粘贴文113本,str3为粘贴位置后的源文本*/114FILE*fp;115fp=fopen(D:\\paper.txt,r+);116while((ch=fgetc(fp))!=EOF)//将文本内容输入到一维数组117中118{119str1[g]=ch;120g++;121}122g=0;123while(str1[i]!=EOF)/*计算文本中字符数量g*/124{125g++;126i++;127}128printf(请分别输入需要移动的文本的开始位置和文本长度:\n);129scanf(%d%d,&m,&n);/*m为需要移动的文本的130开始位置,n为需要移动的文本的长度*/131~4~for(i=m-1;in+m-1;i++)132{133str2[j]=str1[i];134j++;135}136printf(请输入需要移动到的位置:\n);137scanf(%d,&y);/*y为需要粘贴的开始位置138*/139for(k=0;km-1;k++)/*前部不动0---m-2*/140{141str3[k]=str1[k];142}143for(k=m-1;ky;k++)/*被移动的位置将后面的向144前移m-1------y-1*/145{146str3[k]=str1[k+n];147}148q=0;149for(k=y-1;ky+n-1;k++)/*插入部分y-----y+n-2*/150{151str3[k]=str1[m+q-1];152q++;153}154for(k=y+n-1;kg;k++)/*剩下所有次序不变155y+n-1-------g*/156{157str3[k]=str1[k];158}159fseek(fp,0,0);160fputs(str3,fp);161printf(%s\n,str3);162fflush(stdin);163}164165166167voidreplace()168{169intx,h=0,g=0,l=0,i,t,j,k,f;170chara[M],b[M],c[1000];//定义三个数组171FILE*fp;//定义文件指针172fp=fopen(d:\\paper.txt,a+);//令指针指向指定文件,并设定为可读写文件173for(i=0;i5000;i++)174fscanf(fp,%c,&a[i