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

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

ただいまの
回答率

90.51%

  • C++

    4431questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 711

yunchu

score 15

以下のプログラムはセグメンテーション違反になってしまいます.
エラーは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 ] です。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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 18:26

    それと、Hand myCards[3]は3つもいらないですね。Hand myCardsとして宣言し、getMyCards()は

    Hand& getMyCards() { return MyCards; }

    とすれば、動くと思います。

    それと、細かいですが、最後の結果表示で手札の表示がないです。

    キャンセル

  • 2016/08/18 18:29

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

    キャンセル

0

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C++

    4431questions

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