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

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

詳細はこちら
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

2回答

1696閲覧

次のソースコード修正に関するヒントを教えてください。(大学の授業の課題)

Mnt2001

総合スコア0

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

2クリップ

投稿2021/01/18 12:42

編集2021/01/18 15:43

大学の授業の課題で次のようなものが出されました。「答え(ソースコード)」ではなく、「解く為のヒント」を教えてください。言語は”Java”です。

【問題】

以下は「商品の在庫管理に関するプログラム」である。
次のプログラムでは、コマンドライン引数として商品種類の数を指定できたが、
商品の初期在庫を指定できない。コマンドライン引数として、商品種類の数の代わりに、
商品の初期在庫を指定できるようにこのプログラムを修正し、プログラムを作成せよ。
コマンドライン引数がない場合は、デフォルトの要素数(5)で初期化する。
また、初期化直後の在庫も表示せよ。

該当のソースコード

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3public class Kadai12_7 { 4 public static void main(String[] args) throws Exception{ 5 int[] inventory = initialize(args); //在庫データの初期化 6 update(inventory); //在庫データの更新処理 7 output(inventory); //現在の在庫データ表示 8 } 9 10 //在庫変更データの入力 11 static int[] input() throws Exception{ 12 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 13 System.out.print("商品番号?"); 14 int itemnumber = Integer.parseInt(buf.readLine()); 15 16 System.out.print("個数増減?"); 17 int itemchange = Integer.parseInt(buf.readLine()); 18 19 //ここで要素数2の1次元整数配列を生成し 20 //在庫変更データを設定した後 21 //戻り値として配列を返したい 22 23 int item[] = new int[2]; 24 item[0] = itemnumber; 25 item[1] = itemchange; 26 27 return item; 28 29 } 30 31 //在庫データの表示 32 static void output(int[] inventory){ 33 System.out.println("商品在庫:"); 34 35 //ここで配列 inventory を forループで巡回し 36 //在庫にある商品番号(要素番号)と個数を全て表示する 37 38 for( int a=0; a<inventory.length; a++){ 39 System.out.println("商品 "+a+" 個数= "+inventory[a]); 40 } 41 } 42 43 //在庫データの更新 44 static void change(int[] inventory, int[] item){ 45 //ここで引数int[] itemの在庫変更データを参照し 46 //在庫変更データに従い引数 int[] inventory の在庫データを更新 47 inventory[(item[0])]=inventory[(item[0])]+item[1]; 48 } 49 50 //在庫データの初期化 51 static int[] initialize(String[] args){ 52 int size = 5; //デフォルトの要素数 53 if(args.length > 0){ //実行時引数がある場合 54 size = Integer.parseInt(args[0]); //実行時引数で要素数を設定 55 } 56 57 //1次元整数配列 inventory を 要素数 size で生成 58 //生成した配列を戻り値として返す 59 60 int inventory[] = new int[size]; //配列生成 61 62 return inventory; //戻り値設定 63 } 64 65 //在庫データの繰り返し更新処理 66 static void update(int[] inventory) throws Exception{ 67 68 int[] item = input(); //商品増減入力 69 70 //while文を用いて商品番号(item[0])がマイナスの値で無い限り 71 //下記更新処理を繰り返し行う 72 while(item[0] > 0){ 73 change(inventory, item); //在庫データ更新 74 output(inventory); //現在の在庫データ表示 75 item = input(); //商品増減入力 76 } 77 //繰り返しここまで 78 } 79}

###現時点で修正をした箇所
◎修正前

java

1public static void main(String[] args) throws Exception{ 2 int[] inventory = initialize(args); //在庫データの初期化 3 update(inventory); //在庫データの更新処理 4 output(inventory); //現在の在庫データ表示 5 }

◎修正後

java

1public static void main(String[] args) throws Exception{ 2 int[] inventory = initialize(args); //在庫データの初期化 3 output(inventory); //初期化直後の在庫データ表示 4 update(inventory); //在庫データの更新処理 5 output(inventory); //現在の在庫データ表示 6 }

上記のソースコードを実行した時の出力結果

(”商品番号”と”個数増減”は標準入力で、商品番号がマイナスになった時点で処理は終了する。)

商品番号?1
個数増減?2
商品在庫:
商品 0 個数= 0
商品 1 個数= 2
商品 2 個数= 0
商品番号?2
個数増減?5
商品在庫:
商品 0 個数= 0
商品 1 個数= 2
商品 2 個数= 5
商品番号?2
個数増減?2
商品在庫:
商品 0 個数= 0
商品 1 個数= 2
商品 2 個数= 7
商品番号?-1
個数増減?0
商品在庫:
商品 0 個数= 0
商品 1 個数= 2
商品 2 個数= 7

修正後の出力結果(コマンドライン引数=1 3 2 である時)

商品在庫:
商品 0 個数= 1
商品 1 個数= 3
商品 2 個数= 2
商品番号?1
個数増減?2
商品在庫:
商品 0 個数= 1
商品 1 個数= 5
商品 2 個数= 2
商品番号?2
個数増減?3
商品在庫:
商品 0 個数= 1
商品 1 個数= 5
商品 2 個数= 5
商品番号?2
個数増減?2
商品在庫:
商品 0 個数= 1
商品 1 個数= 5
商品 2 個数= 7
商品番号?-1
個数増減?0
商品在庫:
商品 0 個数= 1
商品 1 個数= 5
商品 2 個数= 7

補足情報(使用言語など)

使用しているプログラミング言語はJavaです。

またプログラム作成にはJ-doodleを使用しています。

現時点で自身で分かっている事と分かっていない事は
『初期化後に現在の在庫データを表示する事およびどこを修正するか』は分かっており、
『初期化に関わる部分(initializeメソッド)を修正する事で、目的の出力結果が出る。(要は、この部分を修正すれば、初期化直後の在庫データの表示、つまりは目的の出力結果の表示が可能と考えた。)』事も分かっていますが『その部分の中でも何処を、どのように修正したら良いか。』が分かりません。

※【追記1】現時点での分かっている事、分からない事を追記しました。情報に不足があり、ただ単なる答え丸投げのような書き方に見えてしまい、申し訳ございません。私自身には一切そのような気持ちはありません。授業内容や教科書の参照、先生からのアドバイスをもとに何回も修正・出力を繰り返しましたが、それでも分かりませんでしたので"ヒントをいただきたい"という名目で質問させていただきました。

※【追記2】現時点で、自身で修正した部分のソースコードと『初期化に関わる部分(initializeメソッド)を修正する事で、目的の出力結果が出る。』の理由を直後に()書きで追記しました。

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

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

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

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

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

hoshi-takanori

2021/01/18 13:45

「解く為のヒント」を教えてください。と言われても、問題文をそのままコピペしただけで、それに対してあなたが何をどう理解して、何が分からないのかということを書いてくれないとヒントの出しようがないし、単なる丸投げですね。
Y.H.

2021/01/18 14:44

>『初期化に関わる部分(initializeメソッド)を修正する事で、目的の出力結果が出る。』事も分かっていますが このように考えた根拠を詳細に記載されると良いと思います。
hoshi-takanori

2021/01/18 15:02

> 『初期化に関わる部分(initializeメソッド)を修正する事で、目的の出力結果が出る。』 は明らかなので、むしろこのメソッドでは現在何が行われていて、問題文は何を要求しているか、そのために何を変更すべきかを考えるべきでしょうね。 また、実際に修正したコードがあるなら、それを貼ってくれたら有益なアドバイスができる可能性がありますよ。
hoshi-takanori

2021/01/18 15:38

2021/01/19 00:30 の編集内容を確認しました。main メソッドで initialize を呼んだ直後に output を呼ぶことで、「また、初期化直後の在庫も表示せよ。」は実現できますね。(実際には、インデントが全角スペースのためにエラーになったので、これを半角スペースに修正する必要がありますが。) 次は、「コマンドライン引数として、商品種類の数の代わりに、商品の初期在庫を指定できるようにこのプログラムを修正し」の部分を頑張りましょう。
guest

回答2

0

自己解決

ソースコードの色々な部分をいじって、出力して・・・を繰り返していましたら、目的の結果となりましたので、修正後のソースコードを掲示します。

質問にご協力していただいた皆様、本当にありがとうございました。

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3public class Kadai12_8{ 4 public static void main(String[] args) throws Exception{ 5 int[] inventory = initialize(args); //在庫データの初期化 6 output(inventory); //初期化直後の在庫データ表示 7 update(inventory); //在庫データの更新処理 8 output(inventory); //現在の在庫データ表示 9 } 10 11 //在庫変更データの入力 12 static int[] input() throws Exception{ 13 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 14 System.out.print("商品番号?"); 15 int itemnumber = Integer.parseInt(buf.readLine()); 16 17 System.out.print("個数増減?"); 18 int itemchange = Integer.parseInt(buf.readLine()); 19 20 //ここで要素数2の1次元整数配列を生成し 21 //在庫変更データを設定した後 22 //戻り値として配列を返したい 23 24 int item[] = new int[2]; 25 item[0] = itemnumber; 26 item[1] = itemchange; 27 28 return item; 29 30 } 31 32 //在庫データの表示 33 static void output(int[] inventory){ 34 System.out.println("商品在庫:"); 35 //ここで配列 inventory を forループで巡回し 36 //在庫にある商品番号(要素番号)と個数を全て表示する 37 38 for( int a=0; a<inventory.length; a++){ 39 System.out.println("商品 "+a+" 個数= "+inventory[a]); 40 } 41 } 42 43 //在庫データの更新 44 static void change(int[] inventory, int[] item){ 45 //ここで引数int[] itemの在庫変更データを参照し 46 //在庫変更データに従い引数 int[] inventory の在庫データを更新 47 inventory[(item[0])]=inventory[(item[0])]+item[1]; 48 } 49 50 //在庫データの初期化 51 static int[] initialize(String[] args){ 52 int size = 5; //デフォルトの要素数 53 if(args.length > 0){ //実行時引数がある場合 54 size = Integer.parseInt(args[(args.length-2)]); //実行時引数で要素数を設定 55 } 56 57 //1次元整数配列 inventory を 要素数 size で生成 58 //生成した配列を戻り値として返す 59 60 int inventory[] = new int[size]; //配列生成 61 62 for(int b=0; b<args.length; b++){ 63 64 inventory[b] = Integer.parseInt(args[b]); 65 66 67 68 } 69 return inventory; //戻り値設定 70 } 71 72 //在庫データの繰り返し更新処理 73 static void update(int[] inventory) throws Exception{ 74 75 int[] item = input(); //商品増減入力 76 77 //while文を用いて商品番号(item[0])がマイナスの値で無い限り 78 //下記更新処理を繰り返し行う 79 while(item[0] > 0){ 80 change(inventory, item); //在庫データ更新 81 output(inventory); //現在の在庫データ表示 82 item = input(); //商品増減入力 83 } 84 //繰り返しここまで 85 } 86} 87 88/*(コマンドライン引数=1 3 2) 89商品在庫: 90商品 0 個数= 1 91商品 1 個数= 3 92商品 2 個数= 2 93商品番号?1 94個数増減?2 95商品在庫: 96商品 0 個数= 1 97商品 1 個数= 5 98商品 2 個数= 2 99商品番号?2 100個数増減?3 101商品在庫: 102商品 0 個数= 1 103商品 1 個数= 5 104商品 2 個数= 5 105商品番号?2 106個数増減?2 107商品在庫: 108商品 0 個数= 1 109商品 1 個数= 5 110商品 2 個数= 7 111商品番号?-1 112個数増減?0 113商品在庫: 114商品 0 個数= 1 115商品 1 個数= 5 116商品 2 個数= 7 117*/ 118 119/*(コマンドライン引数無し) 120商品在庫: 121商品 0 個数= 0 122商品 1 個数= 0 123商品 2 個数= 0 124商品 3 個数= 0 125商品 4 個数= 0 126商品番号?1 127個数増減?2 128商品在庫: 129商品 0 個数= 0 130商品 1 個数= 2 131商品 2 個数= 0 132商品 3 個数= 0 133商品 4 個数= 0 134商品番号?2 135個数増減?3 136商品在庫: 137商品 0 個数= 0 138商品 1 個数= 2 139商品 2 個数= 3 140商品 3 個数= 0 141商品 4 個数= 0 142商品番号?2 143個数増減?2 144商品在庫: 145商品 0 個数= 0 146商品 1 個数= 2 147商品 2 個数= 5 148商品 3 個数= 0 149商品 4 個数= 0 150商品番号?-1 151個数増減?0 152商品在庫: 153商品 0 個数= 0 154商品 1 個数= 2 155商品 2 個数= 5 156商品 3 個数= 0 157商品 4 個数= 0 158*/

投稿2021/01/23 12:14

Mnt2001

総合スコア0

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

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

0

質問者さんの理解度が把握しきれないのでヒントを出すのが難しい・・・
とくに考えるようなものでなく、配列に値を設定してください。という問題なので

既存のコードで

  • 配列の生成方法
  • 配列の値の変更
  • 配列のループ
  • コマンドライン引数の数の確認(0と比較して有無を確認している)
  • コマンドライン引数をintに変換

と、サンプルはそろってるので、配列の使い方についてググらなくても解けるレベルだと感じます。

『初期化に関わる部分(initializeメソッド)を修正する事で、目的の出力結果が出る。(要は、この部分を修正すれば、初期化直後の在庫データの表示、つまりは目的の出力結果の表示が可能と考えた。)』事も分かっていますが『その部分の中でも何処を、どのように修正したら良いか。』が分かりません。

initializeメソッドの戻り値が何か、わかりますか?
initializeメソッドの戻り値に対して現状から引数の値を設定すればよいです。
既存のコードで書かれていますが、引数はString(String[])なのでintへの変換が必要です。
配列の値の変更は、ちょっと読みにくく感じるかもしれませんが、changeメソッドですでにやっています。

端的にかけば

java

1int[] hoge = {0, 1, 2}; 2hoge[0] = 123;

とすると、配列hogeは{123, 1, 2}に変わります。

要は、この123にあたる部分をコマンドライン引数から受け取って(int変換して)変更すればよいわけです。

コマンドライン引数として、商品種類の数の代わりに、

”代わり”とあるので、商品種類の数の指定はなくなるように感じますが・・・
商品種類の数は、どのように決めるのか不明です(コマンドライン引数の数=種類数?)

投稿2021/01/19 01:15

momon-ga

総合スコア4826

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

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

Mnt2001

2021/01/19 01:51

回答ありがとうございます。 ご指摘がありました"商品種類の数"ですが、担当の先生に確認してみたいと思います。(分かり次第、このコメント欄にてお知らせ致します。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問