
前提
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++
1#include<iostream> 2using namespace std; 3 4int main(){ 5 int X[4][13] = {0}; 6 char mark; 7 int num; 8 int marknum; 9 int n; 10 cin >> n; 11 for (int i = 0; i < n; ++i){ 12 cin >> mark >> num; 13 if (mark == 'S'){ 14 marknum = 1; 15 } 16 else if (mark == 'H'){ 17 marknum = 2; 18 } 19 else if (mark == 'C'){ 20 marknum = 3; 21 } 22 else if (mark == 'D'){ 23 marknum = 4; 24 } 25 X[marknum][num] = 1; 26 } 27 28 for (int j = 1; j < 5; ++j){ 29 for (int s = 1; s < 14; ++s){// 1 <= s <13に制限 30 if (X[j][s] == 0){ //足りないカードのみ絵柄、番号を出力 31 if (j = 1){ 32 mark = 'S'; 33 34 } 35 else if (j == 2){ 36 mark = 'H'; 37 38 } 39 else if (j == 3){ 40 mark = 'C'; 41 42 } 43 else if (j == 4){ 44 mark = 'D'; 45 46 } 47 cout << mark << " " << s << endl; 48 } 49 } 50 } 51} 52
発生している問題・エラーメッセージ
【入力データ】
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++
1#include<iostream> 2using namespace std; 3 4int main(){ 5 int X[4][13] = {0}; 6 char mark; 7 int num; 8 int marknum; 9 int n; 10 cin >> n; 11 for (int i = 0; i < n; ++i){ 12 cin >> mark >> num; 13 if (mark == 'S'){ 14 marknum = 0; 15 } 16 else if (mark == 'H'){ 17 marknum = 1; 18 } 19 else if (mark == 'C'){ 20 marknum = 2; 21 } 22 else if (mark == 'D'){ 23 marknum = 3; 24 } 25 X[marknum][num-1] = 1;//数字の範囲を変更:1<=num<=13を0<=num-1<=12に変更 26 } 27 28 for (int j = 0; j < 4; ++j){ 29 for (int s = 0; s < 13; ++s){ 30 if (X[j][s] == 0){ 31 if (j == 0){ 32 mark = 'S'; 33 34 } 35 else if (j == 1){ 36 mark = 'H'; 37 38 } 39 else if (j == 2){ 40 mark = 'C'; 41 42 } 43 else if (j == 3){ 44 mark = 'D'; 45 46 } 47 cout << mark << " " << s+1 << endl;//s+1=num 48 } 49 } 50 } 51}

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/08/20 13:50
2022/08/20 14:10
退会済みユーザー
2022/08/21 15:11