📄 static_1.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 + -