C++ 試行錯誤しましたがわかりません

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

C++ 試行錯誤しましたがわかりません

#1

投稿記事 by xj0461jr » 11年前

今回、stringクラスや標準ライブラリの文字列関連の関数を使用しないでつくることと
文字入力には、cin.getline();を使います。

具体的にはCMDにこのように表示したいと思っています。

文字列?Space, the Final Frontier.

A: 2
C: 1
E: 3
F: 2
H: 1
I: 2
L: 1
N: 2
O: 1
P: 1
R: 2
S: 1
T: 2
他: 5

という風に、入力された文字列に対して、アルファベット順に何個あるかカウントしてCMDに表示し、
スペースなどの文字は、他に分類してカウントし表示します。

※入力文字列は半角文字列で、入力文字は、最大で、80文字です。

どうしても、わからないので、分かる方がいましたら教えて下さい。
コードはC++言語でお願いします。

hide

Re: C++ 試行錯誤しましたがわかりません

#2

投稿記事 by hide » 11年前

試行錯誤た結果、わかったこと、わからなかったことを書いて下さいね。

xj0461jr

Re: C++ 試行錯誤しましたがわかりません

#3

投稿記事 by xj0461jr » 11年前

すみません、試行錯誤した結果、分からなかった事と分かったことについて書きます。

まず、分かったことについてですが、ASCIIアスキーコードのa~zやA~Z,その他の文字列と対になる
番号を整数型にそれぞれ、最初に来る番号a_z = 97, la_lz = 65, other = 32と代入していき
cin.getline(w, 80);をint型に直し、離散判定型でカウントしていき、値が同じになったら、文字カウント
をするようにしました。

分からなことについてですが、実行しても、変な風になってしまいます。
どのように解決をしていいのか分からない状態です。
上記でカウントするのはいいのですが、文字列中に同じ文字が
複数ある場合に、認識出来ないです。

下手な説明ですが、よろしくお願いします.

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: C++ 試行錯誤しましたがわかりません

#4

投稿記事 by へにっくす » 11年前

コードをさらさないで聞かれても。
今のあなたにどれぐらい思った通りにコードをかけるか、それを見た上でアドバイスするので、ネタがない限りでは何とも。
xj0461jr さんが書きました:実行しても、変な風になってしまいます。
とあるから、実際に組んでるのですよね?そのコードをさらしてください。
written by へにっくす

xj0461jr

Re: C++ 試行錯誤しましたがわかりません

#5

投稿記事 by xj0461jr » 11年前

コードはこれです
ここから先が思いつきません。

コード:


#include<iostream>

using namespace std;

int main() {

	//変数宣言
	int a_z = 65;					//小文字担当,大文字担当
	int other = 32;					//その他担当
	int integer_w[80];				//入力文字列の数値変換
	int cnt[] = {0, 0, 0, 0};		//配列カウント変数
	int i = 0;
	char w[80];						//入力受付変数
	char str_a_z;

	cin.getline(w, 80);				//千切らずに受付

	//初期化
	for(int i = 0;i <= 80;i++) {

		integer_w[i] = 0;

	}

	//入力文字数カウント
	for(cnt[0];w[cnt[0]] != '\0';cnt[0]++);

	//入力文字を数値に変換
	for(cnt[1];cnt[1] < cnt[0];cnt[1]++) {

		integer_w[cnt[1]] = w[cnt[1]];

	}

	//入力文字列カウント
	for(a_z;a_z <= 122;a_z++) {

		if(integer_w[cnt[3]] == a_z) {

			cnt[3]++;
			i++;

			str_a_z = a_z;

			cout << str_a_z << ":" << i << "\n";

		}
		else {

			i = 0;

		}

	}

	//入力文字列カウント
	for(other;other <= 47;other++) {

		if(integer_w[cnt[3]] == other) {

			cnt[3]++;
			i++;

			cout << "その他" << ":" << i << "\n";

		}
		else {

			i = 0;

		}

	}


}


アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: C++ 試行錯誤しましたがわかりません

#6

投稿記事 by へにっくす » 11年前

(1)それぞれの文字をカウントするのですから、カウントした後にすぐ出力するのは間違っています。
小文字は大文字といっしょにカウントするのであれば、'A'用のカウント変数、'B'用のカウント変数、・・・'Z'用のカウント変数を用意するべきです。(小文字大文字区別するなら'a'用の変数~'z'用の変数も用意するべきですね)
(2)小文字用、大文字用とありますが、'A'=0x41(65)~'Z'=0x5a(90)、'a'=0x61(97)~'z'=0x7a(122)ですよ。'Z'と'a'の間は記号が入っています。なので65~122といっしょにはできません。またotherで47までみていますが、前述したように英文字以外をカウントしたいならそれだけでは足りません。
参考)ASCII文字コード
(3)初期化は宣言時にしてください。
(4)文字はchar型ですが、わざわざint型に変換する必要はありません。

とりあえず、'A'~'Z'までをカウントするサンプルコードを掲示します。

コード:

#include <iostream>

using namespace std;

int main(void) {
	int len = 0; // 文字列の長さ
	int cnt = 0; // 文字列のカウント
	char w[80] = {0}; // 入力受付変数
	int count['Z' - 'A' + 1] = {0}; // 'A'~'Z'のカウント変数を用意する
	int ch = 0; // 文字用
	
	// 入力
	cin.getline(w, 80);
	// 入力した文字列を出力
	cout << w << endl;

	// 文字数のカウント
	for (len = 0; w[len]; len++);
	
	// 大文字のカウント
	// 文字列の長さ分判定
	for (cnt = 0; cnt < len; cnt++) {
		// 文字が一致したら、その文字のカウントアップ
		for (ch = 'A'; ch <= 'Z'; ch++) {
			if (ch == w[cnt]) {
				count[ch - 'A']++;
			}
		}
	}
	// 'A'から'Z'の文字カウントを出力
	for (ch = 'A'; ch <= 'Z'; ch++) {
		cout << (char)ch << ':' << count[ch - 'A'] << endl;
	}
}
あとは小文字の判定と、英文字以外の判定をするだけですので、あなたならできるでしょう。
がんばってください。
written by へにっくす

閉鎖

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