C语言:编写一个程序,接收用户输入的一个字符串(可以包含空格),统计其中所有出现过的所有字符,并按照频率高低的顺序排列输出。频率相同的字符按输入顺序输出。

【问题描述】编写一个程序,接收用户输入的一个字符串(可以包含空格),统计其中所有出现过的所有字符,并按照频率高低的顺序排列输出。频率相同的字符按输入顺序输出。
【输入形式】用户在第一行输入一个字符串,以回车结束输入。
【输出形式】程序统计字符串中出现的所有字符,然后按照字符出现频率大小排序输出,频率相同时,按输入顺序输出。输出形式规定为每行输出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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 C 语言结构体实现该功能的程序: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 // 字符串最大长度 #define MAX_CHARS 256 // 字符集大小 // 定义一个结构体表示字符出现次数 struct CharFreq { char c; // 字符 int freq; // 出现次数 }; // 统计字符串每个字符出现次数 void count_chars(const char *str, struct CharFreq *freqs, int *n) { int len = strlen(str); int i, j; for (i = 0; i < len; i++) { char c = str[i]; // 在已有的字符频率查找该字符 for (j = 0; j < *n; j++) { if (freqs[j].c == c) { freqs[j].freq++; break; } } // 没找到该字符,新增一个字符频率 if (j == *n) { freqs[j].c = c; freqs[j].freq = 1; (*n)++; } } } // 比较两个字符频率的大小 int cmp_char_freq(const void *p1, const void *p2) { const struct CharFreq *f1 = (const struct CharFreq *)p1; const struct CharFreq *f2 = (const struct CharFreq *)p2; if (f1->freq != f2->freq) { return f2->freq - f1->freq; } else { return f1 - f2; } } int main() { char str[MAX_LEN]; struct CharFreq freqs[MAX_CHARS] = {0}; int n = 0; // 字符频率数组已有的字符数 int i; printf("请输入一个字符串(可以包含空格):\n"); fgets(str, MAX_LEN, stdin); count_chars(str, freqs, &n); // 按照字符频率排序 qsort(freqs, n, sizeof(struct CharFreq), cmp_char_freq); // 输出结果 printf("按照字符出现频率排序的结果:\n"); for (i = 0; i < n; i++) { printf("%c %d\n", freqs[i].c, freqs[i].freq); } return 0; } ``` 程序首先定义了一个结构体 `CharFreq` 表示字符出现次数,然后通过一个函数 `count_chars` 统计字符串每个字符出现次数,使用一个结构体数组 `freqs` 存储每个字符出现频率。函数 `cmp_char_freq` 定义了比较两个字符频率大小的规则,然后使用 `qsort` 函数对字符频率数组进行排序。最后输出排序后的字符频率数组即可。 注意,为了方便处理,程序使用了一个常量 `MAX_CHARS` 表示字符集大小,这里假设输入字符串包含 ASCII 码字符,因此字符集大小为 256。如果输入字符串可能包含 Unicode 码字符,则需要根据实际情况调整字符集大小。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值