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

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

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

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

Q&A

解決済

2回答

1239閲覧

標準入力された数字の絶対値の合計を表示するプログラム(java)について

user-_.80

総合スコア3

Java

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

0グッド

0クリップ

投稿2021/02/14 06:18

やりたいこと

最初に数字1つが標準入力され、その数字の数分だけ新たに数字が標準入力されます。
それらの数字の列の前後の差の絶対値の合計を表示したいです。

例)
4
1
5
6
7

合計=|1-5|+|5-6|+|6-7|=6
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.main(Main.java:16)

該当のソースコード

import java.util.*;

public class Main {
public static void main(String[] args) {
// 自分の得意な言語で
// Let's チャレンジ!!
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();

for(int i=0;i<=n;i++){ int log[]= new int[n]; log[i] = sc.nextInt(); int x =Math.abs(log[i]-log[i+1]); int sum=0; sum=sum+x; System.out.println(sum); } } }

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

1T2R3M4

2021/02/14 06:39

paizaの問題でしょうか。 問題ページのリンク貼れますか。
guest

回答2

0

ベストアンサー

端的にいえば、iが0~nまで回すなら

int x =Math.abs(log[i]-log[i+1]);

の部分は

int x =Math.abs(log[i-1]-log[i]);

にすればいい。
iが0の場合は、当然 -1のインデックスにアクセスできないので、if文で0以外って条件つければ良い。

あと、

for(int i=0;i<=n;i++){

n回のループをするときに=を含めちゃダメです。
nが4の時に、
0、1、2、3、4 だと、5回ループするので例外が発生します
※n+1で、初期化すれば、たしかに例外は回避しますが、配列の最初のindexが0か1かって
基本的なところなので、0で慣れておいた方がいいです。

ループの中でnew int[n]すると、

int log[]= new int[n];

せっかく保存した

log[i] = sc.nextInt();

の部分が、ループをまわすたびにnew で初期化されるので、期待した結果にならないはずです。
たとえば、log[0] = 1と設定したあとに、log[1] = 5 としても、
log[0] は、再度、初期化されてるので、1でなく0になります。

あと、

int sum=0;

も、ループの中で0にすると最後の部分しか加算されないです。

投稿2021/02/14 11:40

編集2021/02/14 11:44
momon-ga

総合スコア4826

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

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

0

エラーメッセージのとおりで、int log[]= new int[3];として宣言された配列は、2までしか添え字を使えません。

投稿2021/02/14 06:21

maisumakun

総合スコア146018

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

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

user-_.80

2021/02/14 06:44

maisumakun さん 迅速なご回答ありがとうございました。 ご指摘頂いた点を[n]→[n+1]としてもう一度出力したところ今度は下記のエラーメッセージが出ました。 何度も質問してしまい申し訳ありませんが分かりましたらご回答お願いいたします。 Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:937) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at Main.main(Main.java:14) Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:937) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at Main.main(Main.java:14)
maisumakun

2021/02/14 07:05

> 今度は下記のエラーメッセージが出ました。 0からnまでループを回せば、ループを回る回数はn+1回ですが、入力はn個しかないはずです。
user-_.80

2021/02/14 13:53

そうでした、、おっしゃる通りです。初歩的な事を聞いてしまいすいませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問