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

📄 static_1.c

📁 从键盘输入一段字符
💻 C
字号:
/*统计字符串中每个字符出现的次数*/
/*要求:
@仅统计英文字符(大小写) 
@此时可以利用英文字符ASCII码的规律 
*/ 
#include<stdio.h>
#include<string.h>
#include<conio.h> 

//全局变量
char str[] = "My Name is Ma Youzhong!";                    //给定的字符串
long total = 0;                                            //存放英文字母总数 
long totalAscii = 0;
                                                           //存放52个英文字母a~z; A~Z
char code[52] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};  
int num[52] = {0};			                   //存放对应英文字符出现的次数 

int count[256] = {0};                                      //存放256个ASCII码字符



//函数声明 

void times();						   //统计各个字母出现的次数,按照字母顺序输出
void sort();						   //按照出现次数由高到低进行排序,按顺序输出,并保存到文件中
void save();						   //按照字母顺序,将字母以及个字母出现的次数保存到文件中
void search(char key);					   //查找给定字母出现的次数
//void graphic_disp();					   //图形化显示各个字母出现的频率

int main()
{
 int menu;                                                 //菜单
 char key;
 
 while(1)
    {               
    printf("\n"); 
    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请选择相应操作\n"); 
    
    //选择菜单   
    scanf("%d",&menu);     
    switch(menu)
		{
		 case 1:
			  //system("cls");				  //清屏
              times();                        //统计各个字母出现的次数,按照字母顺序输出
			  break;
		 case 2:
			  //system("cls");				  //清屏
              sort();                         //按照出现次数由高到低进行排序,按顺序输出,并保存到文件中
			  break;
		 case 3:
			  //system("cls");				  //清屏
              save();                         //按照字母顺序,将字母以及个字母出现的次数保存到文件中
			  break;
		 case 4:
			  //system("cls");				  //清屏
              //char key;  
              getchar();                      //把menu后的回车从缓冲区中读进来,如果没有此行代码,观察结果会是什么样子的? 
              printf("\n输入要查询的字母:\n");
	          scanf("%c",&key);
              search(key);                    //查找给定字母出现的次数                
			  break;
	     case 5:
              exit(0);	            
		}
	}
  return 0;
} 

//子函数

void times()                                  //统计各个字母出现的次数,按照字母顺序输出
{
 
    
 
   //先计算小写字母
   int i,j;
   char   c;
   
   //num、code、total、count、totoalAscii重新置为初始值 
   total = 0;
   totalAscii = 0;
   for(i = 0;i < 52;i++)                      //置0                                          
     num[i] = 0;   
   /*
   把num数组和code数组对应起来 
    code[52] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};  
   */
   for(i = 0;i<26;i++)
    code[i] = 97 + i;  
   for(i = 0;i<26;i++)
    code[i+26] = 65 + i;
    
   for(i = 0;i < 256;i++)                     //置0                                          
     count[i] = 0;  
          
   FILE   *fp;  
   if((fp=fopen("data.dat","r"))==NULL)
   {   
     printf("can   not   open   the   file!\n");   
   } 
   
   //统计256个ASCII码字符的个数
   while(!feof(fp))
       {   
         c=fgetc(fp); 
         count[c]++;
         
       }
   rewind(fp);                               //重置文件读写位置 ,思考如果不重置,会出现什么结果???  
   
   //先计算小写字母
   for(i = 0;i<26;i++)
   //for(j = 0;j <= strlen(str);j++)
   {  
      while(!feof(fp))
       {   
         c=fgetc(fp); 
         if(c == 97+i)		            //a的ASCII码值是97
         num[i]++;
         
       }
       rewind(fp);                          //重置文件读写位置 ,思考如果不重置,会出现什么结果???  
   }
   fclose(fp);                             //文件关闭 
   
   
   //统计大写字母 
    if((fp=fopen("data.dat","r"))==NULL)
     {   
      printf("can   not   open   the   file!\n");   
      exit(0);
     } 
   for(i = 0;i<26;i++)
   //for(j = 0;j <= strlen(str);j++)
   {  
      while(!feof(fp))
       {   
         c=fgetc(fp); 
         if(c == 65+i)			    //a的ASCII码值是97
         num[i+26]++; 
         
       }  
       rewind(fp);             		   //重置文件读写位置    
   }
   
   //输出
    for(i = 0;i<26;i++)
       if(num[i]!=0)
       printf("%c: %d次\n",97+i,num[i]);
    for(i = 0;i<26;i++)
       if(num[i+26]!=0)
       printf("%c: %d次\n",65+i,num[i+26]);
}

void sort()                        	   //选择排序(冒泡排序):按照出现次数由高到低进行排序,按顺序输出,并保存到文件中
{

	int i,j,n,pos,temp;
	char c;                           //存放字符 
	for(i = 0;i<52-1;i++)
	 {
	 	pos = i;
	 	for(j = i + 1;j < 52;j++)
	 		if(num[j] < num[pos])
	 			pos = j;
	 	if(pos != i)
	 		{
	 			temp = num[i];
	 			num[i] = num[pos];
	 			num[pos] = temp;
	 			
	 			//交换字符
                 c = code[i];
                 code[i] = code[pos];
                 code[pos] = c; 
	 			}
	 	printf("after orderd, the result is:\n");
	 
	 	}
	 		//按顺序输出
	 	for(i = 0;i < 52;i++)
	  	    printf("%c: %d次\n",code[i],num[i]);

}
void save()                              //按照字母顺序,将字母以及个字母出现的次数保存到文件中
{
  
    total = 0;
    totalAscii = 0;
    int i = 0;
    char fileName[20];                  //文件名字  
   	printf("输入文件名:\n");
	scanf("%s",fileName);
	FILE   *fp;   
    if((fp=fopen(fileName,"w"))==NULL)
    {   
     printf("error!\n");   
    }	
	

    for(i = 0;i<52;i++)
      if(num[i]!=0)
       {
        total += num[i];
        fputc(code[i],fp);
        fputc(':',fp); 
        fprintf(fp,"%8d ",num[i]);
        fputs(" 次",fp); 
        fputc('\n',fp);
       } 
     
    fputs("\n该文档共有",fp); 
    fprintf(fp,"%15ld  ",total);
    fputs(" 个英文字母!\n",fp); 
    
    //计算所有ASCII码字符数
    
    for(i = 0;i<256;i++)
    	totalAscii += count[i];
    
    fputs("\n该文档共有",fp); 
    fprintf(fp,"%15ld  ",totalAscii);
    fputs(" 个ASCII码字符!\n",fp); 
    	
      
}



void search(char key)                      //查找给定字母出现的次数
{
    int i;
   	for(i = 0;i < 52;i++ )
	 if(key == code[i])
	   break;
   	printf("字母 %c 出现 %d 次\n",key,num[i]);
}



//void graphic_disp()                      //图形化显示各个字母出现的频率 
//{

//}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -