SSブログ

職業訓練:サーブレット/JSPへ突入 [勉強]

キャバクラの「キャバ」って、何だっけ? あ、キャバレーか。キャバクラはキャバレークラブの略なんだな。で・・・キャバレーって何だ??と頭の中で「?」がループしている しゃくれアゴです。 

今日(08/31)の職業訓練は、午前中は教科書上下巻の総復習課題「ArrayListの機能を配列で実現させる」の続きをやって、午後からは教科書3冊目「サーブレット/JSP」へと突入しました。

tomcat(振られ気分でロックンロールじゃないYO)6.0をインストールして、binフォルダ内のstartup.batでtomcatを起動させて、IEなどのブラウザで「http://localhost:8080/」で自身のtomcatページが表示されることを確認して・・・
tomcatフォルダ内のwebappsフォルダにentryフォルダを作成させて、そこにhello.htmlとかindex.htmlとか書いておいてみたり、entryフォルダの下にサブフォルダ作って、sub.htmlとか作って、sub.htmlからhello.htmlへのリンクを貼ったり、画像ファイル貼ったり。

まずは、Webの仕組みをザックリと聞いて(既に知ってるんだけどね)、上記のようにtomcatで遊んで、HTMLとかhtmlファイルでの相対パスとか絶対パスとか、そんなのを学びました。

 

 

明日(09/01)からは、いよいよサーブレットを作る章に入ります。
楽しみですねぇ。

あ、そうそう。以前、ここのブログで教科書上下巻トータル演習の初級、上級の問題だけ書いていましたが、それに対する私なりの回答ソースをUPしますね。
えーっと・・・たしか

初級(1):「AさんとBさんの誕生日をキーボードから入力し比較するプログラム」
・入力するのは西暦、月、日
・Aさんの誕生日とBさんの誕生日が等しい → 「同じ誕生日ですね」
・Aさんの誕生日とBさんの誕生日が西暦、月が等しく日が違う → 「同じ月生まれですね」
・Aさんの誕生日とBさんの誕生日が西暦が等しく月、日が違う → 「同じ年生まれですね」
・Aさんの誕生日とBさん西暦、月、日が違う → 「まったく違いますね」
(誕生日の入力させ方は自由。6回聞いてもいいし、2回聞いてそこから切り出してもいい)

初級(2):「九九の計算を表示させるプログラム」
・ただし「奇数×奇数」の計算のみ表示させる
 例:1×1=1、1×3=3、1×5=5・・・
・可能ならば条件分岐を使わない

上級:「1月1日(火)~12月31日(火)までを表示させるプログラム」
・ただしこの年はうるう年ではない
 例:1月1日(火)、1月2日(水)、1月3日(木)・・・中略・・・12月30(月)、12月31(火)
・条件分岐は使わない
・繰り返しは2つまで

でしたね。
じゃー、まず初級(1)の回答ソースです。

import java.io.*;

public class BirthDay {
 public static void main(String[] args) {
  
  int firstYY = 0;
  int firstMM = 0;
  int firstDD = 0;
  int secondYY = 0;
  int secondMM = 0;
  int secondDD = 0;
  
  String firstLine = "";
  String secondLine = "";
  
  BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in));
  try {
   System.out.println("Aさんの誕生日を入力してください。");
   System.out.println("例:2010/08/27");
   firstLine = kbd.readLine();
   System.out.println();
   System.out.println("Bさんの誕生日を入力してください。");
   System.out.println("例:2010/08/27");
   secondLine = kbd.readLine();
   //数値変換&代入
   firstYY = Integer.parseInt(firstLine.substring(0,4));
   firstMM = Integer.parseInt(firstLine.substring(5,7));
   firstDD = Integer.parseInt(firstLine.substring(8,10));
   secondYY = Integer.parseInt(secondLine.substring(0,4));
   secondMM = Integer.parseInt(secondLine.substring(5,7));
   secondDD = Integer.parseInt(secondLine.substring(8,10));
   //年月日の比較
   if ((firstYY == secondYY)&&(firstMM == secondMM)&&(firstDD == secondDD)) {
    System.out.println("同じ誕生日ですね。");
   } else if ((firstYY == secondYY)&&(firstMM == secondMM)) {
    System.out.println("同じ月生まれですね。");
   } else if (firstYY == secondYY) {
    System.out.println("同じ年生まれですね。");
   } else {
    System.out.println("まったく違いますね。");
   }
  } catch (IOException e) {
   System.out.println(e);
  }
 }
}

え? ムダに長い?? イイんです。とりあえず要求されたコトを実現できれば。
まずAさんとBさんの誕生日を文字列として受け取っているから、それぞれ最初の4桁を誕生年、/を超えて次の2桁を誕生月、/を超えた最後の2桁を誕生日として、それぞれの変数へ代入。
あとはif文で比較しているだけです。

これに対する講師の回答ソースが、こちら。
import java.io.*;

public class BirthDay{
 public static void main(String[] args){  
  try{
   
   String[] birthA = getBirth("A");
   String[] birthB = getBirth("B");
   
   if(birthA[0].equals(birthB[0])){
    if(birthA[1].equals(birthB[1])){
     if(birthA[2].equals(birthB[2])){
      System.out.println("同じ誕生日ですね");
     }else{
      System.out.println("同じ月生まれですね");
     }
    }else{
     System.out.println("同じ年生まれですね");
    }
   }else{
    System.out.println("ぜんぜん違いますね");
   }
   
  }catch(IOException e){
   System.out.println(e);
  }
 }
 
 public static String[] getBirth(String str) throws IOException{
  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  String line;
  do{
   System.out.println(str +"さんの生年月日を教えてください(yyyy/mm/dd)");
   line = reader.readLine();
   if(line.length()==10){
    String[] birth = line.split("/");
    if(birth.length == 3){
     if(chkInteger(birth)){
      return birth;
     }else{
      System.out.println("入力された形式が正しくありません\n");
      continue;
     }
    }else{
     System.out.println("入力された形式が正しくありません\n");
    }
   }else{
    System.out.println("入力された形式が正しくありません\n");
   }
  }while(true);
 }
 public static boolean chkInteger(String[] str){
  try{
   for(int i=0;i<str.length;i++){
    Integer.parseInt(str[i]);
   }
   return true;
  }catch(NumberFormatException e){
   return false;
  }
 }
}
 

なんか、めっさオブジェクト指向っぽいんですけど。
入力された年月日を年、月、日にわける処理、年月日がint型(整数)かのチェック、この2つをメソッド化していますね。
if文を入れ子にしているのは、if文の条件を&&とか||でくっつけていくと、あとあと条件が追加になった際に面倒だというのと、入れ子の方が見やすい、ということでした。
すごいですねぇ。

おなじコトを実現しているけど、ソースがこんなにも違うなんて・・・。(^-^;

 

次は初級(2)の回答ソースです。
public class Kuku {
 public static void main(String[] args) {
  for (int i = 1; i < 10; i += 2) {
   for (int j = 1; j < 10; j += 2) {
    System.out.print(i + "*" + j + "=" + (i*j) + " ");
   }
   System.out.println();
  }
 }
}

これは、さすがに講師と同じ答えになりました。
奇数ってことは1つ飛ばしの数字だから、変数iやjを++でインクリメントするのではなく+=2で一気に1つ飛ばしさせちゃうっていうこってす。

 

で、最後に上級問題の解答ソースです。 

import java.util.*;

public class EveryDay {
 public static void main(String[] args) {
  Calendar c1 = Calendar.getInstance();
  c1.set(2013, 0, 1);
  
  int year = 2013;  //閏年じゃない近い未来の年
  int month = 0;
  int day = 0;
  int week = 0;
  String[] weekName = {"日", "月", "火", "水", "木", "金", "土"};
  
  for (int i = 0; i < c1.get(Calendar.MONTH) + 2; i++) {
   for (int j = 0; j < c1.get(Calendar.DAY_OF_MONTH) + 2; j++) {
    System.out.print((c1.get(Calendar.MONTH)+1) + "月" + c1.get(Calendar.DAY_OF_MONTH) + "日" + "(" + weekName[c1.get(Calendar.DAY_OF_WEEK)-1] + ") ");
    c1.add(Calendar.DAY_OF_MONTH, + 1);
   }
  }
 }
}

この問題、Calendarクラスを使ったら70点(100点満点中)って講師が言っていたんですけど、Calendarクラスを使う他に思いつかなかったんですよね。各月の月末って30か31、で2月は閏年じゃないから28日ですよね。
それを配列だけで実現できたら100点だって言われたけど・・・どうやっても思いつきませんでした。

で、講師の回答ソースが、こちら。
public class EveryDay{
 public static void main(String[] args){
  int[] day = {31,28,31,30,31,30,31,31,30,31,30,31};
  String[] week = {"火","水","木","金","土","日","月"};
  
  int days=0;
  for(int i=0;i<12;i++){
   for(int j=0;j<day[i];j++){
    System.out.print((i+1)+"月"+(j+1)+"日("+week[days%7]+")");
    if(days%4 == 3){
     System.out.println();
    }
    days++;
   }
  }
 }
}

さっぱりしてますねー。
配列を使うという、ほぼ答えのようなヒントをもらっても、このfor文の二重ループの2コ目のfor文の条件に配列変数を使うとは・・・なかなか思いつかなかったです。
前職COBOLプログラマだった人は、配列で上記のようなソースを書いて実現できたみたいでしたけど・・・。やっぱり経験者は違いますなぁ。

 

まぁ、Calendarクラスの勉強にもなったし、イイか。

後は、ArrayListの機能を配列だけで実現させるっていう課題ですけどね・・・。
長くなったから、次の機会にっていうか、次のブログ記事でUPしますね。

 


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:資格・学び

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。