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

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

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

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

Q&A

2回答

504閲覧

変数iの定義方法について

ashura

総合スコア17

Java

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

0グッド

1クリップ

投稿2021/07/11 17:17

編集2021/07/15 09:00

前提・実現したいこと

**以下の仕様を持つメソッドdiscountを作成してください。
** - 引数として受け取った値が1000円以上5000円以下の場合、1000円より大きい分について10%割引にする
** - 引数として受け取った値が5000円より大きい場合、1000円より大きく5000円以下の分について10%割引、5000円より大きい分について20%割引にする
** - 値引き額は小数点以下切り捨てで計算する(キャストを使いましょう)
** - 割引金額の上限は5000円とする
これらの条件を満たすようなソースコードを書きたいのです。

今、直面している問題は、変数iの扱いについてです。変数のシンボルが見つからないのは、mainメソッドのtotalPrice += Integer.parseInt( args[i] )でiが定義されてるからでしょうか?

発生している問題・エラーメッセージ

Ex1_14_2.java:53: エラー: シンボルを見つけられません
total= Integer.parseInt( args[i] );
^
シンボル: 変数 i
場所: クラス Ex1_14_2
エラー2個

public class Ex1_14_2 { //!!!mainメソッドの処理は書き換えないでください!!! public static void main (String[] args) { int totalPrice = 0 ; //購入した商品の合計金額 //コマンドライン引数から購入した商品の合計金額(定価)を取得 for(int i = 0 ; i < args.length ; i++ ){ totalPrice += Integer.parseInt( args[i] ); } //discountメソッドを使って値引きを適用し、値引き後の金額を取得 int discountedPrice = discount( totalPrice ); //値引き後の金額 //calcTaxPaymentメソッドを使って支払金額(税込)を取得 int taxPayment = calcTaxPayment( discountedPrice ); //支払金額(税込) //支払金額(税込)を表示 System.out.println("値引き後の支払金額:" + taxPayment + "円" ); } /* **以下の仕様を持つメソッドcalcTaxPaymentを作成してください。 ** - 引数として受け取った値の税込価格(消費税は8%とする)を計算して返す ** - 税込価格は整数(小数点以下切り捨て)で返す */ static int calcTaxPayment( int price ){ //アンダーバーを適切な内容に書き換えてください int IncludingTax =(int)(price *1.08); return IncludingTax; } /* **以下の仕様を持つメソッドdiscountを作成してください。 ** - 引数として受け取った値が1000円以上5000円以下の場合、1000円より大きい分について10%割引にする ** - 引数として受け取った値が5000円より大きい場合、1000円より大きく5000円以下の分について10%割引、5000円より大きい分について20%割引にする ** - 値引き額は小数点以下切り捨てで計算する(キャストを使いましょう) ** - 割引金額の上限は5000円とする */ static int discount( int total ){ total= Integer.parseInt( args[i] ); if(1000<=total && total<=5000){ total = total-(total-1000)*(int)0.1 ; }else if( total> 5000){ total = total-(total-5000)*(int)0.2-(total-1000)*(int)0.1 ; } return total; System.out.println("割引後の支払金額:" +total+"円"); } }

JAVA

試したこと

変数を入れ替えるなどしましたが、エラー解消ができません。今の状態が最もエラーの少ない形です。

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

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

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

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

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

1T2R3M4

2021/07/11 17:22

System.out.plintin は何を意図しているのでしょうか。 すでに調べているとは思いますが、もう一度 リファレンスや関連の入門サイトで調べてみてはいかがでしょうか。
hoshi-takanori

2021/07/11 19:30

よくあるスペルミスですね。println メソッドの名前の由来は、print (印刷、表示) + line (行) です。
dodox86

2021/07/11 20:09

仮にこのエラーが解消しても、新しいエラーが出ます。他の解決していないご質問にも言えますが、基礎の部分を復習されることをお勧めします。
m.ts10806

2021/07/11 20:14

IDEでコーディングすればこの手のミスは防げると思いますが・・
BeatStar

2021/07/15 08:23

エラーメッセージとかのような、コード以外は(```) の中から取り除きましょう。 書いてもいいですが、せめて分けましょう。
BeatStar

2021/07/15 08:41 編集

それと、インデント( Tabキーや半角スペースでやるアレ ) ぐらいは入れましょう。 今のままでは、 足し算がわかりません。 1 + 1        が 2                     に な るのは わかるのですが、 い わ ゆ る哲学的な意味での…… のような感じです。読みづらいですね。
ashura

2021/07/15 08:31

確かに自分でもとても読み返しづらかったです。新たにプレビューという機能を見つけたため今後は確認してから投稿をしようと思います。書き方のアドバイスいただきありがとうございます。
K_3578

2021/07/15 08:31

どっちでもいいけどコード内のコメント見る限りすっごく課題の丸投げ感がするんですけど。
ashura

2021/07/15 08:37

変に中身を変えてしまいますと、エラーが生じるのではないかと考えままコピーする形で投稿をしました。コード内のコメントは削除する方がいいのでしょうか?自分なりに復習をしたり調べているのですが、知識が乏しいため質問の仕方もあまりわからず丸投げと言われても仕方がないと思っています。
1T2R3M4

2021/07/15 08:43

コメントのありなしではなく、以下にあるようにこのサイトに課題を丸投げする行為が非推奨です。 https://teratail.com/help/avoid-asking コードをください・デバッグしてください等の丸投げの質問 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
ashura

2021/07/15 08:55

なるほど、自分が試してつまづいた箇所を質問することが適正なんですね。ご指摘ありがとうございます。
guest

回答2

0

まずエラーメッセージぐらいは読みましょう

エラーメッセージは怒声でも暴言でも罵倒でもハラスメントでもなく、
コンパイラ等からのメッセージです。

つまり今の状態は『相手の話を聞かずに逆ギレしている人』です。

そんな人はコミュニケーションなんて取れませんよね。


Ex1_14_2.java:53: エラー: シンボルを見つけられません total= Integer.parseInt( args[i] ); ^ シンボル: 変数 i 場所: クラス Ex1_14_2

これは『宣言されていない変数等を使っていることが原因』です。

Ex1_14_2.javaの53行目を見てください。

どうやら、discountメソッドの中らしいですね。

args とはなんでしょうか。

そもそもdiscountメソッドから見える範囲にはありません。

ローカル変数としても存在しないし、フィールドとしても存在しない。(仮にフィールドとしてあっても staticなメソッドだからstaticじゃないとアクセスできないが)

居もしない人を『呼んでくれ』と言っているようなものです。

居ないんだから呼びようがない。呼びようがないから、『んー、太郎って誰?』みたいなコメントをしているのです。

i も同様に。

Ex1_14_2.java:65: エラー: シンボルを見つけられません System.out.plintln("割引後の支払金額:" +total+"円"); ^ シンボル: メソッド plintln(String)

これも意味的には同じ。『存在しないメソッドを呼び出している』ことが原因。

System.out.plintln メソッドとはなんでしょうか。

System.out.printlnでは無いでしょうか。

たかが一字間違いでも機械からすれば大事です。

人間なら『おそらくこれが言いたいのだろう』という推測が出来ますが、機械にはそんな芸当はできません。

ほんのちょっとの間違いで意味が相当違うので、大惨事です。

数学と一緒です。

たかだか桁を一つ間違えただけでも意味を考えると相当違います。

コーラ一本100円のときと、10000円(一万円)では相当違います。

たかが二ケタ違うだけで印象が違う。

ちゃんと書きましょう。

つか、基礎が出来ればいればあり得ない問題。


[追記1]

私の過去回答を参考にしてください。


[追記2]

今、直面している問題は、変数iの扱いについてです。変数のシンボルが見つからないのは、mainメソッドのtotalPrice += Integer.parseInt( args[i] )でiが定義されてるからでしょうか?

mainメソッドから呼び出されていますが、それぞれのメソッドやクラスは別物です。

スコープを意識しましょう。

メソッドから使えるのは、ローカル変数(メソッド内部で宣言しているやつ) と、フィールドだけです。

別のメソッド内にある変数は使えません。

同じ変数名を宣言する事はできますが、別物です。

つか、データの状態を考えればわかるはずです。


[追記3]

main以外でコマンドライン引数を受け取ることはできますか?実際にコマンドライン引数から文字を受けるときには、public static void main(String args[])というコードを打ち、mainの部分をメソッド名に変えることを実行しましたが、totalのシンボルが見つかりませんとエラーが出ました。

まずは基礎をやりましょう

上記で挙げた過去回答にも書きましたが、『入門書等にあるものは「道具」です』。

■ メソッド
■ 引数
■ 戻り値

この辺が分かっていないと無理です。

調べてください。調べない人には教える事はできません。

足し算すら理解していない人に微積分を説明するようなものなので。


[追記4]

何となく私も「基礎が出来ていない状態なのかな」と思っています。

まずは基礎をやりましょう

基礎をないがしろにする人は大成しません
これは100%断言できます。

今の状態は『包丁の使い方がまったくわかりませんが、かつら剥きを極めたいです。やり方を教えてください』というようなものです。

かつら剥きって、相当難易度高いと思います。

みじん切りや角切りとかなら適当に切っても出来そうですが、かつら剥きはうすーーーーく切らないといけませんし、続けないといけません。

でも包丁の使い方すらわかっていないと、下手すれば自分の手や指を切りますし、
良くても、かつら剥きは厳しいと思います。

確かに包丁の使い方程度ならほぼ一瞬で教えることが出来ますが、この包丁の使い方が
たとえばこの道ウン十年の人しかできないっていうようなレベルのものだとどうでしょうか。

そもそもその基礎である包丁の使い方ですら教えきることができませんね。

なので「基礎である、包丁の使い方からやるように!!」と言っても、

「俺様はかつら剥きがしたいんだ!!! 包丁の使い方ぐらい、簡単に教えろよ!!!」というようなものです。

「あー、君、無理だからやめといた方がいいよ?」と言いたくなりますよね。

そういうレベルです。

まずは基礎からやり直しましょう。

基礎が出来て初めて応用が出来るのです


[追記5]

確かに基礎がないがしろの状態で教えていただこうとすることは、とても失礼な行為であると反省しています。基礎の復習とともに質問の仕方についても学んでいこうと思います。また回答者様が調べもの(コードの書き方に悩んだとき)をされる際に気を付けられている点などはございますでしょうか?差し支えなければご教授願いたいです。

んー、場合によりますが、絶対的に「質問は最終手段」ですね。

質問をする場合、相手もその時間を使いますし、"安易に質問をすること"に慣れてしまうと、
毎回聞くはめになるし、検索力もつきません。

つまりその場限りの付け焼き刃でしかなく、場合によっては回答者だけに負担をかけることになります。

質問しかしないなら「俺様が良ければどーでもいい」という発想になりそうですが、
私の場合は基本的に回答者になるので、「俺がこういう質問されたらいやだなぁ」と思うような質問はしないように心がけています。

仮に質問をするとしても、「第三者が再現できるように書く」でしょうか。

たとえば、『自分なりの根拠』とか、『自分なりのコード』、『参考文献』、
『試したこととその結果』とかですね。

これらがあるのとないのとでは雲泥の差です。

無い場合は回答者も無駄な労力(だって質問者がやったこともすべてやるから)だし、
下手すると「君、本当に自分でやったの?」となります。

でも「どのようにやった」とかみたいにある程度再現率が高くなるような情報を付与するだけでも、
「んー、この可能性はないな。ってーことは…○○じゃないかな?」とある程度可能性を絞れます。

そして、検索について。

まずは思いつくキーワードを挙げていく。

今回の場合は「言語名」「エラーメッセージ(の内容)」とかですね。

ファイル名や行番号, "total= Integer.parseInt( args[i] );" とかみたいに常に同じにならないものは省いて、

"エラー: シンボルを見つけられません" の部分とか。

そうすると、「Java "エラー: シンボルを見つけられません"」とかがキーワードになりますね。

ディレクトリ(フォルダ)内にあるファイルをすべて連番にするとかのような処理をしたいなら、

1. ディレクトリ内にあるファイルをすべて列挙する 1.1. ファイル名を変更する

的なロジックになるはずです。

で、(1)がよくわからないので、「ファイル 列挙」という二つのキーワードが出てくるので、これを検索キーワードとする。

Java ファイル 列挙

あるいは、文字から整数にすることもありますね。(例: '1' -> 1 )

その場合、「Java 文字 整数 変換」とかで検索しますが、
大抵は「文字列」の場合もヒットします。

(例: "123" -> 123 )

邪魔(ノイズ)なので文字列のヤツは省いちゃいましょう。

Googleなんかだと "-" や "+" とかを使って排除したり追加したりできます。

今回は排除なので "-" を使う。

Java 文字 整数 変換 -"文字列"」とかみたいに。

で、ノイズだと思ったものを -... で省く。

新たに必要だと思ったキーワードはそのまま追加するか +... とかみたいに追加していく。

こうやって範囲を狭めていけば最終的にヒットします。

後はできれば公式リファレンスを読むことですね。

Javaならここ ですね。

C#ならここですね。

ということで、「質問方法を工夫すること」と「検索力を磨くこと」ですね。

詳しい事は私の過去回答(上記で挙げたもの)を参考にしてください。

投稿2021/07/15 08:36

編集2021/07/19 02:04
BeatStar

総合スコア4958

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

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

ashura

2021/07/15 09:57

main以外でコマンドライン引数を受け取ることはできますか?実際にコマンドライン引数から文字を受けるときには、public static void main(String args[])というコードを打ち、mainの部分をメソッド名に変えることを実行しましたが、totalのシンボルが見つかりませんとエラーが出ました。
dodox86

2021/07/15 10:33

>@質問者さん 外していたらごめんなさいなのですが(むしろ、否定して欲しい) せっかくいただいた回答を咀嚼して理解できないほどに基礎部分が分かっていない感じがします。「試したこと」で、「変数を入れ替えるなどしましたが、エラー解消ができません。」とありましたが、コードをこねくり回すばかりになっていませんか。基礎が分かっていないところに解説して理解してもらうのは実はとても難しい、あるいは不可能なことです。そうなるともう納得して質問をクローズし得る回答は丸投げ案件に対応できるエラーの無い完動品のコードだけです。推奨・非推奨はとりあえず置いておくとして、課題ができなくて焦る気持ちは分からなくもないですが、基礎を学んで理解する時間を省略したとき、その時間を埋めるのは回答者のものではありません。
BeatStar

2021/07/15 10:35

dodox86さん ですね。基礎をないがしろにする人は大成しません。
dodox86

2021/07/15 10:47

@BeatStarさん > 基礎をないがしろにする人は大成しません。 こちらの質問に限った話ではありませんが、学校の課題である場合、単位取得が主な目的であるために当人がそもそもプログラミングで大成しようとは考えていない可能性はあります。そのこと自体は別に(少なくとも私は)構わないと考えているのですが、そんな場合、せめて質疑応答だけでも技術的価値、あるいは別の関連部分で価値が出れば良いと思うのみです。
BeatStar

2021/07/15 10:50

dodox86さん > こちらの質問に限った話ではありませんが、学校の課題である場合、単位... あー、確かにそういうこともありますね。 でもこういうタイプって、そもそも「自分さえ良ければいい」っていうタイプが多いので、 意味のある質疑応答なんて期待できませんよ。 (実際、某袋では課題丸投げして、それに対して指摘したら暴言吐かれたことが何度もあったので)
BeatStar

2021/07/15 10:51

あ、ちなみに質問者さんがそうだとは言っていません。あくまでパターン的にです。
ashura

2021/07/15 14:36

回答いただきまして、ありがとうございます。確かに基礎がないがしろの状態で教えていただこうとすることは、とても失礼な行為であると反省しています。基礎の復習とともに質問の仕方についても学んでいこうと思います。また回答者様が調べもの(コードの書き方に悩んだとき)をされる際に気を付けられている点などはございますでしょうか?差し支えなければご教授願いたいです。
K_3578

2021/07/16 01:43 編集

> 質問者さん > 回答者様が調べもの(コードの書き方に悩んだとき)をされる際に気を付けられている点 そういう質問も過去にあったのでまず調べるようにしよう。聞く前に自分で出来るだけのことをやるのが 当たり前だし、ガイドラインにも書いてあります。 例示するとこういう質問とか。 https://teratail.com/questions/122705 >BeatStarさん teratailのバグか知りませんけど回答が途中で切れてるような。
BeatStar

2021/07/16 01:39

K_3578さん > teratailのバグか知りませんけど…… あ、本当ですね。修正します。
dodox86

2021/07/16 01:40

引き続き横からのコメントで大きなお世話かもしれませんが、そもそももう、別のテーマ、オフトピックです。(質問者、回答者双方同意の上ならアリなのかもしれませんが)
BeatStar

2021/07/16 01:52 編集

dodox86さん 確かにそうですね。~~質問者さん、後は別のスレ(?)を立ててください。~~(打消し線)
K_3578

2021/07/16 01:46

質問立てる前に過去の質問という資産を利用してください。 勉強法とか検索力とか過去に相当質問されているような内容です。 その上で分からないなら新規で質問立てれば良いと思いますが、新規で建てる以上 過去の質問で解決しなかった理由を明確に示さなければなりません。 (問題・課題が含まれていない質問と評価される)
BeatStar

2021/07/16 01:52

K_3578さん あ、確かにそうですね。質問者さん、別スレをたてるのではなくて、「検索」してください。 (上記を書いたのは、「勉強法」とかの意味ではなく、「内容が違うのでこれ以上は…」の意味で書いたのですが、確かに「勉強法」についてのものに見えなくもないですね……)
ashura

2021/07/16 15:57

参考になる質問を教えて頂きありがとうございます。質問を立てる前に調べる(同様の質問がないか等)を心がけて取組みたいと思います。
guest

0

今、直面している問題は、変数iの扱いについてです。変数のシンボルが見つからないのは、mainメソッドのtotalPrice += Integer.parseInt( args[i] )でiが定義されてるからでしょうか?

いいえ、違います。
質問の編集がいい加減なため、現在のソースコードとエラーメッセージが対応していません。
私の環境で現時点での次のコードをコンパイルしてみます。

Java

1public class Ex1_14_2 { 2 3 //!!!mainメソッドの処理は書き換えないでください!!! 4 public static void main (String[] args) { 5 6 int totalPrice = 0 ; //購入した商品の合計金額 7 8 //コマンドライン引数から購入した商品の合計金額(定価)を取得 9 for(int i = 0 ; i < args.length ; i++ ){ 10 totalPrice += Integer.parseInt( args[i] ); 11 } 12 13 //discountメソッドを使って値引きを適用し、値引き後の金額を取得 14 int discountedPrice = discount( totalPrice ); //値引き後の金額 15 16 //calcTaxPaymentメソッドを使って支払金額(税込)を取得 17 int taxPayment = calcTaxPayment( discountedPrice ); //支払金額(税込) 18 19 //支払金額(税込)を表示 20 System.out.println("値引き後の支払金額:" + taxPayment + "円" ); 21 22 } 23 24 25 /* 26 **以下の仕様を持つメソッドcalcTaxPaymentを作成してください。 27 ** - 引数として受け取った値の税込価格(消費税は8%とする)を計算して返す 28 ** - 税込価格は整数(小数点以下切り捨て)で返す 29 */ 30 static int calcTaxPayment( int price ){ //アンダーバーを適切な内容に書き換えてください 31 32 int IncludingTax =(int)(price *1.08); 33 34 return IncludingTax; 35 } 36 37 38 /* 39 **以下の仕様を持つメソッドdiscountを作成してください。 40 ** - 引数として受け取った値が1000円以上5000円以下の場合、1000円より大きい分について10%割引にする 41 ** - 引数として受け取った値が5000円より大きい場合、1000円より大きく5000円以下の分について10%割引、5000円より大きい分について20%割引にする 42 ** - 値引き額は小数点以下切り捨てで計算する(キャストを使いましょう) 43 ** - 割引金額の上限は5000円とする 44 */ 45 static int discount( int total ){ 46 47 48 total= Integer.parseInt( args[i] ); 49 50 if(1000<=total && total<=5000){ 51 52 total = total-(total-1000)*(int)0.1 ; 53 54 }else if( total> 5000){ 55 56 total = total-(total-5000)*(int)0.2-(total-1000)*(int)0.1 ; 57 } 58 59 return total; 60 System.out.println("割引後の支払金額:" +total+"円"); 61 } 62}

エラーメッセージ

text

1Ex1_14_2.java:48: error: cannot find symbol 2 total= Integer.parseInt( args[i] ); 3 ^ 4 symbol: variable args 5 location: class Ex1_14_2 6Ex1_14_2.java:48: error: cannot find symbol 7 total= Integer.parseInt( args[i] ); 8 ^ 9 symbol: variable i 10 location: class Ex1_14_2 112 errors

10行目の mainメソッドの
totalPrice += Integer.parseInt( args[i] ); ではなく
48行目の discountメソッドの
total= Integer.parseInt( args[i] ); とエラーメッセージにあります。

args も i も mainメソッドで宣言された変数であり、discountメソッドの中から
参照することはできません。

この行は要らないのです。だから、参照する必要はありません。

discount をメソッドを呼び出すのは、mainメソッドの中の
int discountedPrice = discount( totalPrice ); です。
main の変数 totalPrice の値が discount の引数 total に渡されます。
discount では、その total の値を元に値引きした値を計算すればいいのです。
ここで、total= Integer.parseInt( args[i] ); を実行しようとするのは、
せっかく引数で渡された total の値をぶっ壊して、また再計算をしたいということです。
この行は要らないのです。

コードの 1行1行が何をするためのものか、よく考えてコーディングしてください。

投稿2021/07/16 04:03

kazuma-s

総合スコア8224

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

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

ashura

2021/07/16 15:54

分かりやすく解説していただきありがとうございます。上の分からコードを再確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問