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

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

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

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

Q&A

解決済

2回答

2417閲覧

コマンドライン引数で受取った値をfor文の中で偶奇わけしたい

chimo

総合スコア55

Java

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

0グッド

0クリップ

投稿2020/04/08 01:30

編集2020/04/08 02:17

ケーキの名前と個数をコマンドラインから受け取り計算して合計を示すケーキ屋さんのプログラムを作りたいです。

例えば、コマンドラインに「ショートケーキ 2 モンブラン 1」と打った時、ショートケーキの値段×2+モンブランの値段×1で合計を算出できるようになってほしいです。

わたしはコマンドラインで受取る配列の番号に着目し、偶数(0,2,4,...)ならケーキの種類、奇数(1,3,5,..)ならケーキの個数で、奇数と偶数をワンセットで([0][1],[2][3],...)繰り返し処理を行えば良いと考え、以下のようなプログラムを書きました。

java

1class Cakeshop{ 2 public static void main(String[] args){ 3 int cake = 0 ; //cakeの初期化 4 int sum = 0 ; //sumの初期化 5 int each_price = 0 ; //each_priceの初期化 6 7 for( int i=0 ; i<args.length/2 ; i++ ){ 8 //コマンドラインに打ち込まれたケーキ名によってそのケーキの値段を決める 9 if( args[2*i]=="ショートケーキ"){ 10 cake = 320 ; 11 }else if( args[2*i]=="モンブラン" ){ 12 cake = 350 ; 13 }else if( args[2*i]=="チョコレートケーキ" ){ 14 cake = 370 ; 15 }else if( args[2*i]=="いちごのタルト" ){ 16 cake = 400 ; 17 }else{ 18 cake = 300 ; 19 } 20 21 each_price = cake * Integer.parseInt(args[2*i+1]) ; //各ケーキの値段×個数から出た値 22 sum = sum + each_price ; //各ケーキの値段×個数から出た値を加算していき、合計を求める 23 } 24 25 System.out.println( "合計金額は" + sum + "円です。" ) ; 26 } 27}

すると、エラーは出てきませんでしたが、全てどのケーキも300円として計算されてしまいます...。場合分けの方法が間違ってるのでしょうか。

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

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

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

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

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

guest

回答2

0

コマンドラインで受取る配列の番号に着目し、偶数(0,2,4,...)ならケーキの種類、奇数(1,3,5,..)ならケーキの個数で

ということですので, もう一工夫されると良いのではと思いました.
それは for ループの変数 i の扱いについてです.

for( int i=0 ; i<args.length/2 ; i++ ){

という書き方によって i が 0 から[種類・個数の組]の数(=args.length/2)分ループしていますが, これによって配列の番号に用いる場合に i を 2 倍する必要が生じています.

これを

for( int i=0 ; i<args.length ; i+=2 ){

としますと, i が 0 から 2,4,6,... と常に偶数を指すことになり, [種類・個数の組]の"種類"の配列の番号を指すようになります.
ですので, args[2*i]args[i] となり, args[2*i+1]args[i+1] となって, i を 2 倍する必要が無くなります.

投稿2020/04/09 05:48

jimbe

総合スコア13209

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

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

chimo

2020/04/09 12:25

なるほど!iの進め方を変えるんですね!!iをゼロから一つ飛ばしで進ませることで、偶数のみをさすようにするという画期的な方法があるとは思いませんでした!!メモして、以降きちんとシステムの中でつかえるように心がけます!!とても勉強になりました!コメントありがとうございました!
jimbe

2020/04/09 14:42

ただ, この変更は正常処理時は動作はオリジナルと変わりませんが, ある異常時には異なります. それは, [種類・個数の組]がちゃんと入力されなかった時, すなわち, 個数を入力し忘れた等で args.length が奇数だった時です. 「ショートケーキ 2 モンブラン」とモンブランの個数を入力し忘れた時, オリジナルではショートケーキ 2個の計算だけして結果が表示されますが, 変更した方ではエラー(例外)が表示されます. これはどちらが正しいというよりは仕様としてどちらにするかという問題で, 件では練習問題のようでしたので正常時のみ動作が一致することで良しとしています.
chimo

2020/04/09 14:56

なるほど…いわれてみるまで気づきませんでしたが、そういうエラーも起こってしまうのですね。とても勉強になりました!ありがとうございます!!
guest

0

ベストアンサー

if( args[2i]==ショートケーキ){

2iというキーワードが意味不明です
もしかして、2*i のつもりなのかな?


Cakeshop.java:7: error: cannot find symbol

for( i=0 ; i<args.length/2 ; i++ ){
^

iという変数が定義されてないってことですね
関数の最初にint i; をいれるか、
for(int i=0 ; i<args.length/2 ; i++ ){
とするか、ですね

#エラーメッセージを読んで、なんと書いてあるのか読めるようにしよう


文字列と文字列の比較 - Stringクラスを使った文字列処理 - Java入門

文字列の比較は==ではできません
if( args[2*i].equals("ショートケーキ")){
とする必要がありますね

投稿2020/04/08 01:32

編集2020/04/08 02:32
y_waiwai

総合スコア88042

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

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

chimo

2020/04/08 01:44

そうです!!そこが問題だったんですかね…数学の感覚でいてました…修正してもう一度コンパイルしてみます。
chimo

2020/04/08 01:53

修正してみましたがやはりエラーが出てしまいます・・・。
y_waiwai

2020/04/08 01:57

なら、質問を編集して、そのエラーメッセージを提示しよう 一つエラー潰してもそれで終わりじゃありませんよw
chimo

2020/04/08 02:00

あ、ごめんなさい!質問編集して新たにでたエラーも追記しています。回答していただいたのに追記のお伝えが遅れてしまい申し訳ないです!!
y_waiwai

2020/04/08 02:05

回答に追記しました
chimo

2020/04/08 02:19

回答の追記ありがとうございます。iにintを付け加えて、また自分でもエラーを読んで気づけたこととしてはモンブランやショートケーキを""で囲んでいなかったのでそこも付け加えてコンパイルしてみた結果、コンパイルは通りましたが、全てのケーキが300円として計算されてしまいます...。一応質問にあげたコードも編集しております。
y_waiwai

2020/04/08 02:32

回答に追記しました
chimo

2020/04/08 03:06

あああ…equals忘れてました!!ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問