英文に含まれる、各アルファベットの数を数えるプログラムについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
二千

英文に含まれる、各アルファベットの数を数えるプログラムについて

#1

投稿記事 by 二千 » 9年前

学校の課題で

    キーボードから与えられた英文に含まれる、各アルファベットの数を数えるプログラムを2次元配列を使用して作成して下さい。なお、小文字と大文字は区別しません。

という問題が出たのですが2次元配列をどのようにして使うのかがわかりません。
どなたかわかる方いられましたら教えてください。

二千

Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#2

投稿記事 by 二千 » 9年前

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;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#3

投稿記事 by みけCAT » 9年前

二千 さんが書きました: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]は確保された領域の範囲外であり、アクセスしてはいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#4

投稿記事 by みけCAT » 9年前

二千 さんが書きました:結果は正しく表示されるのですが
本当ですね?それは非常に運がよかったですね。
この提示されたプログラムは範囲外アクセスに加え、未初期化で不定の値を持つ自動変数を計算に使うというundefined behaviorを含みます。
従って、あらゆることが起こり得ます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#5

投稿記事 by みけCAT » 9年前

そもそも、標準ライブラリのgetchar()の戻り値はint型であり、EOFはchar型には入りません。
従って、getchar()の戻り値をchar型のobjectに代入した結果の値(char型)をEOFと比較するのはいい考えではありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#6

投稿記事 by かずま » 9年前

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: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#7

投稿記事 by 二千 » 9年前

かずま さんが書きました: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: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#8

投稿記事 by 二千 » 9年前

二千 さんが書きました:
かずま さんが書きました: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: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#9

投稿記事 by 二千 » 9年前

解決しました
かずまさんのソースコードを参考にさせていただきました

かずま

Re: 英文に含まれる、各アルファベットの数を数えるプログラムについて

#10

投稿記事 by かずま » 9年前

二千 さんが書きました:解決しました
かずまさんのソースコードを参考にさせていただきました
解決したのならそのコードを貼ってください。
文の定義は何ですか? ピリオドまで?
行と文の関係は? 1行に 2つの文がある場合は?
1つの文が 2行にまたがる場合は?

閉鎖

“C言語何でも質問掲示板” へ戻る