2014年度 情報処理・演習2 中間試験の解答解説
----------
問題1(10点x4)
1.1
構造体と共用体の違いを述べよ.
(解答)
構造体 struct kouzou{ と宣言すれば、n[4バイト]、name[1×10バイト]、value[8バイト]で合計22バイト分のデータ列がメモリ内 共用体 union kyouyou{ と宣言すれば、n[4バイト]、name[1×10バイト]、value[8バイト]の中で一番大きい10バイトのメモリが確保 |
1.2
C言語プログラミングにおいて「ポインタ」機能が必要となるのはどのような場面か.具体的に記せ.
(解答)
ポインタを利用するメリットやその効果は以下のものが挙げられる。 1.ある関数の中で宣言したデータを他の関数において同じデータを使いまわしたい場合に有効である。 2.メモリ内に入れたデータ列を動かすことなく、データの順番を入れ替える処理をしたい場合に有効である。 3.ある関数で処理した複数の値を返したい、別の関数で利用したい場合に有効である。戻り値(返り値)の 4.データの大きさ、中身が不明確、あるいはあまり使われないことが予想される場合に有効である。 これらを用いることの効果は、それぞれ、以下のものが対応する. 1.処理の高速化、膨大なメモリ消費の抑制 と考えられる. |
1.3
以下の中からバイナリファイルをすべて選び,記号(a-g)を記せ.括弧内は拡張子である.
a. 実行ファイル(.exe)
b.ソースファイル(.cpp)
c. Wordファイル(.docx)
d. Excelファイル(.xlsx)
e.カンマ区切りファイル(.csv)
f.メイクファイル, Makefile
g. jpeg画像ファイル(.jpeg, .jpg)
(解答)
バイナリファイルとは,テキスト(ASCII)ファイル以外と考えてよい. 汎用的に利用できる文字に関するテキスト(ASCII)コードに対し,各ソフトウェアに対応した2進数コード列で 示されるファイルを探せばよい. バイナリファイルは,実行ファイル,Wordvファイル,Excelファイル,jpegファイルである. |
1.4
演習で使用しているborland
c/c++コンパイラの役割について,以下の単語をすべて用いて説明せよ.
(ソースファイル,CPU,実行ファイル,翻訳,文法エラー)
(解答)
プログラム作成にあたり,プログラマは[ソースファイル]を記述するがこれはテキストファイルであり,その ままの状態で[CPU]は命令を理解できない. コンパイラはこの[ソースファイル]を[翻訳]し,記述等に問題があれば[文法エラー]として扱い,これを エラーメッセージを表示し,プログラマに知らせる機能を持つ. もし問題がなければ,翻訳したものをオブジェクトファイルに」変換し,ヘッダファイルやライブラリとの関連 性を反映するためのリンクという作業を行い,[CPU]が実行可能な[実行ファイル]を生成する. |
----------
問題2(20点)
構造体を用いて成績データの処理を行うプログラムを作りたい.
2.1
一人分の氏名(最大で全角10文字,全角は1文字あたり2バイト),点数(整数),判定(S,A,B,C,Fのうちの
どれか1文字)の3つの変数からなる構造体を定義せよ.構造体の定義部分のみ解答すればよい.
(解答)
struct hantei{ |
解説
上記のように宣言すれば,構造体が記述できます.
注意点は,文字列に関しては配列で示す必要があることですが,換言すれば,構造体の中に,変数と配列を混在
させることも可能です.
2.2
この2.1で定義した構造体を用いて10000万人分のデータを保存するためには,最低何バイトのメモリーが必要と
なるか.ただし,データ圧縮は行わないとする.
※試験中,上記記述に関して訂正あり
誤) 10000万人分
正) 10000人分
(解答)
一人当たり,氏名文字列2×10バイト,得点数値4バイト,判定文字1バイトで25バイトを要する. 10000人であれば,250000バイトのメモリを要することとなる. |
----------
問題3(20点)
変数a, b, c, dがある.(a+b)/cの d乗の計算を行う関数funcを作成したい.a,b,cは実数,dは正の整数とする.
3.1
上記の計算を行う関数を作成せよ.以下の関数部分のみ解答すればよい.
float func( ? ? ? )
{
...
...
return ???;
}
(解答)
float func(double a, double
b, double c, int d){ |
解説
冪乗の計算をするにはmath.h内の関数powを利用するが,引数,返り値ともdouble型となっているため,
関数funcの引数はdouble型としています.
関数funcはfloat型として定義されているので,念のためキャストを行っています.
dは整数型であるため,powの引数にするにはキャストを行っておく必要があります.
3.2
main関数中でa,b,c,dをキーボードから入力し,上記の関数を呼び出し,演算結果を画面に表示するプロ
グラムを作成せよ.
(解答)
#include <stdio.h> float func(double, double, double, int); main(){ printf("\n The result of pow(((a+b)/c), d) is= %f",
func(a, b, c, d)); |
----------
問題4(20点)
要素数が n個の実数型配列 aがあり,配列の中身を一つずつ移動させたい.(ローテーションと言う)
即ち,a[0]→a[1],a[1]→a[2], ...,
a[n-1]→a[0]とする
4.1
配列 aをローテーションする関数を作成せよ.引数としてポインタ変数と要素数を受け取ること.
void rotate( ? ? ? )
{
...
? ? ? ?
}
(解答)
void rotate(double *p, int n){ double tmp; for(i=0; i<n-1; i++){ p[0] = tmp; } |
解説
授業もしくは例題として用いられる二つの変数の入れ替えと同様のアルゴリズムとなっています.
用意された配列に関してポインタ配列を引数とするので double *pとしています.また,以下のように
記述しても同義語となっています.これはシンタックスシュガーと呼ばれ,プログラムを理解しやすく
するために用いられる言語仕様です.
voit rotate(double p[], int n)
どちらで記述しても構いません.
4.2
main関数内にて配列 a[5] =
{1,2,3,4,5};として,rotate関数を利用するプログラムを作成せよ.
確認のために,rotate前後の配列の中身を画面に表示し確認するようにすること.
(解答)
#include <stdio.h> void rotate(double*, int); main(){ printf("The initial values of the array are; \n"); for(i=0;i<n;i++){ /*配列を表示*/ rotate(a, n); /*関数を実行*/ printf("The result values are; \n"); for(i=0;i<n;i++){ /*並べ替えた配列を表示*/ printf("a[%d] -> %f \n"); } 上記関数を記述 |
本日の講義では,このことについて扱うことにする.