编写一个C语言代码美化程序课程设计.docx
- 文档编号:1726503
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:24
- 大小:201.58KB
编写一个C语言代码美化程序课程设计.docx
《编写一个C语言代码美化程序课程设计.docx》由会员分享,可在线阅读,更多相关《编写一个C语言代码美化程序课程设计.docx(24页珍藏版)》请在冰点文库上搜索。
编写一个C语言代码美化程序课程设计
吉首大学
JishouUniversity
课程设计
题目:
编写一个C语言代码美化程序
作者:
学号:
所属院系:
数学与计算机科学学院
专业年级:
09级网络工程
指导老师:
职称:
时间:
2010年10月17日--10月24日
目录
一、摘要
二、需求分析
三、概要分析
四、源代码详细分析及测试
五、总结
六、参考文献
编写一个C语言代码美化程序
一、摘要
题目要求:
编写一个C语言代码美化程序,能处理符合语法的C代码,进行重新排版,使之更加美观易读。
设计要求:
(1)程序采用字符界面
(2)显示功能菜单,用户指定键即可进入相应功能(3)可由用户选择输入文件(.c文件),程序对它进行格式化(4)将修改以后的文件输出到另一个.c文件
开发语言与环境:
C语言是目前世界上流行、使用最广泛的高级程序设计语言。
它是一种结构化语言,层次清晰,便于按模块化方式组织程序,易于调试和维护。
C语言的表现能力和处理能力极强。
它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。
它还可以直接访问内存的物理地址,进行位一级的操作。
因此,我们这次使用的开发平台为VC++6.0,采用的高级语言为c语言。
二、需求分析
当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于信息系统的环境。
计算机的最到好处的于利用它能够进行信息管理,使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。
C/C++语言无疑是当今嵌入式开发中最为常见的语言。
但其中对于C/C++语言代码的书写是一个令人头痛的问题,很多程序员尤其是新手写出来的C/C++源程序代码让人感觉杂乱无章,给人一种很不好的印象。
甚至几个月后自己对自己编写的C/C++源程序代码都看不懂。
针对这一种情况,我们认为编写一个美化C/C++代码的美化工具很有必要性,该程序可以快速的对乱糟糟的代码进行自动排版,让程序看起来更符合规范,更加符合大家的习惯,看起来不那么费力。
让程序起到很好的美化效果,并且不改动原来程序的功能。
编制这样一个程序,对大家一定可以起到很大的帮助。
这次的小程序,我们小组人员的分工如下:
谭向宏:
完成了两个主要子函数的编制;吴方朴:
对主函数的调试,调用函数;刘晖:
搜集资料,做测试实例,测试。
大家的共同合作下,完成了这一小程序,过程虽艰苦,但收获颇丰。
3、概要分析:
C程序美化流程图
N
Y
N
Y
这次的美化代码程序,定义并调用了两个被调函数,由主函数调用完成。
函数的大致流程如下:
首先输入要美化的c原文件的文件名,用读写方式打开该文件,然后用只写方式打开另一文件,若文件不存在则会新建一文件,然后调用函数readin按行读取数据,并将读取的数据放入定义的全局变量数组中,用函数check找到关键符号,在输出的同时做换行加空格等操作,对文件进行美化。
美化完成后,关闭两个文件,一个美化文件过程便完成了。
四、源代码详细说明及测试
1、代码详细说明:
原理:
对于美化代码,无非是对不整齐的代码将它重新排版对齐,其中就是要对原文件的代码去除空格以及多余的字符之类的,从而起到美化的效果,为了达到这种功能,我们定义了函数进行相关的操作
首先确定所需要的函数模块:
第一部分是主函数部分:
voidmain()
第二部分是按行读出的模块部分:
intreadln(FILE*fp)
第三部分是符号查找匹配部分:
char*check(charstr[],chartar)
第一部分:
主函数部分,主要代码及分析如下:
voidmain()
{FILE*infp,*outfp;//设置文件指针
char*p,fn[64];
intj;
printf部分:
字符界面设置;
scanf("%s",fn);//输入你要修改的文件名;
infp=fopen(fn,"r+");//应用读写方式打开输入的文件;
if(infp==NULL)//若打开文件失败,报错;
{printf("文件夹打开错误,请重新输入.\n");
return;
}
outfp=fopen("tempwenjian.c","w");//为输出打开一个文件,若不存在该文
件自动新建生成一文件名为tempwenjian.c的文件;
if(outfp==NULL)//若打开文件失败,报错;
{printf("不能创建文件夹.\n");
return;
}
这部分的while循环是精华部分,涉及到了函数的调用;
while(readln(infp)!
=EOF_REACHED)
//调用readln函数,若函数返回值不是0,做循环;
{p=check(strl,'}');//调用函数,查找符号}:
if(p!
=NULL)//查找成功
{magin--;
fprintf(outfp,"\n");//在}符号之前输出换行符;
}
for(j=0;j fprintf(outfp,""); fprintf(outfp,"%s",strl); //在tempwenjian.c文件中,以字符串格式输出该行数据; p=check(strl,'{');//调用函数,查找符号{: if(p! =NULL)//查找成功 {magin++; fprintf(outfp,"\n");//在{之后输出换行符; } } fprintf(outfp,"\n");//最后输出换行符; printf("恭喜您,美化代码成功! \n"); fclose(infp);//关闭原文件; fclose(outfp);//关闭出入文件; } 第二部分: 按行读出的模块部分: 在原始的代码中,及自己输入文件名的那个原文件中,按行读出字符,刚放入全局变量数组str1中。 细节及详细解释如下: Intreadln(FILE*fp) //按行读取数据,以文件类型指针接收输入的待美化的文件; {inti=0,j=0; registerintc; while(! feof(fp))//当文件未结束,作while循环; {c=fgetc(fp);//从文件读入一个字符,赋给c变量; strl[i]=c;//把该读入的字符赋给要输出的数组; if(c! =''&&c! ='\t') j=1; //如果读入的该字符不是空格且不是一个水平制表,就令j=1;表示读入的该字符为一个有效字符; i+=j;//如果读入的字符为有效字符,i加1; if(c=='\n') //如果读入的该字符为一换行符,即该行数据已读完毕,使该输出数据为空字符; {strl[i]='\0'; returnREAD_OK; //该行读入完毕,且该行撤消了换行操作,返回主调函数,带回数据1; } }//读完某一行时结束,循环结束; magin=i; if(i)//如果文件只有一行,继续执行以下操作: {strl[i-1]='\n';//若文件只有一行,在结尾处执行换行操作; strl[i]='\0'; returnEOF_LINE;//返回主调函数,带回数据2; } elsereturnEOF_REACHED; } 第三部分: 符号查找匹配部分: char*check(charstr[],chartar) //被调函数,是一个返回字符指针的函数,用来查找; { registerinti=0,c; staticintstatus=CODE;//令status=0; do{ c=str[i]; //在存储的该行字符中,第i个字符赋给c,即从第一个字母开始查找匹配 的符号; switch(c){ case'\"': switch(status) { caseCODE: status=QUOTE;break; //“后若为开始,把status重新赋值为1,不满足status==0,需要继续循环; caseSLASHinQUOTE: status=CODE;break;//否则就把status重新归为code0; caseQUOTE: status=CODE;break; }break; case'\\': switch(status) { caseQUOTE: status=SLASHinQUOTE;break;//如果c为\,status==1,则把status的值赋为2,不满足status==0,继续循环; }break; case'\n': switch(status) { caseLINEQ: status=CODE;break; //如果c为换行符,且status==5,则把status归零; }break; case'\'': switch(status) { caseCODE: status=QUOTE2;break; //如果c为字符',status为0时,status改赋值为3,不满足status==0,继续循环, caseQUOTE2: status=CODE;break; //如果c为字符',当status为3时,即,下一次循环到来时,status归零; }break; case'/': switch(status) { caseCODE: status=SLASH;break; //如果c为字符/,status为0时,status改赋值为4,不满足status==0,继续循环 caseSLASH: status=LINEQ;break; //如果c为字符/,status为4时,status改赋值为5,不满足status==0,继续循环 casePARAQ: status=CODE;break; //如果c为字符',status为5时,即,下一次循环到来时,status归零; }break; case'*': switch(status) { caseSLASH: status=PARAQ;break; //如果c为*,且status==6,则把status归零; }break; default: switch(status) { caseSLASH: status=CODE;break; //对于c以上情况均不满足,如果status==4,则归零; } } if(c==tar&&status==CODE)//找到了相匹配的字符且status==0 returnstr+i; //如是找到了匹配的字符,就返回匹配的字符的地址; i++; }while(c); returnNULL; } 2、运行与调试 程序运行画面代码 printf("吉首大学课程设计——C语言美化程序\n"); printf("CProgrambeautifier\n"); printf("******************************\n"); printf("*制作人: 谭向宏、吴方朴、刘辉*\n"); printf("******************************\n"); printf("请输入您需要美化的C文件: "); 其中包括程序的主题——C语言美化程序,包括制作人,输入提示的操作。 运行的画面如下: 图1 箭头所示为输入C文件的名称 下面我们对一个杂乱的C代码进行美化操作 操作前的效果图如下: 图2 以上为一段简单的密码C代码,初看起来给人的感觉特别混乱,杂乱无章,给人很不好的感觉 以下的代码是经过C程序美化后的效果: 图3 以上给人的感觉比较舒服,没有前面的那种杂乱感了 2、操作错误的提示界面: 图4 3、当们在输入C文件的地方,随意输入一个不存在或者错误的C文件名字时,就会出现以下界面: 图5 系统会提示您文件夹打开错误,请重新输入 按任意键取消对话框 4、当您输入正确的C文件时 图6 操作界面如下: 图7 系统将会提示您,恭喜您,美化代码成功! 当C文件被美化后,将会以一个新的文件temp.c的文件作为修改后的文件,即为我们所需要的最终文件 3、完整源代码如下: #include #include #include #defineEOF_REACHED0 #defineREAD_OK1 #defineEOF_LINE2 //各种状态: #defineCODE0//ccode #defineQUOTE1//"" #defineSLASHinQUOTE2//"\? " #defineQUOTE23//'' #defineSLASH4/// #defineLINEQ5//// #definePARAQ6///**/ charstrl[128];//存储输出数据的数组; intmagin; char*check(charstr[],chartar)/*被调函数,是一个返回字符指针 的函数,用来查找;*/ { registerinti=0,c; staticintstatus=CODE;//令status=0; do{ c=str[i];/*在存储的该行字符中,第i个字符赋给c,即从 第一个字母开始查找匹配的符号;*/ switch(c){ case'\"': switch(status) { caseCODE: status=QUOTE;break; //“后若为开始,把status重新赋值为1,不满足status==0,需要继续循环; caseSLASHinQUOTE: status=CODE;break; //否则就把status重新归为code0; caseQUOTE: status=CODE;break; }break; case'\\': switch(status) { caseQUOTE: status=SLASHinQUOTE;break; //如果c为\,且status==1,则把status的值赋为2,不满足status==0,继//续循环; }break; case'\n': switch(status) { caseLINEQ: status=CODE;break; //如果c为换行符,且status==5,则把status归零; }break; case'\'': switch(status) { caseCODE: status=QUOTE2;break; //如果c为字符',当status为0时,把status改赋值为3,不满足status==0,//继续循环, caseQUOTE2: status=CODE;break; //如果c为字符',当status为3时,即,下一次循环到来时,status归零; }break; case'/': switch(status) { caseCODE: status=SLASH;break; //如果c为字符/,当status为0时,status改赋值为4,不满足status==0,//继续循环 caseSLASH: status=LINEQ;break; //如果c为字符/,当status为4时,status改赋值为5,不满足status==0,//继续循环 casePARAQ: status=CODE;break; //如果c为字符',当status为5时,即,下一次循环到来时,status归零; }break; case'*': switch(status) { caseSLASH: status=PARAQ;break; //如果c为*,且status==6,则把status归零; }break; default: switch(status) { caseSLASH: status=CODE;break; //对于c以上情况均不满足,如果status==4,则归零; } } if(c==tar&&status==CODE)//找到了相匹配的字符且status==0 returnstr+i;//如是找到了匹配的字符,就返回匹配的字符的地址; i++; }while(c); returnNULL; } intreadln(FILE*fp)//按行读取数据,以文件类型指针接收输入的待美化的文件; {inti=0,j=0; registerintc; while(! feof(fp))//当文件未结束,作while循环; {c=fgetc(fp);//从文件读入一个字符,赋给c变量; strl[i]=c;//把该读入的字符赋给要输出的数组; if(c! =''&&c! ='\t') j=1;//如果读入的该字符不是空格且不是一个水平制表, //就令j=1;表示读入的该字符为一个有效字符; i+=j;//如果读入的字符为有效字符,i加1; if(c=='\n')//如果读入的该字符为一换行符,即: 该行数据已读完 //毕,使该输出数据为空字符; {strl[i]='\0'; returnREAD_OK;//该行读入完毕,且该行撤消了换行操作, //返回主调函数,带回数据1; } }//读完某一行时结束,循环结束; magin=i; if(i)//如果文件只有一行,继续执行以下操作: {strl[i-1]='\n';//若文件只有一行,在结尾处执行换行操作; strl[i]='\0'; returnEOF_LINE;//返回主调函数,带回数据2; } elsereturnEOF_REACHED; } voidmain() {FILE*infp,*outfp;//设置文件指针 char*p,fn[64]; intj; printf("吉首大学课程设计——C语言美化程序\n");//以下六行字符为提示性界面 printf("CProgrambeautifier\n"); printf("******************************\n"); printf("*制作人: 谭向宏、吴方朴、刘辉*\n"); printf("******************************\n"); printf("请输入您需要美化的C文件: "); scanf("%s",fn);//输入你要修改的文件名; infp=fopen(fn,"r+");//应用读写方式打开输入的文件; if(infp==NULL)//若打开文件失败,报错; {printf("文件夹打开错误,请重新输入.\n"); return; } outfp=fopen("tempwenjian.c","w"); //为输出打开一个文件,若不存在该文件自动新建生成一 //文件名为tempwenjian.c的文件; if(outfp==NULL)//若打开文件失败,报错; {printf("不能创建文件夹.\n"); return; } while(readln(infp)! =EOF_REACHED) //调用readln函数,若函数返回值不是0,做循环; {p=check(strl,'}');//调用函数,查找符号}: if(p! =NULL)//查找成功 {magin--; fprintf(outfp,"\n");//在}符号之前输出换行符; } for(j=0;j fprintf(outfp,""); fprintf(outfp,"%s",strl); //在tempwenjian.c文件中,以字符串格式输出该行数据; p=check(strl,'{');//调用函数,查找符号{: if(p! =NULL)//查找成功 {magin++; fprintf(outfp,"\n");//在{之后输出换行符; } } fprintf(outfp,"\n");//最后输出换行符; printf("恭喜您,美化代码成功! \n"); fclose(infp);//关闭原文件; fclose(outfp);//关闭出入文件; } 五、总结 忙碌了一个多星期,在大家的共同努力下,我们总算将此程序设计出来。 尽管不是自己独立完成,仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。 另外平时扎实的基础也很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。 为了解决此类问题,最好就是多向同学,老师请教,不要怕难为情。 尤其是老师,评他们多年的编写程序的经验,要解决我们的问题,对他们来说只是smallcase。 从这一个多星期的设计过程中,我看到了大家的拼搏与努力,也让我知道团队精神得难能可贵,尽管一年下来大家不怎么有多大接触,但是彼此之间的友谊已经在我们心里扎根生底,在遇到问题时,我们会共同进退,每个人都很慷慨不会因为是通过自己艰辛劳动设计出来的东西而不准他人剽窃了。 总之,这次设计程序让我受益良多,我会好好珍惜像这种难得的机会。 六、参考文献: 《XX文库》、《C程序设计(第三版)》、《C++程序设计》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编写 一个 语言 代码 美化 程序 课程设计