代码改变世界

2.4.2程序作业

2016-03-23 14:25  叶思维  阅读(189)  评论(0编辑  收藏  举报

本程序能正确统计某程序设计语言源文件的字符数,单词数和行数,并能实现部分拓展功能,如返回程序的代码行/空行/注释行/。程序攻分为4个主要函数,分别统计行数程序,统计字符数和单词数函数,返回代码行和空行函数,返回注释行函数。但程序不完善,我没有写出能递归处理目录下符合条件的文件函数。高级功能我也没有实现。能力有限,只能期待日后改进。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>



 void hangshu()
{    
  int num=0;
  FILE*fp;
  char str[500];

  if((fp=fopen("test.txt","rt"))==NULL) 
  {
   printf("cannot open file\n");
   return;
  }
       
    while (fgets(str,500,fp))  
    {
      num++;
   }
  fclose(fp);
   printf("该文件共有%d行\n",num);
}


void count()
{
    char str[500];
	int strLen;
     FILE*fp;
    
	int i;
	int j;
	int blank=0;
	int ch=0;
	int word=0;
 

  if((fp=fopen("test.txt","rt"))==NULL) 
  {
   printf("cannot open file\n");
   return;
  }

  
 while(fgets(str, 500, fp))
 {
        strLen = strlen(str);
		for(i=0;i<strLen;i++)
		{
			j=str[i];
			if(j==' '||j=='\t')
			{
		!blank&&word++;
		blank=1;
			
			}
			else if(j!='\n'&&j!='\r')
			{
				ch++;
			blank=0;
			
			}
		}
        !blank&&word++;
		blank=1;
		
 }
   printf("共有%d个单词,%d个字符",word,ch);
}

 void advanced()
 {

int strLen;	 

	
 FILE*fp;
 char str[500];


  if((fp=fopen("test.txt","rt"))==NULL) 
  {
   printf("cannot open file\n");
   return;
  }

       
    while (fgets(str,500,fp))  
	{
		
        strLen = strlen(str);
	
         if(strLen>3)
		 {
			printf("%s是代码行.\n",str);
		 }
		 

		 if(strLen<=3)
		  {
         
            printf("%s是空行.\n",str);
		  }	
	}
		
 }   



void zhushi()
{
         FILE*fp;
         int i =0;
        
         char str[500];
        if((fp=fopen("test.txt","rt"))==NULL) 
  {
   printf("cannot open file\n");
   return;
  }
       
		fp=fopen("test.txt","r");
    while(fgets(str,500,fp))
    {
            str[i]=fgetc(fp);
                i++;
        }
        if (str[i]='\\')
			printf("%s是注释行\n",str);
    fclose(fp);
          
}


	
void Menu()
{
        printf("--------------------\n");
    printf("----程序主菜单------\n"); 
    printf("--------------------\n");
    printf("----1显示行数---\n");
 printf("----2显示单词数和字符数----\n");
 printf("----3返回代码行和空行-------\n");
 printf("----4返回注释行-------\n");

        printf("----5退出-----------\n");
    printf("---回车键返回菜单---\n"); 
    printf("--------------------\n");
        printf("---请选择:(1-5)-:---\n");

}


void main()
{
        char menuNum;
       
        while(1)
        {
                Menu();
                scanf("%d",&menuNum);
        switch(menuNum)
        {
               

             case 1:
				    hangshu();
                    break;
			 case 2:
                    count();
					break;
			 case 3:
				    advanced();
				    break;
			 case 4:
				   zhushi();
				   break;
        case 5:
                      
                        exit(0);
        
        default:
                        printf("\n输入错误!\n");
                printf("按任意键返回....\n");
               getchar();

}
}
}