ホーム » 2014 (ページ 12)
年別アーカイブ: 2014
福井県を当てるクイズ問題、第一ヒント「歯みがきロボコン」…
そういえば、昨日のテレビ朝日のクイズ番組で、 写真や動画から県を当てる都道府県クイズ。 『福井県』を当てる問題で、 第1ヒントが「歯みがきロボコン」だったそうだ。
# 丁度その時間は、風呂に入っていて、見そこねた…(x_x;
第1ヒント:「歯みがきロボコン」 第2ヒント:「ペンギンの初詣」、 第3ヒント:「越前ガニ・ミュージアム」、 第4ヒント:「東尋坊」
ようやく第4ヒントで回答ボタンが押され、 一発目は「石川県」と答えられてしまったようだが…
2014年2月9日(第359回)
学生さんがテスト期間中につき、教員による収録でお送りしました。
- まるよし Train Pops ~ 国語と遊ぼう! 第42回 「ごんぎつね」
- ごんぎつねの「ごん」の最後の言葉は・・・
- 後期期末試験について
- 金田先生の恋愛相談「どんと来い」
担当:丸山先生、金田先生、川上先生、西
構造体の配列渡しの質問
構造体を使ったプログラムで、構造体のデータを配列全部を渡すのか、 配列の1つを渡すのか…の違いが判らずに混乱している人がいるので、 簡単なサンプルプログラムを示す。
// 構造体のサンプル struct A { int data ; } ; // 構造体の全部を渡す場合 void foo( struct A* p ) { // struct A p[] // 引数宣言は上のように書いても同じ。 for( int i = 0 ; i < 100 ; i++ ) { p[i].data = ... ; // 上の1行は下の2つでも同じ意味 // (*(p+i)).data = ... ; // (p+i)->data = ... ; } } // 構造体の1件を渡す場合 void baa( struct A* p ) { p->data .... } void main() { // 局所的な配列 struct A a[100] ; // 配列全体を渡す(a[]の先頭アドレス) foo( a ) ; // 配列のi番目を渡す for( int i = 0 ; i < 100 ; i++ ) { bar( &a[i] ) ; } }
2年情報基礎演習の発表会
簡単なパズル系の問題の、解決プログラム作成の課題に取り組んだ結果報告を、発表会形式で行いました。
2014年2月2日(第358回)
- まるよし Train Pops ~ 国語と遊ぼう! 第41回 「ごんぎつね」
- 二十歳の話
- STAP細胞について
- 公衆電話の話
- 節分の話
担当:前田勝(4EI)、山野(2C)、松島(2C)、西(教員)
コンテナクラスとテンプレート
例年より情報構造論が早く進んだので、STLとかBoostを少しだけ紹介するために、 その基本のコンテナとテンプレートを紹介する。
コンテナクラス
情報構造論の授業では、リストといった様々なアルゴリズムの説明では、 ひとまず整数でリストを…演習で名前と年齢の構造体で…といった 方式で進めてきたが、リストは次のデータのポインタと、実体のデータと考えれば、 実体データは、整数や名前と年齢といったように、必要に応じて変わってくる。
しかし、アルゴリズムが単純リスト・双方向リスト・2分木と変わっても、 実体データが違うだけで、自分自身で全てを記述することになる。 ただ、複雑なアルゴリズムになればなるほど、この作業が大変になる。
ここで、コンテナクラスという考え方が出てくる。 オブジェクト指向の派生・継承の考え方を使い、例えば単純リストを作りたい場合、 次のポインタだけの基本クラスを作り、そのリストを扱う処理をライブラリとして作っておく。 整数のリスト処理がしたければ、単純リストクラスに、整数を加えた派生クラスを作ったり、 名前と年齢を加えた派生クラスを作れば良い。
// 概念の説明用のクラス宣言であり、 // このままでは使いやすいクラスにはならない class List { private: List* next ; public: List( List* n ) : next( n ) {} } ; class ListInt : public List { private: int data ; : } ; class ListNameAge : public List { private: char name[20] ; int age ; : } ;
ただ、上記のプログラムでは、小さなオブジェクトでも仮想関数を使ったり、 肝心のアルゴリズムに相当する部分が記述が困難になるので、実際はもう少し 面倒な宣言になってしまう。 このため、C++などではテンプレートクラスがよく利用される。
テンプレート機能
C++でのテンプレート機能とは、型の部分を「仮の型名」としてプログラムを記述し、 そのプログラムを使用する時に具体的な型名を"<>"の中に記載する方式。 コンパイラ的には、異なる型でテンプレートが利用される度に、 その型用の機械語を生成するので、コードが肥大化する可能性があるのが問題ではある。
#include <stdio.h> template <class T> class List { public: T data ; List<T>* next ; public: List<T>( T x , List<T>*n ) : data( x ) , next( n ) {} } ; int main() { // 整数型のリスト処理 List<int>* p = new List<int>( 1 , new List<int>( 2 , NULL ) ) ; for( ; p != NULL ; p = p->next ) { printf( "%d\n" , p->data ) ; } // 実数型のリスト処理 List<double>* r = new List<double>( 1.2 , new List<double>( 2.3 , NULL ) ) ; for( ; r != NULL ; r = r->next ) { printf( "%f\n" , r->data ) ; } return 0 ; }
このテンプレートクラスの考え方を、究極まで活用したものとして、STL(Standard Template Library)や、 Boostといったライブラリが有名である。
// Cの場合 #include <stdio.h> int main() { int* a ; // 配列の作成 if ( (a = (int*)malloc( sizeof( int ) * 10 )) != NULL ) { // 配列の初期化 for( int i = 0 ; i < 10 ; i++ ) a[ i ] = i ; // 配列の合計 int sum = 0 ; for( int i = 0 ; i < 10 ; i++ ) sum += a[ i ] ; printf( "%d¥n" , sum ) ; } return 0 ; } // STLの場合 #include <numeric> #include <vector> #include <list> using namespace std ; int main() { vector<int> a ; // 配列サイズはSTL任せ... for( int i = 0 ; i < 10 ; i++ ) a.push_back( i ) ; // 配列末尾にiを追加 int sum = accumulate( a.begin() , a.end() , 0 ) ; printf( "%d¥n" , sum ) ; // 同じ処理を実数型の単純リストで... list<double> b ; for( int i = 0 ; i < 10 ; i++ ) b.push_back( (double)i ) ; printf( "%f¥n" , accumulate( b.begin() , b.end() , 0.0 ) ) ; return 0 ; }