ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのまた今回も助けて下さい。 お願いします。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
今回で2回目のトピックを立てせて貰う全くJava未経験者のミキって言います。わーい(嬉しい顔)

今回は私自身なりに頑張って理解を試みましたが、結局、手が付けられなかったのでよろしくお願いします。

今回の宿題の締切が来週の月曜日の朝の9時まで、これが提出出来なければ単位が取れない状況なるので、前回みたいな感じではなくてすべての情報を提供したいと思います。

※今回の宿題は一問だけ何ですが、1.1と1.2みたいな形で分かれてるので両方の内容を載せたいと思います。
後、クラス図とファイル名の中身もここで記載します。

【1】これがファイルの中身のサンプルです。バッド(下向き矢印)
ファイル名:Questions.csv
問題文001 正解001 選択肢2 選択肢3 選択肢4
問題文002 正解002 選択肢2 選択肢3 選択肢4
問題文003 正解003 選択肢2 選択肢3 選択肢4
問題文004 正解004 選択肢2 選択肢3 選択肢4
問題文005 正解005 選択肢2 選択肢3 選択肢4
問題文006 正解006 選択肢2 選択肢3 選択肢4
問題文007 正解007 選択肢2 選択肢3 選択肢4
問題文008 正解008 選択肢2 選択肢3 選択肢4
問題文009 正解009 選択肢2 選択肢3 選択肢4
問題文010 正解010 選択肢2 選択肢3 選択肢4
問題文011 正解011 選択肢2 選択肢3 選択肢4
問題文012 正解012 選択肢2 選択肢3 選択肢4
問題文013 正解013 選択肢2 選択肢3 選択肢4
問題文014 正解014 選択肢2 選択肢3 選択肢4
問題文015 正解015 選択肢2 選択肢3 選択肢4
問題文016 正解016 選択肢2 選択肢3 選択肢4
問題文017 正解017 選択肢2 選択肢3 選択肢4
問題文018 正解018 選択肢2 選択肢3 選択肢4
問題文019 正解019 選択肢2 選択肢3 選択肢4
問題文020 正解020 選択肢2 選択肢3 選択肢4
問題文021 正解021 選択肢2 選択肢3 選択肢4
問題文022 正解022 選択肢2 選択肢3 選択肢4
問題文023 正解023 選択肢2 選択肢3 選択肢4
問題文024 正解024 選択肢2 選択肢3 選択肢4
問題文025 正解025 選択肢2 選択肢3 選択肢4
問題文026 正解026 選択肢2 選択肢3 選択肢4
問題文027 正解027 選択肢2 選択肢3 選択肢4
問題文028 正解028 選択肢2 選択肢3 選択肢4
問題文029 正解029 選択肢2 選択肢3 選択肢4
問題文030 正解030 選択肢2 選択肢3 選択肢4

【2】次に使われてるクラス図です。(昨日の講義中、教授に聞いた話ですと、8つのクラスがあって、その内に6つのクラスにその一つ一つの機能を持たせるのがこの問題のヒントらしいです。

クラス名1 jp::co::blackbear::school::QuizMain
     ・S main(in args: String [])

クラス名2 jp::co::blackbear::school::exception::UserIOException

クラス名3 jp::co::blackbear::school::exception::QuizIOException

クラス名4 jp::co::blackbear::school::manager::QuizCreator
・loadQuizData(): List

クラス名5 jp::co::blackbear::school::vo::Quiz
・answer:String
     ・question:String
○getAnswear(): String
○getChoices(in isRandom; boolean): List
○getQuestion(): String

クラス名6 jp::co::blackbear::school::QuizExecutor
△excute
□inputAnsweer(): String
□isCollectAnswer(): Boolean
□printEndMessage(in user: User)
□printQuestion()
□printResult(in user: User)
□printStartMessage(in user: User)

クラス名7 jp::co::blackbear::school::vo::User
□entryCount: int
□totalScore: String
□userId: String
□userName: String
○getAverageScore(): String
○getEntryCount(): int
○getTopScore(): String
○getTotalScore(): String
○getUserId(): String
○getUserName(): String
○setEntryCount(in entryCount: int)
○setTotalScore(in totalScore: String)
○setUserId(in userId: String)
○setUserName(in userName: String)

クラス名8 jp::co::blackbear::school::manager::UserManager
■currentUserId: String
○getCurrentUser(): User
□InputUserId(): String
□login(): User
□saveUserData()
尚、このクラス図には依存があるます。 ヒントはクラス名、メソッド名から推測して下さい。

【3】出力結果イメージです。
QuizMain 【Javaアプリケーション】
小テストを行います。
ユーザIDを入力して下さい: 192 ← キーボードからの入力されてるナンバーです。

ユーザID :192
参加回数 :2回
最高得点 :4点
平均得点 :3.00点

【第一問】
 問題文024
 1. 選択肢2
 2. 正解024
 3. 選択肢4
 4. 選択肢3
 解答を入力して下さい:2 ← キーボードから入力するナンバーです。

【第二問】
 問題文011
 1. 選択肢3
 2. 正解011
 3. 選択肢4
 4. 選択肢2
 解答を入力して下さい

これが途中の出力結果です。

それではこちらが問題です。バッド(下向き矢印)

問題1.1
コンソール入力でクイズ形式の小テストを行うことができるプログラムを作成して下さい。
・問題と選択肢は、実行時にファイルから読み込む。
・入力はコンソール(キーボード)から行う。
・実行のたびに問題をランダムで選択する。
・選択肢の順番がシャッフルされる。
・5問解答後、プログラムを終了する。 問題数はソース中に直書きせず、定数を使用する。
※これ以外の機能は、各自の判断で実装して下さい。

問題1.2
問1.1で作成したプログラムを拡張し、ログイン機能と個人データ保存機能を追加してください。 この際、以下の事を満たすように。
・ログイン時にIDを入力し、ログインする(パスワードは不要)。
・IDは正規表現【0-9A-Za-z_\.】{1,8}を満たしてるものとする。
・以前にIDを入力したことがある場合、個人データ(IDと参加数、最高点、平均点)を表示する。 この個人データは専用のクラス(ValueObject)を作成すること。
・ファイルから個人データを読み込む際にはMapを使用してキャッシュを行う。
※これ以外でも実装可能ならば良しとします。

使われてる内容:
Java基本文法、オブジェクト指向、例外処理、ストリームそしてコレクションフレームワークを十分に理解して、それぞれクラスにこれらの内容を活用する事。

これが以上の問題になります。
たくさん問題があって、本当によく分からないのでよろしくお願いします。

美紀より

コメント(24)

>丸投げして出した回答で単位を取る方が問題
だが、こういう問題のある奴がいるからこそこのコミュは成立する
でも、タイトルは何とかして欲しいよね…。

とりあえず一部だけ。

public class ValueObject {
private String id = null;
private int 利用回数 = 0;
private int 最高点 = 0;
private double 平均 = 0.;
private List<Integer> 過去の点数 = new ArrayList<Integer>();

private ValueObject() {
}

public static ValueObject(String id) {
//IDチェック
ValueObject user = new ValueObject();
//ファイルから?読み込み
//セット
return user;
}

// getter

public void メソッド名何がいいかな〜(int 点数) {
利用回数++;
if(最高点 < 点数) {
最高点 = 得点;
}
過去の点数.add(点数);
//平均求める
}

}

とりあえず、こんなんでいいでしょ。
これ以上は今やってる時間ない。
色んな掲示板でよく見る語句としては、
「いくら出す?」ですかね。
冗談ですが。

>△excute
executeかなぁ。
三角はオーバーライドかなーと思うのですが、
□と○は…???

これ、作ってもコピペできる量じゃなさそう…
パッケージ指定もあるし。。。


>以前にIDを入力したことがある場合、個人データ(IDと参加数、最高点、平均点)を表示する

…参加数って…

persistent なオブジェクト作れと?
…さすがにそこまではしないですよ…ね?
>コ(´・ェ・`)ロ さ〜ん
はい! それは私のスペル間違いでして、本当はExecuteです。
後、私の推測で・・・・
□はPrivateなフィールド名
○は恐らくPublicなメソッドだと思いうんですが・・・!
でもちょっと分からないです。ふらふら
>檸檬 さ〜ん
ありがとうございますわーい(嬉しい顔)
大変、優しい方何ですねあっかんべー
> persistentなオブジェクト作れと?

「個人データ保存機能を追加してください」
「UserIOException」

などとあるので、ファイルに保存するものなのでしょう。
JavaのベテランがEclipseを使っても、数時間かかりそうですね。
自宅のマシンはパワーがなくてEclipseもないので、
お手伝いは断念。
ぁぁ、なるほど。

# 全然読んでなかったです…(汗
>たぁぼさ〜ん
手伝おうとしてくれてだけでもとても感謝してます。ハート
ありがとうございます。
確かにそうですよね。 
私も一日中、Javaの本を読んでたんですが、結局何もできませんでしたたらーっ(汗)げっそり 
>コ(´・ェ・`)ロ さ〜ん
何か私が言った事がヒントになったんですかexclamation & question
コ(´・ェ・`)ロ さんは、私のコメントへの反応だと思います。
mixiはあまり期待できそうにないので、
身近な友達を捕まえて、頑張られてはどうでしょう?>Mikiさん
ちょっと見ただけではナゾがあるので、

>尚、このクラス図には依存があるます。

その依存関係を図で書いて、みなさんに見せた方がいいですね。
ところで、必ず教授が示されたクラス、パッケージ構成で書かなければならないのですか?
QuizExecutor のインスタンスの単位が謎ですね、Quizと同じにするか、全の問題にするか。
isCollectAnswerがあるので、Quizと同じととれるのだが、
printStartMessageとかUserを引数にしているので、全ての問題っぽくもある
QuizMainとの分担をどうして欲しいのか、問題からは読み取れない。

List<Quiz>とcurretnQuizをインスタンス変数に持って、isCollectAnswerを呼んで欲しいのかしら?だとしたら、ちょっと気持ち悪いな。
全体像を考えると訳わからなくなりそうなので、
各クラスのフィールド・メソッドの名前から推測して半分ほどやってみたのですが

UserManager#getCurrentUserとUserManager#login()の差、
QuizExecutor#isCollectAnswerの使い方がわかりません。

isCollectAnswerにStringかintの引数つけちゃっていいのかなぁ。。


↑↑↑は、私の解釈での疑問ですが
みなさんの言う通り不透明な箇所が多いですね。

何か新情報あればそれに従って明日再チャレンジしようかとは思いますが、
何もなければ勝手に変更しちゃうかもです。
package jp.co.blackbear.school;
import java.util.Collections;
import java.util.List;
import jp.co.blackbear.school.manager.QuizCreator;
import jp.co.blackbear.school.manager.UserManager;
import jp.co.blackbear.school.vo.User;

public class QuizMain {
public static void main(String[] args) {
try{
new QuizExecutor().excute();
}catch(Throwable t){
t.printStackTrace();
}
}
}
-----------------------------------------------------------------------------
package jp.co.blackbear.school.exception;
import java.io.IOException;
public class UserIOException
extends Exception
{
public UserIOException() {
super();
}
public UserIOException(String message) {
super(message);
}
public UserIOException(String message, Throwable cause) {
super(message, cause);
}
public UserIOException(Throwable cause) {
super(cause);
}
}
-----------------------------------------------------------------------------
package jp.co.blackbear.school.exception;
public class QuizIOException
extends Exception
{
public QuizIOException() {
super();
}
public QuizIOException(String message) {
super(message);
}
public QuizIOException(String message, Throwable cause) {
super(message, cause);
}
public QuizIOException(Throwable cause) {
super(cause);
}
}
-----------------------------------------------------------------------------
package jp.co.blackbear.school.manager;
import java.io.*;
import java.util.*;
import jp.co.blackbear.school.QuizExecutor;
import jp.co.blackbear.school.exception.QuizIOException;
import jp.co.blackbear.school.vo.Quiz;
public class QuizCreator {
static final String fileName = "Questions.csv";
static final String delimiter = " ";
static final String charasetName = "MS932";
public static List loadQuizData() throws QuizIOException{
List result = new ArrayList();
try {
File file = new File(fileName);
FileInputStream is = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(is, charasetName);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null){
String[] ar = line.split(delimiter);
Quiz q = new Quiz(ar);
result.add(q);
}
return result;
} catch (Exception e) {
throw new QuizIOException(e);
}
}
}
-----------------------------------------------------------------------------
package jp.co.blackbear.school.vo;
import java.util.*;
public class Quiz{
String answer;
String question;
List choices;
public Quiz(String[] ar){
question = ar[0];
answer = ar[1];
choices = new ArrayList();
for(int i = 1; i < ar.length; i++){
choices.add(ar[i]);
}
}
public String getAnswear(){
return answer;
}
public List getChoices(boolean isRandom){
if (isRandom){
Collections.shuffle(choices);
}
return choices;
}
public String getQuestion(){
return question;
}
}
package jp.co.blackbear.school;
import java.io.*;
import java.util.*;
import jp.co.blackbear.school.exception.*;
import jp.co.blackbear.school.manager.*;
import jp.co.blackbear.school.vo.*;
public class QuizExecutor {
public static final int COUNT = 5;
public void excute() throws IOException, UserIOException, QuizIOException{
printStartMessage(null);
UserManager userManager = new UserManager();
User user = userManager.login();
printResult(user);
List qs = QuizCreator.loadQuizData();
Collections.shuffle(qs);
int score = 0;
for (int i = 0; i < COUNT; i++){
Quiz q = (Quiz)qs.get(i);
printQuestion(q);
int n = inputAnsweer();
List choices = q.getChoices(false);
score += q.getAnswear().equals(choices.get(n)) ? 1 : 0;
}
printEndMessage(user);
user.setEntryCount(user.getEntryCount()+1);
user.setTopScore(Math.max(user.getTopScore(), score));
user.setTotalScore(user.getTotalScore()+score);
userManager.saveUserData();
}
int inputAnsweer() throws IOException{
while(true){
System.out.print("解答を入力して下さい: ");
String ans = new BufferedReader(new InputStreamReader(System.in)).readLine();
if (ans.matches("^[1-4]$")){
return Integer.parseInt(ans)-1;
}
}
}
public boolean isCollectAnswer(){
return false;
}
void printQuestion(Quiz q){
System.out.println();
System.out.println(q.getQuestion());
List qs = q.getChoices(true);
for (int i = 0; i < qs.size(); i++){
System.out.println((i+1)+":"+qs.get(i));
}
}
public void printStartMessage(User user){
System.out.println("QuizMain 【Javaアプリケーション】 ");
System.out.println("小テストを行います。");
}
public void printResult(User user) {
System.out.println(
new StringBuffer()
.append("ユーザID :").append(user.getUserId()).append("\n")
.append("参加回数 :").append(user.getEntryCount()).append("回\n")
.append("最高得点 :").append(user.getTopScore()).append("点\n")
.append("平均得点 :").append(user.getAverageScore()).append("点")
.toString());
}
public void printEndMessage(User user){
System.out.println("おつかれさまでした。");
}
}
package jp.co.blackbear.school.vo;
import java.io.Serializable;
import java.math.BigDecimal;
public class User
implements Serializable
{
int entryCount = 0;
int topScore = 0;
long totalScore = 0;
String userId;
String userName = "名無しさん";
public String getAverageScore(){
if (entryCount == 0){
return "0.00";
}
BigDecimal bd = new BigDecimal((double)totalScore / entryCount);
bd = bd.setScale(2);
return bd.toString();
}
public int getEntryCount() {
return entryCount;
}
public void setEntryCount(int entryCount) {
this.entryCount = entryCount;
}
public int getTopScore() {
return topScore;
}
public void setTopScore(int topScore) {
this.topScore = topScore;
}
public long getTotalScore() {
return totalScore;
}
public void setTotalScore(long totalScore) {
this.totalScore = totalScore;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
-----------------------------------------------------------------------------
package jp.co.blackbear.school.manager;
import java.io.*;
import jp.co.blackbear.school.exception.UserIOException;
import jp.co.blackbear.school.vo.*;
public class UserManager {
String currentUserId;
User currentUser;
public User getCurrentUser(){
return currentUser;
}
public User login() throws UserIOException
{
try{
currentUserId = inputUserId();
File file = getFile(currentUserId);
try {
if (file.exists()){
FileInputStream in = new FileInputStream(file);
ObjectInputStream is = new ObjectInputStream(in);
currentUser = (User)is.readObject();
}else{
currentUser = new User();
currentUser.setUserId(currentUserId);
}
} catch (Exception e) {
throw new UserIOException(e);
}
return getCurrentUser();
}catch(Throwable t){
throw new UserIOException(t);
}
}
String inputUserId() throws IOException{
for(;;){
System.out.print("ユーザIDを入力して下さい: ");
String userId = new BufferedReader(new InputStreamReader(System.in)).readLine();
if (userId.matches("[0-9A-Za-z\\.]{1,8}")){
return userId;
}
System.out.println("invelid userid");
}
}

public void saveUserData() throws UserIOException{
File file = getFile(currentUserId);
try {
FileOutputStream out = new FileOutputStream(file);
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(currentUser);
} catch (IOException e) {
throw new UserIOException(e);
}
}
static File getFile(String userId){
return new File(userId+".ser");
}
}
今回の例題ではたいした影響はありませんが、
Streamのclose処理はきちんとやりましょう。

一応、Streamのfinalize()でclose処理が行われますが、
SunのJava VMの場合、ガベージコレクションを2、3度実行した後でないと、
finalize()を呼びません。

また、Serializableなクラスには、
きちんとserialVersionUIDをつけましょうね。
あえて実装しないことで、学生っぽさをアピールしてみた(w
それにどうせこんな長いソース誰も読まないって。
別トピで「セキュリティなども考慮したソースを提示すべき」は撤回なんですかね(汗
別トピで「セキュリティなども考慮したソースを提示すべき」は、思ってたし、今もそう思うけど、長いと嫌になってきました。人間って弱いですね。反省
なかのさんがソースを提示して下さってから、
トピ主さんのレスがありませんが、
ちゃんと提出できたのですかね…(・ω・)?

ログインすると、残り2件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング