ページ 1 / 1
英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 17:25
by 二千
学校の課題で
キーボードから与えられた英文に含まれる、各アルファベットの数を数えるプログラムを2次元配列を使用して作成して下さい。なお、小文字と大文字は区別しません。
という問題が出たのですが2次元配列をどのようにして使うのかがわかりません。
どなたかわかる方いられましたら教えてください。
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 17:37
by 二千
2次元配列なしでここまでできたのですが、結果は正しく表示されるのですがエラーが出てしまいます。
コード:
#include <stdio.h>
int main(void) {
int i=0;
int a[26] = { 0 };
char ch[1000];
while ((ch[1000] = getchar()) != EOF) {
for (i = 0; ch[i] != '\0'; i++) {
if ('a' <= ch[i] && ch[i] <= 'z') {
a[ch[i] - 'a']++;
}
if ('A' <= ch[i] && ch[i] <= 'Z') {
a[ch[i] - 'A']++;
}
}
}
for (i = 0; i<26; i++) {
printf("%c : %d\n", i + 'a', a[i]);
}
return 0;
}
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 17:42
by みけCAT
二千 さんが書きました:2次元配列をどのようにして使うのかがわかりません。
どなたかわかる方いられましたら教えてください。
適当に使えばいいでしょう。
例えば
コード:
#include <stdio.h>
void solve(void) {
/* ここにキーボードから与えられた英文に含まれる、各アルファベットの数を数えるプログラムを書く */
puts("hello, world!");
}
int main(void) {
void (*nizigenhairetu[2][2])(void);
nizigenhairetu[0][0] = solve;
nizigenhairetu[0][1] = nizigenhairetu[0][0];
nizigenhairetu[1][0] = nizigenhairetu[0][1];
nizigenhairetu[1][1] = nizigenhairetu[1][0];
nizigenhairetu[1][1]();
return 0;
}
具体的な入出力の仕様がわかると、もっといい使い方がわかるかもしれません。
二千 さんが書きました:2次元配列なしでここまでできたのですが、結果は正しく表示されるのですがエラーが出てしまいます。
8行目のch[1000]は確保された領域の範囲外であり、アクセスしてはいけません。
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 17:51
by みけCAT
二千 さんが書きました:結果は正しく表示されるのですが
本当ですね?それは非常に運がよかったですね。
この提示されたプログラムは範囲外アクセスに加え、未初期化で不定の値を持つ自動変数を計算に使うという
undefined behaviorを含みます。
従って、あらゆることが起こり得ます。
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 18:01
by みけCAT
そもそも、標準ライブラリのgetchar()の戻り値はint型であり、EOFはchar型には入りません。
従って、getchar()の戻り値をchar型のobjectに代入した結果の値(char型)をEOFと比較するのはいい考えではありません。
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 18:56
by かずま
2次元配列を無理やり使うとしたら、
大文字と小文字を別々に数えたらどうでしょうか?
コード:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int count[26][2] = { 0 }, c;
while (c = getchar(), c != EOF)
if (islower(c))
count[c - 'a'][0]++;
else if (isupper(c))
count[c - 'A'][1]++;
for (c = 0; c < 26; c++)
printf("%c : %d\n", 'a'+c, count[c][0] + count[c][1]);
return 0;
}
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 19:50
by 二千
かずま さんが書きました:2次元配列を無理やり使うとしたら、
大文字と小文字を別々に数えたらどうでしょうか?
コード:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int count[26][2] = { 0 }, c;
while (c = getchar(), c != EOF)
if (islower(c))
count[c - 'a'][0]++;
else if (isupper(c))
count[c - 'A'][1]++;
for (c = 0; c < 26; c++)
printf("%c : %d\n", 'a'+c, count[c][0] + count[c][1]);
return 0;
}
これをもとに英文を1文だけ読み込んでfor文でカウントするようにしたいのですがどうすればいいでしょうか
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 20:03
by 二千
二千 さんが書きました:かずま さんが書きました:2次元配列を無理やり使うとしたら、
大文字と小文字を別々に数えたらどうでしょうか?
コード:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int count[26][2] = { 0 }, c;
while (c = getchar(), c != EOF)
if (islower(c))
count[c - 'a'][0]++;
else if (isupper(c))
count[c - 'A'][1]++;
for (c = 0; c < 26; c++)
printf("%c : %d\n", 'a'+c, count[c][0] + count[c][1]);
return 0;
}
これをもとに英文を1文だけ読み込んでfor文でカウントするようにしたいのですがどうすればいいでしょうか
改行されたらカウント結果を出力するようにしたいです
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 20:23
by 二千
解決しました
かずまさんのソースコードを参考にさせていただきました
Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて
Posted: 2016年1月24日(日) 21:14
by かずま
二千 さんが書きました:解決しました
かずまさんのソースコードを参考にさせていただきました
解決したのならそのコードを貼ってください。
文の定義は何ですか? ピリオドまで?
行と文の関係は? 1行に 2つの文がある場合は?
1つの文が 2行にまたがる場合は?