: この文書について...
情報処理概論期末試験
- 問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()文で関数から出てしまえば,
そのあとで,文字列が等しいかどうかのチェックが不要になる.
: この文書について...
YAMASHITA YUKIHIKO
平成13年9月8日