文字列配列について

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

文字列配列について

#1

投稿記事 by yuher » 13年前

ある英文について,標準入力からgetcharで一文字ずつ読み込み,アルファベットのそれぞれの文字が何個あるか集計し,アスタリスクで表示しろ.という問題です.度数はアスタリスクで表示し,大文字、小文字は区別せず,アルファベット以外は無視するとのことです.
ヒントとしては,while,for文を使用するらしいです.
よろしくお願いします.

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

Re: 文字列配列について

#2

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

フォーラムルールをお読みください。
課題の丸投げは禁止です。
今書けているコードがありましたら、提示してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yuher

Re: 文字列配列について

#3

投稿記事 by yuher » 13年前

変数、配列宣言と初期化(文字列を集計する要素数26の配列,ほか)

while(getchar()の戻り値がEOFではない)
if(読み込んだ文字がアルファベット)
その文字に該当する要素を1だけ増やす

頻度の最大値MAXを求める

for (i=0;i<26;i++)
{
i番目の文字の*の個数を計算(maxを使った比例計算)
  行頭の表示(i番目の文字)
  計算した個数だけ*を出力
  行末に頻度を整数で表示

こんな感じにすればいけるのでは?というのはあるのですが,これを言語にすることができません
よろしくお願いします.

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

Re: 文字列配列について

#4

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

そのような感じでいいと思います。
どこがわかりませんか?全部ですか?どこがわからないかがわかりませんか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yuhe

Re: 文字列配列について

#5

投稿記事 by yuhe » 13年前

C言語を始めたばっかりで、参考書を無理やりこじつけて形にはできたのですが,言語に変換することができません.
全体的に分に変換することができないです。。。

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

Re: 文字列配列について

#6

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

うーん…教えるのは難しいですね…

コード:

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

/* *の個数の最大値 */
#define GRAPH_MAX 60

int main(void) {
	/* 変数、配列宣言と初期化(文字列を集計する要素数26の配列,ほか) */
	int input;
	int syuukei[26]={0};
	int i;
	int max=0;

	/* while(getchar()の戻り値がEOFではない) */
	while((input=getchar())!=EOF) {
		/* if(読み込んだ文字がアルファベット) */
		if(isalpha(input)) {
			/* その文字に該当する要素を1だけ増やす */
			if(islower(input))syuukei[input-'a']++;
			else if(isupper(input))syuukei[input-'A']++;
		}
	}

	/* 頻度の最大値MAXを求める */
	for(i=0;i<26;i++) {
		if(syuukei[i]>max)max=syuukei[i];
	}

	if(max==0)max=1; /* ゼロ除算防止 */

	for(i=0;i<26;i++) {
		/* i番目の文字の*の個数を計算(maxを使った比例計算) */
		int kazu=syuukei[i]*GRAPH_MAX/max;
		int j;
		/* 行頭の表示(i番目の文字) */
		printf("%c : ",i+'A');
		/* 計算した個数だけ*を出力 */
		for(j=0;j<kazu;j++)putchar('*');
		/* 行末に頻度を整数で表示 */
		printf(" %d\n",syuukei[i]);
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yuher

Re: 文字列配列について

#7

投稿記事 by yuher » 13年前

ありがとうございます.これを見てじっくり考えてみます!

yuher

Re: 文字列配列について

#8

投稿記事 by yuher » 13年前

int kazu=syuukei*GRAPH_MAX/max;

すいません,この行だけちょっとわからないです.
syuukei*GRAPH_MAX/max;とはどういうことですか?

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

Re: 文字列配列について

#9

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

その文字の個数から表示すべき*の個数を求めています。
syuukeuをmaxで割ってsyuukeiのmaxに対する割合を求めます。
この割合をGRAPH_MAX(max個あるアルファベットに対する*の表示個数)に掛けて表示すべき*の個数を求めます。
これをそのまま書くとGRAPH_MAX*(syuukei/max)となりますが、C言語では整数の割り算は切り捨てになるため、
最初の表現になっています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yuher

Re: 文字列配列について

#10

投稿記事 by yuher » 13年前

やり方,可能な処理かわかりませんが,kazuというのを浮動小数点で表示することなどはできないのでしょうか。

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

Re: 文字列配列について

#11

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

できます。なぜ必要なのですか?それともただの興味ですか?

コード:

double kazu=(double)syuukei[i]*GRAPH_MAX/max;
double型の変数をprintfでひょうじするには%fを使用します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yuher

Re: 文字列配列について

#12

投稿記事 by yuher » 13年前

すいません,浮動小数点を利用すればsyuukei*GRAPH_MAX/max;の形を変換できるものだと思っていました.
計算自体を浮動小数点で計算してもsyuukei*GRAPH_MAX/max;の形は変えられないのでしょうか?

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

Re: 文字列配列について

#13

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

浮動小数点なら任意の順番で大丈夫だと思います。(多少の誤差はでるかもしれませんが)

コード:

double kazu=(double)syuukei[i]*GRAPH_MAX/max;
double kazu=(double)GRAPH_MAX*syuukei[i]/max;
double kazu=(double)syuukei[i]/max*GRAPH_MAX;
double kazu=(double)GRAPH_MAX/max*syuukei[i];
double kazu=1.0/max*syuukei[i]*GRAPH_MAX;
double kazu=1.0/max*GRAPH_MAX*syuukei[i];
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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