c语言求字频
‘壹’ c语言 统计字母频率
看我旁边做的注解
cnt(s,array); /*调用子函数cnt,并传给参数s, array。s是字符数组,相当于字符串指针;array是数组好理解*/
for(i=0;i<26;i++)
printf("%d",array[i]); /* for循环 依次输出26个字母出现的次数。这里%d后面加个空格或逗号分隔才好 */
printf("\n");
子函数
void cnt(char *p,int arr[]) /* 第一个参数是字符串指针,第二个参数是整型数组 */
{
int i;
for(i=0;i<26;i++) /*数组初始化*/
arr[i]=0; /* 26个字母的个数全初始设置为0 */
while(*p) /* 循环,*p表示取指针p所指的字符,如果为0则表示字符串结束,退出循环 */
{
if(*p>='a'&&*p<='z') /*数组元素判断*/ /* 判断是否是a到z的字母,若是才统计*/
arr[*p-'a']++; /*p与字母a的差值刚好就是数组arr下标*/ /* 字母a对应数组的下标是0, b是1,依次类推 */
p++; /* 指针加1, 指向后面一个字符 */
}
}
这样可以么?
‘贰’ c语言 求在输入的字符序列中统计各个小写字母出现的频率。
#include "stdio.h"
main()
{ int n[26]={0},i,j;
char m[200];
gets(m);
for(i=0;m[i]!='\0';i++)
if(m[i]>=97 && m[i]<=122)
n[m[i]-97]++; /*取得每个小写字母出现的个数*/
for(j=0;j<26;j++)
if(n[j]!=0)
printf("%c is %d/%d\n",97+j,n[j],i);
}
或者用下面的程序,更好懂些。
#include "stdio.h"
main()
{ int n[26]={0},i,j;
char m[200];
gets(m);
for(i=0;m[i]!='\0';i++)
if(m[i]>=97 && m[i]<=122)
{switch(m[i])
{
case 'a': n[0]+=1;break;
case 'b': n[1]+=1;break;
case 'c': n[2]+=1;break;
case 'd': n[3]+=1;break;
case 'e': n[4]+=1;break;
case 'f': n[5]+=1;break;
case 'g': n[6]+=1;break;
case 'h': n[7]+=1;break;
case 'i': n[8]+=1;break;
case 'j': n[9]+=1;break;
case 'k': n[10]+=1;break;
case 'l': n[11]+=1;break;
case 'm': n[12]+=1;break;
case 'n': n[13]+=1;break;
case 'o': n[14]+=1;break;
case 'p': n[15]+=1;break;
case 'q': n[16]+=1;break;
case 'r': n[17]+=1;break;
case 's': n[18]+=1;break;
case 't': n[19]+=1;break;
case 'u': n[20]+=1;break;
case 'v': n[21]+=1;break;
case 'w': n[22]+=1;break;
case 'x': n[23]+=1;break;
case 'y': n[24]+=1;break;
case 'z': n[25]+=1;break;
}
}
for(j=0;j<26;j++)
if(n[j]!=0)
printf("%c is %d / %d\n", 97+j, n[j], i);
}
‘叁’ C语言编程:输入一字符串,统计字符串中各个字符出现的频率
可以先排序,在遍历统计。
#include<stdio.h>
#include<string.h>
//升序字符串src,然后返回
char*sort(char*src)
{
chartem,len=strlen(src);
for(inti=0;src[i];i++)
{
for(intj=0;j<len-i-1;j++)
if(src[j]>src[j+1])
{
tem=src[j];
src[j]=src[j+1];
src[j+1]=tem;
}
}
returnsrc;
}
intmain()
{
charstr[1000],ch;
inti=0,cnt;
printf("inputastring:");
gets(str);
sort(str);//排序
ch=str[0];
cnt=1;
for(i=1;str[i];i++)//遍历统计
{
if(str[i]!=ch)
{
if(cnt)
printf("%chas%d. ",ch,cnt);
ch=str[i];
cnt=1;
}
else
cnt++;
}
if(cnt)
printf("%chas%d. ",ch,cnt);
return0;
}
‘肆’ 从一个C语言源程序文件中 统计出该C程序中使用的关键字及其频率
以下程序已经编译运行确认,需要将C语言源程序文件保存为a.c:
#include <stdio.h>
#include <string.h>
#define Key_Num 32 //C语言共有32个关键字
#define Len_Min 2 //最短的长度为2
#define Len_Max 8 //最长的长度为8
const char Key[Key_Num][Len_Max+1]={
"auto","break","case","char","const","continue","default","do","double",
"else","enum","extern","float","for","goto","if","int","long","register",
"return","short","signed","sizeof","static","struct","switch","typedef",
"union","unsigned","void","volatile","while"
};
int count[Key_Num];
char input[Len_Max+1];
void CheckKeyWord(){
int i,result;
for(i=0;i<Key_Num;i++){
result=strcmp(input,Key[i]);
if(result==0){
count[i]++;
break;
}
if(result<0)
break;
}
}
int IsKeyLetter(char c){
return c>='a' && c<='z';
}
int IsOtherLetter(char c){
return c>='A' && c<='Z' ||
c>='0' && c<='9' || c=='_';
}
enum MY_STATE{
INVAILD,//初始时
IN_QUOTE,//引号内
IN_QUOTE_TRANS,//引号内读到转义符
IN_WORD,//有可能是关键词
NOT_KEY,//不是关键词
COMMENT_1,//第一个注释符(/)
COMMENT_LINE,//行注释
COMMENT_BLOCK,//块注释
COMMENT_BLOCK_1//块注释内读到'*'
};
int main(){
FILE *fi;
int i;
enum MY_STATE state;
fi=fopen("a.c","r");
if(fi==NULL) return 1;
i=0;
state=INVAILD;
memset(count,0,sizeof(count));
while(fscanf(fi,"%c",&input[i])==1){
switch(state){
case INVAILD:
if(IsKeyLetter(input[i])){
state=IN_WORD;
i++;
}
else if(IsOtherLetter(input[i]))
state=NOT_KEY;
else if(input[i]=='\"')
state=IN_QUOTE;
else if(input[i]=='/')
state=COMMENT_1;
break;
case IN_QUOTE:
if(input[i]=='\\')
state=IN_QUOTE_TRANS;
else if(input[i]=='\n')//这里漏引号,编译错误。
state=INVAILD;
break;
case IN_QUOTE_TRANS:
if(input[i]=='\n')//这里漏引号,编译错误。
state=INVAILD;
else
state=IN_QUOTE;
break;
case IN_WORD:
if(IsKeyLetter(input[i])){
if(i<Len_Max)
i++;
else{
i=0;
state=NOT_KEY;
}
}
else if(IsOtherLetter(input[i])){
i=0;
state=NOT_KEY;
}
else{
input[i]='\0';
CheckKeyWord();
i=0;
if(input[i]=='\"')
state=IN_QUOTE;
else if(input[i]=='/')
state=COMMENT_1;
else
state=INVAILD;
}
break;
case NOT_KEY:
if(input[i]=='\"')
state=IN_QUOTE;
else if(input[i]=='/')
state=COMMENT_1;
else if(!IsKeyLetter(input[i]) && !IsOtherLetter(input[i]))
state=INVAILD;
break;
case COMMENT_1:
if(input[i]=='/')
state=COMMENT_LINE;
else if(input[i]=='*')
state=COMMENT_BLOCK;
else if(IsKeyLetter(input[i])){
state=IN_WORD;
i++;
}
else if(IsOtherLetter(input[i]))
state=NOT_KEY;
else
state=INVAILD;
break;
case COMMENT_LINE:
if(input[i]=='\n')
state=INVAILD;
break;
case COMMENT_BLOCK:
if(input[i]=='*')
state=COMMENT_BLOCK_1;
break;
case COMMENT_BLOCK_1:
if(input[i]=='/')
state=INVAILD;
else
state=COMMENT_BLOCK;
break;
}
}
fclose(fi);
fi=fopen("keyword.txt","w");
if(fi==NULL) return 1;
for(i=0;i<Key_Num;i++)
fprintf(fi,"%s: %d\n",Key[i],count[i]);
fclose(fi);
return 0;
}
‘伍’ 字母频率统计-C语言
1、char a2[][26]={0};
按照你这种写法 这个数组只有一行,也就是等效于char a2[1][26]={0};
所以当出现超过一个字符的时候 调用越界,导致崩溃。
如果你准备用二维数组的话,那么大小需要动态分配。
但实际上,没必要用数组,直接输出就好了。
2、 输入没有说以.结束,而是说以ctrl+z结束。
改了一版代码,你看看:
#include<stdio.h>
intmain()
{
intc;
inta[26]={0};
inti=0,j=0,max;
while((c=getchar())!=EOF)
{
if(c>='a'&&c<='z')
a[c-'a']++;
}//用a[0]大小表示字母a出现次数,其他字母分别用a[1],a[2]…a[25]表示。
for(i=1,max=a[0];i<26;i++)
{
if(a[i]>max)
max=a[i];
}
for(i=max;i>0;i--)
{
for(j=0;j<26;j++)
{
if(a[j]>=i)putchar('*');
elseputchar('');
}
putchar(' ');
}
printf("abcdefghijklmnopqrstuvwxyz ");
return0;
}
‘陆’ 用C语言统计字母的使用频率
分怎么少要求这么多,我也简单点回答: 写出了代码还是要给你解释 ..
分析:1.定义:str[200]装字符串,s[26]装26个字母对应出现的频率,
根据你的要求:
(根据三的分析,主要问题在于:)内容
*p=str n=0; 由于只有英文字母数组中,所以:
if('a'<=*p<='z')while(*p){s[*p-'a']++;p++} /*对于s[*p-'a']++;解释一下:if里说明了是 小写字母,所以*p-'a'就是对应的acs2码相减, 得出的数也就是字母a后面的数..*/
if()就把上面小写改成大写就行 //这里A与a都统计在s[0]里 ..类推..
这样出现的次数就统计在s[26]里了 排序会撒?常用冒泡法 ..
创新要求: 就是文件那章内容 读写而已 字符串不是靠手输入str[]中...fgets
是否可以解决您的问题?
‘柒’ C语言显示一段字符串中每个字符出现的频率
每个字符出现的次数除以总共字符数即为出现的频率,频率具体可以用百分数或纯小数表示均可,可以人为约定。
‘捌’ 急求C语言编写的汉字字词频率统计系统
你好!
这个程序有点麻烦,要费些时间,程序什么时间要,私,信,说,明,一,下
‘玖’ c语言 求频率的问题 !
#include <stdio.h>
#include <string.h>
#include <cstdlib>
//以上是头文件。
int main(void)
//创建主函数
char s[100]={0}; //字符 s取100个(s1.s2......s100)赋值0域
int freq[256]={0}; //设freq取256个(freq1.......freq256)赋值0域
int i;//设i
printf("请输入:"); //用户键入值
gets(s); //得值s
for(i=0;i<strlen(s);i++) //循环i赋值0且i小于stren(s)且i后置递增
freq[s[i]]++; //freq取s在i中取且后置递增;
for(i='a';i<='z';i++); //循环i赋值"a"且i小于"z"且i后置递增;
printf("%c: %d\n", i, freq[i]); //机器自动输入变量c、d\n、i以及freqi中取;
system("pause"); //系统暂停
return 0; //返回0
} //待续之后程序。
‘拾’ c语言,统计字母频率,看下我编的哪里有问题
【1】int b[26]而不是int b[25]
【2】 a[i]=+32; //应该是a[i] += 32
【3】void paixv(int b[]){ b[26]=0;b[27]=0; //这个 b[26]=0;b[27]=0;没用,而且是错的
【4】另外不要写32,97这些,尽量用'a' - 'A'这样表示
【5】number函数很不好,可以这么实现
void number(char a[],int b[])
{
int i;
for(i=0; i<26; i++)
++b[a[i]-'a'];
}