C语言字母频率统计

在进行密码破解时有时候需要得到字母出现的频率信息,下面我将简单的使用C语言来读取一个文件,然后统计该文件内的字母出现的频率。

 

1、在D盘下新建一个文本文件(文件名为"A.txt"),然后在该文件里面保存一些字母。

 

 

2、编译并运行程序

C语言源代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 
 5 //统计字母的个数 
 6 void CountLetter(FILE *fp, int data[])
 7 {
 8     char ch=fgetc(fp); // 读取文件的第一个字符 
 9     while(ch!=EOF) // 当读取到的不是文件结束符EOF则继续读取下一个 
10     {
11         if(ch>='A' && ch<='Z') // 大写字母转小写 
12             ch+=32;
13         if(ch>='a' && ch<='z') // 统计字母个数 
14             data[ch-'a']++; // 当前字母个数加一 
15         ch=fgetc(fp); // 读取文件的下一个字符 
16     }
17 }
18 
19 //打印统计字母的结果到屏幕上 
20 void PrintCount(int data[])
21 {
22     int i=26;
23     int sum = 0; // 字母总的个数 
24     
25     while(i--)
26     {
27         sum+=data[i]; // 计算字母的总个数 
28     }
29     printf("统计字母频率结果(共%d个字母):\n",sum);
30     for(i=0; i<26; i++)
31     {
32         printf("%c=%.2f%%   \t",'a'+i,data[i]*1.0/sum * 100); // 输出字母的频率 
33         if( (i+1)%4 == 0 ) // 每输出4个后换一行 
34             printf("\n"); // 换行 
35     }
36 }
37 
38 
39 int main()
40 {
41     FILE *fp; // 文件指针
42     int data[26] = {0}; // 字母统计数组 
43 
44     fp=fopen("D:\\A.txt","r"); // 以只读的方式打开文件,如果D盘下没有文件"A.txt"则会打开失败 
45     if(fp==NULL) // 判断文件是否打开成功 
46     {   
47         printf("无法打开文件!\n");
48         exit(1); // 退出程序  需要头文件<stdlib.h> 
49     }
50     
51     CountLetter(fp, data); //统计字母的个数 
52     PrintCount(data); // 打印统计结果
53 
54     fclose(fp); // 关闭数据文件 
55     return 0;
56 }

注意:在C语言中,我们要输出一个%,则要输两个% (即%%)

 

转载于:https://www.cnblogs.com/wuqianling/p/5362978.html

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<stdio.h> #include<stdlib.h> struct four { double a; struct four *next; //定义结构体,作为链表的节点. }; void main() { double sum(void); //函数声明. 该函数返回等式的计算结果. 有优先级的运算符号在函数内部先进行计算。 double sum1; printf("请输入等式,以 '=' 结束, 例如“ 2*2*3-2/2= ” 结果将自动保留六位有效数字\n"); sum1=sum(); printf("该等式的结果为:\t%f\n\n",sum1); } double sum(void) { struct four *head,*pnew,*ptail,*p,*q; //结构体成员. char ah; double s=0,last; //last作为 pnew->a 的前一个数值. int j=1; q=(struct four *)malloc(sizeof(struct four)); scanf("%lf%c",&q->a,&ah); last=q->a; while(j==1 && ah!='=') //头节点的建立. { switch(ah) //对运算符号的优先级进行选择,优先级高的先进行计算. { case '+': j=0; continue; break; case '-': j=0; continue; break; case '*': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last*q->a; break; case '/': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last/q->a; break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } last=q->a; scanf("%c",&ah); } pnew=(struct four *)malloc(sizeof(struct four)); pnew->a=q->a; //将头节点的信息传递给 head 和 ptail. head=ptail=pnew; while(ah!='=') //接下来节点的建立. { pnew=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&pnew->a); switch(ah) { case '*': pnew->a=last*pnew->a; break; case '/': pnew->a=last/pnew->a; break; case '+': break; case '-': pnew->a=-pnew->a;break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } scanf("%c",&ah); if(ah=='-' || ah=='+'|| ah=='=') //将值进行传递 ptail->next=pnew. { ptail->next=pnew; ptail=pnew; } last=pnew->a; } ptail->next=NULL; p=head; while(p!=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值