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

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

ただいまの
回答率

87.48%

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 742

score -11

前提・実現したいこと

**以下の仕様を持つメソッド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

試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ashura

    2021/07/15 17:37

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

    キャンセル

  • 1T2R3M4

    2021/07/15 17:43

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

    キャンセル

  • ashura

    2021/07/15 17:55

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

    キャンセル

回答 2

+3

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

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

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

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


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/16 10:46

    質問立てる前に過去の質問という資産を利用してください。
    勉強法とか検索力とか過去に相当質問されているような内容です。

    その上で分からないなら新規で質問立てれば良いと思いますが、新規で建てる以上
    過去の質問で解決しなかった理由を明確に示さなければなりません。
    (問題・課題が含まれていない質問と評価される)

    キャンセル

  • 2021/07/16 10:52

    K_3578さん

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

    キャンセル

  • 2021/07/17 00:57

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

    キャンセル

+1

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

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

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+"円");
    }
}


エラーメッセージ

Ex1_14_2.java:48: error: cannot find symbol
        total= Integer.parseInt( args[i] );
                                 ^
  symbol:   variable args
  location: class Ex1_14_2
Ex1_14_2.java:48: error: cannot find symbol
        total= Integer.parseInt( args[i] );
                                      ^
  symbol:   variable i
  location: class Ex1_14_2
2 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/17 00:54

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

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る