Ç言語というプログラミング言語をご存じだろうか・・・。
きっと誰もが一度は耳にしたことがあると思う。
フリー百科事典『ウィキペディア(Wikipedia)の冒頭には、このように書いてある。
C言語(シーげんご、英: C programming language)は、1972年にAT&Tベル研究所のデニス・リッチーが主体となって開発した汎用プログラミング言語である。
英語圏では「C language」または単に「C」と呼ばれることが多い。
日本でも文書や文脈によっては同様に「C」と呼ぶことがある。
制御構文などに高水準言語の特徴を持ちながら、ハードウェア寄りの記述も可能な低水準言語の特徴も併せ持つ。基幹系システムや、動作環境の資源制約が厳しい、あるいは実行速度性能が要求されるソフトウェアの開発に用いられることが多い。後発のC++やJava、C#など、「C系」と呼ばれる派生言語の始祖でもある。
サーティファイという団体が主催する資格試験にこのÇ言語がある。
1級から3級まであるが、今回は2級にトライしてみた。
2級の難易度は、
合格率:65%くらい
偏差値:47
学習時間:3級取得者なら100時間
認定基準:
出題範囲:
問題は下記内容が出題された。
1~6は過去問で対策すれば何とかなる。
問題は7と8だ。これはコードを読み内容を理解しないといけないので、
過去問で傾向を把握しただけでは回答できない。
ちなみに問題7はこんな内容だ。
関数mulBinはchar型配列a,bで'0' , '1'の8文字の2進数を受けとりaとbの積を返す。
求めた積を2進数に変換しchar型配列mへ返す。
やることは、まず配列変数aとbをそれぞれ10進数にする。
10進数の状態でaとbの乗算し、その結果を2進数に戻して配列変数mへ格納する。
実際のコードの一部
コードの中の㉟~㊴に適した回答をする。
char a[] = { '0', '1', '1', '0', '0', '0', '1', '0' };
char b[] = { '1', '1', '1', '0', '0', '0', '1', '1' };
void mulBin(char a[], char b[], char m[])
{
int w[8][16];
int i, j, sum;
for (i=0; i<8; i++) {
for(j=0; j<16; j++) {
w[i][j] = 0;
}
}
for (i=0; i<8; i++) {
if( ㉟ ) {
for(j=0; j<8; j++) {
w[i][㊱] = (b[j] == '0') ? 0 : 1;
}
}
}
sum = 0;
for(㊲) {
for (i=0; i<8; i++) {
sum += w[i][j];
}
m[j] = (㊳) ? '0' : '1';
㊴;
}
return;
}
過去問を見ると、この手の基数変換はよく出題されている。
偏差値47なので複雑な計算式ではない。
ちなみに問題8はこんな内容だ。
社員の月毎の勤務時間に応じて給与を計算する。
社員の給与額は契約タイプで管理する。
契約タイプ
・基本給(円)
・最小時間:その日の給与額を基本とする最小の勤務時間(時間)
・最大時間:その日の給与額を基本とする最大の勤務時間(時間)
・不足分の減額:勤務時間が最小時間未満のとき、基本給から減額される時間あたりの金額(円)
・超過分の増額:勤務時間が最大時間を超えたときの、基本給から増額される時間あたりの金額(円)
・時間計算切替じきい値:その月の勤務時間が時間計算切替しきい値未満のとき、時給計算により給与額を計算するための勤務時間(時間)
・時給計算時の時給:上記のときの時給金額(円)
やることは、まず従業員の契約タイプを調べる。
契約タイプに基づき給与額を求める。勤務時間が少ないときは時間給で給与計算する。
実際のコードの一部
コードの中の㊵~㊹に適した回答をする。
struct contact {
char ctype;
int base_pay;
int min_time;
int max_time;
int sub_pph;
int add_pph:
int limit_time;
int base_pph;
};
struct worktime {
char id[6];
int ctype;
int wtime;
int pay;
};
contact cr[3];
worktime wt[5];
int calcpay (int wtime, contact *pcr)
{
int pay;
if (wtime < pcr->limit_time) {
pay = ㊵ ;
} else {
pay = pcr->base_pay;
if (wtime < pcr->main_time) {
㊶;
} else if (wtime > pcr->max_time) {
㊷;
}
}
return pay;
}
int setpay ( worktime wt[5], int wtcut, contact cr[3])
{
int i, j;
for (i=0; i<wtcut; i++) {
j=0;
while( cr[j].ctype != '$') {
if (㊸) {
break;
}
j++;
}
if (cr[j].ctype == '$') {
return -1;
}
wt[i].pay = calcpay(㊹);
}
return 0;
}
この手の構造体もよく過去問に出題されている。
こちらも複雑な計算ではなく、ごく簡単な計算式である。
さて、結果はというと得点率86%で合格でした。
学習の時点では満点を狙っていたので、ちょっと残念な気もするが合格なのでヨシとしよう。
番号5の演算子の優先順位は、あまり頭に入れなかったので失敗した。
これを頭に入れておけば90%は超えたと思う。
満点を狙ってた割にアマカッタなと反省。
主催団体から立派な認定証を頂きました。



