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

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

新規登録して質問してみよう
ただいま回答率
85.35%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

Q&A

解決済

1回答

1360閲覧

AIZU ONLINE JUDGE[ITP1_6_B]の回答

KakiP

総合スコア14

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

0グッド

0クリップ

投稿2020/03/09 13:37

AIZU ONLINE JUDGEのITP1_6_Bについて質問です。

こちらの問題、下記のコードでは受理されるのですが

C++

1#include <iostream> 2using namespace std; 3 4int main(){ 5 int n, b; 6 bool cards[4][14]; 7 char a; 8 9 for(int i = 0; i < 4; i++){ 10 for(int j = 0; j < 15; j++){ 11 cards[i][j] = false; 12 } 13 } 14 15 cin >> n; 16 for(int i = 0; i < n; i++){ 17 cin >> a >> b; 18 if (a == 'S') cards[0][b] = true; 19 if (a == 'H') cards[1][b] = true; 20 if (a == 'C') cards[2][b] = true; 21 if (a == 'D') cards[3][b] = true; 22 } 23 24 for(int i = 0; i < 4; i++){ 25 for(int j = 1; j<= 13; j++){ 26 if(cards[i][j] == false){ 27 if( i == 0) a = 'S'; 28 if( i == 1) a = 'H'; 29 if( i == 2) a = 'C'; 30 if( i == 3) a = 'D'; 31 cout << a << " " << j << endl; 32 } 33 else continue; 34 } 35 36 } 37 38 return 0; 39}

 下記のように書き直すと、runtime errorになってしまいます。

C++

1#include <iostream> 2using namespace std; 3 4int main(){ 5 int n, b; 6 bool cards[3][13]; 7 char a; 8 9 for(int i = 0; i < 4; i++){ 10 for(int j = 0; j < 15; j++){ 11 cards[i][j] = false; 12 } 13 } 14 15 cin >> n; 16 for(int i = 0; i < n; i++){ 17 cin >> a >> b; 18 if (a == 'S') cards[0][b] = true; 19 if (a == 'H') cards[1][b] = true; 20 if (a == 'C') cards[2][b] = true; 21 if (a == 'D') cards[3][b] = true; 22 } 23 24 for(int i = 0; i < 4; i++){ 25 for(int j = 1; j<= 13; j++){ 26 if(cards[i][j] == false){ 27 if( i == 0) a = 'S'; 28 if( i == 1) a = 'H'; 29 if( i == 2) a = 'C'; 30 if( i == 3) a = 'D'; 31 cout << a << " " << j << endl; 32 } 33 else continue; 34 } 35 36 } 37 38 return 0; 39}

こちら、何故なのか知っている方がいたら教えていただきたいです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

OKの方とランタイムエラーになるNGの方のソースの違いは以下のように

sh

1$ diff ok.cpp ng.cpp 26c6 3< bool cards[4][14]; 4--- 5> bool cards[3][13];

4種類の絵柄とそれぞれ13枚のカードが入り得る配列になっているか否か、です。

NGのコードの方では最初のfalseでの初期化部分でbool cards[3][14]に書き込みをし、領域外を破壊することとなり、初期化以降でもcards[3][...]相当の部分にアクセスする可能性があるので、実行時にエラー(ランタイムエラー)になってもおかしくないです。

C++

1... 2for(int i = 0; i < 4; i++){ 3 for(int j = 0; j < 15; j++){ 4 cards[i][j] = false; 5 } 6 } 7} 8...

追記しました:

OKのコードについても初期化の部分で配列の範囲外cards[3][14]にアクセスしているので、最悪、実行時エラーが起きてもおかしくないです。正しくは以下のように修正すべきでしょう。

C++

1bool cards[4][14]; 2char a; 3... 4// 初期化の部分 5for(int i = 0; i < 4; i++){ 6 // 「足りないカードを出力する部分」のやり方に沿ったループ(cards[i][0]は使わない) 7 // 元のコード for(int j = 0; j < 15; j++){ 8 for(int j = 1; j <= 13; j++){ 9 cards[i][j] = false; 10 } 11} 12 13// 足りないカードを出力する部分 14for(int i = 0; i < 4; i++){ 15 for(int j = 1; j<= 13; j++){ 16 17...

投稿2020/03/09 14:07

編集2020/03/09 16:40
dodox86

総合スコア9256

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

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

dodox86

2020/03/09 14:12

何となくですが、C言語/C++では配列の宣言でcard[4] としたときに添え字(インデックス)として0~3でアクセスするものを、NG版のようにcard[3]で宣言すると勘違いされているのかな、と思いました。
KakiP

2020/03/10 13:23

こちらありがとうございます! 理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問