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;jfprintf(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++程序设计》