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

作者アーカイブ: t-saitoh

2025年5月
 123
45678910
11121314151617
18192021222324
25262728293031

検索・リンク

ファイルとC言語

C言語のファイル操作において、絶対PATH,相対PATHの理解は重要であり、 Windowsのコマンドプロンプトを開いて、"C:\WINDOWS\system32\IME\CINTLGNT"あたりを 例題に、相対PATHの親ディレクトリ表記を解説。

c:
dir
dir \WINDOWS
dir \WINDOWS\system32
dir \WINDOWS\system32\IME
dir \WINDOWS\system32\IME\CINTLGNT
cd \WINDOWS\system32\IME
dir
dir CINTLGNT      # これを絶対PATHでは?
dir ..
dir ..\..         # これを絶対PATHでは?
dir ..\..\system  # これを絶対PATHでは?

後半は教室に戻り、FILE型とfopen()の説明を行う。

FILE* fp ;
fp = fopen( "ファイル名" , "モード" ) ;
fclose( fp ) ;
# ファイルを開く際のカレントディレクトリは、通常プログラムファイルのディレクトリ
# モードには、"r"読み込み , "w"書き込み , "a"追記がある。

Windows と unix では、行末文字の考え方が違う。 unix では "\n" で次の行の左端に移動するが、 Windows では、"\r"(復改) , "\n"(改行) を送らないと、次行左端に移動しない。 このため、WindowsのC言語と、UnixのC言語の互換性を考え、 「テキストモード」では、"\n"と"\r\n" の置き換えをしてくれる。 「バイナリモード」では、置き換えをしない。

リスト処理の応用

リスト構造への簡単な処理の説明が終わっているので、本日は応用ネタ。

末尾追加

先週説明したリストの生成は、先頭挿入型であったため、データは挿入順序とは逆順にならぶ。 後の説明のキューにも関連するので、末尾追加型の処理も説明する。

struct List {
int  data ;
struct Lint* next ;
} ;
struct List* top = NULL ;
struct List** tail = &top ;
int x ;
while( scanf( "%d" , &x ) == 1 ) {
*tail = cons( x , NULL ) ;
tail = &( (*tail)->next ) ;
}

スタックとリスト

スタックは、局所変数のデータや関数の帰りアドレスなどの保管で使われるデータ領域で 使われているが、LIFO(Last In First Out)「最後に入れたデータを最初に取り出せる」 データ構造。配列を使って記述すれば、

int stack[ 100 ] ;
int sp = 0 ; // 機械語の説明であれば、領域末尾から使うんだけど...
void push( int x ) {
stack[ sp++ ] = x ;
}
int pop() {
int ans = stack[ --sp ] ;
return ans ;
}
void main() {
push( 1 ) , push( 2 ) ; push( 3 ) ;
printf( "%d" , pop() ) ;
printf( "%d" , pop() ) ;
printf( "%d" , pop() ) ;
}

しかし配列を使うと、そのサイズ以上のデータを覚えることはできない。そこで、リスト構造のお出まし。

struct List* stack = NULL ;
int push( int x ) {
stack = cons( x , stack ) ;
}
int pop() {
int ans = stack->data ; // データ0件のときの処理は別途書いてね。
struct List* del = stack ;
stack = stack->next ;
free( del ) ;
return ans ;
}

リストと待ち行列

リストとは反対に、FIFO(First In First Out)「最初に入れたデータを最初に取り出せる」タイプの データ構造ま待ち行列(Queue)と呼ばれる。配列を使って記述すれば、

int queue[ 100 ] ;
int wp = 0 ;  // 書き込み用のポインタ
int rp = 0 ;  // 読み出し用のポインタ
void put( int x ) {
queue[ wp ] = x ;  // wpが一周してrpに追いついたときの処理は別途書くこと。
if ( ++wp > 100 ) wp = 0 ;
}
int get() {
int ans = queue[ rp ] ;  // 同じくデータが0件(wpに追いついた)の処理も別途書くこと。
if ( ++ rp > 100 ) rp = 0 ;
return ans ;
}
void main() {
put( 1 ) ; put( 2 ) ; put( 3 ) ;
printf( "%d" , get() ) ;
printf( "%d" , get() ) ;
printf( "%d" , get() ) ;
}

このような配列を使った待ち行列では、配列サイズを超えた場合に、すでにデータを読み出して 使われていない部分を再利用するために、ポインタを先頭に戻す。 このデータ構造は、先頭と末尾が巡回してつながっているようなイメージなので、 「リングバッファ」と呼ばれる。

しかしながら、このリングバッファも配列での実装だから、配列サイズの上限は超えられない。 これまたリスト構造が便利なはず。

struct List* queue = NULL ;
struct List** tail = &queue ;
void put( x ) {
(*tail) = cons( x , NULL ) ;
tail = &( (*tail)->next ) ;
}
int get() {
int ans = queue->data ;
struct List* del = queue ;
queue = queue->next ;
free( del ) ;
return ans ;
}

UML-クラス図

オブジェクト指向の話も、仮想関数などの話や演習も一段落で、次のUMLの説明に入る。

UMLは、システムの構造や処理などを図にして表現するための方法で、 共通の書き方として定められている。

UML

UMLは、オブジェクト指向において、それを図示するために OML などの表現方法として 始まって、現在は UML へと発達してきた。詳しくはwikipedia参照。

UMLの表現は、大きく分けて、データ構造などを示す構造図と、処理順序に関連する振る舞い図 からなる。

構造図は、クラスの構造を表わすクラス図、ファイルやライブラリ・モジュールなどを表現するコンポーネント図、ハードウェアやアプリケーションの関係を図にした配置図、 クラスに具体的なオブジェクトを書き込んでしめしたオブジェクト図などからなる。

振る舞い図は、相互作用図(アクティビティ図)、システムに要求される機能をユーザ視点で示したユースケース図、内部の状態の変化を表現した状態遷移図などからなる。

後半は、GUI&仮想関数の課題のレポート作成の時間とした…

ほめて育てる?仲が悪ければ褒めても逆効果!

高専に最初に赴任したときは、卒研の指導でも厳しい質問をとばしていた時期もあるけど、 「褒めて育てる」のも大切だよ…と言われ、時と場所を選ぶようにはなった。 さて、こういう反省のもと、JR福知山線の事故をうけて、JRの改善の取り組みとして、 様々な分析が行われた結果が注目されているらしい

その1つが、上司と部下の関係がいい場合には、上司が褒めると部下も作業改善に積極的。 しかし、関係が悪い場合には、上司が褒めても部下は作業改善に消極的になるという 報告があったらしい。
# 日頃から良い関係を作っておけ…ということだな…

情報処理技術者試験の2009年度からの新制度

学生さんへの勉強への意欲拡大で、資格試験の積極取得を伝えているが、 情報処理技術者試験の2009年度からの変更にともない、情報収集。 秋の試験願書受付期間も7/13-8/19の期間みたい。

新しい区分になったけど、直感的に分かりやすい資料を探してみた。 これを見ると、基本情報(FE)は、ほとんどそのままの様子。 新しい「ITパスポート試験(IP)」は、情報システムの利用者側の視点での出題で、 初級システムアドミニストレータが、入門的になったものだろうか… 試験問題の例などを見たけど、どうも経営・法律・業務などの業務系関連知識が 要求される知識ネタが多そう。 3年ならば、今までどおり基本情報にチャレンジするのが、無難だと思う。

管理サーバのアップデート(2009/7/1)

今回は、Apache2 や bind9 も対象に含まれていたので、 ちょっとアップデート対象のパッケージも多めだった。 ついでに、緊急連絡システムのサーバでは、使わない サーバ系パッケージが残っていたので、TeXパッケージと共に 削除する。 デスクトップ環境のパッケージも消せばいいんだけど、 将来的な管理移譲に備え、残しておく。

U-20プログラミングコンテスト

毎年、20歳未満のプログラマの才能の芽の発掘を目的に開催されている コンテスト。皆さん、チャレンジしてみましょう。

学研大人の科学:4ビットマイコン(GMC-4)

大人の科学の4ビットマイコン。 これで2500円というのは安い。

0906301940_320x240.jpg

本物の4ビットマイコンというのではなく、 組み込みCPUでのシミュレータなんだけど、 アドレス表示の2進LEDとデータ(メモリ)表示の7セグLEDで 十分4ビットマイコンになっている。

当然、命令コードは読みやすい……はずがない… だけど、ステップ実行だったり、音発生だったりと、実験のネタにする機能が十分備わっている。

メモリ・レジスタ

プログラム 00-4F
データ 50-5F
レジスタ A,B,Y,Z,A',B',Y',Z'

命令コード

基本命令
Opコード ニーモニック 内容 Flag
0 KA K→Ar キー入力有無
1 AO Ar→Op 1
2 CH Ar⇔Br , Yr⇔Zr 1
3 CY Ar⇔Yr 1
4 AM Ar→(Yr) 1
5 MA (Yr)→Ar 1
6 M+ Ar+(Yr)→Ar 桁上がり
7 M- Ar-(Yr)→Ar マイナス
8 TIA □ □→Ar 1
9 AIA □ Ar+□→Ar 桁上がり
A TIY □ □→Yr 1
B AIY □ Yr+□→Yr 桁上がり
C CIA □ Ar≠□→Flag 不一致
D CIY □ Yr≠□→Flag 不一致
E (CAL) (別表参照) (-)
F JUMP □□ if(Flag)goto□□ 1
CAL命令
Opコード ニーモニック 内容(CAL命令はFlag=1の時だけ実行) Flag
E0 CAL RSTO 0→数字LED 1
E1 CAL SETR 1→2進LED[Y] 1
E2 CAL RSTR 0→2進LED[Y] 1
E3
E4 CAL CMPL NOT(Ar)→Ar 1
E5 CAL CHNG A,B,Y,Z⇔A',B',Y',Z' 1
E6 CAL SIFT Ar%2→Flag,Ar/2→Ar Ar[0]
E7 CAL ENDS エンド音 1
E8 CAL ERRS エラー音 1
E9 CAL SHTS ショート音 1
EA CAL LONS ロング音 1
EB CAL SUND Arの音階の音 1
EC CAL TIMR (Ar+1)×0.1sec待ち 1
ED CAL DSPR (E)→2進LED[0:3],(F)→2進LED[4:6] 1
EE CAL DEM- DEC((Y)-Ar)→(Y),Y– 1
EF CAL DEM+ DEC((Y)+Ar)→(Y),Y– 1

学研FX-マイコン

記事を読むと、元々は、学研の電子ブロックのFX-マイコン(R-165)として 販売されていたものがベースらしい。 A,B,Y,Zと補助レジスタA',B',Y',Z'という考え方は、まるでZ80。 ニーモニックは、学研の子供向けというのもあるのか、違和感を感じる。 どちらにしろ、この価格は素晴らしい!

大人の科学.net

H21年度高専プロコン、競技部門本選参加へ…

高専プロコンの予選結果が発表となりました。 自由部門×2、課題部門×1、競技部門×1にて、応募しましたが、 残念ながら、競技部門1チームが本選参加となりました。

  • 競技部門:くるったー、4EI:奥村、小林、丸山(指導高久)

参加学生の方は、全力が出せるように準備頑張ってください。
本戦では、残念ながら勝ち残ることができませんでしたが、 参加者の学生さんは良い経験となったようです。

高専プロコン予選通過、競技部門のみ

高専プロコンの予選結果が発表となった。 残念ながら、今年度は競技部門だけとなった。 審査員の講評を見ると、

  • … 自由と課題の中身が似通ってきています。 これは課題部門が幅広い解釈ができるため…
  • … 世の中にある話題の中から適当なものを見つけてきたような作品が多く、 若者らしい斬新なアイデアが少なかったことが残念です。

と書かれている。実際、応募資料を作る時も、 自由/課題の選択はアイディアが出てからの後付け。 アイディアについても、指導教員の知っているネタ説明を元に、 考え出したりしていれば、ご指摘のとおり…としかならない。 逆の見方をすれば、資料さえあと少し頑張れば、予選通過をしてもおかしくなかったとも言える。

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー