出现频率-一道C语言编程题,本人初学者,求大神解答

问题描述

一道C语言编程题,本人初学者,求大神解答

编写程序实现功能:数据文件story.txt是一篇英文小故事,请先统计其中26个字母的出现次数。
要求一:再根据用户要求,输出某个字母的出现次数,直到用户输入#为止。
要求二:请输出出现频率最高的三个字母和它们的出现次数。

解决方案

#include
#include
#include
int main()
{
int alpha[26]={0}; //用于计数26个字母出现的次数
FILE *text; //FILE 指针
char ch;

if((text=fopen("Story.txt","r"))== NULL){
    printf("File open error!");
    exit(0);
}//如果没有文件则提示错误

while((ch=fgetc(text))!=EOF){
    ch = tolower(ch);
    if(ch>='a'&&ch<='z'){
        alpha[ch-'a']++;
    }
}//将每个字母出现的次数存放到lpha数组中
fclose(text);

int isSelected[26] ={0};//用于标记是否已经被选为前三个
int i;
int FIndex=0,SIndex=0,TIndex=0;//分别记录前三个字母的下标
int MaxNum = 0;
for(i=0;i<26;i++){
    if(!isSelected[i]){
        if(alpha[i]>MaxNum){
            FIndex = i;
            MaxNum = alpha[i];
        }
    }
}
isSelected[FIndex] = 1; //在未被选择的字母中比较出当前次数最多的,则为第一个

MaxNum = 0;
for(i=0;i<26;i++){
    if(!isSelected[i]){
        if(alpha[i]>MaxNum){
            SIndex = i;
            MaxNum = alpha[i];
        }
    }
}
isSelected[SIndex] = 1;//在未被选择的字母中比较出当前次数最多的,则为第二个

MaxNum = 0;
for(i=0;i<26;i++){
    if(!isSelected[i]){
        if(alpha[i]>MaxNum){
            TIndex = i;
            MaxNum = alpha[i];
        }
    }
}
isSelected[TIndex] = 1;//在未被选择的字母中比较出当前次数最多的,则为第三个

printf("前三个字母:%c %c %cn出现的次数:%d %d %dnn",'a'+FIndex,'a'+SIndex,'a'+TIndex,
       alpha[FIndex],alpha[SIndex],alpha[TIndex]);

printf("Enter a Letter to check its count(end with input #):nn");
while((ch=getchar())!='#'){
    ch = tolower(ch);
    if(ch<'a'|| ch>'z')printf("Enter a letter !n");
    else {
        printf("time(s):%dn",alpha[ch-'a']);
    }
    getchar();
}//判断是否为‘#’,如果不是则打印相应的次数

}


解决方案二:

答案
http://zhidao.baidu.com/link?url=Nadtw7S-7KdNfrht5mu6DVrvbmyQU37rv59E1z0EnZzS2KWVeLdpoOGNQq9p6XG3_doDDT6q-6y0rI-_-Ywvcn-wTKVLC3rG8V75X0m7Aqe

解决方案三:

代码自己去搜google,这里说思路
定义一个数组,26个元素长,遍历你的字符串,然后放入对应的下标(因为字母在ascii是连续的,只要用字符减'a'就可以得到下标,不需要switch,为了避免特殊字符,对结果判断下是不是0-25)
然后遍历完了就统计好了。

解决方案四:

怎么回复功能这么不好,提供的代码显示模块这么不好,还把我打的代码漏显示了一些,无语了,

解决方案五:

前三个头文件为:
#include
#include // exit(int num); 退出并返回数字num结束
#include // tolower(char ch); 把ch转换为小写字母

解决方案六:

原来只有头文件显示不了。。。
stdio.h>
stdlib.h>
ctype.h>

解决方案七:

这道题的重点在于文件的 读写操作和字母的判断
难点在于 怎么满足题目要求:要显示前三个字母,又要让用户随便输入来查看

读写操作和字母的判断 下面的代码里有,对于我说的难点,解决办法是:除了创建储存字母数的alpha数组,为了不破坏alpha里的内容,额
外创建了一个isSelected数组来标记元素是否被选为前三个字母。

解决方案八:

初学者,看答案的.....................

时间: 2024-08-29 23:17:38

出现频率-一道C语言编程题,本人初学者,求大神解答的相关文章

c语言-两道C语言编程题:求教各位大神

问题描述 两道C语言编程题:求教各位大神 两元一瓶啤酒,两个啤酒瓶换一瓶啤酒,四个啤酒瓶盖换一瓶啤酒,输入的金额可以买几瓶. 输入一串字符串,写两个函数,第一个函数使输入的字符串全都后移一位,第二个函数将字符串中的字母大写换小写,小写换大写?. 拜托各位了 谢谢~ 解决方案 第一个问题描述不清,不知道是不是可以借啤酒瓶和瓶盖,我的程序按照不可以编写: #include <stdio.h>int foo(int money){ int c = money / 2; int c1 = 0; int

二叉树 求结点个数-c++编程,,跪求大神解答

问题描述 c++编程,,跪求大神解答 #include using namespace std; template struct BiNode { BiNode *lchild; datatype data; BiNode *rchild; }; template struct element { BiNode *ptr; int flag; }; BiNode *first,*bt,*q,*temp,stack[20],queue[20]; element s[20]; int count=0

不懂c语言基础的问题,求大神解答。

问题描述 不懂c语言基础的问题,求大神解答. for(j=0;j<=9;j++){ scanf(""%d""&i); a[j]=i;} 这样写为什么不行? 原代码:#includeint main(){ int a[10]ijz; printf(""请输入十个数值:""); for(j=0;j<=9;j++) scanf(""%d""&i); a[j]=i;

malloc-关于c语言二叉树的问题,求大神解答,急

问题描述 关于c语言二叉树的问题,求大神解答,急 这是一段关于二叉树的代码.*list_from_tree这个函数是用来建立二叉树的,但我不太懂它是如何建立二叉树的,求大神详细解释. #include #include typedef struct tnode Tnode; struct tnode{ Tnode *left; Tnode *right; int data; }; Tnode *new_tnode(int data); void print_tree(Tnode *tree, i

内存管理-一道编程题用c语言实现这些功能时间有限1天时间求大神解答

问题描述 一道编程题用c语言实现这些功能时间有限1天时间求大神解答 有用户空间100kb,并规定作业的相应程序浇入内存连续区域,并不能被移动.作业与进程均采用sjf算法.输入为一组作业的进入时间,需要的内存容量(不超过100k)和运行时间. 要求: (1)按时间顺序给出每个作业的执行顺序,开始时间和结束时间,以及发生调度时内存各分区的状态: (2)计算这组作业的平均周转时间和平均带权周转时间: (3)实现作业一级调度和进程一级调度,包括调度算法和数据结构: (4)实现动态分区内存管理,包括内存分

单链表-请教C编程题,本人初学者,求大神解答,万分感谢

问题描述 请教C编程题,本人初学者,求大神解答,万分感谢 求大侠帮忙:C语言程序设计---编程题说明:以下所有题目程序应是非递归的) 编写一个函数,输出整数m的全部素数因子.例如,m=120时,素数因子为:2,2,2,3,5 请编写程序判断一个字符串是否是回文.若是回文,函数返回值为1,否则返回值为0.(回文是顺读和倒读都一样的字符串).要求: 1) 编写sub()判断一字符串是否为回文 2) 在主函数中完成数据的输入与结果的输出 3.起泡排序是把大的元素向下移,也可以将小的元素向上移,请给出下

字符-一道acm水题 all in all 一直找不出错误 求大神解答

问题描述 一道acm水题 all in all 一直找不出错误 求大神解答 描述字符串s和t均由字母组成,若在t中除去一些字母能够得到s,我们就说s是t的一个子串.比如abc就是acbefc的子串(acbefc去掉第二.第四.第五个字符后就得到abc)输入有若干组输入数据,每组一行,分别为字符串s和t,s与t之间用空格隔开输出对于一组s与t,若s是t的子串,则输出Yes,否则输出No 样例输入sequence subsequence abc acb VERDI vivaVittorioEmanu

c++-一道OJ上的题,数的划分,求大神解答

问题描述 一道OJ上的题,数的划分,求大神解答 有N个排列好的数,不改变排列次序,要分成K个部分,每个部分至少有一个数, (其中K <=N),若将每一个部分的数相乘,然后将K个部分相加,则可以得到一个表达式,求这个表达式的最大数值. 输入格式文件第一行为2个整数N.K下面N行为N个整数(N<=100,整数的范围都在整型以内)样例输入5 2 12345 样例输出121 我的思路是动态规划:以f(ij)表示分成i组,最后一个数是j的最大数值.以下是我的代码: #include <iostre

tang-c++编程题,求大神解答............谢谢啦...........

问题描述 c++编程题,求大神解答............谢谢啦........... 在一个数组中首先判断里的自符是否为回文字符,如果是在按其长度排序,若相同长度的则按ASCII码排序(用c++)求大神解救....... 解决方案 花了一小时弄的,,,亲测. #include<iostream> using namespace std; bool judge(char *str); void sort(char *Selected[],int n); int Length(char *str