📄 程英涛.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<malloc.h>
#include<iostream.h>
#define isspace(c) (((c)==32)||((c)==9)||((c)==13))
#define SIZE 100
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
int code=0;
int blank=0;
int comm=0;
int sum=0;
int functionnum=0;
int unfunnum=0;
bool flag=0;
int avgfunline=0;
char dir[50];
void fenxi();
void menu(char &choice)
{
int i;
for(i=0;i<80;i++)
{
printf("*");
}
for(i=0;i<35;i++)
printf(" ");
printf(" 程序分析 ");
for(i=0;i<35;i++)
printf(" ");
for(i=0;i<80;i++)
{
printf("*");
}
for(i=0;i<30;i++)
printf(" ");
printf("(1).进入程序分析界面\n");
for(i=0;i<30;i++)
printf(" ");
printf("(2).退出程序\n\n");
for(i=0;i<30;i++)
printf(" ");
printf("请输入您的选择:");
// scanf("%c",&choice);
cin>>choice;
if(choice=='1')
{
printf("\n");
for(i=0;i<30;i++)
printf(" ");
printf("现在进入程序分析界面:\n");
for(i=0;i<80;i++)
{
printf("*");
}
fenxi();
for(i=0;i<80;i++)
{
printf("*");
}
menu(choice);
}
else if(choice=='2')
{
printf("\n");
for(i=0;i<30;i++)
printf(" ");
printf("现在您选择了退出程序!\n");
getch();
exit(0);
}
else if(choice!='1'&&choice!='2')
{
printf("\n");
for(i=0;i<30;i++)
printf(" ");
printf("输入错误,请重新选择:\n");
menu(choice);
}
}
//menu(),用于显示一个友好的交互界面。
int judge(char *string)
{
int flag=0;
for(string;*string!='\n';string++)
{
if(isspace(*string))
continue;
else
{
flag=1;
break;
}
}
return flag;
}//judge()
tongji(char *string)
{
if((*string=='/')&&(*(string+1)=='/'))
comm++;
else if(judge(string)==0)
blank++;
}
int InitStack(SqStack &S)
{
S.base=(char *)malloc(SIZE*sizeof(char));
if(!S.base)exit(0);
S.top=S.base;
S.stacksize=SIZE;
return 1;
}
int GetTop(SqStack S,char &e)
{
if(S.top==S.base)
return 0;
e=*(S.top-1);
return 1;
}
int Push(SqStack &S,char &e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base,(S.stacksize+10)*sizeof(char));
if(!S.base)exit(0);
S.top=S.base+S.stacksize;
S.stacksize+=10;
}
*S.top++=e;
return 1;
}
int Pop(SqStack &S,char &e)
{
if(S.top==S.base)
return 0;
e=*--S.top;
return 1;
}
int StackEmpty(SqStack &S)
{
if(S.top==S.base)
return 1;
else
return 0;
}
funnum(char *string,SqStack &S)
{
char *ch;
char *sh;
ch=strchr(string,'{');
sh=strchr(string,'}');
if(strstr(string,"struct"))
functionnum--;
if(!StackEmpty(S)&&strstr(string,"struct"))
functionnum++;
if(ch)
Push(S,*ch);
if(sh)
{
Pop(S,*sh);
if(StackEmpty(S))
functionnum++;
}
if(StackEmpty(S))
unfunnum++;
}
structline(char *string,SqStack &S)
{
flag=0;
char *ch;
char *sh;
ch=strchr(string,'{');
sh=strchr(string,'}');
if(StackEmpty(S)&&strstr(string,"struct"))
flag=1;
if(flag==1)
unfunnum++;
if(ch)
Push(S,*ch);
if(sh)
{
Pop(S,*sh);
if(StackEmpty(S))
flag=0;
}
}
void shuchu()
{
printf("The result of analysing program file %s\n",dir);
printf("Lines of code:%d\n",code);
printf("Lines of comments:%d\n",comm);
printf("Blank lines:%d\n\n",blank);
printf("Code\tComments\tSpace\n");
printf("====\t========\t======\n");
printf(" %d%% \t %d%% \t %d%% \n\n",100*code/sum,100*comm/sum,100*blank/sum);
printf("The program include %d functions\n",functionnum);
printf("The average length of a section of code is %d line.\n",avgfunline);
if(avgfunline>=10&&avgfunline<=15)
printf("Grade(code) A:--");
if((avgfunline>=8&&avgfunline<=9)||(avgfunline>=16&&avgfunline<=20))
printf("Grade(code) B:--");
if((avgfunline>=5&&avgfunline<=7)||(avgfunline>=21&&avgfunline<=24))
printf("Grade(code) C:--");
if(avgfunline>24&&avgfunline<5)
printf("Grade(code) D:--");
printf("\n=====================\n");
if(100*comm/sum>=15&&100*comm/sum<=25)
printf("Grade(comments) A:--");
if((100*comm/sum>=10&&100*comm/sum<=14)||(100*comm/sum>=26&&100*comm/sum<=30))
printf("Grade(comments) B:--");
if((100*comm/sum>=5&&100*comm/sum<=9)||(100*comm/sum>=31&&100*comm/sum<=35))
printf("Grade(comments) C:--");
if(100*comm/sum>=35||100*comm/sum<=5)
printf("Grade(comments) D:--");
printf("\n=====================\n");
if(100*blank/sum>=15&&100*blank/sum<=25)
printf("Grade(space) A:--");
if((100*blank/sum>=10&&100*blank/sum<=14)||(100*blank/sum>=26&&100*blank/sum<=30))
printf("Grade(space) B:--");
if((100*blank/sum>=5&&100*blank/sum<=9)||(100*blank/sum>=31&&100*blank/sum<=35))
printf("Grade(space) C:--");
if(100*blank/sum>35||100*blank/sum<5)
printf("Grade(space) D:--");
printf("\n");
}
void fenxi()
{
char string[256];
char *str;
FILE *fp;
SqStack s;
InitStack(s);
printf("请输入欲打开的.cpp文件路径(例如 D:\\\\01.cpp):\n");
scanf("%s",dir);
if((fp=fopen(dir,"r"))==NULL)
{
printf("Error openning %s.\n\n",dir);
exit(0);
}
else
{
while((str=fgets(string,sizeof(string),fp))!=NULL)
{
tongji(str);
funnum(str,s);
sum++;
}
fclose(fp);
fp=fopen(dir,"r");
while((str=fgets(string,sizeof(string),fp))!=NULL)
{
structline(string,s);
}
fclose(fp);
unfunnum=unfunnum-2*functionnum;
code=sum-blank-comm;
avgfunline=(code-unfunnum)/functionnum;
shuchu();
}
}
void main()
{//主函数
char choice1;
menu(choice1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -