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

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

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

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

Java

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

Q&A

解決済

4回答

1568閲覧

Loopにならない

Shoan

総合スコア13

if

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

Java

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

0グッド

0クリップ

投稿2017/01/19 23:30

###前提・実現したいこと
一年間の保険の合計金額を表示する問題です。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 + "$"); } } }

}

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

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

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

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

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

maisumakun

2017/01/19 23:48

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

2017/01/19 23:52

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

2017/01/20 00:26

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

回答4

0

①に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 00:56

syachiku

総合スコア117

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

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

Shoan

2017/01/20 01:03

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

2017/01/20 01:08

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

0

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

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

java

1if (age <= 15) { 2 3} else if (age <= 19) { 4 5} else if (age <= 24) { 6 7} else { 8 9}

投稿2017/01/20 00:44

swordone

総合スコア20651

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

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

Shoan

2017/01/20 00:49

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

2017/01/20 01:10

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

2017/01/20 01:15

年齢に値する料金です。
guest

0

まず、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 00:15

masaya_ohashi

総合スコア9206

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

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

Shoan

2017/01/20 00:29

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

2017/01/20 00:49

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

0

ベストアンサー

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

java

1import java.util.*; 2 3public class TPQ 4{ 5public static void main(String args[]) 6{ 7try(Scanner scanner= new Scanner(System.in)) 8{ 9System.out.println("How many people in your family?"); 10int number = scanner.nextInt(); 11int a[] = new int[number]; 12int sum = 0; 13for(int x = 0; x < number; x++) 14{ 15System.out.print("Enter their age:"); 16int age = scanner.nextInt(); 17 18if(age <= 15) 19{ 20System.out.println("No insurance needed"); 21a[x] = 0; 22 23} 24if(age >= 16 && age <= 19) { 25a[x] = 1150; } 26if(age >= 20 && age <= 24) { 27a[x] = 1050; } 28if(age >= 25) { 29a[x] = 900;} 30 31sum += a[x]; 32System.out.println("The total price is" + sum + "$"); 33} 34} 35} 36}

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

java

1import java.util.*; 2 3public class TPQ 4{ 5public static void main(String args[]) 6{ 7try(Scanner scanner= new Scanner(System.in)) 8{ 9System.out.println("How many people in your family?"); 10int number = scanner.nextInt(); 11int a=0; 12int sum = 0; 13for(int x = 0; x < number; x++) 14{ 15System.out.print("Enter their age:"); 16int age = scanner.nextInt(); 17 18if(age <= 15) 19{ 20System.out.println("No insurance needed"); 21a = 0; 22 23} 24if(age >= 16 && age <= 19) { 25a = 1150; } 26if(age >= 20 && age <= 24) { 27a = 1050; } 28if(age >= 25) { 29a = 900;} 30 31sum += a; 32System.out.println("The total price is" + sum + "$"); 33} 34} 35} 36}

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

java

1import java.util.*; 2 3public class TPU 4{ 5public static void main(String args[]) 6{ 7Scanner scanner= new Scanner(System.in); 8 9System.out.println("How many people in your family?"); 10int number = scanner.nextInt(); 11int a[] = new int[500]; 12int sum = 0; 13for(int x = 0; x < number; x++) 14{ 15System.out.print("Enter their age:"); 16int age = scanner.nextInt(); 17 18if(age <= 15) 19{ 20System.out.println("No insurance needed"); 21a[x] = 0; 22 23} 24if(age >= 16 && age <= 19) { 25a[x] = 1150; } 26if(age >= 20 && age <= 24) { 27a[x] = 1050; } 28if(age >= 25) { 29a[x] = 900;} 30 31sum += a[x]; 32System.out.println("The total price is" + sum + "$"); 33} 34 35} 36}

投稿2017/01/20 01:05

編集2017/01/20 02:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Shoan

2017/01/20 01:14

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

退会済みユーザー

2017/01/20 01:18

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

2017/01/20 01:19

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

退会済みユーザー

2017/01/20 01:26

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

2017/01/20 01:32

ありがとうございます。
退会済みユーザー

退会済みユーザー

2017/01/20 01:58

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

2017/01/20 03:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問