【问题描述】编写一个程序,接收用户输入的一个字符串(可以包含空格),统计其中所有出现过的所有字符,并按照频率高低的顺序排列输出。频率相同的字符按输入顺序输出。
【输入形式】用户在第一行输入一个字符串,以回车结束输入。
【输出形式】程序统计字符串中出现的所有字符,然后按照字符出现频率大小排序输出,频率相同时,按输入顺序输出。输出形式规定为每行输出4个字符数据,输出格式为:字符-出现次数。每个字符-出现次数输出中间用一个空格分隔,每行末尾没有空格。程序输出结尾有一个回车。
【样例输入】
The job requires an agile mind.
【样例输出】
#-5 e-4 i-3 r-2
a-2 n-2 T-1 h-1
j-1 o-1 b-1 q-1
u-1 s-1 g-1 l-1
m-1 d-1 .-1 #表示空格(在程序请输出空格,而不是字符’#’,这里只是表示而已。)
【样例说明】用户首先输入字符串The job requires an agile mind. 程序统计完毕之后按照每行4个统计结果输出,字符串中有5个空格,所以输出为#-5,#表示空格。字符’b’和’T’出现次数同为1,因为输入时’b’先于’T’输入,所以输出时也先打印’b’的统计信息。
【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:frequence.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
int num;
char chara;
}Numb;
void Change(Numb* m, Numb* n)
{
Numb a;
a.chara = m -> chara;
a.num = m->num;
m->chara = n->chara;
m->num = n->num;
n->chara = a.chara;
n->num = a.num;
}
void Sort(Numb* L, int q)
{
int i = 0;
int j = 0;
for (i = 0; i < q - 1; i++)
{
for (j = 0; j < q - i - 1; j++)
{
if (L[j].num < L[j + 1].num)
Change(&L[j], &L[j + 1]);
}
}
}
int main()
{
char index[80];
Numb late[80];
memset(late, 0, sizeof(late));
gets(index);
int i = 0;
int j = 0;
int x = 0;
for (i = 0; i < strlen(index); i++)
{
for (j = 0; j < x; j++)
{
if (late[j].chara == index[i])
{
late[j].num++;
break;
}
}
if (j == x)
{
late[x].chara = index[i];
late[x].num = 1;
x++;
}
}
Sort(late, x);
for (i = 0; i < x; i++)
{
printf("%c-%d ", late[i].chara, late[i].num);
if ((i + 1) % 4 == 0)printf("\n");
}
printf("\n");
return 0;
}