今日から学生は夏休みに入ります。
1期の授業の終わりに次の課題を出しました。

Q. カレンダーを表示するプログラムを作成せよ。入力は西暦年と月とする。
なお、西暦元年1月1日は月曜日である。

カレンダーを作成するためには、まず閏年(うるうどし)を考慮しなければなりません。閏年の定義は「西暦年が400で割り切れる年」又は「西暦年が4で割り切れ、かつ100で割り切れない年」です。
C言語で書くと、

if (year % 400 == 0){
<閏年である>
}
else if(year % 4 == 0 && year % 100 != 0){
<閏年である>
}

となります。
解答例では、この閏年判定は関数化してあります。
月毎の日数は基本的に2月以外は変化はないため、配列に順番に入れておきます。
2月は閏年ではないときの日数28日とします。

 int month_date[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

閏年の場合は、1日足して29日としています。

 if(checkUruu(year)) month_date[1]++; // 閏年の2月分

カレンダー風に表示するために1週間(7日分)表示したら改行をして、それっぽく見せます。

  if(cnt % 7 == 0) printf(“\n”);

閏年をチェックする関数(checkUruu)では、閏年だった場合、戻り値を「1」としていますが、これは閏年でない場合の28日に1日足して29日にするために使っています。

 // 日数計算
 for(i=1; i<=year-1; i++){
  total = total + 365 + checkUruu(i);
 }

このときの変数totalは、指定した西暦年の前の年までのトータル日数を計算するために使っています。その後に指定した西暦年の指定月の前の月までの日数をtotalに入れています。

 for(i=0; i<month-1; i++){
  total = total + month_date[i];
 }

total変数の目的は、月の初日が曜日によってずれるため、スペース表示を行うために使っています。
解答例は分かりやすいように月曜日から表示しています。

 for(i=1,cnt=0; i<=total%7; i++, cnt++) printf(” “); // その月の初日の曜日のずれを考慮

【C言語でカレンダー表示をするプログラム】

/*
xCalendar.c 西暦年を月を指定するとカレンダーを表示する
          09/07/07(火) Syuichi Takeda wrote.
*/
#include <stdio.h>
int checkUruu(int);  /* 閏年チェック関数: 閏年なら1を返す */
int main(void)
{
 int year, month;
 int month_date[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 int total = 0;
 int i, cnt;
 
 // 西暦年入力
 do{
  printf(“西暦年を入力して下さい “);
  scanf(“%d”, &year);
 } while(year < 1);
 
 // 月日入力
 do{
  printf(“月を入力して下さい “);
  scanf(“%d”, &month);
 } while(month < 1 || month > 12);
 
 // 日数計算
 for(i=1; i<=year-1; i++){
  total = total + 365 + checkUruu(i);
 }
 
 if(checkUruu(year)) month_date[1]++; // 閏年の2月分
 
 for(i=0; i<month-1; i++){
  total = total + month_date[i];
 }
 
 // カレンダー表示
 printf(“\n\n\t%d年\n%2d月\n”, year, month);
 printf(” 月 火 水 木 金 土 日\n”);
 for(i=1,cnt=0; i<=total%7; i++, cnt++) printf(”   “); // その月の初日の曜日のずれを考慮
               // 月曜->ずらさない 火曜->1日ずらす
 for(i=1; i<=month_date[month-1]; i++, cnt++){
  if(cnt % 7 == 0) printf(“\n”);
  printf(“%3d”, i);
 }
 printf(“\n”);
 
 return 0;
}
int checkUruu(int year) // 閏年なら1を返す
{
 if (year % 400 == 0){
  return 1;
 }
 else if(year % 4 == 0 && year % 100 != 0){
  return 1;
 }
 return 0;
}

【実行結果】

西暦年を入力して下さい 2000
月を入力して下さい 2
     2000年
 2月
月 火 水 木 金 土 日
   1  2  3  4  5  6
  7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29

意外とこのプログラムWindowsなどのカレンダーより表示できる西暦年の範囲が広くていいですよ。(Windowsのカレンダーだと2009年の時点で1980年からしか表示できない)
この解答例では曜日が月曜から始まっています。
よくあるカレンダー表示みたいに日曜日から始まるようにするには、カレンダー表示の先頭部分を以下のようにします。

 // カレンダー表示
 printf(“\n\n\t%d年\n%2d月\n”, year, month);
 printf(” 日 月 火 水 木 金 土\n”);
 for(i=1,cnt=0; i<=(total+1)%7; i++, cnt++) printf(”   “);

こういったプログラムを作る場合は、実際に紙に書いてみるといいと思います。例えば、西暦元年の1月はどうなるとか、2月になったらどうなるとか言ったように書いてみます。
すると、カレンダーのポイントは月ごとの初日に曜日がずれていくことにあると気づきます。
閏年でない場合は1年間で1日曜日がずれます。
西暦元年の1月1日は月曜日ですが、西暦2年の1月1日は火曜日となります。
閏年だと前の年と比べて、2日ずれます。
とにかく、書いてみることです。
私の場合、まずは学生には曜日を考えずにカレンダーっぽく7日ずつ表示が出来るかどうかを最初に考えさせました。
一度にプログラムすると大変ですが、少しずつプログラムして目的に近づいていくことがベストだと思います。
〓武田〓

学院のテニス大会が催されました。
朝方の雨もどこへやら、日中は日差しがあり、夏の暑さでした。
女子高生の格好あり、本気モードの方あり、試合放棄の方あり、景品のビールを飲みたそうな人あり…と様々な人間模様が繰り広げられていました。
試合が終わる頃には、皆一様に疲れ果て、目も遠くをみておりましたが、爽やかな汗でした。
スポーツっていいですね。
テニスと言うと、高貴なイメージがあります。(学院の中でテニスが上手いK君は「テニスの王子様」と呼ばれ親しまれています。)
貧乏でもテニスはできるんでしょうが、何か合わない気がします。
やはりお金持ちのスポーツだと思います。
私も出来ましたら、いつでもテニスが出来るようにテニスコート付きの家に住みたいものです。その横にプールもあれば何も言うことはありません。
テニスで汗をかき、プールでクールダウンといった感じですか。
私は将来お金持ちになりたいと思いますが、お金持ちになることが先か、テニスが上手くなることが先か今悩んでいます。
〓武田〓

本日、大きく改定された2009年春の情報処理技術者試験を受けてきました。
私は旧ソフトウエア開発技術者試験にあたる応用情報技術者試験(通称AP)を受けました。
前回までは、午後試験が午後Ⅰと午後Ⅱに分かれており、それぞれ2時間と1時間の試験でしたが、今回は午後2時間半のみの試験となり、選択問題となりました。
気持ちとしては、早く試験が終わるので良かったですね。
最近は中国の方の姿も見受けられます。(会話をかわしている言葉で気がつきます。)
やるだけのことはやりましたので、結果が楽しみです。
で、試験の最中にふと思ったのですが、最近一人になる時間があまりなく、久々に一人の時間(試験の間だけですが)を持てました。
いつもなら試験の時間は辛い気持ちになるのですが、なぜか今日はすがすがしい気持ちで、「一人もいいもんだ」などと考えていました。
帰り際、昇降口を出たところにある自転車駐輪場の方から、甲高い歌声で

あ~ わたしの恋は~ みなみのぉ~ 風にのってはし~るわ~

と聴こえてきました。
少し音程もはずれぎみで周囲の笑いを誘っていましたが、皆バカにしたような笑いではなく、微笑ましい雰囲気になっていました。
試験も終わり、ほっとしたところでの歌声でしたので、皆きっと私同様「気持ちはわかるよ」と考えていたのかもしれません。
歌は歌いたいときに歌うものですよね。
〓武田〓

人生に卒業はありませんw
先日、ひたちなか情報電子専門学院での第24回卒業式がありました。
私がこの学院に来てからは11回目の卒業式です。
一体何を卒業するのだろうかと毎度の事ながら思います。
形式上は学校を卒業する訳ですが。
私の好きな歌に尾崎豊の「卒業」があります。
世の中に対する「支配」からの卒業を歌っています。
最近好きな歌にガガガSPの「卒業」もあります。
「別れた彼女」からの卒業を歌っています。
内容は違いますが、どちらも「自立」というキーワードが頭に浮かびます。
ご卒業おめでとうございます。

~ s/卒業|自立/感謝/g

…Perl
〓武田〓

先日、オリバー先生や職場の同僚と外国人が集うバーに行きました。
あえて店員の方に英語のメニューを持ってきてもらい、注文しようとしたのですが、メニューだけではどんな料理か分からず、私はとりあえず好きな食べ物である「トマトスライス」といったのですが、無いと言われてしまい困ってしまいました。
そのときオリバー先生が店員に使った言葉がこれです。

What do you recommend?

その時は何をいっているのか分かりませんでした。
ずっと気になっていたので、調べてみると意味は

おすすめは何ですか?

でした。
日本でも良く使う表現です。
これは憶えようと思いました。
ついでに調べてみました。

What kind of food is this?

どんな料理ですか?(メニューを指差しながら)

次回は使おうと思います。
〓武田〓

勝田マラソンが終わってから、一度3kmほど走りましたが、勝田マラソンに出る前と出た後での走っているときの気持ちは違うものなんだ、と感じました。
出場前は去年より速く走りたいという気持ちがあるため、意識して一歩一歩走るのですが、出場後に走ったときは、周りの景色を見ながら、などの余裕が出てリラックスして走ることが出来ました。(どちらが良いということではないです)
走ることに変わりはないのですが、何か目標があってそれに向かって動いているときの方が「真剣さ」はあると思いました。
私は「くだらないこと」にあえて熱くなりたい方です。
くだらないことでも何か自分の中で目標や動機づけを行うことで、きっと心から熱く真剣になれると思います。
〓武田〓

勝田マラソン10kmの部に出場しました。
今回は学生5名と先生が1名出走したため、かなりの大所帯(私の中では)となりました。
チーム名は「恋愛専門学院」です。
初出場者が3名いましたが、全員完走しました。
素晴らしい結果です。
マラソンというのは走っているときはかなり辛いのですが、走り終えたあとの気持ちは勝田マラソンの合言葉よろしく、風になったような気持ちです。
なぜかゴールしたときに、今までの長かった距離が一瞬のことのように感じるのです。
「人は死ぬ瞬間、今までの人生を走馬灯のように思い出す。」と言いますが、まさにそれと似ています。
ゴールを死と考えるならば、走っている最中が人生です。
走っている最中、考えることは今までに自分が関わった人たちや周囲に対する感謝の気持ちです。
〓武田〓

今年の最後はプログラムです。

【問題】 入力した10進数を2進数に変換して表示するプログラムを作成せよ。

C言語の授業の期末テストで出した問題です
解答例を2つ考えました。
1つ目は情報処理の勉強で習ったとおり元の数を2で割ってあまりを求めていき、最後に1になるまで繰り返すものです。

/* 10進数を2進数に変換する(1) */ #include <stdio.h> #include <stdlib.h> int main(void) { int i, n; int bits[1024]; int digit, amari; printf("10進数: "); scanf("%d", &digit); n=0; while(digit>=1){ amari = digit % 2; /* 配列変数に順番に代入して */ bits[n++] = amari; digit = digit / 2; } /* 逆順に表示している */ for(i=n-1; i>=0; i--){ printf("%d", bits[i]); } printf("\n"); return 0; }

2つ目はコンピュータの得意なビット演算を用いた方法です。
int型変数のサイズを4バイトとして考えています。

/* 10進数を2進数に変換する(2) */ #include <stdio.h> #include <stdlib.h> int main(void) { int i; unsigned int digit; /* 1000 0000 0000 0000 0000 0000 0000 0000 */ unsigned int bitCheck = 0x80000000; printf("10進数: "); scanf("%d", &digit); /* int型が4バイトであるため */ for(i=0; i<32; i++){ switch(digit & bitCheck){ case 0: printf("0"); break; default: printf("1"); } /* 1ビット右にシフトする */ bitCheck >>= 1; } printf("\n"); return 0; }

他にも色々と答えはあると思います。
Larry Wallの言葉を借りれば、

There is more than one way to do it!(そのやり方は色々ある!)

です。
今年もありがとうございました。
来年また、よろしくお願いいたします。
〓武田〓

笑顔が素敵な彼です。
これはとある居酒屋でコーラを飲んでいる写真です。
このストローは店員さんが出してくれました。
飲んだ後の笑顔です 飲んだ後の笑顔
実はこのコーラを飲む前にも彼はコーラを飲んでいたのですが、何を思ったか彼はその場にあった全員のストローをつなげて長いストローを作成したのです。
片付けにきた店員さんは少しむっとしたように見えたのですが、次にコーラを注文したときなんとその店員さんがもってきたコーラには写真のようなストローが…
こういった演出(演出?)は素敵ですね。冗談のわかる客と冗談のわかる店員のお兄さん。
ストローだけでなく、その場にいた全員の心もつながった瞬間でした。
俳優志望の粋なエンジニアの彼ですが、現在彼女募集中だそうです。
私が映画監督であれば、彼に言って欲しいセリフはこれです。

「人生なんて、人と比べるもんじゃないっスよ」
「そんなの関係ないぜ!」

コーラを飲む前の様子 飲み始めた時の様子
〓武田〓

パソコン事務学科のみなさん、ようこそ!
それではこれからの授業はこのブログを通じて実践学習をしていきたいと思います。
まずは毎日なにか記事を書き込んでみて下さい。
今日の感想でもいいですし、趣味の事、食べた物、授業の事、なんでもいいと思います。
とりあえずお互いにコメントやトラックバック機能を試してみて習った用語を自分のものにしていければいいかな、と思います。
私は、そうですねぇ真剣に日記でも書いてみますか。
〓武田〓