質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1688閲覧

セグメンテーション違反になってしまう.

wanwanwan

総合スコア21

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/08/18 08:40

以下のプログラムはセグメンテーション違反になってしまいます.
エラーはmain関数前のcompare_cardsの関数だと突き止めたのですが、どうすれば良いかわかりません.
理想の実行結果はコードの下に書きました.
加えて、手札の表示方法も分かりません.

#include<iostream> #include<string> using namespace std; class Card { private: int num; string suit; public: Card(){ num = 1; suit = "heart"; } void setNum( int n ); void setSuit( string s ); int getNum(){ return num; } string getSuit(){ return suit; } void showData(); }; void Card::setNum( int n ){ if( n >= 1 && n <= 13 ){ num = n; }else{ cout << "該当しないマークです.\n"; num = 1; } } void Card::setSuit( string s ){ if( s =="heart" || s == "spade" || s == "diamond" || s =="club" ){ suit = s; }else{ cout << "該当しないマークです.\n"; suit = "heart"; } } void Card::showData(){ char c; if( num == 1 || num == 11 || num == 12 || num == 13 ){ if( num == 1 ){ c ='A'; } if( num == 11 ){ c = 'J'; } if( num == 12 ){ c = 'Q'; } if( num == 13 ){ c = 'K'; } cout << "["<< suit << " の " << c << "]"; }else{ cout << "[" << suit << " の " << num << "]" ; } } class Hand { private: Card cards[ 3 ]; public: Hand(); void setCard( int n, string s, int i ); Card getCard( int i ); void showHand(); int getSumOfNum(); }; Hand::Hand(){ cards[ 0 ].setNum( 1 ); cards[ 0 ].setSuit( "heart" ); cards[ 1 ].setNum( 2 ); cards[ 1 ].setSuit( "heart" ); cards[ 2 ].setNum( 3 ); cards[ 2 ].setSuit( "heart" ); } void Hand::setCard( int n, string s, int i ){ if( i >= 0 && i <= 2 ){ cards[ i ].setNum( n ); cards[ i ].setSuit( s ); }else{ cout << "不正な配列番号です。\n"; } } Card Hand::getCard( int i ){ if( i >= 0 && i <= 2 ){ return cards[ i ]; }else{ return cards[ 0 ]; } } void Hand::showHand(){ cout << "手札は"; for( int i = 0; i < 3; i++ ){ cards[ i ].showData(); } cout << "です。\n"; } int Hand::getSumOfNum(){ int sum = 0; for( int i = 0; i < 3; i++ ){ sum += cards[ i ].getNum(); } return sum; } class Human{ private : string name; int age; Hand myCards[ 3 ]; public : Human(); Human( string s, int n ); void setName( string s ){ name = s; } void setAge( int n ); string getName(){ return name; } int getAge(){ return age; } void setMyCard( int n, string s, int i ); Hand getMyCards(){ return myCards[ 3 ]; } }; Human::Human(){ name = "名前がありません."; age = 0; } Human::Human( string s , int n ){ name = s; age = n; } void Human::setAge( int n ){ if( n<0 ){ cout<<"入力された年齢に誤りがあります。\n"; }else if( n>150 ){ cout<<"入力された年齢は怪しいです。\n"; age = n; }else{ age = n; } } void Human::setMyCard( int n, string s, int i ){ if( i >= 0 && i <= 2 ){ myCards[ i ].setCard( n, s, i ); }else{ cout << "不正な配列番号です。\n"; } } Human compare_cards( Human h1, Human h2 ){ Hand hand1,hand2; hand1 = h1.getMyCards(); hand2 = h2.getMyCards(); if( hand1.getSumOfNum() > hand2.getSumOfNum() ){ return h1; } else if( hand1.getSumOfNum() < hand2.getSumOfNum() ){ return h2; } } int main(){ string name; int age; int num; string suit; Human hum1,hum2,hum; cout << "名前 年齢 :"; cin >> name >> age; hum1.setName( name ); hum1.setAge( age ); for( int i = 0; i < 3; i++ ){ cout << i + 1 << "枚目 :"; cin >> num >> suit; hum1.setMyCard( num, suit, i ); } cout << "名前 年齢 :"; cin >> name >> age; hum2.setName( name ); hum2.setAge( age ); for( int i = 0; i < 3; i++ ){ cout << i + 1 << "枚目 :"; cin >> num >> suit; hum2.setMyCard( num, suit, i ); } hum = compare_cards( hum1 , hum2 ); cout << "勝負に勝った" << hum.getName() << " です。" << hum.getAge() << " です。"; cout << endl; cout << "よろしくお願いします。\n"; return 0; }

理想とする実行結果

( *印はキーボードからの入力例 )
名前 年齢: *y *12
1枚目: *8 *club
2枚目: *11 *heart
3枚目: *2 *club

名前 年齢: *u *13
1枚目: *12 *heart
2枚目: *13 *diamond
3枚目: *12 *club

勝負に勝った、u です。13才です.手札は[ heart の Q ] [ diamond の K ] [ club の Q ] です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

HumanクラスのHand myCards[ 3 ];が変ですね。単純にHand myCards;がやりたいことではないでしょうか?
Handクラスはカード3枚の情報を保持してますので、Humanクラスが更に3組の手札を持っている必要はないように思います。
関連する下記の2行を適切に修正すれば落ちなくなるだろうと思います。

Hand getMyCards(){ return myCards[ 3 ]; }
myCards[ i ].setCard( n, s, i );

投稿2016/08/18 09:22

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これ、class HumangetMyCards()return myCards[3];となっているのがダメです。myCards配列は[0],[1],[2]の3つまでです。[3]はありませんので例外が発生します。
また、3枚のカード全てをgetMycards()で得る必要があるので、Handへのポインター(Hand*)を返すか、myCardsを単純な配列じゃなくてvector<Hand>にしてその参照を返すかしないとうまく動きません。
または、getMyCards(int n)と引数をつけて指定した番号のカードを返すようにすればどうでしょうか?

投稿2016/08/18 09:06

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2016/08/18 09:26

それと、Hand myCards[3]は3つもいらないですね。Hand myCardsとして宣言し、getMyCards()は Hand& getMyCards() { return MyCards; } とすれば、動くと思います。 それと、細かいですが、最後の結果表示で手札の表示がないです。
PineMatsu

2016/08/18 09:29

追記: 3つもいらないという理由は、Hand自身がCard cards[3]と3枚保持しているからです。 言い忘れましたが、setMyCard関数も修正が必要です。(myCardsは配列をやめるから)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問