|
タイピングプログラム作成2
|
前回はタイピングを行うための設定を行うところまでを行ったのですが、ここではタイピングのメインになる部分の作成を行っていきます。 |
タイピングのメインになる部分のロジックを考えていきたいと思います。
タイピングの基本的な動きは、終了確認→タイピング内容のチェック→次データの取得 を繰り返します。 |
まず最初に終了確認を行っていきたいと思います。
タイピングの終了確認には2種類あります。時間で判断する場合と出題数で確認する場合です。
前回の設定画面で試験区分の設定と言うのがありました。これは練習なのかテストなのかを判断していて、テストの場合には、10分間の制限時間内に何問入力できるかで確認していきます。
よって、テストの場合には時間での判断になります。
練習の場合には、時間で判定する場合と問題数で判定する場合の2種類がありますので、それぞれ別の判断をする必要があります。
int end_sw = 0; //終了スイッチ
if (wtype.equals("0")){ //試験区分がテストか?
if (le_time < now_time){
end_sw = 2; //タイムオーバー
}else{
type_count = type_count + 1;
}
}else{
wkcount = Integer.parseInt(wnum);
if (wtime.equals("0")){ //時間設定しているか?
if (type_count >= wkcount){
end_sw = 1; //出題数に達した場合
}else{
type_count = type_count + 1;
}
}else{
if (le_time < now_time){
end_sw = 2; //タイムオーバー
}else{
if (type_count >= wkcount && wkcount != 0){
end_sw = 1; //出題数に達した場合
}else{
type_count = type_count + 1;
}
}
}
} |
まず、終了処理が必要かどうかを判断するスイッチを作成します。
終了スイッチが0の場合は、タイピング続行
終了スイッチが1の場合は、出題数の設定を満たす。
終了スイッチが2の場合は、タイムオーバーとします。
1と2は両方とも終了させるのですが、出題数が指定したもん台数に達した場合には、最終問題と言うことでチェックしてから、終了させる必要がありますが、
タイムオーバーの場合には、入力したタイピングデータはチェックせずに終了させる必要があるため、同じ終了でも後の作業が変わってくるので、スイッチで判断できるように、別にしてあります。
最初に試験区分がテストになっているかを確認し、
テストであれば、時間内かどうかを確認します。
練習の場合は、時間設定しているかを確認し、設定していない場合は、出題数に達していれば終了する。
練習の場合で時間設定をしている場合には、時間を確認しています。
|
終了チェックが済んだら、次はタイピング結果の判定を行ってその結果をデータベースに保存していきます。
con = ds.getConnection();
Statement statement = con.createStatement();
int score = 0,level = 0,wd_icnt = 0;
int wk_cnt = 0,wk_level = 0,total_wd = 0;
String sql;
if (end_sw <= 1){
//タイピング結果の判定
if (type_data.equals(type)){
level = Integer.parseInt(dblevel);
wd_icnt = Integer.parseInt(wd_cnt);
total_wd = Integer.parseInt(total_cnt) + wd_icnt;
score = wd_icnt * level;
ans_count = ans_count + 1;
}
//タイピング解答テーブルの登録
sql = "insert into typeans_table(student_id,type_id,type_data,score,type_cnt,type_date)";
sql = sql + " values(" + user_id + "," + type_id + ",'" + type_data + "'," + score + "," + w_cnt;
sql = sql + ",'" + wyear + "/" + wmonth + "/" + wdate + " " + whour + ":" + wminute + ":" + wsecond + "'";
sql = sql + ")" ;
statement.executeUpdate(sql); |
まず終了スイッチを確認して、タイムオーバーでない場合は判定を行い、データの登録を行います。
タイピングの判定は、単純にイコールかどうかを見ているだけです。
検定試験では、細かく文字をチェックしていきますが、このソフトでは問題あたりの判定としていきます。
判定が済めば、データの登録をしていきます。生徒情報、タイピング問題の情報、結果、時間などをタイピング解答テーブルに登録します。
登録には、insert文を使って保存していきます。 |
結果の登録が完了したら、次の問題を取得します。
if (end_sw == 0){
//タイピングデータ取得
sql = "SELECT * FROM type_table ";
if (wtype.equals("1")){
if (wlevel.equals("0")){
}else{
sql = sql + "where level <= " + wlevel;
}
}
sql = sql + " order by rand()" ;
// クエリーの実行
ResultSet result
= statement.executeQuery(sql);
int wtype_id = 0;
String wk_type = "";
String wk_kana = "";
if (result.next() == true){
wtype_id = result.getInt("id");
wk_type = result.getString("type_data");
if (kana_disp.equals("0")){
wk_kana = result.getString("type_kana");
}
wk_cnt = result.getInt("word_cnt");
wk_level = result.getInt("level");
}
result.close();
total_wd = Integer.parseInt(total_cnt) + wk_cnt;
session.setAttribute("type_cnt",Integer.toString(type_count));
//出題番
type_cnt = Integer.toString(type_count);
session.setAttribute("id",Integer.toString(wtype_id)); //タイピングID
session.setAttribute("type",wk_type); //タイピングデータ
session.setAttribute("wd_cnt",Integer.toString(wk_cnt));
//文字数
session.setAttribute("total_cnt",Integer.toString(total_wd));
//トータル文字数
req.setAttribute("kana",wk_kana); //タイピングかな
session.setAttribute("dblevel",Integer.toString(wk_level));
//タイピングレベル
msg = "";
url = "type.jsp";
}
|
終了スイッチを確認し、出題数が最後の場合には、データの取得をする必要がないので、この処理は飛ばします。
データが必要な場合には、タイピングテーブルから、次の問題を取得します。
取得の方法は、前回タイピングデータを取得したのと同じで問題ありません。乱数を使って問題を取得するので、どの問題が出題されるかは決まっていません。
|
最後に終了処理を行います。
最初に行った終了判定の結果を元に、終了処理を実行します。
if (end_sw > 0){
//終了処理を行う
//タイピング速度を求める
float sp_time = 0,ft_cnt = 0,ftime=0;
String s_time;
ft_cnt = Integer.parseInt(total_cnt);
if (wtime.equals("0")){
ftime = now_time - le_time;
sp_time = ft_cnt / (ftime * 60);
}else{
ftime = Integer.parseInt(wtime);
sp_time = ft_cnt / (ftime * 60);
}
//得点を求める
sql = "SELECT sum(score) FROM typeans_table where student_id =
" + user_id;
sql = sql + " and type_cnt = " + w_cnt;
// クエリーの実行
ResultSet result
= statement.executeQuery(sql);
int type_score = 0;
if (result.next() == true){
//タイピングデータ取得
type_score = result.getInt("sum(score)");
}
type_score = type_score * (int)(sp_time * 100);
result.close();
//タイピング履歴テーブルの内容を更新
float w_rate = ans_count / type_count * 100;
sql = "update typehis_table set ";
sql = sql + "type_number = " + type_cnt + ",type_stroke
= " + total_cnt;
sql = sql + ",type_speed = " + sp_time + ",type_score
= " + type_score;
sql = sql + ",type_rate = " + w_rate;
if(wtype.equals("1") && wtime.equals("0")){
sql = sql + ", end_time = '" + wyear + "/"
+ wmonth + "/" + wdate + " " + whour + ":"
+ wminute + ":" + wsecond + "'";
}
sql = sql + " where student_id = " + user_id + " AND
type_cnt = " + w_cnt;
statement.executeUpdate(sql);
msg = "終了です。";
url = "typeres.jsp";
//タイピング関連セッション情報削除
session.removeAttribute("type_cnt"); //出題番
session.removeAttribute("ans_cnt"); //正解数
session.removeAttribute("id"); //タイピングID
session.removeAttribute("type"); //タイピングデータ
session.removeAttribute("kana_disp"); //かな表示設定
session.removeAttribute("wd_cnt"); //文字数
session.removeAttribute("total_cnt"); //トータル文字数
session.removeAttribute("wtype"); //タイピング種別
session.removeAttribute("e_year"); //終了年
session.removeAttribute("e_month"); //終了月
session.removeAttribute("e_date"); //終了日
session.removeAttribute("e_hour"); //終了時
session.removeAttribute("e_minute"); //終了分
session.removeAttribute("e_second"); //終了秒
session.removeAttribute("wtime"); //終了時刻設定
session.removeAttribute("num"); //出題数
session.removeAttribute("level"); //レベル
session.removeAttribute("dblevel"); //DBレベル
}
|
最初にタイピング結果を保存するのに必要なタイピング速度と点数を求めていきます。
タイピング速度は、1秒間に何文字打てるかを計算しています。
得点は、まずタイピング結果テーブルから得点の合計を求めて、タイピング速度と掛けたものを点数としています。
求めたタイピング速度や点数をタイピング履歴に更新していきます。
更新処理は、update文を使います。
最後にタイピングで使ったセッション情報を削除しています。
これは、必要のなくなったセッション情報を持っていると、メモリーを圧迫するので解放しています。 |
これでタイピングのメインになる処理ができました。
次回は、タイピングの結果を表示させたいと思います。
点数や間違えた部分の確認などを行えるように、情報を表示させていきます。 |
タイピングプログラム作成1 UP タイピングプログラム作成3 |
  |
|