ホーム » 2014 (ページ 7)

年別アーカイブ: 2014

2025年5月
 123
45678910
11121314151617
18192021222324
25262728293031

検索・リンク

オブジェクト指向の講義メモ

テンプレート

古い開発モデル

最近の開発モデル

2014年7月13日(第381回)

  • まるよし Train Pops ~ 国語と遊ぼう! 第63便「図書館」 後編
    • ゲスト:英語科 吉田先生
  • 鯖江市地域活性化プランコンテストについて
    • ゲスト:実行委員長 小川さん
  • 英検の話

担当:山野(3C)、松島(3C)、田嶋(2C)、稲葉(1EI)、西(教員)

ファイル操作の基本

前回、fopen() のテキストモードなどの解説も終わったので、簡単なファイル処理。

fscanf,fprintf

まずは基本ということで、今までの scanf+printf をファイル版の fscanf+fprintf に変えて、 データの入出力のプログラム。 一応昨年度までにやっているはずなので、簡単な説明に留める。

#include <stdio.h>
void main() {
FILE* fp_in ;
FILE* fp_out ;
if ( (fp_in = fopen( "data.txt" , "rt" )) != NULL ) {
if ( (fp_out = fopen( "out.txt" , "wt" )) != NULL ) {
char name[ 100 ] ;
int  p[ 3 ] ;
while( fscanf( fp_in , "%s%d%d%d" ,
name, &p[0], &p[1], &p[2] ) == 4 ) {
fprintf( fp_out , "%s %lf¥n" ,
name , (p[0]+p[1]+p[2]) / 3.0 ) ;
}
fclose( fp_out ) ;
}
fclose( fp_in ) ;
}
}

来週のこの時間は、ファイル入出力の演習ということで、 上記のような、データ読み込み&出力のプログラム作成を演習課題とする。

getc,putc

1文字づつ入出力を行う処理のサンプルで、以下のプログラムを示す。

このプログラムで、(1)入力データが無い場合は、EOF(End Of File) C言語では -1 が定数で割り当てられていることを説明。 また、このプログラムで、1文字データを記憶する変数 c が、なぜ char 型でなく int型なのか説明。 (2) このプログラムで、キーボード上でファイル入力終了のための、"^Z"(Windowsの場合 / unixなら"^D")を説明。 (3) このプログラムは、1文字を入力したらすぐさま大文字化して出力する。 しかし、"This is a pen."と入力しても、入力文字と出力文字が交互に、"TThHiIsS aA pPeEnN.."と出力されないことを説明。 入力バッファリング・出力バッファリングの説明を行う。

#include <stdio.h>
void main() {
int c ;
while( (c = getchar()) != EOF ) {
if ( c >= 'a' && c <= 'z' )
c = (c-'a') + 'A' ;
putchar( c ) ;
}
}

バッファオーバーフロー対策の入出力

以下のプログラムは、予想以上の長い文字列を入力すると、バッファ溢れを利用して、 想定外のプログラムを実行できる可能性があって、極めて危険。

char name[ 10 ] ;
scanf( "%s" , name ) ;

バッファオーバーフローによる脆弱性攻撃を防ぐには、以下の様な方法が一般的。

char buff[ 1000 ] ;
while( fgets( buff , sizeof( buff ) , fp ) != NULL ) {
char name[ 1000 ] ;
int  x , y ;
if ( sscanf( buff , "%s%d%d" , name , &x , &y ) == 3 ) {
// name , x , y を使う処理
}
}

2014年7月6日(第380回)

  • まるよし Train Pops ~ 国語と遊ぼう! 第62便「図書館」
    • ゲスト:英語科 吉田先生
  • 七夕の話
  • 高専地区体育大会について

担当:前田勝(5EI)、山野(3C)、辻(1M)、川﨑(1EI)、西(教員)

unix講習会

卒研の5年生が、Raspberry-PiやらWebサーバ使いたいやらで、 unixを触る機会が多いけど、基本が解らないので 講習会をして欲しいとの要望から、unixの講習会を行いました。 卒研の時間を使ったけど、中途半端になってもいけないので、3時間コースになりました。

unixを使うには

unixを使うと言っても、色々な方法がある。 HDDインストール、USBインストール、 Windowsの仮想サーバ上にインストール(ただしLinuxは不安定)。 自前のサーバでなければ、Remote Desktopで接続、Rloginなどからssh接続。 ちょっと本物との違いがあるかもしれないけど、Cygwin,MinGWをインストール。

unixには様々なものがあるが、大きく分けるとBSD系(FreeBSD,NetBSD)、 Mac OS X、Linux。 Linuxといっても、Linux自体はカーネル部分だけであり、フリーの周辺ソフトを 取りまとめたディストリビューションがいくつかある。 有名なのは、RedHat系(CentOS,Fedra)、Debian系(Debian,Ubuntu)。 最近であれば、Ubuntuを入れるのが無難だろう。

unixの最初

まずは、login してもらって、ディレクトリ構成やら簡単な設定方法を説明。

/boot 起動に必要なもの
/bin  必要最低限の実行プログラム
/sbin 必要最低限の管理者向け実行プログラム
/lib  ライブラリやモジュールなど
/home ユーザのディレクトリ
/etc  設定ファイル
/var  プログラムが可変データを保存する場所
/tmp  だれでも書き込める作業用データの置き場
/usr/bin  一般的な実行プログラム
/usr/sbin 一般的な管理者向け実行プログラム
/usr/local/bin そのシステム固有の実行プログラム
/usr/local/sbin そのシステム固有の管理者向け実行プログラム
/dev  デバイスファイル

unixで設定を行う場合、システム全体に関係する設定は、/etc/配下のファイル、 各ユーザ固有の設定は、$HOME/配下の "." で始まる隠しファイルを使う。

各ユーザの情報は、/etc/passwd,/etc/group などで管理され、 passwdファイルの最後の欄には、login-shell などが記載される。

shellの基本

shellは、コマンドの対応処理をしてくれるが、基本設定は、.bashrc や .profile で 設定する。サーバの簡単な設定を行うだけであれば、基本的なバッチファイル (shell-script)の書き方を知っていればいい。

変数代入・参照、if,case などの概略だけを説明する。

そういえば、chmod で実行フラグの説明しなかったな…

shell-scriptでは、環境変数とshell変数があり、環境変数は子プロセス起動時に 引き継がれる。 環境変数で、重要な、LANG,PATH,LD_LIBRARY_PATH などを説明する。

分割コンパイルの説明

フリーのソフトを個別ダウンロード・コンパイルする学生も多い一方で、 make の意味やらが解らない人も多いので、分割コンパイルやmakeを説明。

複数のプログラムから、一つのプログラムを作る場合には、ヘッダファイルなどの 書き方が重要なので、4年の情報構造論でやったネタを分割する場合で説明。

(( list.h ))
struct List {
int  data ;
struct List* next ;
} ;
struct List* cons( int , struct List* ) ;
void print( struct List* ) ;
extern int count ;
------------------------------------------------
(( list.c ))
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int count = 0 ; // cons実行回数のカウント
struct List* cons( int x , struct List* n ) {
struct List* nn ;
count++ ;
nn = (struct List*)malloc( sizeof( struct List ) ) ;
if ( nn != NULL ) {
nn->data = x ;
nn->next = n ;
}
return nn ;
}
void print( struct List* p ) {
for( ; p != NULL ; p = p->next )
printf( "%d¥n" , p->data ) ;
}
------------------------------------------------
(( main.c ))
#include <stdio.h>
#include "list.h"
int main() {
struct List* l = cons( 1 , cons( 2 , cons( 3 , NULL ) ) ) ;
print( l ) ;
printf( "%d¥n" , count ) ;
return 0 ;
}

共通のヘッダファイルには、構造体宣言やプロトタイプ宣言を記載する。

Makefileの書き方

前述のlist.c,main.c をコンパイルするには、必要最小限の処理毎に行う場合は、 以下の3つのコマンドで行う。

$ gcc -c list.c
$ gcc -c main.c
$ gcc list.o main.o
----------------
$ gcc list.c main.c であれば、一度にできるけどmakeの理解のため。

プログラムの修正があった場合には、3つのどのコマンドを実行すべきかは、 人間が考えるのは煩雑。そこで make を使う。 make は、ファイルの日付情報を元に必要最小限の処理を行ってくれる。

(( Makefile ))
a.out: list.o main.o
gcc list.o main.o
list.o: list.c list.h
gcc -c list.c
main.o: main.c list.h
gcc -c main.c

しかし、gcc のコンパイラを別なものを使うとか、特殊なライブラリを使う場合、 makeの変数を使って書き換えを容易に行えるようにする。

CC = gcc
CFLAGS = -Wall # -DDEBUG
a.out: list.o main.o
$(CC) list.o main.o
list.o: list.c list.h
$(CC) $(CFLAGS) -c list.c
main.o: main.c list.h
$(CC) $(CFLAGS) -c main.c

構造図(UML)

先週のUMLの概要説明の後なので、今回は構造図を説明する。

構造図には、以下の記法がメインであり、基本的にプログラムやシステムの構造を記載する記法。

  • クラス図とオブジェクト図
  • コンポーネント図
  • 配置図
  • パッケージ図

以下の記事は、IT専科のUML入門の要点をまとめたものであり、詳しくは元を参照。

クラス図とオブジェクト図

クラス図は、クラスの中身と他のクラス間の関係を記述するための図。

1つのクラスは、上段にクラス名・中段に要素・下段にメソッドを記載する。 各要素・メソッドの前には、限定子として("-":private,"+":public,"#":protected)などを 記載する。


IT専科から引用

コンポジションと集約

各クラスの間は、その関係により、線の描き方を変える。 線の両端には、多重度を示す数値や記号、線の中央には役割などを必要に応じて記載する。
関連:────
集約:◇───
コンポジション:◆───
依存:←——-
汎化:◁────

クラスと他のクラスの間の関連は直線で表し、多重度やその役割を書き添える。 継承は白抜き△矢印で表現し、そのクラスの基底クラスに向かって矢印を描く。 関連においてオブジェクトの寿命が同じ(クラスの要素に別要素が包含される)場合は、 コンポジション(合成)と呼ばれ、黒塗り◆で矢印を描く。 寿命などが別であり、ポインタで結合されるような関係は集約と呼ばれ、 白抜き◇で矢印を描く。

class Engine {
// エンジン
} ;
class Tire {
// タイヤ
} ;
class Car {
Engine engine ;     // コンポジション
Tire*  wheel[ 4 ] ; // 集約
} ;

is-a,has-a

クラス設計を考えるとき、派生とすべきか、コンポジション(or集約)で実装すべきか 悩む場合も多い。この時の判断の方法では、is-a,has-a関係という言葉が使われる。 基底クラス「どうぶつ」から派生した「哺乳類」は、"哺乳類は動物である"という 言い方ができる。一方で、前コンポジションの説明では、 "Car は、Engine(Tire)を、部品として持つ"という言い方ができる。 このことから、is-a で関係を表現できるか、has-a で表現できるかがカギとなる。

class Animal {
//どうぶつ
} ;
class Mammalia : Animal { // is-a 関係なので派生で実装すべき。
// 哺乳類
} ;

オブジェクト図は、クラス図の理解を助けるために、具体的な値を記載したもの。 クラス図の最上段を下線付きで記載する。

パッケージ図

パッケージ図は、クラス図をパッケージ毎に分類して記載する図。 パッケージの塊を、フォルダのような図で記載する。


IT専科から引用

コンポーネント図とコンポジット構造図

コンポーネント図は、複数のクラスで構成される処理に、 インタフェースを用意し、あたかも1つのクラスのように扱ったもの。 接続するインタフェースを、提供側を◯───で表し、要求側を⊃──で表す。


IT専科から引用

配置図

配置図は、システムのハードウェア構成や通信経路などを表現するための図。 ハードウェアは直方体の絵で表現し、 デバイスの説明は、"≪device≫"などを示し、実行環境には、"≪executionEnvironment≫" などの目印で表現する。


IT専科から引用

2014年6月22日(第378回)

  • まるよし Train Pops ~ 国語と遊ぼう! 第60便 「気づかない方言」 後編
  • 水泳の話
  • 映画の話 梅雨の時期に見る映画は?

担当:山野(3C)、松島(3C)、山田(1B)、森山(1M)、西(教員)

  • まるよし Train Pops ~ 国語と遊ぼう! 第60便 「気づかない方言」 後編
  • 水泳の話
  • 映画の話 梅雨の時期に見る映画は?

担当:山野(3C)、松島(3C)、山田(1B)、森山(1M)、西(教員)

北陸バドミントン交歓試合

1406211042_320x240.JPG

プロコン競技の補助的サンプルコード

プロコンの競技部門では、PPM形式画像ファイルの先頭に、 画像分割数などが、コメントで埋め込まれるので、 コメントを追加するプログラムを示して、画像データの入出力に慣れてもらうサンプルを示す。

2014年6月15日(第377回)

  • まるよし Train Pops ~ 国語と遊ぼう! 第59便 「気づかない方言」
  • 新人自己紹介 田中さん
  • 部活動について
  • サッカーワールドカップについて

担当:前田勝(5EI)、山野(3C)、川﨑(1EI)、田中(1B)、西(教員)

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー