2014年7月27日(第383回)
学生さんがテスト期間中につき、教員による収録でお送りしました。
- まるよし Train Pops ~ 国語と遊ぼう! 第65便 「走れメロス」 後編
- 新任先生紹介 物質工学科 坂元先生
ゲスト:物質工学科 坂元先生
担当:中村先生、手嶋先生、西
パイプ処理
前回の授業では、標準出力・標準入力・入力リダイレクト・出力リダイレクトなどの説明を行った。 今回は、この考え方をさらに応用したパイプ(unixパイプ)について説明する。
入力リダイレクトや出力リダイレクトでは、 ファイルという概念では、キーボードの入力とファイルからの入力、画面への出力とファイルへの出力が 同じように扱えるため、プログラム起動時にリダイレクトを設定すれば、簡単に切り替えられることを説明した。
しかし、ファイルでは、他のプログラムからの出力を入力として使ったりすることもできる。
例えば、以下の様な、名前と複数科目の点数のファイルがあって、各人の平均点を求めるプログラムがあったとする。
(( mean3.c )) #include <stdio.h> void main() { char name[ 100 ] ; int point[ 3 ] ; while( scant( "%s%d%d%d" , name , &point[0] , &point[1] , &point[2] ) == 4 ) { printf( "%s %lf" , name , (point[0]+point[1]+point[2]) / 3.0 ) ; } }
さらに、名前と点数のデータから、全員の平均点を求める以下のプログラムがあったとする。
(( mean-all.c )) #include <stdio.h> void main() { char name[ 100 ] ; int count = 0 ; double sum = 0.0 , p ; while( scant( "%s%lf" , name , &p ) == 2 ) { sum += p ; count ++ ; } printf( "%lf" , sum / count ) ; }
この時点で、名前と3教科のデータが入ったファイルがあったならば、以下の様に実行すれば、 画面に全員の平均点が表示される。
$ mean3.exe < data.txt > data-a.txt $ mean-all.exe < data-a.txt
しかし、各人の平均点の中間結果を data-a.txt に保存しなくても、 以下の様なパイプで処理を起動すると、一度に 結果を確認できる。
$ mean3.exe < data.txt | mean-all.exe
2014年7月20日(第382回)
学生さんがテスト期間中につき、教員による収録でお送りしました。
- まるよし Train Pops ~ 国語と遊ぼう! 第64便 「走れメロス」
- 先生方の地区大会
- 手嶋先生、本を出版!
担当:中村先生、原口先生、手嶋先生、金田先生、丸山先生、西
2014年歯みがきロボコン(小学生の部)の車体
この数年、福井県歯科医師会さんとの「歯みがきロボットコンテスト」の運営の 協力をしているなか、小学生・リモコンの部に参加する子ども向けの 夏休みの工作教室の準備を始めた。
しかし、今まで使ってきた 『楽しい工作シリーズ No.170 リモコンロボット製作 クローラータイプ (70170)』 が作成中止になり、入荷ができないとのことであった。 そこで、今年は改めて違う工作セットで作ることとなった。 キャタピラタイプのロボット製作セットでは、部品が足りないので、 別のパーツと組み合わせ、ひとまず試作。
夏休みの親子工作教室の2~3時間で作る (といってもリモコン・ギヤボックスなどは先に作っておく)必要があるから、 シンプルな構成とした。
学科サーバの認証キーの更新を行いました
学科サーバ(www.ei.fukui-nct.ac.jp)のサーバ証明書を更新しました。 更新によりhttps接続の認証キーが不正…といった表示はなくなるはずです。
オブジェクト指向の講義メモ
テンプレート
古い開発モデル
最近の開発モデル
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)、西(教員)