職業訓練:サーブレット/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しますね。
コメント 0