⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 程英涛.cpp

📁 一个数据结构的课程设计文件,C编写.内容为:程序分析
💻 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 + -