C言語で文書中の文字の頻度を計算するプログラムを作成したい
Posted: 2015年6月18日(木) 21:35
学校の課題がわからないのでここで、質問させていただきます。
以下にベースとなるコードを表記しこのコードを習性して、C言語で文書中の文字の頻度を計算するプログラムを作成します。
コードの仕様を箇条書きすると、
1、標準入力よりASCII文字を読み込み、文字の頻度の降順に、頻度が同じならばASCII表の順にソートし,各行に「文字 頻度」の形式で出力
2、大文字と小文字を区別せずに頻度を計算
3、空白(SP)、改行(CR)、タブ(HT)の頻度は計算しない、図形文字以外の文字は頻度を計算しない
4、頻度情報の出力順は実行例と同じにします。特に頻度が0の文字を表示してはいけない
です。
コードの必須条件を箇条書きすると、
A.頻度情報を格納するために、構造体を必ず定義、構造体名、メンバ名およびデータ型は自由
B.その構造体を格納する配列をmain関数の局所変数として定義、配列のメモリ領域をmalloc関数で確保する必要無し
C.main関数以外に2個以上の関数を定義
D.文字の入力にはgetchar関数を使用
E. 文字種の判断はisupper関数などを使用
です。
テストデータの中身は、
#09=#@ahz
0099==hhzz
99h
です。このテストデータを用いて課題のコードを実行すると
9 5
h 4
0 3
= 3
z 3
# 2
@ 1
a 1
となります。
下記のURLにアスキー表へのリンクを張りました。
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
自作したコードでは、構造体の宣言があいまいなので、頻度の値がおかしくなってしまいます。しかし、どこをどうなおせばいいのかわからないため、手のつけようがありません。ご協力お願い致します。以下に自作したコードを記します。
よろしくお願いいたします。
以下にベースとなるコードを表記しこのコードを習性して、C言語で文書中の文字の頻度を計算するプログラムを作成します。
#include <stdio.h>
#include <ctype.h>
int main(void) {
int x;
int count[128] = { 0 };
x = getchar();
while (x != EOF) {
if (isgraph(x)) {
count[x] += 1;
}
x = getchar();
}
for (x = 0; x < 128; x++) {
if (count[x] != 0) {
printf("%c %3d\n", x, count[x]);
}
}
return 0;
}
1、標準入力よりASCII文字を読み込み、文字の頻度の降順に、頻度が同じならばASCII表の順にソートし,各行に「文字 頻度」の形式で出力
2、大文字と小文字を区別せずに頻度を計算
3、空白(SP)、改行(CR)、タブ(HT)の頻度は計算しない、図形文字以外の文字は頻度を計算しない
4、頻度情報の出力順は実行例と同じにします。特に頻度が0の文字を表示してはいけない
です。
コードの必須条件を箇条書きすると、
A.頻度情報を格納するために、構造体を必ず定義、構造体名、メンバ名およびデータ型は自由
B.その構造体を格納する配列をmain関数の局所変数として定義、配列のメモリ領域をmalloc関数で確保する必要無し
C.main関数以外に2個以上の関数を定義
D.文字の入力にはgetchar関数を使用
E. 文字種の判断はisupper関数などを使用
です。
テストデータの中身は、
#09=#@ahz
0099==hhzz
99h
です。このテストデータを用いて課題のコードを実行すると
9 5
h 4
0 3
= 3
z 3
# 2
@ 1
a 1
となります。
下記のURLにアスキー表へのリンクを張りました。
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
自作したコードでは、構造体の宣言があいまいなので、頻度の値がおかしくなってしまいます。しかし、どこをどうなおせばいいのかわからないため、手のつけようがありません。ご協力お願い致します。以下に自作したコードを記します。
#include <stdio.h>
#include <ctype.h>
typedef struct asc2{
char asc2char;
int fre;
} ASC2;
int main(void) {
ASC2 asc2[128];
int i=0;
asc2[0].asc2char = getchar();
while (asc2[i].asc2char != EOF) {
if (isgraph(asc2[i].asc2char)) {
asc2[i].fre += 1;
}
asc2[i].asc2char = getchar();
i++;
}
for (i = 0; i < 10; i++) {
if (asc2[i].fre != 0) {
printf("%c %3d\n", asc2[i].asc2char, asc2[i].fre);
}
}
return 0;
}