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

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

ただいまの
回答率

90.53%

  • Java

    15554questions

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

  • if

    243questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Loopにならない

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 654

Shoan

score 7

前提・実現したいこと

一年間の保険の合計金額を表示する問題です。15歳以下は保険に加入することができない、16から19歳は15%増、20から24は5%増、25歳以上は10%引きという設定です(ベースは1000ドル)。まず、家族が何人かを聞いて、年齢を一人ずつ聞いてarrayに記録し、その合計を表示しようと思ったのですがエラーが出てしまいます。
Java初心者なのであまりループなどおはずかしながら把握しておりません。

You are to write a program for small insurance company.  The program is supposed to determine the cost of automobile insurance premium for each family member, based on their ages. The basic insurance price is $1,000 per year per person plus an additional amount based on age, per the table below.

16 to 19    Additional 15% of basic price
20 to 25    Additional 5% of basic price
Over 25    Discount 10% of basic price
Any other age    No insurance

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

Loopにならず、エラーが出ます。
年齢を聞かれ、入力するとエラーがでます。

該当のソースコード

import java.util.*;

public class Totalprice 
{
public static void main(String args[])
{
try(Scanner scanner= new Scanner(System.in))
{
System.out.println("How many people in your family?");
int number = scanner.nextInt();
int a[][] = new int[2][number];

for(int x = 0; x < number; x++)
{
System.out.print("Enter their age");
int age = scanner.nextInt();

if(age <= 15)
{
System.out.println("No insurance needed");
a[x][number] = 0;
return;
}
if(age >= 16 || age <= 19)
a[x][number] = 1150;
if(age >= 20 || age <= 24)
a[x][number] = 1050;
if(age >= 25)
a[x][number] = 900;

int sum = 0;
sum += a[x][number];        
System.out.println("The total price is" + sum + "$");
}  
}
}
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • maisumakun

    2017/01/20 08:48

    エラーが出たときは、「どのようなエラーが出たか」がいちばん重要です。エラーメッセージを記載していただければ、大きな手がかりとなります。

    キャンセル

  • Shoan

    2017/01/20 08:52

    毎回部分的にかえると違うエラーがでてくるのですが、今あるエラーは java33: error: cannot find symbol symbol: variable x location : class Totalprice です

    キャンセル

  • swordone

    2017/01/20 09:26

    コードのマークダウンをしてください(質問編集画面でコード部分を選択状態にし、<code>ボタンを押す)。コードが読みやすくなります。

    キャンセル

回答 4

+2

まず、aという変数ですが、配列で2×number分の領域を確保していますが、この2という部分はなんでしょうか?金額を足していくだけならa[number]というnumber個分の配列だけでよいはずです。というか、合計を出すだけならこの配列aすら不必要で、変数sumだけで十分です。

a[x][number]に値を代入しようとしていますが、例えばnumberが2だったとき、最初のループでx=0、number=2の状態であるため、2×2で取った配列の(0,2)へアクセスしようとするわけですから、配列の長さが足りません。配列の添字は0から始まるため、2の長さで取ったものでアクセスできる添字は0か1だけdだけです。
※例えば2×2の配列でアクセスできるのは(0,0)、(0,1)、(1,0)、(1,1)の4パターンだけです。

おそらくxという変数は人数分の繰り返しの添字のつもりだと思いますが、実際に配列へアクセスするときはxは配列の1段目の添字に使われており、number分の大きさを取った2段目の配列の部分ではありません。

sumという変数ですが、人数分繰り返す処理の「中」に宣言しているため、一人処理するたびに0にリセットされ、意図している合計にならず、必ず毎回その人の額になってしまいます。

最後に出力している合計額も、最後ではなく一人ずつ毎回出力しているのもおかしいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/20 09:29

    sumの部分をforの外に出し、int a[][] の代わりにint a[number]でしょうか? ほかに改善点等ありましたらご指摘お願いします。

    キャンセル

  • 2017/01/20 09:49

    そうです。変数宣言はint a[number]で十分です。というか、sumを外に出したらのなら、毎回sumに直接金額を足していけばよいです。配列に格納していく必然性はいまのところ感じません。このあとその配列を使ってなにか処理をするなら別ですが、合計を出すだけなら不要です。

    キャンセル

+2

エラーの直接的な原因はmasaya_ohashiさんの回答の通りです。

ほか、15歳以下の場合returnしていますが、これではmainメソッドから抜けてしまい、プログラムが終了してしまいます。ここのreturnは不要です。
また、分岐の部分はelseを使えばわざわざ論理和をとる必要がなくなります。

if (age <= 15) {

} else if (age <= 19) {

} else if (age <= 24) {

} else {

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/20 09:49

    masaya_ohashiさんからa[number]のみでよいとのご指摘をいただき、各年齢の下の価格の部分を変えたいと思うのですがそこはどのように変えればよろしいでしょうか?

    キャンセル

  • 2017/01/20 10:10

    各年齢の下の価格の部分というのが何なのかわからないです。

    キャンセル

  • 2017/01/20 10:15

    年齢に値する料金です。

    キャンセル

+2

①にint型の多次元配列について
家族の人数分だけ年齢と保険金額を保持したいなら
int a[][] = new int[number][2];が正しいですね。

質問者の宣言をイメージにすると
左の[2]を【】で表した場合
【[],[],[]】
【[],[],[]】
となるので
2人の家族に対して3つの情報格納場所があるといったイメージになります
もしこのイメージを
【[],[],[]】 //年齢を格納する配列
【[],[],[]】 //金額を格納する配列
としたいのならMapを用いるべきでしょう。

②for文でのループについて
numberの値によって配列の要素数が変わってくるのにそのnumberが固定値、しかも配列の要素外で
a[0][~]とa[1][~]の2つと決まっている要素数の指定に変数 x を使用してループしているのがおかしいですね。
ループする度に値が変わる x で指定するべきなのは number 人目の家族なので
年齢と保険金額を格納する場合
a[0][x] = x人目の年齢
a[1][x] = x人目の保険金額
という書き方をするのが妥当でしょう。

③if文の条件式について
例えば1つ目の条件式
if (age >= 16 || age <= 19)
では16以上 または 19以下になるので
0歳でも100歳でも条件にあてはまってしまいます。
「||」 ではなく「&&] を使用すると
16以上 かつ 19以下 となるので正しい条件式になります。

④計算と出力について
int sum = 0;
sum += a[x][number];
System.out.println("The total price is" + sum + "$");

これらを全てfor文のループ内に書くのはダメです。
まず1行目の int sum = 0; でループする度に合計値 sum が0になります。
ループが始まる前に宣言しておきましょう。
2行目はそのままの位置(for文内)で大丈夫です。(内容は②で指摘したとおりです)
3行目の System.out.println("The total price is" + sum + "$"); は
for文内に書くとループごとにその時の合計値が出てしまうのでループが終わった後、
つまり全ての保険金額を合計した後にしましょう。

長くなりましたが以上になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/20 10:03

    ご回答ありがとうございます。Mapはどのような使い方になりますか?初心者なもので申し訳ないです。。。

    キャンセル

  • 2017/01/20 10:08

    Mapについてはここのコメント欄で1から説明できるほど簡単に扱えるものではないですね・・・。今は現状のコードのダメな部分をしっかり把握して改善する必要があります。今あなたが書いているコードは基礎中の基礎なので。他に今回のコードで分からないところはありますか?

    キャンセル

checkベストアンサー

+1

以下で目的の結果は出ると思うので参考にできるかも知れません

import java.util.*;

public class TPQ 
{ 
public static void main(String args[]) 
{ 
try(Scanner scanner= new Scanner(System.in)) 
{ 
System.out.println("How many people in your family?"); 
int number = scanner.nextInt(); 
int a[] = new int[number];
int sum = 0; 
for(int x = 0; x < number; x++) 
{ 
System.out.print("Enter their age:"); 
int age = scanner.nextInt();

if(age <= 15) 
{ 
System.out.println("No insurance needed"); 
a[x] = 0; 

} 
if(age >= 16 && age <= 19) {
a[x] = 1150; }
if(age >= 20 && age <= 24) {
a[x] = 1050; }
if(age >= 25) {
a[x] = 900;}

sum += a[x];         
System.out.println("The total price is" + sum + "$"); 
}   
} 
} 
}

別の方法で実行するものが以下です

import java.util.*;

public class TPQ 
{ 
public static void main(String args[]) 
{ 
try(Scanner scanner= new Scanner(System.in)) 
{ 
System.out.println("How many people in your family?"); 
int number = scanner.nextInt(); 
int a=0;
int sum = 0; 
for(int x = 0; x < number; x++) 
{ 
System.out.print("Enter their age:"); 
int age = scanner.nextInt();

if(age <= 15) 
{ 
System.out.println("No insurance needed"); 
a = 0; 

} 
if(age >= 16 && age <= 19) {
a = 1150; }
if(age >= 20 && age <= 24) {
a = 1050; }
if(age >= 25) {
a = 900;}

sum += a;         
System.out.println("The total price is" + sum + "$"); 
}   
} 
} 
}

エラー発生部分ではないかと思える場所を削ったものが以下です

import java.util.*;

public class TPU
{ 
public static void main(String args[]) 
{ 
Scanner scanner= new Scanner(System.in); 

System.out.println("How many people in your family?"); 
int number = scanner.nextInt(); 
int a[] = new int[500];
int sum = 0; 
for(int x = 0; x < number; x++) 
{ 
System.out.print("Enter their age:"); 
int age = scanner.nextInt();

if(age <= 15) 
{ 
System.out.println("No insurance needed"); 
a[x] = 0; 

} 
if(age >= 16 && age <= 19) {
a[x] = 1150; }
if(age >= 20 && age <= 24) {
a[x] = 1050; }
if(age >= 25) {
a[x] = 900;}

sum += a[x];         
System.out.println("The total price is" + sum + "$"); 
}   

} 
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/20 10:14

    ご回答ありがとうございます。 一番最後の}の部分で error: class, interface, or enum expectedとでたのですがどういったエラーかご存知ですか?

    キャンセル

  • 2017/01/20 10:18

    }が足らないか多いかどちらかだと思います
    一番上の行から一番下の行まで全部用いてコンパイルするとエラーなしに実行できると思うのですが・・・

    キャンセル

  • 2017/01/20 10:19

    すみません。うっかりミスをしてました。もうひとつ、sum += a [x] cannot find variable x と出てしまいました。

    キャンセル

  • 2017/01/20 10:26

    ちょっと分かりませんね 違うコードを上の回答に追記するのでそちらで試してみてはどうでしょうか

    キャンセル

  • 2017/01/20 10:32

    ありがとうございます。

    キャンセル

  • 2017/01/20 10:58

    以前どこかで、配列の大きさを一つのコード内で入力した数値に応じて設定しようとするとエラーが出る場合がありました 環境の違いによるものだと思うのですが、とりあえず配列の最大値を500にして(500人以上はできない)その他エラーの原因となる可能性のある部分を削ったコードを上の回答に追記しておきます

    キャンセル

  • 2017/01/20 12:24

    大変ありがとうございました。助かりました。

    キャンセル

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

  • Java

    15554questions

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

  • if

    243questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。