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

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

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

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

Q&A

解決済

4回答

2925閲覧

処理が無限ループしてしまいます。

icecleam

総合スコア46

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

0グッド

0クリップ

投稿2020/08/21 16:00

以下のコードでSumScoreを実行時、一人目の名前を未入力でエンターを押した際に「名前を入力してください。」という文言を出力し、再度入力できるようにしたいのですが、うまく出力されません(内容は以下の通り)。

以下の画面でエンターを押すと、「名前を入力してください。」が無限に出力されます。


何人分の成績を入力しますか(数字で入力): 1
1人目の名前:


ここを変えればうまくいくとは思うのですが、わからなかったので教えていただきたいです。
よろしくお願いします。

JAVA

1 2 while (true) { 3 if (!inName.isEmpty()) break; 4 System.out.println("名前を入力してください。"); 5 }

java

1import java.util.HashMap; 2 3/** 4 * 個人の成績を格納し、合計点を計算する機能を提供する。 5 * 6 * @author 7 */ 8public class Person { 9 10 //デフォルトコンストラクターの宣言 11 public Person() { 12 } 13 14 /** 氏名 */ 15 String name; 16 17 /** 成績を格納(科目名, 点数) */ 18 HashMap<String, Integer> recordMap; 19 20 /** 21 * 引数に与えられた名前をもとに、新しいPersonオブジェクトを生成する。 22 * @param name 名前 23 */ 24 public Person(String name) { 25 this.name = name; 26 } 27 28 /** 29 * 合計点を計算する。 30 * @return 合計点 31 */ 32 public int calcSum() { 33 int kokugo = (recordMap.get("国語")).intValue(); 34 int sansu = (recordMap.get("算数")).intValue(); 35 int rika = (recordMap.get("理科")).intValue(); 36 int syakai = (recordMap.get("社会")).intValue(); 37 int sum = kokugo + sansu + rika + syakai; 38 return sum; 39 } 40}

java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.util.HashMap; 4 5/** 6 * 氏名と各科目の点数を入力させ、合計値を表示する。 7 * 8 * 9 */ 10public class SumScore { 11 12 /** 新しいSumScoreオブジェクトを生成する。 */ 13 public SumScore() { 14 } 15 16 /** 17 * mainメソッド 18 * @param args コマンドライン引数(今回は使用しない) 19 */ 20 public static void main(String[] args) { 21 22 try (InputStreamReader inStream = new InputStreamReader(System.in); 23 BufferedReader bufReader = new BufferedReader(inStream)) { 24 25 int kazu = 0; 26 System.out.print("何人分の成績を入力しますか(数字で入力): "); 27 try { 28 String inParam = bufReader.readLine(); 29 kazu = Integer.parseInt(inParam); 30 if (kazu <= 0) { 31 System.out.println("人数は1以上にしてください。"); 32 System.exit(1); 33 } 34 } catch (NumberFormatException e) { 35 System.out.println("人数は整数で指定してください。"); 36 System.exit(1); 37 } 38 39 // 人数分だけPerson配列を生成する。 40 Person[] person = new Person[kazu]; 41 // 人数分だけ点数を入力させる。 42 for (int i = 0; i < kazu; i++) { 43 System.out.print((i + 1) + "人目の名前: "); 44 45 String inName = bufReader.readLine(); 46 while (true) { 47 if (!inName.isEmpty()) break; 48 System.out.println("名前を入力してください。"); 49 } 50 51 // 名前を引数にPersonオブジェクトを生成する。 52 person[i] = new Person(inName); 53 // 成績を格納するHashMapを生成する。 54 HashMap<String, Integer> recordMap = new HashMap<String, Integer>(4); 55 56 // 国語の点数を入力させ、recordMapに点数を格納する。 57 recordMap.put("国語", getScore("国語", bufReader)); 58 59 // 算数の点数を入力させ、recordMapに点数を格納する。 60 recordMap.put("算数", getScore("算数", bufReader)); 61 62 // 理科の点数を入力させ、recordMapに点数を格納する。 63 recordMap.put("理科", getScore("理科", bufReader)); 64 65 // 社会の点数を入力させ、recordMapに点数を格納する。 66 recordMap.put("理科", getScore("社会", bufReader)); 67 68 // recordMap をPersonオブジェクトに代入する。 69 person[i].recordMap = recordMap; 70 } 71 // 合計点を計算し出力する。 72 System.out.println(); 73 System.out.println("====== 合 計 点 一 覧 ====="); 74 for (int i = 0; i < kazu; i++) { 75 int sum = person[i].calcSum(); 76 System.out.println("名前:" + person[i].name + ", 合計:" + sum + "点"); 77 } 78 } catch (Exception e) { } 79 } 80 81 static Integer getScore(String subject, BufferedReader bufReader) { 82 while (true) { 83 try { 84 System.out.print(subject + ": "); 85 String line = bufReader.readLine(); 86 if (!line.isEmpty()) { 87 try { 88 Integer score = Integer.valueOf(line); 89 if (score >= 0 && score <= 100) return score; 90 System.out.println("得点は 0~100点の範囲で入力してください。"); 91 92 } catch (NumberFormatException e) { } } 93 } catch (Exception e) { } 94 System.out.println("得点を入力してください。"); 95 } 96 } 97} 98

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

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

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

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

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

guest

回答4

0

いいわけではない。マルチコア時代におけるマルチCPU時代とも理屈が違うのは純然とした事実であり、主流の回答ではないことを理解しつつ、別な考え方別な見方もあるので、そういう考え方に興味がある方hあお話しましょうというネタでもある。完全に事実誤認であれば仰ることもわかるが、たとえば、スレッド切り替えのハードウェア的なコストはSMTのサポートが有る時無い時、コア数などによって異なってくるため、基本的にSMTなしのシングルコアで考える考え方からするとネタである。という話であり非対称マルチプロセス技術そのものはネタではない。

投稿2020/08/23 03:50

kokorohamoe

総合スコア190

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

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

kokorohamoe

2020/08/23 03:54

一部の方がおっしゃられているが、非対称マルチプロセス技術なり、マルチスレッド技術に関してはC++2AによりC++11時代からの新しい技法 新しい書き方があるため、おっしゃられているように、私がまちがっている可能性も高いが少なくとも複数の書き方(シリアライズ、パラレル)があることは事実であり、私のこの回答は非主流であり、多分にジョークの回答とは時代的にはなってしまうが、シリアライズの回答以外に、パラレル技術の回答 マルチコアの場合の回答もあるため、両方あるよという意味で、ネタとして回答をした。
kokorohamoe

2020/08/23 03:55

ちなみにわたし、どっちかというとシリアライズ派
momon-ga

2020/08/23 11:33 編集

あなたが、この文言を投稿するさいに「あなたの回答」に文言を書いて、「回答する」ボタンを押下してる前提でコメントしますが、 何に対して回答しているつもりなの??? 回答の内容については、どうでもいいが、(どうでもいいと思わない人が低評価すればよい&私は低評価した) ※矛盾しているが、内容は読む価値ないの、どうでもいいと、こんな回答するな!のどうでもよくないが混ざってます。 せめて回答の使い方ぐらい、なんとかならないの?
kokorohamoe

2020/08/23 23:18

ここでは、私は無礼者なのでしょうね。いつも失礼致しております。 質問に応えるのは質問者様なので 正当にならない範囲で、答えのヒントに成るように 答え かつ、それが真実であり、私が作成可能であるということを示すサンプルを 作りました。 https://t.co/x9p8QHXEF2?amp=1 スレッド分と合わせ、これでよいかと思います。よくある追加質問として、シグナルを使わないのか?というものがありますが、カーネルの挙動 およびマルチコアなどを考えると メインメモリだけではなくCPUキャッシュメモリなどの兼ね合いもあるため、質問者様のコードを活かしつつ、かつ他の方とはちがうやりかたということで、提示しております。 https://t.co/x9p8QHXEF2?amp=1 スレッドのサプルです。なおVMの影響によりタイミング問題で毎回回答が異なるようです。スレッドで外部から書き換えるやり方もあるというのが趣旨ですからこれで良いかと思います。ただ、オラクル社のサンプルを見てコピペレベルですので、とくに書く必要がないと考えておりましたが、念の為記述することにしました
Zuishin

2020/08/23 23:26

inName に値をぶっこんでない。0 点。三回提出して三回とも 0 点だったので失格。
Zuishin

2020/08/23 23:28

一つのスレッドしか仕事してないのにわざわざスレッド作るってとうていプログラミング経験者のものとは思えない。作った人にそう伝えといて。
kokorohamoe

2020/08/24 02:21

スレッドには、いわゆるコアによる物理スレッドと、割り込みによる論理スレッドがあります。短いプログラムで大きなプログラムのいち部を抜粋説明するのはよくある技法です。昔は物理スレッドがマルチCPUしかなかったために、一般的には論理スレッドでしたが、コア技術により4-8の物理独立スレッドが当たり前になってきているため、どちらの技術のほうが一般であるか?というのは、ハードウェア割り込みによる、論理スレッドを考えないとしても、一律な答えがありません。また、ヘテロジニアスマルチコアもあるため回答が難しいですが、ごく一般的に抽象化したモデルでもシリアライズする方法と、パラレル化する方法、すくなくとも、2つは紹介される方が望ましいと考えます。なお組み込みも経験しておりますので、ホモジニアスではなくヘテロジニアスとしております。Intel Core i7などはホモジニアスマルチコアだとおもいます。GPUがヘテロジニアスマルチコアかとおもいます。 よろしくお願いいたします。
Zuishin

2020/08/24 02:24

アイハブアペンみたいなこと言わなくていい。失格者は退場。
kokorohamoe

2020/08/24 02:25

またC++11よりスレッドの言語への取り込みが始まりC++17で本格化しているC++の考え方を背景にJavaについても言語仕様にスレッドがありますからif for に準ずると考えていますが if forなど シリアル化のほうが個人的には好きです。とはいえ、他の回答者様もおりますので、一風変わった最近流行の書き方といういみで面白いネタの回答といういみで、オルタナティブ回答としておりますが、表現が難しくて申し訳ございません。一助となれば幸いです。
kokorohamoe

2020/08/24 02:26

あの、なにかコンテストなどには参加していないとおりすがりであることを、明記しておきます。この記事について
Zuishin

2020/08/24 02:26

表現が難しいのではなくまるで意味のないたわごとでしかない。
guest

0

https://stackoverflow.com/questions/1842734/how-to-asynchronously-call-a-method-in-java
基本的に非同期呼び出しの場合、あまりJavaは使えないが、
new Thread(new Runnable() {
public void run() {
x.matches("something");
}
}
).start();
サンプルにあるように外部スレッドを使いinNameにあたいをぶっこめばいい。
16コア32コアが流行り始めている現在 スレッドに注目したのはセンスが良い。知っておくべき知識としては、アフィニティについて調べると良いと思う。

投稿2020/08/22 04:33

編集2020/08/22 04:35
kokorohamoe

総合スコア190

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

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

Zuishin

2020/08/22 05:57

外部スレッドを使ってローカル変数に値をぶっこめって、頭の中に何か涌いてるんですか?
momon-ga

2020/08/22 14:55

何か別の質問と間違えて回答してませんか?
kokorohamoe

2020/08/23 03:13

いわゆるマルチコアアーキテクチャーの場合、OSによるカーネル制御と、クリティカルセクションによるHOTなループではOSも含めたスレッドの処理レベルが異なる。シングルCPUのシングル構成の時代のセオリーが通じる時代ではないためC++2A時代に合わせ回答をしている
kokorohamoe

2020/08/23 03:16

どちらのアーキテクチャーが正解ということはない。昔ながらの割り込みを使ったスレッド制御もあれば、そもそもマルチコアによるハードウェアレベルによる同時スレッド技術もある。なにが正解ということはないので、面白げな回答要因ということで、ネタ回答
Zuishin

2020/08/23 03:28

> 何か別の質問と間違えて回答してませんか? いいえ、その後のコメントや他の回答を見てわかる通り、間違えたわけではなく、この人の普通の回答です。 ネタ回答と言い訳していますが、適当なカタカナを適当に繋いだ意味不明な寝言で初心者を迷わせようとする非常に悪質な回答者です。
kokorohamoe

2020/08/23 05:40

I think tat is sequential .I will write one other idea parallel .初心者であることはお互い様だとは思うが議論には関係ない。
kokorohamoe

2020/08/23 05:42

バケツソート、ハッシュソート、クイックソート、バイナリートなど、プログラムには複数のアルゴリズムがあり、一長一短がある。なにが良いか?ということに一律の回答はない。入力条件、出力条件、ハードウェア構成など外部条件により回答が定まる。そしてRISC,CISCなどがあるようにほぼ必ず別回答がある。
Zuishin

2020/08/23 05:48 編集

むちゃくちゃな英語でごまかすな。並列処理でローカル変数に値ぶっこんで解決すると思ってること自体がプログラミングしたことない証拠。
kokorohamoe

2020/08/23 09:14

https://paiza.io/projects/WZPRT77jA7dTDMDNuSrecw はいよ。 なるべく余計なことをしないように問題箇所だけ書いといた シングルスレッドで書いたのでクラスの方を変えたが、 いいたいことはやり方は何種類もある。 オンラインシステムなのでCPUを使わないを最優先のためこのアルゴリズムとした PC アプリなどでAC直結の場合はCPUを消費しても良いので前述の通りthreadを使ったほうがよい また、がベッジコレクタはシステム優先にしてある
kokorohamoe

2020/08/23 09:16

ガベッジコレクタへのヒントをいつにするかは悩ましい問題ではあるが、もともと処理速度優先という議題なので、すべて速度優先、リソースどかぐいほうこうで ちゃらっとかいた
Zuishin

2020/08/23 09:17

ほらスレッドの意味も知らない。
Zuishin

2020/08/23 09:39 編集

スレッド使って再提出。それと回答に責任もって Stack Overflow のコードも使うこと。0 点。 それとこのコードでは inName を捨てているし、繰り返し無駄な反転をして可読性が低い。ほかにもあるかもしれないが酷すぎて読む価値もない。
kokorohamoe

2020/08/23 13:02

スレッドというのはInt13Hを使う方法とハードウェアを使う方法があり歴史的経緯から今は難しい時期にあります。また、技術というのは、みだりに公開(を要求)するものではない。一般的に、部外に軽々しく公表できるものではないから、簡単に掲示板で言えるものではない。そのため、侮辱にたえるという奇妙なことが発生しかねない。言えない理由がある人がいる。私の場合は私の技術であることがほとんどであるから、私の裁量で書ける。だが、誰かを誹謗中傷し、金銭と等価である知識を引きずり出す行為はほめがたい。だめではないが、きをつけられたい。本人が権利を有していない預託されている技術だった場合、トラブルになりかねない。
kokorohamoe

2020/08/23 13:05

提出はべつに乗りかかった船だからかまわないけれども。1+1=2を書いてといわれるくらいなのは、さすがに、もう少しは難しいが、このレベルでサンプルコードがいるのかという気分にはいわれたほうがなる。
kokorohamoe

2020/08/23 13:06

のりかかったふねだから、お時間はいただくがたまわった。
kokorohamoe

2020/08/23 13:08

Javaでの、スレッド関連のタイマ感数を調べておく。C++の場合cond_waitを使わず、volatile loopを使うことを提案していることには注意されたい。たまに、cond_wait至上主義の人がいるのでつかれる
Zuishin

2020/08/23 13:13

0 点。再々提出。
guest

0

ベストアンサー

inNameがループの中で更新されないからです。
こんな感じの修正でよいかと

java

1 String inName = ""; 2 while (true) { 3 if (!inName.isEmpty()) break; 4 System.out.println("名前を入力してください。"); 5 inName = bufReader.readLine(); 6 }

投稿2020/08/21 16:04

momon-ga

総合スコア4820

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

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

icecleam

2020/08/21 16:10

ありがとうございます! 無事に実行できました!
momon-ga

2020/08/21 16:11

元のソースをあまりいじらないようにしてますが、 コードの意図としては、swordoneさんのように書くのが良いと思います。
guest

0

java

1 while (true) { 2 if (!inName.isEmpty()) break; 3 System.out.println("名前を入力してください。"); 4 String inName = bufReader.readLine(); 5 }

再度入力を要求しないと、inNameは空のままです。
というか、これならこっちのほうがいいのでは?

java

1 while (inName.isEmpty()) { 2 System.out.println("名前を入力してください。"); 3 String inName = bufReader.readLine(); 4 }

投稿2020/08/21 16:04

編集2020/08/21 16:12
swordone

総合スコア20651

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

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

momon-ga

2020/08/21 16:07

たぶん while (inName.isEmpty()) { System.out.println("名前を入力してください。"); inName = bufReader.readLine(); } と、書きたかったのだと思います。
swordone

2020/08/21 16:12

ご指摘ありがとうございます。 何も考えんとコピペしてた…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問