🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

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

Q&A

解決済

2回答

2511閲覧

javaで書いたレジシステムを模したプログラムの履歴表示の仕方

chiaki0927

総合スコア1

Java

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

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

0グッド

1クリップ

投稿2021/03/03 03:40

編集2021/03/03 07:44

現在、大学でjava言語の勉強を始めたばかりの初学者です。
課題でレジシステムを模したプログラムを書いていて詰まってしまいました。

import

1 public class CasherSystem{ 2 public static void main(String[] args){ 3 Scanner input=new Scanner(System.in); 4 5 System.out.println("================================="); 6 System.out.println("| WELCOME TO CIMP CASHER SYSTEM |"); 7 System.out.print("================================="); 8 System.out.println(); 9 System.out.println("---------------------------------"); 10 System.out.println("| MAIN MENU |"); 11 System.out.println("---------------------------------"); 12 13 System.out.println("Options"); 14 System.out.println("1 - Checkout"); 15 System.out.println("2 - Transaction History"); 16 System.out.println("3 - Exit "); 17 System.out.println("Please select:"); 18 19 int option = input.nextInt(); 20 if(option == 1){ 21 System.out.println("================================="); 22 System.out.println("| WELCOME TO CIMP CASHER SYSTEM |"); 23 System.out.print("================================="); 24 System.out.println(); 25 System.out.println("---------------------------------"); 26 System.out.println("| MAIN MENU |"); 27 System.out.println("---------------------------------"); 28 29 System.out.println("Options"); 30 System.out.println("1 - Checkout"); 31 System.out.println("2 - Transaction History"); 32 System.out.println("3 - Exit "); 33 System.out.println("Please select:1"); 34 35 System.out.println("---------------------------------"); 36 System.out.println("| PAYMENT SECTION |"); 37 System.out.println("---------------------------------"); 38 System.out.println("Enter customer's bill"); 39 40 double bill = input.nextDouble(); 41 double tax = bill*0.12; 42 double total = bill+tax; 43 44 double[] history = bill,tax,total; 45 System.out.println("Enter custpmer's bill:"+bill); 46 System.out.printf("Price: $ %10.2f\n",bill); 47 System.out.printf("Tax : $ %10.2f\n",tax); 48 System.out.println("-------------------"); 49 System.out.printf("Total: $ %10.2f\n",total); 50 51 System.out.println("Enter customer's payment:"); 52 double pay = input.nextDouble(); 53 double change = pay - total; 54 while(change<0){ 55 System.out.printf("custermar's change:$%10.2f\n",change); 56 System.out.println("Warning:The customer's payment is not enough. Enter customer's payment again."); 57 pay = input.nextDouble(); 58 change = pay - total; 59 } 60 if(change>=0){ 61 System.out.printf("custermar's change:$%10.2f\n",change); 62 63 } 64 System.out.println("================================="); 65 System.out.println("| WELCOME TO CIMP CASHER SYSTEM |"); 66 System.out.print("================================="); 67 System.out.println(); 68 System.out.println("---------------------------------"); 69 System.out.println("| MAIN MENU |"); 70 System.out.println("---------------------------------"); 71 72 System.out.println("Options"); 73 System.out.println("1 - Checkout"); 74 System.out.println("2 - Transaction History"); 75 System.out.println("3 - Exit "); 76 System.out.println("Please select:"); 77 option = input.nextInt(); 78 } 79 80 if(option==2){ 81 System.out.println("================================="); 82 System.out.println("| WELCOME TO CIMP CASHER SYSTEM |"); 83 System.out.print("================================="); 84 System.out.println(); 85 System.out.println("---------------------------------"); 86 System.out.println("| MAIN MENU |"); 87 System.out.println("---------------------------------"); 88 89 System.out.println("Options"); 90 System.out.println("1 - Checkout"); 91 System.out.println("2 - Transaction History"); 92 System.out.println("3 - Exit "); 93 System.out.println("Please select:2"); 94 System.out.println("---------------------------------"); 95 System.out.println("| TRANSACTION HISTORY |"); 96 System.out.println("---------------------------------"); 97 System.out.println(); 98 System.out.println(" History Sales Tax Total"); 99 System.out.println("------------------------------------------------------"); 100 101コード

課題の内容としては、
1、メインメニュー、オプション3つの表示
2、オプションの選択を聞く。
3、1を選んだら商品の入力、お釣りの計算などの処理(ここはできました。)
4、2を選んだら、今まで入力された商品の金額等の最新の5つの履歴の表示。(ここで詰まってます。)
5、3を選んだら、今まで入力されたすべての金額の合計の表示。
終了です。

上のコードの下に履歴を表示させたいのですが、最新の5つの履歴の表示の仕方が、さっぱりわからず困っています。おそらく配列?を使って入力した値を集めるのかと思ったのですが、うまくいきませんでした。
非常に初歩的な質問で恐縮なのですが、回答いただけると助かります。

追記
すいません、、。設計の見直しというのも、どう直していいかわからないのですが課題に添付されていた設計?の流れの画像があったので貼ります。
イメージ説明

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

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

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

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

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

m.ts10806

2021/03/03 04:05

コードはマークダウンのcode機能を利用してご提示ください
chiaki0927

2021/03/03 04:19

ご指摘いただき、ありがとうございます。
dodox86

2021/03/03 05:04

途中までのコードっぽいので分かりませんが、3の"Exit"を選ばなくても終了してしまう(ループしていない)ような全体の作りっぽく見えますが、大丈夫でしょうか。
Luice

2021/03/03 05:15

コードを書くより前に設計を行ったほうが良いです。 課題を噛み砕いて、必要な機能を洗い出してからコードに落とし込んだほうが良いです。
BeatStar

2021/03/03 06:13

私も『仕様を見直せ』に一票です。 設計がバグっていると、出来上がるのもバグだらけになります。 だって「前提自体が間違っている」のだから。
guest

回答2

0

ベストアンサー

あるいは配列としてでもいいので、(追加する前にすでに) サイズが 5 になっていたら古い方( 先端 ) を削除してから追加する。

配列使う場合も、剰余を使うとそんなに大変じゃないです。(たしかに面倒ですが、想像するほどじゃないのでは?)
表示の部分で少し気をつかわないと変なインデックスにアクセスする可能性があるくらい

java

1public static void main(String[] args) { 2 int MAX_HISTORY_SIZE = 3; // 履歴保存数 3 double[][] history = new double[MAX_HISTORY_SIZE][]; // 履歴 4 int historyCnt = 0; // 登録した回数(件、履歴のindexで使用) 5 6 7// このあたりが、option==1で、書く部分 8 history[historyCnt % MAX_HISTORY_SIZE] = new double[] { 1, 1, 1 }; 9 // 登録したらカウントアップ 10 historyCnt++; 11 12 // カウントアップを、登録時にあわせて1行で書いてもよい 13 history[historyCnt++ % MAX_HISTORY_SIZE] = new double[] { 2, 2, 2 }; 14 history[historyCnt++ % MAX_HISTORY_SIZE] = new double[] { 3, 3, 3 }; 15 history[historyCnt++ % MAX_HISTORY_SIZE] = new double[] { 4, 4, 4 }; // 1 が上書きされる 16 17 System.out.println(java.util.Arrays.deepToString(history)); 18 System.out.println("-----"); 19 20 history[historyCnt++ % MAX_HISTORY_SIZE] = new double[] { 5, 5, 5 }; // 2を上書き 21 history[historyCnt++ % MAX_HISTORY_SIZE] = new double[] { 6, 6, 6 }; // 3を上書き 22 23// このあたりが、option==2で、書く部分 24 // 履歴の表示 25 System.out.println(" History Sales Tax Total"); 26 // CNTが履歴保持数を超えているかでループの回数を変更する 27 int loopCnt = (historyCnt > MAX_HISTORY_SIZE) ? MAX_HISTORY_SIZE : historyCnt; 28 // 履歴未満ならcnt分、最大で履歴保持数まで 29 for (int i = 0; i < loopCnt; i++) { 30 // 履歴配列のインデックスは履歴未満なら0スタート(i)で、履歴を超えるなら剰余計算が必要。 31 int dispIdx = historyCnt < MAX_HISTORY_SIZE ? i : (historyCnt + i) % MAX_HISTORY_SIZE; 32 double bill = history[dispIdx][0]; 33 double tax = history[dispIdx][1]; 34 double total = history[dispIdx][2]; 35 // historyを単純な連番にしないなら計算が必要(CNTから-xxレコード分表示) 36 int no = historyCnt < MAX_HISTORY_SIZE ? (i + 1) : historyCnt - MAX_HISTORY_SIZE + i + 1; 37 System.out.printf("%5d, %10.2f, %10.2f, %10.2f %n", no, bill, tax, total); 38 } 39}

結果

[[4.0, 4.0, 4.0], [2.0, 2.0, 2.0], [3.0, 3.0, 3.0]] ----- History Sales Tax Total 4, 4.00, 4.00, 4.00 5, 5.00, 5.00, 5.00 6, 6.00, 6.00, 6.00

追記
このコードをほぼそのままコピーして動きませんという質問がくるとは思いませんでした。
このコードは、考え方というか、BeatStarさんの回答にある

私なら、『5つ分の履歴を保持する』です。(当たり前ですが)

の部分について、配列での実装を示したものです。
ついでに履歴の表示部分が書いてあります。

繰り返しになりますが、そのままコピーしても、そもそも直接的な課題への回答になるようなものではないです。

当たり前すぎて書いてなかったですが、コメント追加しました。

投稿2021/03/03 09:37

編集2021/03/04 06:37
momon-ga

総合スコア4826

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

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

chiaki0927

2021/03/03 10:36

ご丁寧な説明ありがとうございます。上記のコードをdr.javaに打ち込んでコンパイルしてみたところ、 System.out.println(java.util.Arrays.deepToString(history));の行でエラーが発生しました。エラーメッセージは 「java.util.Arrays cannot be resolved to a type」です。 一番上に import java.util.Arrays; と追加してもエラーが出てしまいます。何かエラーの原因がわかれば教えていただきたいです、、。
momon-ga

2021/03/03 10:45

dr.javaが、何かわからないですが、その部分は > [[4.0, 4.0, 4.0], [2.0, 2.0, 2.0], [3.0, 3.0, 3.0]] を表示するだけなので、コメントアウトしてもよいと思います。
BeatStar

2021/03/03 10:56

(あ、そうか。確かに余剰(余り)を使えばいけたか……)
chiaki0927

2021/03/03 10:59

了解です!ありがとうございます。
guest

0

設計や質問にあるコードを無視して書きますね。(質問にだけ答える形で)


まず、設計を見直してください。

それでは書きますね。

えーっと、プログラムって『こう書けばこう動く』ではなくて、人間がやっていることを代理でやっているだけです。

だから『現実世界でならどうするか』を考えてみてください。

今回の場合、『どうやって履歴を保持しているか』を考えるのです。

今回は『最新の5つの履歴を保存』ですね。

私なら、『5つ分の履歴を保持する』です。(当たり前ですが)

たとえば、ホワイトボードかなんかに 書いていく。

たとえば { 4, 10, 2, 5, 8, 3, 11, 100, 10, 11, 12, 11, 10 } という流れだとします。(履歴的な)

まず、4 がホワイトボードに記録されます。
で、次の 10 も記録されます。
...
とやって、8 まで記録します。

で、問題なのが、次から。
3を書こうとしますが、すでに5つ並んでいます。
だから 最初の 4 を排除して、3 を『五位』的な立ち位置で記録。

3の次の 11 も 記録しますが、すでに 5つあるので、最も古い 10 が排除されて、
『五位』として 11 が記録される。

……と言う風にやっていく。

そうすると、最終的に履歴としては { 10, 11, 12, 11, 10 } となっているはずです。

プログラムに落とし込むなら、たとえば ( Javaだと出来るかわかりませんが ) キューにプッシュしていって、(追加時にすでに)サイズが 5 なら ポップして追加。

みたいにする。

あるいは配列としてでもいいので、(追加する前にすでに) サイズが 5 になっていたら古い方( 先端 ) を削除してから追加する。

みたいになると思いますよ。


[追記1]

よくよく考えたら、「ひとつ前に戻る」とか「二つ前に戻る」とか「二つ後に進む」等のような処理をしたいがために今回の内容になっていることに気が付きました。

TerPad等のようなテキストエディタにも同様の処理が含まれているのでそれを実装させたいのだろうと思います。

そう考えると、「配列」か「ArrayList」が望ましいかもしれません。

投稿2021/03/03 06:23

編集2021/03/05 08:04
BeatStar

総合スコア4962

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

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

chiaki0927

2021/03/03 07:47

ご丁寧にありがとうございます。 今回の課題では配列を使いたいので、要素数が5の配列を作成し、入力された値を順番に格納するということでいいんでしょうか?
BeatStar

2021/03/03 07:53

そうですね。要素数は5でいいと思います。( +1 ぐらいでもいいけど。) 順番に入力していって……って感じですね。 でもどの位置に配置したかとかがわからないといけないので、別途、変数が必要だと思います。 現実世界だと、『正の字を書く感じで』です。 それが面倒なので、私ならリスト構造である LinkedListか、キュー構造で保持しますね。 リスト構造なら(追加前のサイズが5なら) 先端を削除して、新規データを追加するだけですし、 キュー構造ならポップするときは先端からで、追加するときは末尾なのでこれも pop & push で事足ります。 なので私ならリス子構造かキュー構造でやります。 でも一応配列でもできるはずです。(自分ですべてやらないといけないのが面倒だけど)
chiaki0927

2021/03/03 10:38

Arraylistを使って試してみます!ありがとうございます。
BeatStar

2021/03/03 10:58

momon-gaさんの回答を読みましたが、確かに余剰(割り算の余り)を使えば配列でも行けますね。 現在位置を i ( forで使うとして ) としてやると i % 6 でいけるかも。
chiaki0927

2021/03/03 11:37

ありがとうございました!試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問