谁能帮我解释一下这个程序每一步的意思,谢谢啊,尤其是那个lessthan函数

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

char s[MAX_LEN];
int num[256] = { 0 }, first[256];

int lessThan(char i, char j) {
if (num[i] != num[j])
return num[i] < num[j];
return first[i] > first[j];
}

int main() {
int i, j, k;
char tmp;
fgets(s, MAX_LEN, stdin);
if (s[strlen(s) - 1] == '\n' || s[strlen(s) - 1] == '\r')
s[strlen(s) - 1] = '\0';
for (i = 0; s[i] != '\0'; i++) {
num[s[i]]++;
if (num[s[i]] == 1)
first[s[i]] = i;
}
for (i = 0; s[i] != '\0'; i++)
for (j = i + 1; s[j] != '\0'; j++)
if (lessThan(s[i], s[j])) {
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
for (i = k = 0; s[i] != '\0'; i++)
if (i == 0 || s[i] != s[i - 1]) {
k++;
printf("%c-%d%c", s[i], num[s[i]],
s[i + 1] == '\0' || k % 4 == 0 ? '\n' : ' ');
}
return 0;
}

首先要知道每个字符串都对应于一个ASCII编码,也就是码数不一样比如空格对应的ASCII十进中数为32,也就是first[32]的位置会存储的代表空格统计到的个数,然后32这个位置数按字符输出的话就是一个空格键,理解这个关键程序也就不难啦;

#include <stdio.h> //调用stdio库
#include <string.h>//调用string库
#define MAX_LEN 1000 //宏定义字符存储空间的长度

char s[MAX_LEN];//定义字符存储空间
int num[256] = { 0 }, first[256];//num存储每个字符的个数,first存储每个字符第一次出现的位置,在后面次数相同时,作为先输出用。

//根据统计次数多的先排,次数相等的最先出现的先排
int lessThan(char i, char j) { //传入两个字符的ASCII码
if (num[i] != num[j]) //判断两个字符统计的资料是否相等
return num[i] < num[j];//不相等,返回两个统计数比较
return first[i] > first[j]; //次数相等,看先那个字符最先出现
}

int main() {
int i, j, k; //定义循环临时变量
char tmp; //定义临时交换变量
fgets(s, MAX_LEN, stdin); //等待用户输入字符串
if (s[strlen(s) - 1] == '\n' || s[strlen(s) - 1] == '\r')
s[strlen(s) - 1] = '\0'; //消除输入字符串中的回车或换行符
for (i = 0; s[i] != '\0'; i++) {
num[s[i]]++; //统计字符出现的资料
if (num[s[i]] == 1) //存储字符第一次出现的位置
first[s[i]] = i;
}
for (i = 0; s[i] != '\0'; i++)
for (j = i + 1; s[j] != '\0'; j++)
if (lessThan(s[i], s[j])) {//根据lesThan判断这个字符是否要调换位置重新排序
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
for (i = k = 0; s[i] != '\0'; i++) //准备输出
if (i == 0 || s[i] != s[i - 1]) {
k++;
printf("%c-%d%c", s[i], num[s[i]],
s[i + 1] == '\0' || k % 4 == 0 ? '\n' : ' ');
}
return 0;
}追问

真的谢谢啊,不过我还想知道num[s[i]]这个是什么意思啊,num数组里存的是是s[i]的ASCII编码值吗

追答

ASCII已经可以在s[i]里体现出来了,上面有用到num[s[i]],这个就是根据s[i]字符的ASCII码数然后找在num存储的位置,假如s[i]存的是'A'这个字符,那么他对应的ASCII码数就是65,num[s[i]]也就是num[65],'A'出现一次,num[65]里面就加一。对应不同的字符位置是不一样的,num数组里统计某个位置字符出现的次数

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-29
让我用电脑给你回答.现在是手机.打字太慢了.

谁能帮我解释一下这个程序每一步的意思,谢谢啊,尤其是那个lessthan函数...
首先要知道每个字符串都对应于一个ASCII编码,也就是码数不一样比如空格对应的ASCII十进中数为32,也就是first[32]的位置会存储的代表空格统计到的个数,然后32这个位置数按字符输出的话就是一个空格键,理解这个关键程序也就不难啦;include <stdio.h> \/\/调用stdio库 include <string.h>\/\/调用s...

解释一下 这个程序 每一步都是什么意思
一种很朴实的办法实现了从大到小排序。从第一个数开始,后面的依次和它比较,遇到大的就互换。一轮遍历结束后,就找出了最大的一个数放在第一位。然后前移一位,进行下一轮遍历,直到最后。数列也按从大到小排列好了。说明白一点,就是从要排列的位开始,找出后面最大的一个数,然后把那个数和出...

谁能帮我解释一下 下面的程序是啥意思啊 每一步最好都说清楚啊
这个程序的整体意思是求0--100中不能被7或11整除的数并打印出来

谁能告诉我这个程序每一步的意思啊?
printf("Total steps: %d\\n", steps);\/\/输出最后一次也就是steps能被7整除的steps的值 return 0;}

求解释下下面单片机程序的每一步是什么意思,谢谢了
既然你还没学汇编,我就不用专业术语给你解释了,用好理解的方法帮你简单解释下,如果有必要我们再讨论 org 0000h ;表示下一条指令的地址是0000h ljmp 0030h ;跳转到30h处的指令 org 0030h cword:mov a,#0c5h ;cword:人为定义的标号,mov a,#0c5h :把0c5h放入a寄存器里 ...

pascal语言Pascal程序:请帮我解释下 这个程序的每一步意思
Begin \/\/程序入口,开始 t:=0; \/\/给t赋值,使t为0 for a:=1 to n do \/\/以下语句执行n次,即7次 for b:=1 to n do \/\/以下语句执行n次,即7次,因为上面要求循环7次,所以实际是49次 for c:=1 to n do \/\/以下语句执行n次,即7次,因为上面要求循环49次,所以下面的语句一共...

请matlab高手帮忙分析一下这个程序。详细解释每一步什么意思!答案满意...
你透露的信息太少了,起码应该告知一下这个程序是用来干什么的,大概用的是什么算法啊。看来只能猜了,从最后画出的图来看,感觉这个程序的目的用逼近的方法得到一条分界线的样子,具体是什么算法,看不出来。你看看我的注解,自己研究一下吧。在网页里可能显得比较乱,你复制粘贴到matlab的编辑器了再看...

求程序员大神解释一下~每一步都是什么意思?
第一行 。声明一些字符。第二行。 输入c1,c2,c3字符。回车 第三行。 输出c4,c5 第四行。程序结束。

问两道有关c语言字符指针的问题,请将程序每一步的意思告诉我,谢谢啦
第一题答案:B。理由:*s与*t都是取出此时地址存储的值,while()语句里面的意思是,当指针s与t都不为空并且s指向的值等于t指向的值。。。当s或者t为空或者t与s指向的值不同时,while()结束,返回此时s指向的值减去t指向的值,所以为比较两个字符串的大小;第二题答案:A。理由:x的地址赋值...

这个程序什么意思 能把每一步意思讲一下吗 上面的解释看不懂 能通俗...
如果这个程序P1上的8位IO(Output)接的全是灯,P0的第0位IO(Input)接的是物理按键 具体是灯依次1灭7亮,2灭6亮,3灭5亮,4灭4亮,5灭3亮,6灭2亮,7灭1亮 一直循环上面的流水灯现象 直到按下物理按键,灯全灭若干时间,再全亮若干时间,最后全灭,程序停止,直到复位重启 ...

相似回答