ページ 1 / 1
C++
Posted: 2016年11月02日(水) 20:33
by rookie
コード:
#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人分出力されるプログラムを教えてください
Re: C++
Posted: 2016年11月02日(水) 20:42
by あんどーなつ
rookieさん
タイトルが短すぎる
文章を一番最初でなく最後に書く
インデントなし
は、荒らしみたいに見えるのでやめてください。
Re: C++
Posted: 2016年11月02日(水) 21:06
by あんどーなつ
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
こんなんでいいでしょうか?
Re: C++
Posted: 2016年11月02日(水) 22:09
by みけCAT
あんどーなつ さんが書きました:こんなんでいいでしょうか?
入力した値が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
Re: C++
Posted: 2016年11月02日(水) 22:39
by rookie
オーバーライド・仮想関数・ポリモーフィズムを使用するのが条件です
Re: C++
Posted: 2016年11月02日(水) 22:46
by あんどーなつ
みけCATさん
いや、プログラムの意味がほんっきでわからなかった、だけです。
Re: C++
Posted: 2016年11月02日(水) 23:12
by あんどーなつ
みけ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
Re: C++
Posted: 2016年11月02日(水) 23:35
by あんどーなつ
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のほうも直しておけばー。
ポリモフィズム。現行のコードで出来てるんじゃない?
Re: C++
Posted: 2016年11月02日(水) 23:37
by あんどーなつ
void CTest::base(void) {
は
void CTest::InputData(void) {
だった。
Re: C++
Posted: 2016年11月02日(水) 23:59
by あんどーなつ
virtualとそうでない関数の違いはすでに現行のコードででてました。
仮想関数:
派生クラスのインスタンスを作成
基本クラスの変数として呼び出し
派生クラスの関数が呼び出される
めでたしめでたし
仮想関数でない関数:
派生クラスのインスタンスを作成
基本クラスの変数として呼び出し
基本クラスの関数が呼び出される
まどかが概念になった アベシ