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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

4159閲覧

char型配列とString型の配列について

MyongsongMun

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2016/12/23 03:52

編集2017/01/16 01:34

###前提・実現したいこと
Javaでトランプのカードを取り出すときに11以上のカードであればJ, Q, Kの文字列を出力するプログラムを実現したいです。

###発生している問題
char型の配列でJ, Q, Kを管理してるんですけど、
System.out.println()で出力する際に文字コードとして出力されてしまいます。

###該当のソースコード

Java

1import java.util.Scanner; 2import java.util.Random; 3 4class CardApp { 5 public static void main(String[] args) { 6 // 定数定義 7 final int MAX_CARD = 52; // 全カードの枚数 8 final int SPADE = 0; // スペード 9 final int DIA = 1; // ダイア 10 final int HEART = 2; // ハート 11 final int CLOVER = 3; // クローバー 12 13 // 変数定義 14 int remCard = 52; // 残りカードの枚数 15 int n = 0; // 何枚引くか入力した値を格納する変数 16 17 // インスタンス宣言 18 Scanner sc = new Scanner(System.in); 19 Random r = new Random(); 20 21 // カード用の配列を生成 22 char[] chara = {'J', 'Q', 'K'}; // 11以上のカード 23 boolean[][] card = new boolean[4][13]; // 全カード 24 boolean isPull = false; // そのカードが引かれたかをチェックする変数 25 26 for (int i = 0; i < card.length; i++) { 27 for (int j = 0; j < card[i].length; j++) { 28 card[i][j] = isPull; 29 } 30 } 31 32 // メインループ処理 33 while (true) { 34 // 何枚引くか入力する 35 do { 36 System.out.printf("何枚引きますか(%d / %d)(終了 : 0)?", remCard, MAX_CARD); 37 n = sc.nextInt(); 38 } while (n > remCard || n < 0); 39 40 // アプリ終了条件 41 if (n == 0) { 42 System.out.println("アプリケーションを終了します。"); 43 break; 44 } 45 46 remCard -= n; 47 48 49 // 引くカードの値をtrueにする 50 int cnt = 0; 51 while (true) { 52 int idx1 = r.nextInt(4), idx2 = r.nextInt(13); 53 54 if (!(card[idx1][idx2])) { 55 card[idx1][idx2] = true; 56 cnt++; 57 // カード文字列判断処理 58 switch (idx1) { 59 case SPADE: System.out.print("S" + (idx2 >= 11 ? chara[reChar(idx2 + 1)] : reChar(idx2 + 1)) + (cnt != n ? " " : "\n")); break; 60 case DIA: System.out.print("D" + (idx2 >= 11 ? chara[reChar(idx2 + 1)] : reChar(idx2 + 1)) + (cnt != n ? " " : "\n")); break; 61 case HEART: System.out.print("H" + (idx2 >= 11 ? chara[reChar(idx2 + 1)] : reChar(idx2 + 1)) + (cnt != n ? " " : "\n")); break; 62 case CLOVER: System.out.print("C" + (idx2 >= 11 ? chara[reChar(idx2 + 1)] : reChar(idx2 + 1)) + (cnt != n ? " " : "\n")); break; 63 default: break; 64 } 65 } 66 // 指定された引く数分カードを引いたらループ終了 67 if (cnt == n) break; 68 } 69 // アプリ終了条件 70 if (remCard == 0) { 71 System.out.println("アプリケーションを終了します。"); 72 break; 73 } 74 } 75 76 } 77 78 /** 79 * 11以上のカードだったら文字列配列の指定要素を返し、そうでなければ数値を返します。 80 * @param num 文字列判断対象の数値 81 * @return 11以上であれば文字列配列の指定要素 82 */ 83 static int reChar (int num) { 84 switch (num) { 85 case 11 : return 0; 86 case 12 : return 1; 87 case 13 : return 2; 88 default : return num; 89 } 90 } 91} 92 93

###試したこと
String型の配列で管理をすると、問題なく想定通りの挙動をしてくれました。

###補足情報(言語/FW/ツール等のバージョンなど)
言語: Java
Version : 1.8.0

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

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

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

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

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

swordone

2016/12/23 09:33

コードにchar配列が見当たりませんが、どこの話をしているのでしょうか?
guest

回答2

0

3項演算子?:は、第1オペランドがtrueなら第2オペランドを、falseなら第3オペランドを返す演算子です。
3つまとめて一つの演算なので、このかたまりで返り値の型がコンパイル時点で決定します。
今回のコードでいうと、

java

1idx2 >= 11 ? chara[reChar(idx2 + 1)] : reChar(idx2 + 1)

この部分ですが、第2オペランドがchar型、第3オペランドがint型です。charよりintのほうがデータの型として大きいので、この演算子としてはint型を返すとコンパイラは判断します。
そのため、第2オペランドが返る際にはcharがintにキャストされてしまうため、文字コードが表示されてしまうというわけです。

投稿2017/01/16 02:53

swordone

総合スコア20649

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

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

0

1つの関数で数字と文字を返すのは無理があります。ロジックを使わず、
s[1]="1"
:
:
s[13]="K"
としたらいかがですか?

投稿2016/12/23 04:04

katsuya141

総合スコア367

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

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

MyongsongMun

2016/12/23 04:32

一応実現はできたのですが、どうしてこのような現象が起きるのかが知りたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問