アプリ版:「スタンプのみでお礼する」機能のリリースについて

Java超初心者のため皆さんの力を貸して下さい。
下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教えて頂けると助かります。宜しくお願いします。

※回答の際は、コンパイルして確認したいと思っておりますので、お手数ですがプログラムを全て記述して頂けると非常に助かります。

ちなみにプログラムの具体的な内容ですが、
「キーボードからメニュー番号1を選択しEnter ⇒ 名前を入力しEnter ⇒ 生年月日を入力しEnter ⇒ 電話番号を入力しEnter ⇒ システム内に保存され、今まで入力した内容と会員番号(自動採番)が付加された状態の一覧が表示される」プログラムです。

--------------------------------------------------------
◆メニュー番号を選択してください。
1.登録 2.照会 3.検索 4.削除
1
■名前を入力してください。
○○○○
■生年月日を入力してください。
2012/12/30
■電話番号を入力してください。
090○○○○○○○○
#### 会員情報を表示します ####
<1人目>
[会員番号]JAVA0001
[名前]○○○○
[生年月日]2012/12/30
[電話番号]090○○○○○○○○
--------------------------------------------------------

A 回答 (4件)

こういう質問を、一般に「丸投げ」といいます。

つまり「最初から最後まで全部作ってください」という質問のことで、もっとも嫌われる質問の一つです。

少なくともプログラミングのカテゴリで、プログラミングを覚えようと思っているのであれば、現時点で書けるところまでできたものを添付してください。その上で、「ここまでは作れたが、これとこれがわかりません」と質問してください。

Javaの超初心者であっても、最初から最後まで何一つできないということはないはずです。ごくごく簡単なソースコードを書いてコンパイルし、「Hello World」と表示する、ぐらいまではやっているはずです。であれば、少なくともクラスの骨格を書いて、mainメソッドを書いて……ぐらいまではできるはずです。何もできないということはありえませんし、もし本当に何もできないなら、こんなことを質問せず、Javaの最初の使い方から勉強し直すべきです。

ということで、あなたが現時点でどこまでできたのか、ソースコードを補足に貼ってください。それをもとに、わからない部分を補足することはできるでしょう。

この回答への補足

※文字数制限がありますので、補足と回答欄に貼り付けました。

ご指摘どおり、途中までは作成していましたが自身が無く質問を丸投げしてしまいました。。失礼致しました。

下記に、分からない部分・状況・質問の記載と、途中まで作成したソースコードを貼り付けましたので、もし宜しければ教えて頂ければと思います。
お手数ですが宜しくお願いします。


【状況】
Kaiinフォルダを作成し、その中に「Kaiin.java」と「KaiinSystem.java」の2個ファイルを作成。(2ファイルは連動しています)
コマンドプロンプトで、「KaiinSystem.java」のほうをコンパイル実行すると、質問欄に記載した実行結果が表示されるようにしたいです。

<現状の実行結果>
・コンパイル実行は可能
・入力内容が反映されない
・2人目以降登録できておらず<○人目>の部分がずっと<1人目>と表示
・会員番号も自動採番にならない。
--------------------------------------------------------
◆メニュー番号を選択してください。
1.登録 2.照会 3.検索 4.削除
1
■名前を入力してください。
○○○○
■生年月日を入力してください。
2012/12/30
■電話番号を入力してください。
090○○○○○○○○
#### 会員情報を表示します ####
<1人目>
[会員番号]JAVA0001
[名前]name
[生年月日]barth
[電話番号]tel
--------------------------------------------------------


【質問】
どのように修正を行えば、2人目以降の登録、会員番号が自動採番、登録内容が保存・反映されますか??
(恐らく、Kaiin.javaのほうのファイルを修正するのかなと思っていますが・・)

一応、「KaiinSystem.java」ファイルへgetterやsetterのメソッドを、
「Kaiin.java」ファイルへArrayListまたはLinkedListメソッドをそれぞれ組み込んでみたりと色々と試行錯誤しましたが、保存・反映されませんでした。
getterやsetter、ArrayListもしくはLinkedList等のメソッドを使用して作成できると思うんですが、よく分かりません。。



<Kaiin.java>
-----------------------------------------------------
import java.io.*;
import java.util.*;


public class Kaiin {
private static int lastID = 0;//最終番号
private static final String KAIIN_ID_FORMAT = "JAVA"; //会員番号フォーマット
private String kaiinID; //会員ID
private String name; //名前
private String barth; //誕生日
private String tel; //電話番号


//会員情報を作成し初期化(会員IDは自動採番)
public Kaiin(String name, String barth, String tel) {
this.kaiinID = makeKaiinID();//会員ID取得 & 最終番号カウントアップ
this.name = name;
this.barth = barth;
this.tel = tel;
}

//会員情報を作成し初期化(会員IDは受け渡す)
public Kaiin(String id, String name, String barth, String tel) {
this.name = name;
this.barth = barth;
this.tel = tel;
this.kaiinID = id;
setLastID(id);//最終番号を更新
}


//会員情報を取得
public String getName() { //名前
return name;
}
public String getBarth() { //生年月日
return barth;
}
public String getTel() { //電話番号
return tel;
}
public String getID() { //会員ID
return kaiinID;
}


//会員情報を設定
public void setName(String iname){ //名前
this.name = iname;
}
public void setBarth(String ibarth){ //生年月日
this.barth = ibarth;
}
public void setTel(String itel){ //電話番号
this.tel = itel;
}
public void setID(String ikaiinID){ //会員ID
this.kaiinID = ikaiinID;
}


//会員情報を文字列に変換
@Override
public String toString() {
return "[会員番号]:" + kaiinID + "\n[名  前]:" + name + "\n[生年月日]:" + barth + "\n[電話番号]:" + tel;
}

//会員情報を文字列に変換(CSV形式)
public String toCsvFormat() {
return kaiinID+","+name+","+barth+","+tel;
}

//会員情報の最終番号を設定(指定番号が最終番号でない場合、設定なし)
public static void setLastID(String id){
String sid = id.substring(KAIIN_ID_FORMAT.length());
int iid;
try {
iid = Integer.parseInt(sid);
} catch (NumberFormatException e) {
return;
}
if( lastID < iid ) {
//最終番号を更新
lastID = iid;
}
}

//会員情報の最終番号取得
public static int getLastID(){
return lastID;
}

//会員情報の会員ID作成
private String makeKaiinID(){
lastID = lastID + 1;
String newID = String.format("%04d",lastID);
return KAIIN_ID_FORMAT + newID;
}
}
-----------------------------------------------------

補足日時:2012/12/31 07:52
    • good
    • 0
この回答へのお礼

<KaiinSystem.java>
-----------------------------------------------------
import java.io.*;
import java.util.*;

public class KaiinSystem {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line;
try {
System.out.println("◆メニュー番号を選択してください");
System.out.println("1.登録 2.照会 3.検索 4.削除");
line = reader.readLine();
int n = Integer.parseInt(line);
switch(n) {
//1.登録
case 1:
System.out.println("■名前を入力して下さい");
line = reader.readLine();

System.out.println("■生年月日を入力して下さい");
line = reader.readLine();

System.out.println("■電話番号を入力して下さい");
line = reader.readLine();

Kaiin kaiin = new Kaiin("name","barth","tel");

//会員情報登録内容表示
System.out.println("##### 会員情報を表示します #####");
System.out.println("<1人目>\n" + kaiin);
break;

//2.照会
case 2:


//3.検索
case 3:


//4.削除
case 4:


default:
System.out.println("1~9の間の番号を入力して下さい。");
break;
}
}
catch (IOException e) {
System.out.println(e);
}
}
}
-----------------------------------------------------

お礼日時:2012/12/31 07:53

> Kaiin kaiin = new Kaiin("name","barth","tel");



この前の部分でせっかく名前・生年月日・電話番号を入力させているのに、それを使わずに"name"や"barth"などの固定文字列を使うのはなぜですか?

ついでに書くと、「誕生」にあたる英単語の綴りはbirthです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2013/01/06 11:00

人が書いたソースコードを読むのも勉強になると思うのでとりあえず既に書かれているものに追加する感じで、期待する動作をするように書き進めてみました。


#2で既に指摘されている通り、Kaiinをnewするときの引数が変ですね。スペルも間違っています。

さらに、元のだと複数の会員を管理するシステムにはならないので、会員クラスのインスタンスをリストに格納するように書き換えました。
ArrayListの使い方については次のJavaDocでも読んでくださいな。
http://docs.oracle.com/javase/jp/6/api/java/util …

import java.io.*;
import java.util.*;

public class KaiinSystem {
List<Kaiin> kaiins;

public KaiinSystem() {
kaiins = new ArrayList<Kaiin>();
}

public void listAll() {
// 会員情報登録内容表示
System.out.println("##### 会員情報を表示します #####");
int seq_number = 1;
for (Kaiin kaiin : kaiins) {
System.out.printf("<%d人目>\n%s\n", seq_number, kaiin);
++seq_number;
}
}

public void register(String name, String birth, String tel) {
kaiins.add(new Kaiin(name, birth, tel));
}

public static void main(String[] args) {
KaiinSystem kaiinSystem = new KaiinSystem();
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String line;
boolean quit = false;
try {
while (!quit) {
System.out.println("◆メニュー番号を選択してください");
System.out.println("1.登録 2.照会 3.検索 4.削除 5.終了");
line = reader.readLine();
int n = Integer.parseInt(line);
switch (n) {
// 1.登録
case 1:
System.out.println("■名前を入力して下さい");
String name = reader.readLine();

System.out.println("■生年月日を入力して下さい");
String birth = reader.readLine();

System.out.println("■電話番号を入力して下さい");
String tel = reader.readLine();
kaiinSystem.register(name, birth, tel);
kaiinSystem.listAll();
break;

// 2.照会
case 2:
kaiinSystem.listAll();
break;
// 3.検索
case 3:
break;
// 4.削除
case 4:
break;
case 5:
quit = true;
break;
default:
System.out.println("1~5の間の番号を入力して下さい。");
break;
}
}
} catch (IOException e) {
System.out.println(e);
}
}
}

スピードを求めないならリストを一つ一つ比較すれば検索が作れますし、検索が作れたら検索してマッチしたものをリストから消すだけなので、削除も簡単に作れますよね。リストの操作については先に出したArrayListのJavaDocのremoveメソッドを参照してください。
検索の仕方として会員IDで探すのか名前などで探すのかというのはありそうですが、リストを一つ一つ調べる方法だったらどんな検索でもできます。

あと、こんなクラスの使い方をするならsetter/getterは要らないのではないかとか、例外の使い方が雑だとか、会員IDに4桁以上の値が入った時の処理が考慮されていないとか、使っていないものをimportしているとか気になるところは色々とありますが。

この回答への補足

回答ありがとうございます。
参考になり大変助かりました。

もし宜しければ教えて頂きたいことがあります。
現在、「2.照会」を作成中ですが、どのように作成したらいいのか分からず困っています。
下記に実装させたい機能と質問を記載し、作成出来たところまでのソースコードを貼り付けました。

【実装させたい機能】
・会員番号を入力 ⇒ 該当会員番号の登録内容が一覧表示
・入力した会員番号が存在しない場合 ⇒ エラーメッセージを表示し、メニュー画面に戻る
・会員番号を何も入力しない場合 ⇒ 登録した全件データが一覧表示される


【作成途中のソースコード】※照会の部分のみ貼り付けました。
// 2.照会
case 2:
System.out.println("会員番号を入力して下さい。例)JAVA0000");
String seq_number = reader.readLine();
//会員番号が該当する場合
if ( == ) {
memberSystem.listAll();
//会員番号が存在しない場合(true)、何も入力しなかった場合(false)
} else if ( != ) {
System.out.println("会員番号が存在しません。メニュー画面に戻ります。");
} else {
memberSystem.listAll();
break;

【質問】
条件式をどのように指定すると「実装させたい機能」に記載している機能を実装した照会が作成できますか?
if文で作成できると思い途中まで作成しましたが、条件式をどのように指定するのか分からず困っています。
(一応、これを使用するのかなと思った比較演算子を条件式に記載しております。)

お手数ですが、教えて頂けると助かります。
宜しくお願いします。

補足日時:2013/01/02 13:00
    • good
    • 0

if文だけではおっしゃるようなことはできません。

リストの中で特定の条件をみたすものを探すようなことをするにはリストの要素を一つ一つ虱潰しに調べることですね。
というわけで、for文とオブジェクトの比較について勉強しましょう。

指定された会員IDを表示するメソッドを書いてみたので参考にしてください。
public void printKaiin(String id) {
boolean found = false;
if (id.equals("")) { // If empty line is given, show all.
listAll();
return;
}

for (Kaiin kaiin : kaiins) {
if (id.equals(kaiin.getID())) {
System.out.println(kaiin);
found = true;
}
}
if (!found) {
System.out.println("会員番号が存在しません。");
}
}
同じ会員IDが出てこないことはどうやって保証されているのかや、コードがミスっていて同じ会員IDが2つあった場合はどうするかについては聞いていないのでとりあえず一致するものをすべて見せるようにしました。

そもそも、質問者さんはfor (Kaiin kaiin : kaiins) が何をしているか理解していますか?
これはJDK5.0から導入された文法で、かつてはこういう書き方をするのが当たり前でした。
Iterator<Kaiin> i = kaiins.iterator();
while (i.hasNext()) {
Kaiin kaiin = i.next();
...
}
このfor文を使うことで、kaiinsに含まれるKaiinのインスタンスを1つずつ取り出して処理をします。今回はIDが一致していないか比較しています。

また、Javaでの比較には==とObject.equals(object o)があることを御存知ですか?前者は同一性の判定に使われ、後者は同値性の判定に使われます。同一性は同じオブジェクトを参照しているかの比較に使われ、同値性は同じ値のオブジェクトを参照しているかの比較に使われます。なぜ数値の比較に==が使えるかはJavaの言語仕様がそうなってるからという説明になります。

まあ、ざっくりいうと、==は数値の比較に使われ、.equalsはそれ以外のものの比較に使われると覚えておくとよいでしょう。というわけで、文字列 (String型) の比較も.equalsで行います。


何かの課題だと思いますが、これを完成させるのに必要な知識がかなり不足しているように見えます。プログラミングが得意な友人などに飯でもおごって教えてもらうことをおすすめします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
色々と教えて頂き非常に参考になりました。
Javaは初心者でスキル不足な状況ですが、回答していただいたヒントを基に作成し完成できればと思います。
ありがとうございました。

お礼日時:2013/01/06 10:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!