C++

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

C++

#1

投稿記事 by rookie » 7年前

コード:

#include<stdio.h>
#pragma warning(disable:4996)

class CTest{
public:
virtual void base(void);
virtual void InputData(void);
virtual void OutputData(void);
int atk;
int def;
int spd;
};

class Enemy :public CTest{
void base(void);
void InputData(void);
void OutputData(void);
};

class Human :public CTest{
void base(void);
void InputData(void);
void OutputData(void);
};


void CTest::base(void){

}

void Enemy::base(void){
printf("敵\n");
}

void Human::base(void){
printf("人\n");
}

void CTest::InputData(void){

}

void Enemy::InputData(void){
printf("攻撃入力==>");
scanf("%d", &atk);
printf("防御入力==>");
scanf("%d", &def);
printf("速さ入力==>");
scanf("%d", &spd);
printf("\n");
}

void Human::InputData(void){
printf("攻撃入力==>");
scanf("%d", &atk);
printf("防御入力==>");
scanf("%d", &def);
printf("速さ入力==>");
scanf("%d", &spd);
printf("\n");
}

void CTest::OutputData(void){

}

void Enemy::OutputData(void){
printf("攻撃:%d\n", atk);
printf("守備:%d\n", def);
printf("速さ:%d\n", spd);
printf("\n");
}

void Human::OutputData(void){
printf("攻撃:%d\n", atk);
printf("守備:%d\n", def);
printf("速さ:%d\n", spd);
printf("\n");
}


int main(void){

CTest *pt[3];
pt[0] = new CTest;
pt[1] = new Enemy;//敵
pt[2] = new Human;//人

int count;

for (int i = 0; i<3; i++){
printf("1:敵 2:人どちらですか?==>");
scanf("%d", &count);
pt[count]->base();
pt[count]->InputData();
}

for (int i = 0; i < 3;i++)
pt[count]->base();
pt[count]->OutputData();

return 0;
}

最後に入力した情報が3人分出力されてしまいます
入力した値が正常に3人分出力されるプログラムを教えてください

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: C++

#2

投稿記事 by あんどーなつ » 7年前

rookieさん

タイトルが短すぎる
文章を一番最初でなく最後に書く
インデントなし

は、荒らしみたいに見えるのでやめてください。

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: C++

#3

投稿記事 by あんどーなつ » 7年前

98行目から101行目にかけて、ブロック( { } )で囲む
99行目のcount->i
100行目のcount->i

で、出力が次のようになります。

コード:

$ ./a.exe
1:敵 2:人どちらですか?==>1
敵
攻撃入力==>1
防御入力==>1
速さ入力==>1

1:敵 2:人どちらですか?==>2
人
攻撃入力==>2
防御入力==>2
速さ入力==>2

1:敵 2:人どちらですか?==>1
敵
攻撃入力==>3
防御入力==>3
速さ入力==>3

敵
攻撃:3
守備:3
速さ:3

人
攻撃:2
守備:2
速さ:2
こんなんでいいでしょうか?

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

Re: C++

#4

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

あんどーなつ さんが書きました:こんなんでいいでしょうか?
入力した値が3人分出力されていないので条件を満たしていないように見えますが、あんどーなつさんは本当にこれでいい可能性があると思っているのですか?
rookie さんが書きました:入力した値が正常に3人分出力されるプログラムを教えてください
特に〇〇を使え、みたいな条件は無いですよね。

コード:

#include <cstdio>
#include <cstdlib>

struct character {
	static const char* const typeNames[];
	int type, atk, def, spd;

	static character readData();
	void printData() const;

private:
	static int readInteger() {
		int res;
		if (scanf("%d", &res) != 1) {
			puts("入力エラー");
			exit(1);
		}
		return res;
	}
};
const char* const character::typeNames[] = {"敵", "人"};

character character::readData() {
	character d;
	printf("1:敵 2:人どちらですか?==>");
	d.type = readInteger();
	printf("攻撃入力==>");
	d.atk = readInteger();
	printf("防御入力==>");
	d.def = readInteger();
	printf("速さ入力==>");
	d.spd = readInteger();
	printf("\n");
	return d;
}

void character::printData() const {
	if (0 < type && type <= (int)(sizeof(typeNames) / sizeof(*typeNames))) {
		printf("%s\n", typeNames[type - 1]);
	}
	printf("攻撃:%d\n", atk);
	printf("守備:%d\n", def);
	printf("速さ:%d\n", spd);
	printf("\n");
}

int main(void) {
	const int inputNum = 3;
	character charaData[inputNum];
	for (int i = 0; i < inputNum; i++) {
		charaData[i] = character::readData();
	}
	for (int i = 0; i < inputNum; i++) {
		charaData[i].printData();
	}
	return 0;
}
入力データ

コード:

1 1 1 1
2 2 2 2
1 3 3 3
出力データ

コード:

1:敵 2:人どちらですか?==>攻撃入力==>防御入力==>速さ入力==>
1:敵 2:人どちらですか?==>攻撃入力==>防御入力==>速さ入力==>
1:敵 2:人どちらですか?==>攻撃入力==>防御入力==>速さ入力==>
敵
攻撃:1
守備:1
速さ:1

人
攻撃:2
守備:2
速さ:2

敵
攻撃:3
守備:3
速さ:3

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

rookie

Re: C++

#5

投稿記事 by rookie » 7年前

オーバーライド・仮想関数・ポリモーフィズムを使用するのが条件です

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: C++

#6

投稿記事 by あんどーなつ » 7年前

みけCATさん

いや、プログラムの意味がほんっきでわからなかった、だけです。

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: C++

#7

投稿記事 by あんどーなつ » 7年前

みけCATさんに怒られたから本気出した。

コード:

#include<stdio.h>

class CTest
{
public:
  virtual void base (void);
  virtual void InputData (void);
  virtual void OutputData (void);
  int atk;
  int def;
  int spd;
};

class Enemy:public CTest
{
  void base (void);
  void InputData (void);
  void OutputData (void);
};

class Human:public CTest
{
  void base (void);
  void InputData (void);
  void OutputData (void);
};


void
CTest::base (void)
{

}

void
Enemy::base (void)
{
  printf ("敵\n");
}

void
Human::base (void)
{
  printf ("人\n");
}

void
CTest::InputData (void)
{

}

void
Enemy::InputData (void)
{
  printf ("攻撃入力==>");
  scanf ("%d", &atk);
  printf ("防御入力==>");
  scanf ("%d", &def);
  printf ("速さ入力==>");
  scanf ("%d", &spd);
  printf ("\n");
}

void
Human::InputData (void)
{
  printf ("攻撃入力==>");
  scanf ("%d", &atk);
  printf ("防御入力==>");
  scanf ("%d", &def);
  printf ("速さ入力==>");
  scanf ("%d", &spd);
  printf ("\n");
}

void
CTest::OutputData (void)
{

}

void
Enemy::OutputData (void)
{
  printf ("攻撃:%d\n", atk);
  printf ("守備:%d\n", def);
  printf ("速さ:%d\n", spd);
  printf ("\n");
}

void
Human::OutputData (void)
{
  printf ("攻撃:%d\n", atk);
  printf ("守備:%d\n", def);
  printf ("速さ:%d\n", spd);
  printf ("\n");
}


int
main (void)
{

  CTest *pt[3];

  int sel;

  for (int i = 0; i < 3; i++)
    {
      printf ("1:敵 2:人どちらですか?==>");
      scanf ("%d", &sel);
      if (sel == 1)
        pt[i] = new Enemy();
      else if (sel == 2)
        pt[i] = new Human();
      else {
        printf("入力が不正です\n");
        return 1;
      }
      pt[i]->base ();
      pt[i]->InputData ();
    }

  for (int i = 0; i < 3; i++) {
    pt[i]->base ();
  pt[i]->OutputData ();
}

  return 0;
}
UNIXのindentコマンドで整形してますが、実際に直しているのは、mainのところだけです。

実行結果

コード:

$ ./a.exe
1:敵 2:人どちらですか?==>1
敵
攻撃入力==>1
防御入力==>1
速さ入力==>1

1:敵 2:人どちらですか?==>2
人
攻撃入力==>2
防御入力==>2
速さ入力==>2

1:敵 2:人どちらですか?==>1
敵
攻撃入力==>3
防御入力==>3
速さ入力==>3

敵
攻撃:1
守備:1
速さ:1

人
攻撃:2
守備:2
速さ:2

敵
攻撃:3
守備:3
速さ:3

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: C++

#8

投稿記事 by あんどーなつ » 7年前

rookie さんが書きました:オーバーライド・仮想関数・ポリモーフィズムを使用するのが条件です
うん、何を使って勉強してる???

オーバーライドは出来てるちゃ、できてるけど…わかりやすく
void CTest::base (void) { printf("テスト\n"); }って書けばいいのかな

仮想関数って、CTestのメソッドが呼び出せるかどうかだよね。

コード:

void CTest::base(void) {
  printf ("攻撃入力==>");
  scanf ("%d", &atk);
  printf ("防御入力==>");
  scanf ("%d", &def);
  printf ("速さ入力==>");
  scanf ("%d", &spd);
}
て書いて、かつ

コード:

void Human::InputData (void) {
  CTest::InputData();
  printf("人間性==>");
  scanf("%d", &hmt); // humanity
  printf("\n");
}
void Enemy::InputData (void) {
  CTest::InputData();
  printf("邪悪さ==>");
  scanf("%d", &wic); // wickness
  printf("\n");
}
とか書けばー。そんでもってメンバ変数を1個ずつ追加必要だね。
せっかくだからOutputDataのほうも直しておけばー。

ポリモフィズム。現行のコードで出来てるんじゃない?

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: C++

#9

投稿記事 by あんどーなつ » 7年前

void CTest::base(void) {

void CTest::InputData(void) {
だった。

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: C++

#10

投稿記事 by あんどーなつ » 7年前

virtualとそうでない関数の違いはすでに現行のコードででてました。

仮想関数:
派生クラスのインスタンスを作成
基本クラスの変数として呼び出し
派生クラスの関数が呼び出される
めでたしめでたし

仮想関数でない関数:
派生クラスのインスタンスを作成
基本クラスの変数として呼び出し
基本クラスの関数が呼び出される
まどかが概念になった アベシ

閉鎖

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