密码分析
时间限制: 1S类别: 结构体->简单
晚于: 2023-12-01 23:55:00后提交分数乘系数50%
问题描述 :
密码分析学中常常需要统计字符出现的频度。给定若干行短文,要求按字符出现的频度由高到低输出,当两个字符出现的频度相同时,按字符大小的顺序输出。
注意:只需要统计英文字母的频度,非英文字母一律忽略。
输入说明 :
输入由多组数据组成。每组数据由一行长度不超过100的字符串组成,不区分字母大小写,如A与a看作同一个字母。
输出说明 :
对每组输入数据都有若干行输出,每行有两个输出数据,第一个数据为某个大写字母,第二个数据为该字母出现的频度,两个数据之间有一个空格。输出顺序按字母出现的频度由高到低输出,当两个字母的频度相同时,按字母大小的顺序输出。两组输出之间有一行空行。
#include<stdio.h>// summershell
#include<string.h>
#include<stdlib.h>
struct zifu
{
int f;
char x;
} alpha[30];//定义一个结构体包含字母和次数
int cmp(const void *a,const void *b)
{
if((*(struct zifu *)b).f-(*(struct zifu *)a).f!=0)
return (*(struct zifu *)b).f-(*(struct zifu *)a).f;
else
return (*(struct zifu *)a).x-(*(struct zifu *)b).x;}/*这是一个用于比较两个结构体变量的函数,其中结构体包含两个成员变量f和x。如果f的值不同,则按照f的值从大到小排序;如果f的值相同,则按照x的值从小到大排序。这个函数通常用于排序算法中,例如快速排序。*/
int main()
{
char str[100];
int cou=1;
while(fgets(str, sizeof(str), stdin)!=NULL) /* changed gets() to fgets()
fgets(str, sizeof(str), stdin)
是一个用于从标准输入读取字符串的函数。它的返回值是一个非空指针,如果读取成功,则返回指向字符串的指针,否则返回NULL。因此,当fgets(str, sizeof(str), stdin)!=NULL
时,表示从标准输入成功读取了一个字符串。
以下是一个示例代码,演示了如何使用fgets()
函数从标准输入读取字符串,并判断读取是否成功:*/
#include <stdio.h>
int main() {
char str[100];
printf("请输入一个字符串:");
if (fgets(str, sizeof(str), stdin) != NULL) {
printf("读取成功,输入的字符串为:%s", str);
} else {
printf("读取失败!");
}
return 0;
}
{
if(cou++!=1)
printf("\n");
for(int i=0; i<30; i++)
{
alpha[i].f=0;
alpha[i].x=i+'A';
}
int len=strlen(str),cou=0;
for(int i=0; i<len; i++)
{
if(str[i]>='a' && str[i]<='z')
alpha[str[i]-'a'].f++;
if(str[i]>='A' && str[i]<='Z')
alpha[str[i]-'A'].f++;
}
qsort(alpha,26,sizeof(alpha[0]),cmp);
for(int i=0; i<26; i++)
{
if(alpha[i].f)
printf("%c %d\n",alpha[i].x,alpha[i].f);
}
}
return 0;
}