ホーム » t-saitoh の投稿 (ページ 180)

作者アーカイブ: t-saitoh

2025年5月
 123
45678910
11121314151617
18192021222324
25262728293031

検索・リンク

プロコントラブル、今年はイノシシ

例年、プロコンではみごとにトラブルが続いている。 BLOGに残っているだけでも、以下のような状況。 昨年度は高久先生のみの引率で、成績以外でのトラブルなし。 ということで、ほとんど私が疫病神って気分になってきた。

今年はイノシシをはね、今庄で1時間待ち

ここまで連続でトラブルが続いているため、 今年も何が起こるか…と思っていたけど、新大阪サンダーバードの出発で、 安心して、高久先生と「何も起こりませんでしたね…」といったら、鯖江駅につく 10分前の今庄駅で、前の特急が「イノシシをはねた」という理由で、停車。 最終的に1時間ほど今庄駅に待たされ、鯖江駅到着は23:10分頃。

あまりの例年のトラブルで、列車の中ではもう笑うしかない状態。

高専プロコン2日目

競技部門は、目の前の餌に釣られない改良が間に合ったのかなぁ〜♪

自由部門もデモが見やすくなるような、改良をしたものの、朝のセットアップで間に合ったのかなぁ〜♪

1010170843_320x240.jpg

競技:敗者復活戦敗退、自由:敢闘賞

競技部門は、昨日の進入できない場所に囲まれた水瓶につられて動けなくなるトラブルの 対応などを行ったりしましたが、残念ながら敗者復活戦敗退となってしまいました。

自由部門は、デモ審査とマニュアル審査でしたが、事前の準備やちょっとした改良が間に合い、 無事に審査を終えました。帰りのJRの都合から、閉会式を待たずに出発しましたが、 帰路にWebでチェックしましたが、例年通りの敢闘賞でした。

プロコン自由:砂であそぼう

1010161424_320x240.jpg

プロコン1日目

朝からトラブル? 1010160804_240x320.jpg

高専プロコンで高知に移動中

1010151352_240x320.jpg

file-scope(static)とextern文

プロコンの競技部門の学生さんたちが、最後の追い込み。 各パーツに分かれて動作確認が取れてきたし、 1つのプログラムに合成する最後の段階になっている様子。 しかしながら、合成した後プログラムが動かないとの相談。 1度目の処理は動くけど、2回目で動かないという状態なので、 不完全な初期化データを使って動かなくなっているのではと想像する。 といっても、そう簡単に間違いが見つかる訳もないけど、 ひとまずコードを見せてもらう。 すると、覚えたての分割コンパイルで、ヘッダファイルの中に、 static int array[…] ; といった記載が見つかる。

このままでは、array[] が、各C言語ファイル毎に、file-scope の別な実体を持つため、 大域変数渡しの副作用が伝わらなかったり、その結果として未初期化が発生したり。

ファイルスコープ

C言語では、静的変数の局所変数を作りたい場合、関数ブロック内で "static"キーワードを指定すればよい。 しかしながら、関数ブロック外で static キーワードをつけると、 分割コンパイルした場合、file-scope を持つようにコンパイルされる。 つまり、各ファイル毎の大域変数は、たとえ同じ名前の大域変数が別ファイルに あったとしても、別な記憶領域を確保してくれる。

(( aaa.c ))
int x1 ;         // 静的変数・大域変数
static int x2 ;  // 静的変数・大域変数・ファイルスコープを持つ
void foo() {
static int x3 ; // 静的変数で局所変数
:
}
(( bbb.c ))
extern int x1 ;  // aaa.c の x1と同じ実体を参照できる。
static int x2 ;  // aaa.cのx2とは大域変数だけど別の実体をもつ

分割コンパイルして、各ファイルで共通の変数や関数を定義する場合は、 以下のように行う。 ポイントは、extern によって宣言すると、実体は別のところにある変数となる。

(( common.h ))
int foo() ;      // プロトタイプ宣言
extern int bar ; // 実体はどこかで確保される変数として宣言
(( aaa.c ))
#include "common.h"
int bar = 123 ;  // 変数barの実体
int foo() {
// 関数foo()の実体
}
(( bbb.c ))
#include "common.h"
void main() {
bar = 234 ;              // aaa.c の大域変数barに代入
printf( "%d" , foo() ) ; // aaa.c の関数foo()を呼び出し
}

関係データベースとSQL

データベースの基礎の説明が終わったので、 データベースの実際のデータベース操作言語SQLの詳細を説明する。

関係データベースの用語

関係データベースでは、表構成のデータで表現され、 集合であらわされる項目の複数の組み合わせで表現される。 1つの項目フィールドの取り得る値の集合をAとした場合、 直積とは、 で表現される。A,Bの間の関係とは、直積の一部 であらわされる。

SQLの基本

SQLの基本として、データのテーブルを作る "CREATE TABLE" 文の説明として、 数値型・文字型・日付型などの型の名前や説明を交えながら説明。 参考にしている教科書では、CREATE VIEWの説明がある割に、CREATE TABLEの説明が無い… この他に、INSERT文の説明を行う。

データを探す場合は、SELECT文を使うが、 選択とは、特定条件のレコードを探す処理、射影でそのレコードの中の特定のカラムを取り出す。 結合とは、カラムの組み合わせを記述すものである。

SELECT  [射影] FROM [結合] WHERE [選択] ;
例: SELECT S.名前 FROM S,P WHERE P.点数>80 AND S.学科='電子情報' ;

教科書で説明の無い部分として、WHERE節の中のBETWEEN,LIKE,IS NULLなどを紹介。

来週は副問い合わせ文などの説明の後、Web上のSQL演習環境を説明した後、練習課題とする。

計算機システム:OSの歴史と機能概要

コンピュータの歴史の説明の後の、8bit,16bitのパソコンの発達をうけ、 32bitパソコンの発達やOSの発達について説明する。

16bitパソコンの登場とともに、マイクロソフト社のMS-DOSや、GUIを取り入れたApple社の Macintoshの発達したころ、16bitコンピュータはシングルタスク・シングルユーザであった。 この頃の汎用機では、その計算機パワーを活用すべくマルチユーザ・マルチタスクで 処理が行われていた。 この便利な機能を、ミニコンやパソコンで使いたいという要求がでてきた。 この中で、C言語を開発したカーニハンやリッチーは、Multicsをミニコンで動かすために、 unixを開発した。 unixでは、複数ユーザが同時に複数の処理をこなすために、プログラムが並行動作している 別プログラムに悪影響を及ぼさないようにするなどの保護機能・セキュリティ機能が 重要になってきた。 32bitコンピュータが出てきたころになり、パソコンでもようやくマルチタスク・マルチユーザを 実現するための保護機能を実装できるようになってきた。 パソコンOSでは、Windows 95/98/Me/Home等ではシングルタスク・シングルユーザ がベースであった。しかし、OS/2やWindows/NT/2000/Xp/Vista/7とマルチタスク・マルチユーザ の機能が発達していった。 一方、unixでは、BSD/SysVの2系統に分かれて発達する中、 インターネットを利用したオープンソースのOSのLinuxが発達していく。

コンピュータの基本構成

計算の手順はプログラムであり、計算に必要なデータと共に使われることで、 ソフトウェアと呼ばれる。プログラムの計算手順の考え方はアルゴリズムと呼ばれる。 コンピュータは、CPU,メモリ(主記憶),補助記憶装置,周辺装置から成り立っている。 ほとんどのコンピュータは、ノイマン型と呼ばれる構成で、 (1)メモリから命令を読む,(2)命令を解読,(3)データをメモリから読む,(4)計算,(5)結果をメモリに書き込むの処理を繰り返して行われる。

主記憶のメモリには、不揮発性のROMと揮発性のRAMがあり、 最近のOSでは、処理に応じてプログラムの中身を変える必要から、 RAMがほとんどとなっている。 しかし、このままでは電源を入れた直後のコンピュータは動けない。 このためメモリの一部はROMがあり、この中には、 周辺装置の使い方BIOSと、電源投入直後の処理ブートローダのプログラムが 書き込まれている。 コンピュータは、ブートローダがBIOSを使って、補助記憶装置内のOSを主記憶に呼び出して OSが動き始める。利用者が、アプリケーションを起動すると、 OSが補助記憶装置内のプログラムをRAMに呼び出して処理が行われる。

プログラムを動かすにあたって、CPUでは機械語で処理が行われる。 昔はプログラムはアセンブリ言語を使って記述していた。 しかし高級言語の登場によって、プログラムが書きやすくなった。 高級言語で書かれたプログラムが動くにあたって、実行方式にはコンパイラ方式インタプリタ方式がある。 コンパイラ方式は、処理前に機械語をすべて生成してあるため、実行速度が速い。 しかしテストプログラムを動かすような場合、全命令を機械語に直す時間がかかるので、 インタプリタ方式が多用される。コンパイラ方式は実行時に高級言語で書かれた ソースプログラムが不要のため、プログラムの考え方が盗まれることがない。

構造体ポインタ渡し&オブジェクト指向

先週の構造体の基本の説明を受け、構造体の実際的な使い方の紹介を行う。 後半では、構造体をうまく使えば、データ隠蔽、手続き隠蔽ができて、 手続き・データ設計者と、それを利用する人に分かれて大きいプログラムが書ける… といった説明を行う。 また、この発展形としてのオブジェクト指向の導入部分を説明する。 ただし、オブジェクト指向のネタは、本来の授業範囲外でテストには出さない。

構造体のポインタ渡し

構造体を使っていると、そのデータを使った処理の記述が増えてくる。 この場合は、以下のように関数に構造体へのポインタを渡して操作を行う。

struct Person {
char name[ 10 ] ;
int  age ;
} ;
// ポインタ渡しに慣れるまではアロー演算子は使わない。
void set( struct Person*p , char s[] , int a ) {
// 質問:なぜ (*p).name = s ; ではいけないのか?
strcpy( (*p).name , s ) ;
(*p).age = a ;
}
// 慣れたら、アロー演算子。
void print( struct Person*p ) {
printf( "%sさんは%dさいです\n" ,
p->name , p->age ) ;
}
void main() {
struct Person saitoh ;
set( &saitoh , "saitoh" , 45 ) ;
print( &saitoh ) ;
}

このようなスタイルに慣れると、呼び出し側(この例ではmain()の中)には、 データ構造の中身、手続きの中身を知らなくても、プログラムが書ける。 このようにデータ構造をブラックボックスでとらえられることをデータの隠蔽化、 処理の中身をブラックボックス化することを手続きの隠蔽化という。

そのまんまオブジェクト指向に…

この辺に慣れてくると、オブジェクト指向も理解しやすくなってくる。 オブジェクト指向では、データ構造⇒オブジェクト、データに対する手続き⇒メソッドと呼び、 この2つを合わせてクラスと呼ぶ。

class Person {
char  name[ 10 ] ;
int  age ;
void set( char s[] , int a ) {
strcpy( name , s ) ; age = a ;
}
void print() {
printf( "%s%d" , name , age ) ;
}
} ;
void main() {
Person saitoh ;
saitoh.set( "saitoh" , 45 ) ;
saitoh.print() ;
}

授業で眠そうにしている学生さんがいたので、ちょいとイヤミきつめで注意。 緊迫感がなさそうだし、3年だと「あと2年しかない」、「不景気で就職も進学も大変」 というネタでやる気をださないと苦労するのは自分…と雑談を交えた授業となった。

避難訓練&進路希望調査

今日は、昼から避難訓練があるので、授業が短縮授業であった。 しかし来週には保護者面談を実施するので、 自分の授業 の前に、進路希望調査の用紙を配る。 様式は、就職用と進学用で表は履歴書っぽい書式で、裏面は就職先・進学先・業種や、 それに伴う意欲を確認するようなものとした。 これを、保護者面談までor面談当日に提出してもらう予定。

しかしながら、まだ夢のような希望を言ってくる人もいそうなので、 「夢を語る時間はもう終わった」と明言する。

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー