C言語関係掲示板

過去ログ

No719 使われている文字の頻度を調べ多い順に出力

[戻る] [ホームページ]
No.8713

使用頻度計算プログラムを作りたいのです。
投稿者---しいたけ(2003/07/31 01:39:47)


途中まで作ったのですが、あってるのかどうかさえ
わからなくなってきました。丸投げっぽくて申し訳
ないのですが教えて頂ければ助かります。

作りたいのは文章を読み込んで、使われている文字の
頻度を調べ多い順に出力するというプログラムです。
調べる文字は英数字で大文字小文字の区別はしません。

よろしくお願いします。


#include <stdio.h>

#define SIZE 1000

main()
{
  char buf[SIZE];
  int alpha, num;
  int i;
  int a[36];

  alpha = num = 0;
  for(i=0;i<36;i++) a[i]=0;

  while(fgets(buf, SIZE, stdin) != NULL) {

   for (i = 0; buf[i] != '\0'; i++){
    if (buf[i]=='a' || buf[i]=='A') a[10]++;
    if ((buf[i] >= 'a' && buf[i] <= 'z') || 
        (buf[i] >= 'A' && buf[i] <= 'Z')) {
     alpha++;
   }
   else if (buf[i] >= '0' && buf[i] <= '9') {
     num++;
   }
  } 
 }
 printf("Alphabet: %6d\n", alpha);
 printf("Number  : %6d\n", num);
 printf("a %d",a[10]);
}


No.8715

Re:使用頻度計算プログラムを作りたいのです。
投稿者---nop(2003/07/31 09:40:18)


>作りたいのは文章を読み込んで、使われている文字の
>頻度を調べ多い順に出力するというプログラムです。
>調べる文字は英数字で大文字小文字の区別はしません。

とりあえず、仕様をもっと詳しく書いて下さい。

No.8733

Re:使用頻度計算プログラムを作りたいのです。
投稿者---しいたけ(2003/07/31 13:57:46)


>>作りたいのは文章を読み込んで、使われている文字の
>>頻度を調べ多い順に出力するというプログラムです。
>>調べる文字は英数字で大文字小文字の区別はしません。
>
>とりあえず、仕様をもっと詳しく書いて下さい。

説明不足ですみません。
出力形式は以下のとおりです。

大文字小文字を区別しなければアルファベットは26文字、数字は10文字。
大きさ36の配列aを用意し
a[0]〜a[9]: 数字0〜9の頻度 
a[10]〜a[35]: アルファベットの頻度
とする。

大きさ36の配列bにはそれぞれ対応する文字を入力しておき、配列aを
大きい順に並び替えるとき対応が崩れないようにbのほうも変化させる。

実行例

1: e 5109

2: t 3768

3: o 2743

以下省略 


よろしくお願いします。


No.8739

Re:使用頻度計算プログラムを作りたいのです。
投稿者---あかま(2003/07/31 16:10:17)


見た感じ大体あっているような感じはします。
if (buf[i]=='a' || buf[i]=='A') a[10]++;
をえんえん'z'まで書いていかなきゃならんのかと悩んでいると勝手に推測します。

添え字のうまい計算の仕方として
'1'-'0'
で数字の1、
'c'-'a'
で数字の2がでます。

これを使ってbuf[i]が

'0'〜'9'の時は
a[buf[i]-'0']

でa[]の目的の添え字がでるはずです。同様に

'a'〜'z'の時は
a[buf[i]-'a'+10]

'A'〜'Z'の時は
a[buf[i]-'A'+10]

で出るかと思います



No.8740

Re:使用頻度計算プログラムを作りたいのです。
投稿者---しいたけ(2003/07/31 16:13:47)


ありがとうございました!



No.8741

Re:使用頻度計算プログラムを作りたいのです。
投稿者---nop(2003/07/31 16:27:05)


とりあえず、こんなのを参考にどうぞ。

#include    <stdio.h>
#include    <string.h>
#include    <ctype.h>
#include    <limits.h>


int main( void )
{
    /* ***** 内部変数定義 ***** */
    int     count[1+UCHAR_MAX] = {0};
    char    buf[1024] = { '\0' };
    char    *p;
    int        i;

    /* ****************************************
        各文字の出現数をカウントする文字列を入力
    **************************************** */
    do
    {
        /* ***** プロンプト表示 ***** */
        fprintf( stderr, ">>" );

        /* ***** 文字列入力 ***** */
        fgets( buf, sizeof(buf), stdin );
        ( p=strrchr(buf,'\n') ) ? *p='\n' : 0;    /* 改行除去 */
    } while( !buf[0] );

    /* ****************************************
        文字列中の各文字の出現数をカウントする
    **************************************** */
    for( i=0; buf[i]; i++ )    /* 文字列終端までループ */
    {
        if( isalnum(buf[i]) )    /* 英数字か? */
        {
            /* ***** 文字をカウント ***** */
            count[tolower(buf[i])]++;
        }
    }

    /* ****************************************
        各文字の出現数を表示する
    **************************************** */
    for( i=0; i<=UCHAR_MAX; i++ )
    {
        if( isdigit(i) || islower(i) )    /* 英数字か? */
        {
            /* ***** 文字の出現数を表示 ***** */
            printf( "%c : %d\n", i, count[i] );
        }
    }
    return 0;
} /* ***** main() ***** */