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

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

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

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

受付中

For 文 ネスト 変数が範囲内に収まらない

tendon_man
tendon_man

総合スコア22

C++

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

2回答

0リアクション

0クリップ

334閲覧

投稿2022/08/20 12:25

編集2022/08/21 15:08

前提

C++で以下のような問題に対してコードを書きましたが、アウトプットが思うように出ません。

For文で 1 <= s <= 13としているのですが14以降も出力されてしまいます。
どなたか、理由をご教授いただけないでしょうか。

【問題】

太郎が花子と一緒にトランプ遊びをしようとしたところ、52枚あるはずのカードが n 枚のカードしか手元にありません。これらの n 枚のカードを入力として、足りないカードを出力するプログラムを作成して下さい。

太郎が最初に持っていたトランプはジョーカーを除く52枚のカードです。

52枚のカードは、スペード、ハート、クラブ、ダイヤの4つの絵柄に分かれており、各絵柄には13のランクがあります。

Input
最初の行に太郎が持っているカードの枚数 n (n ≤ 52)が与えられます。

続いて n 組のカードがそれぞれ1行に与えられます。各組は1つの空白で区切られた文字と整数です。文字はカードの絵柄を表し、スペードが'S'、ハートが'H'、クラブが'C'、ダイヤが'D'で表されています。整数はそのカードのランク(1 〜 13)を表しています。

Output
足りないカードをそれぞれ1行に出力して下さい。各カードは入力と同様に1つの空白で区切られた文字と整数です。出力するカードの順番は以下のとおりとします:

絵柄がスペード、ハート、クラブ、ダイヤの順番で優先的に出力する。
絵柄が同じ場合は、ランクが小さい順に出力する。

【作成コード】

C++

#include<iostream> using namespace std; int main(){ int X[4][13] = {0}; char mark; int num; int marknum; int n; cin >> n; for (int i = 0; i < n; ++i){ cin >> mark >> num; if (mark == 'S'){ marknum = 1; } else if (mark == 'H'){ marknum = 2; } else if (mark == 'C'){ marknum = 3; } else if (mark == 'D'){ marknum = 4; } X[marknum][num] = 1; } for (int j = 1; j < 5; ++j){ for (int s = 1; s < 14; ++s){// 1 <= s <13に制限 if (X[j][s] == 0){ //足りないカードのみ絵柄、番号を出力 if (j = 1){ mark = 'S'; } else if (j == 2){ mark = 'H'; } else if (j == 3){ mark = 'C'; } else if (j == 4){ mark = 'D'; } cout << mark << " " << s << endl; } } } }

発生している問題・エラーメッセージ

【入力データ】

47 S 10 S 11 S 12 S 13 H 1 H 2 S 6 S 7 S 8 S 9 H 6 H 8 H 9 H 10 H 11 H 4 H 5 S 2 S 3 S 4 S 5 H 12 H 13 ...

【出力データ】

S 1 S 16 S 20 S 27 S 28 S 29 S 30 S 31 S 32 S 33 S 34 S 35 S 36 S 37 S 38 S 40 S 45 S 46 S 53 S 54 S 55 S 56 S 67 S 68 S...

回答いただいているお二方ありがとうございます。

以下のように変更した結果、正常な値を出力することができました
変更点
① if (j =1){ ⇨ if (j == 1){
②  j,sの範囲を0からに修正

ここで疑問なのはなぜ修正によって
sが表示されたりされなかったりしたのか、また数字だけ連続で永遠に出力されてしまったのかという点です。
値の範囲が正常に修正されたこととの関連がわからないです。
修正後コード

C++

#include<iostream> using namespace std; int main(){ int X[4][13] = {0}; char mark; int num; int marknum; int n; cin >> n; for (int i = 0; i < n; ++i){ cin >> mark >> num; if (mark == 'S'){ marknum = 0; } else if (mark == 'H'){ marknum = 1; } else if (mark == 'C'){ marknum = 2; } else if (mark == 'D'){ marknum = 3; } X[marknum][num-1] = 1;//数字の範囲を変更:1<=num<=13を0<=num-1<=12に変更  } for (int j = 0; j < 4; ++j){ for (int s = 0; s < 13; ++s){ if (X[j][s] == 0){ if (j == 0){ mark = 'S'; } else if (j == 1){ mark = 'H'; } else if (j == 2){ mark = 'C'; } else if (j == 3){ mark = 'D'; } cout << mark << " " << s+1 << endl;//s+1=num } } } }

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

C++

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