next up previous
: この文書について...

情報処理概論期末試験

問1.
次の語句を簡単に説明しなさい.(各3点) (具体例によって説明しても良い.)

(1) bit (2) byte
(3) 予約語 (4) プログラミング言語
(5) コンパイラ (6) インタープリタ
(7) レジスタ変数 (8) 変数のスコープ
(9) if文 (10) while文
(11) for文 (12) 配列
(13) ファイル stdio.h (14) 関数scanf()
(15) ポインタ (16) 関数malloc()

問2.
次の問に答えなさい.(各3点)

(1) 演算子 & と&&の違いを説明しなさい.

(2) iがint型 で宣言されているとき,++iとi++の違いを説明しなさい.

(3) 繰り返し使う手続きを, 関数とマクロによって実現したときの違い説明しなさい.(コードサイズ,実行時間の違いなど)

(4) 次の文を実行したときの表示を,桁が分かるように示しなさい.

 
            printf("%10.3d  %10.3f \n", 5, 12.34567);

問3.
代表的な計算機言語の名前を4つ示し,その特徴を簡単に説明しなさい.(20点)

問4.
次の関数の機能を答えなさい. そして,各行の内容を行番号ごとに説明しなさい. また,この関数は正しく動作するが, 実行のステップ数を1行ぶん少なくすることができる, どのように修正すれば良いか示しなさい.(20点)


1:   int f(char *str1, char *str2)
2:   {
3:     while(*str1 != '\0' || *str2 != '\0') 
4:     {
5:       if( *str1 != *str2 ) break;
6:       str1++;
7:       str2++;
8:     }
9:     if( *str1 == '\0' &&  *str2 == '\0') return(1);
10:    return(0);
11:  }


解答

問1

(1)
情報量の単位で,1bit は0または1などの二者択一の情報量を表 す.
(2)
1byteは8bitの情報量を意味する. (昔は,1wordの意味にも使われ ていたが特に解答する必要はない。)
(3)
プログラミング言語で用途が決められた単語で, 変数名などに使用することができないもの. C言語では,if, for, int, externなどがある.
(4)
コンピュータに行わせたい仕事を記述する言語.
(5)
プログラムを直接にコンピュータが実行することができる機械語に 翻訳するもの.
(6)
プログラムの細かい単位を1つずつ翻訳しながら実行するもの. (実際には,中間言語に変換してから,1つずつ実行する.)
(7)
記憶クラスの一つで,プログラムでの意味としては自動変数と同じであ る.異なる点は,高速化のために, レジスタ変数はできるだけ, プロセッサ内のレジスタに割り当てようとすることである.
(8)
宣言した変数が使用できる有効範囲. 自動変数,レジスタ変数,静的変数は, 宣言したブロックの中がスコープになる. 外部変数は,宣言した場所以下のファイルがスコープになる.
(9)
if (条件) 文
のようにして使用する.条件が成立すると, 文(ブロックも文に含まれる)を実行し, 条件が成立しないと,文を実行しないで次に進む. else if,else などと組み合わせることもできる.
(10)
while (条件) 文
のようにして使用する.条件が成立している間, 文を繰り返し実行する. 条件が成立しなくなると,次に進む.
(11)
for(カウンタの初期設定 ; 条件 ; カウンタの再設定) 文
のように使用する.まず,カウンタを初期設定し, それが条件を満足している間,文を繰り返し実行する. このとき文を繰り返し実行する度に,カウンタの再設定を行う. 条件が成立しなくなると,次に進む.
(12)
基本的なデータ構造の一つ. 同じデータ型のデータのための領域が複数確保され, 0以上の整数,またはそれを多次元化したもので, 1つのデータの位置を指定し, その内容を参照したり書き換えたりすることがきるもの.
(13)
入出力するためにインクルードするヘッダファイル. stdio.hには入出力のための関数のプロトタイプ宣言や, マクロ定義が記述されている.
(14)
標準入力から,指定するフォーマットに従って, データを入力するための関数.
(15)
データが存在するアドレスを格納する変数.
(16)
システムからデータ領域をもらうための関数. 引数に必要なデータのバイト数を指定すると, その大きさを持った領域の先頭アドレスを指す char型のポインタを返す.

問2

(1)
&はビットごとのAND演算子で,&&は論理AND演算子である. i & jは, i,jを2進数で表したときの各桁を論理積した結果が値になる. i & jは,i,jが0のときは「偽」, 0以外のときは「真」としたときの論理積した結果(真が1,偽が0) が値になる. (&で,変数のアドレスを取り出す演算子というのも○とする.)
(2)
++iの場合は,iの値を1だけ増やしてから,その値を++iの値とする. i++の場合は,i++の値はiの値になり,その後でiを1だけ増やす.
(3)
関数の場合,そのプログラムはコピーされず, 1つしかないので,コードサイズは小さいが, 呼出などの手続きのために,多少遅くなる. マクロの場合は,それを使ったところにマクロを展開するので, コードサイズが大きくなるが,呼出などの手続きが不要なため, 高速である.
(4)
(7桁の空白)005(2桁の空白)(4桁の空白)12.346(改行)

問3

FORTRAN
アセンブラの次に開発された, 科学技術計算のためのプログラミング言語である. 数式が,普通の式に近い形で記述できるようになった. いまでも,スーパーコンピュータなどでは使われている.
LISP
関数型のプログラミング言語である. リストを処理するようにして,計算を進める言語である. Emacs Lispが有名.
Prolog
論理型のプログラミング言語である. 第5世代コンピュータでは,これを拡張したもので, 並列推論を行うことを目標とした. 今でも,人口知能の分野で使われている.
C++
Cを拡張したオブジェクト指向のプログラミング言語である. ウインドウシステムを記述することに適しているため, Windowsのアプリケーション開発などに広く使われいる.
他に, 機械語,アセンブラ,COBOL,BASIC, ALGOL, PASCAL, C, Java, awk, perl, rubyなど. 一般に知られている言語ならばOK.

問4

2つの文字列(先頭アドレスのポインタ)を入力して, 両方の文字列が等しければ1,そうでないときは0を返す関数.

1:
関数 int f(char *str1, char *str2) を定義することを示す.
2:
関数定義のブロックがはじまることを示す.
3:
どちらかの文字列の文字のチェックが終了していないならば, 次のループを実行することを示す.
4:
ループのブロックがはじまることを示す.
5:
いま2つのポインタが指している文字 (文字列の中の文字を順番に指している)が, 異なるならばループを終了して次に進む.
6:
*str1が文字列の次の文字を指すようにポインタ str1をインクリメントする.
7:
*str2が文字列の次の文字を指すようにポインタ str2をインクリメントする.
8:
ループのブロックが終わることを示す.
9:
ループを終了して, *str1と*str2が両方とも0ならば, 文字列が等しいことになるなるので, 戻り値を1として関数を終了する.
10:
そうでない場合は,*str1と*str2が異なる場合であり, 文字列が異なるので, 戻り値を0として関数を終了する.
11:
関数定義のブロックが終わることを示す.

5行目と11行目を

 
5:       if( *str1 != *str2 ) return(0);
10:      return(1)
として,9行目を削除する. 文字列が異なる場合は,5行目の条件が成り立つ場合だけなので, return()文で関数から出てしまえば, そのあとで,文字列が等しいかどうかのチェックが不要になる.




next up previous
: この文書について...
YAMASHITA YUKIHIKO 平成13年9月8日