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

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

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

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

Q&A

解決済

3回答

3515閲覧

java キーボード入力・出力を繰り返すには・・?

Jolie

総合スコア0

Java

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

0グッド

0クリップ

投稿2020/10/09 13:21

前提・実現したいこと

javaで、運賃計算のプログラムを作成しています。
疑問①
乗客の乗った区間数 N が、2度与えられるので、キーボード入力を繰り返したい。
その後の出力も、繰り返し表示させたい。

<イメージとしては・・>
N = sc.nextInt();//1度目の区間数を入力
System.out.println(100 + N * 10);//一度目の出力
N = sc.nextInt();//2度目の区間数を入力
System.out.println(100 + N * 10);//2度目の出力

なので、while文を使ってみたけれど、表示結果がおかしい・・。1度目の区間数を入力しようとすると、なぜか二度入力することになる。二度入力しないと、結果が出力されない。
for文を使ってみても、まず1度目のキーボード入力が2度入力しなければ、結果が出力されない・・。

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ 3 3 130 19 290 ### 該当のソースコード java ソースコードimport java.util.Scanner; public class Fee { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt();//ある乗客の乗った区間数 N //while(N <= 30) for (int i = 0; i < N; i++){ N = sc.nextInt(); System.out.println(100 + N * 10); } //System.out.println(100 + N * 10); } }

試したこと

運賃計算のプログラムを作成しています。
・初乗り運賃 100 円
・1 区間ごとに 10 円ずつ加算
ある乗客の乗った区間数 N が与えられるので運賃がいくらかを出力するプログラムを作成してください。
例えば入力例 1の場合
3
3 区間乗ったので 100 + 3 × 10 という計算となるので、以下のように出力してください。
130

条件
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ N ≦ 30

疑問①
乗客の乗った区間数 N が、2度与えられるので、キーボード入力を繰り返したい。
その後の出力も、繰り返し表示させたい。
<イメージとしては・・>
N = sc.nextInt();//1度目の区間数を入力
System.out.println(100 + N * 10);//一度目の出力
N = sc.nextInt();//2度目の区間数を入力
System.out.println(100 + N * 10);//2度目の出力

なので、while文を使ってみたけれど、表示結果がおかしい・・。1度目の区間数を入力しようとすると、なぜか二度入力することになる。二度入力しないと、結果が出力されない。
for文を使ってみても、まず1度目のキーボード入力が2度入力しなければ、結果が出力されない・・。
Forでもwhileでも、繰り返しの処理はどっちを使ってもいいの?

public class Main {
public static void main(String[] args ) throws Exception {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for (int i = 0; i < N; i++) {
String token1 = sc.next();
String token2 = sc.next();
System.out.println("hello = " + token1 + " , world = " + token2);
}
}
}

↑のサンプルコードの、6・7行目にデータ型と変数名が違う(int N)とは違うものをいきなり出てきたけど、そんなことしていいのか?! いつもそういうところで戸惑う。だって、Nは区間数をキーボード入力するために定義しているけど、String token1 = sc.next();
String token2 = sc.next();←はなんの為に定義したのかがわからない。2回違う、区間数を入力するため? 同じデータ型・同じ変数名が使えないから、わざわざ名前を変えただけ・・?

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

dodox86

2020/10/10 02:21 編集

全般的にJavaとプログラミングの基本を理解されていないような印象を受けましたが、違うでしょうか。現時点で既に2件、回答をいただいていますが、噛み合っていないかんじがします。コードを理解せずいじくりまわして結果だけみてもダメで、理解して主体的に書かなければ希望通りには動かないです。また、質問のポイントを絞りましょう。
Jolie

2020/10/10 02:30

dodox86様 質問も散文的で、全般的にJavaとプログラミングの基本を理解されていないような印象を受けましたが、違うでしょうか。現時点で既に2件、回答をいただいていますが、噛み合っていないかんじがします ↑ まったくおっしゃる通りです。わたしは、現在、プログラミングスクールのCodeCampのオンラインレッスンで学んでいますが、正直、全般的にJavaとプログラミングの基本を理解できていないと感じるまま、Java基礎の最終課題まで運良く進むことができました。しかし、実際は、paizaのスキルチェックDにも至りません。 本日は、オンラインレッスンでしたので、ここに書き込んで頂いた内容を、質問することにしました。そうすると、講師の方によると、手続き型プログラムをすっ飛ばして、オブジェクト指向で考えてしまっているところで、混乱しているということに気づきました。フィールドに入力した変数名しか、書いてはダメだと思っていた事や、そもそもプログラミングの基本は手続き型プログラムだということを今日、知りました・・。_| ̄|○ ご指摘ありがとうございますm(__)m 基本を理解できるように頑張ります。
dodox86

2020/10/10 02:42

> 手続き型プログラムをすっ飛ばして、オブジェクト指向で考えてしまっているところで、混乱しているということに気づきました。 ああ、なるほど、ひとつの原因ではありますね。オブジェクト指向は今は普通に使われる考え方ですが、抽象的なモノの考え方なので、初心の方にはしっくりくるまで結構時間がかかると思います。ですので後回しで良いです。それよりも「逐次、分岐、繰り返し」の基本的な流れに慣れるのが先決でしょう。 (どうでもいいですが、私の先のコメントは一部、編集していますので質問者さんが引用されている部分と違ってしまいましたが気にしないでください。修正したのは私の誤用の為です。すみません)
Jolie

2020/10/10 02:49

dodox86 ですので後回しで良いです。それよりも「逐次、分岐、繰り返し」の基本的な流れに慣れるのが先決でしょう ↑ この部分できるようになるまで、頑張ってみたいと思います! dodox86さんのように、理解できていないという本質を見抜いていただけて スッキリしました。ありがとうございますm(__)m
guest

回答3

0

乗客の乗った区間数 N が、2度与えられるので、キーボード入力を繰り返したい。

ここからしてすでにおかしいです。

質問文に書かれた問題の文章に抜けがあるのでなければ、区間数 N が与えられる(今回のプログラムだとキーボードから入力する)のは一度だけで、その後は、「与えられた N の値を使用する」だけで計算ができます。

Forでもwhileでも、繰り返しの処理はどっちを使ってもいいの?

for と while は、どちらも繰り返し処理を行なう命令なので、(繰り返しの種類による向き不向きはありますが)どちらを使っても同じ処理ができます。

しかし、今回の「運賃計算のプログラム」には、そもそも繰り返しは必要ありません100 + N * 10を計算して、それを表示するだけですからね。

↑のサンプルコードの、6・7行目にデータ型と変数名が違う(int N)とは違うものをいきなり出てきたけど、そんなことしていいのか?! いつもそういうところで戸惑う。だって、Nは区間数をキーボード入力するために定義しているけど、

ええと、そのサンプルプログラムは「今回の問題」とは関係ありません。共通点は、 N という変数を使っていることぐらいです。「入力した数値 N の回数分、『hello = ほげ , world = ふが』みたいな、繰り返し中に入力した2つの文字列を含む行を表示する」というプログラムですね。

投稿2020/10/09 15:57

編集2020/10/09 15:59
Daregada

総合スコア11990

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

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

Jolie

2020/10/09 22:40

解答ありがとうございますm(__)m 区間数 N が与えられる(今回のプログラムだとキーボードから入力する)のは一度だけで、その後は、「与えられた N の値を使用する」だけで計算ができます。 ↑ こちらについてですが・・↓のような感じで良いということでしょうか? public class Fee { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt();//ある乗客の乗った区間数 N System.out.println(100 + N * 10); N= sc.nextInt(); System.out.println(100 + N * 10); N= sc.nextInt(); System.out.println(100 + N * 10); N= sc.nextInt(); System.out.println(100 + N * 10); } ↑これで、何度か同じように入力することができました。これで合っているでしょうか・・? 区間数 N が与えられる(今回のプログラムだとキーボードから入力する)のは一度だけで、その後は、「与えられた N の値を使用する」だけで計算ができます。 ↑上についてですが、キーボード入力を複数回するには、同じデータ型と変数名を使ってはいけないという認識があったので、for文やwhile文を使おうとしました。←そもそもココが間違った考え方なのでしょうか?
Daregada

2020/10/09 22:58 編集

その、「区間数の入力と運賃の計算を複数回行なう」ことは、今回の問題文には書いてないですよね。あなたがそれをやりたいことは伝わりました。問題文とは異なるプログラムを作りたいのですね。 その場合、短いプログラムを書くなら、繰り返す回数を制御する変数(名前はN以外)がNとは別に必要です。forやwhileと、その変数を組み合わせることになります。 ところで、ソースコードを提出すると自動的に合格かどうか自動判定するようなところで勉強しているのなら、問題文とは異なる動きのプログラムを提出すると、当然不合格と判定されます。複数のテストケースで繰り返しプログラムを実行するのは、自動判定する相手の担当なのでは?
Jolie

2020/10/10 02:36

Daregada様 ご回答ありがとうございます。「区間数の入力と運賃の計算を複数回行なう」ことは、今回の問題文には書いてないですよね。← 確かに!そうですね・・(・・;) ところで、ソースコードを提出すると自動的に合格かどうか自動判定するようなところで勉強しているのなら、問題文とは異なる動きのプログラムを提出すると、当然不合格と判定されます。複数のテストケースで繰り返しプログラムを実行するのは、自動判定する相手の担当なのでは? ↑ まったくおっしゃる通りです。 繰り返す回数を制御する変数(名前はN以外)がNとは別に必要です。forやwhileと、その変数を組み合わせることになります。 ↑ こちらについては、解答頂いた内容を元に、オンラインレッスンで質問し 講師の方から、教えて頂くことができました。 ヒントをくださり感謝しますm(__)m ありがとうございました!!
guest

0

自己解決

java
import java.util.Scanner;

public class Kurikaeshi {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = -1;//ある乗客の乗った区間数 Nはー1とかイレギュラーな値を定義しておく
//Nが0だったら終わる
while (N != 0) {
N = sc.nextInt();
System.err.println(100 + N * 10);
}
}
}

投稿2020/10/10 03:01

Jolie

総合スコア0

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

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

0

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

N = sc.nextInt();

for文で比較に使ってるNをそのナカミで変更してはいけません
0を入力したらそれでループが終わってしまうのは理解できるでしょうか

投稿2020/10/09 13:30

編集2020/10/09 13:31
y_waiwai

総合スコア88042

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

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

Jolie

2020/10/09 14:12

返答ありがとうございますm(__)m iが入力した値Nより小さければ、変数iを1つずつ増やしながら、i < Nがfalseになるまで、N = sc.nextInt();を繰り返すという認識でした。なので、0を入力したらそれでループが終わってしまうのは理解できていません・・。0を入力するのは、iを初期化する時に必要なのだと思っていました。Nはキーボードから入力する値なので、比較のしようがないのか・・な?(´-`)
y_waiwai

2020/10/09 14:35

forの条件文はループを回るごとにチェックされ、真であるならループを実行します ここで、0を入力したらNは0になります 次のループに入るときに、条件文は i<0 となって偽となりそこでループを抜け、終了します
Jolie

2020/10/10 02:39

y_waiwai 様 こちらの意味が、最初よくわかっていなかったので 本日は、オンラインレッスンがあったので、コチラの解答を元に質問させて頂きました。 それで、わかることができました。 教えてくださり ありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問