2019 Dトラック
下記の設問A,Bにそれぞれ回答してください。設問Bは1問のみ選択して回答してください。入力欄で表現できないもの(ソースファイル、図表、動画など)はURLを示してください。但しURLが示すコンテンツは募集締め切り以前のものに限ります。
A.下記はフィジカルトラックが求めるキャンパー像ですが、これに対し自身の経験やSC(※)に対する思いを述べてください。
・現時点での到達ではなくSC参加(我々が提供するコンテンツ)により伸びるであろう人材。
・活字等で得た知識に満足せず実際に自分の手を動かして物事の本質に迫ろうとする人。(物事の本質を見極めるまで途中で納得せず自分の手を止めない人。)
・SCで発掘あるいは評価しないと埋もれてしまいがちな特技の持ち主。
・SC修了後も自分の意志で継続的に課題に取り組む人。
・自分の得た知見を他の人と共有するための行動を起こす人。
※SCは2019年度セキュリティ・キャンプ全国大会の略
B.以下の課題のうちひとつを選らび回答してください。総合的な回答ではなく、どの部分にフォーカスしたかを述べ, なるべくディープ回答を求めます。
B.1 作ってみたいCPUの仕様書を作成してください。特徴・用途、命令セットとそれに対応するビット列は必須とします。必ずしも現存する商用化されている汎用CPUにとらわる必要はありません。
B.2 LEDを点滅させるプログラムを示し、LEDが実際に点滅するまでの過程を解説してください。
B.3 高級言語ではできないことについて解説してください。
B.4 C言語の関数longjmp setjmpを用いたプログラムを示し.それらを解説してください。
B.5 群論とコンピュータサイエンスのかかわりについて思うところを述べて下さい。
B.6 LSIを製造できる装置が使えるとしらどのようなものを作りたいですか。装置の所有者を納得する提案書を作成してください。
B.7 サイバーセキュリティの分野で半導体や機械語の知識が必要な理由を自分なりの言葉で述べて下さい。
#include <cstdlib>
#include <setjmp.h>
#include <iostream>
#include <iomanip>
using namespace std;
jmp_buf jmp;
double Division_cal(double x, double y) {
double resu = 0;
if (x == 0) {
longjmp(jmp, 1);
}
else {
resu = y / x;
return resu;
}
}
void Exception_handling(void) {
cout << "0 is included in a denominator" << endl;
}
int main(void) {
double deno = 0;
double nume = 0;
double res = 0;
cout << " ★Division program★ " << endl;
cout << " - Please enter a number - " << endl;
while (1) {
cout << "denominator:" << flush;
if (!(cin >> deno)) {
cout << "Input more than significant digits or non-numeric input" << endl;
cin.clear();
cin.ignore(1024, '\n');
continue;
}
cin.ignore(1024, '\n');
break;
}
while (1) {
cout << "molecule :" << flush;
if (!(cin >> nume)) {
cout << "Input more than significant digits or non-numeric input" << endl;
cin.clear();
cin.ignore(1024, '\n');
continue;
}
cin.ignore(1024, '\n');
break;
}
if (setjmp(jmp) == 0) {
res = Division_cal(deno, nume);
cout << "Division result:" << setprecision(4) << res << endl;
}
else {
Exception_handling();
}
system("PAUSE");
return 0;
}
除算プログラム.setjmp,longjmpは分母に0が入力された時の例外処理に使用している.
!(cin >> deno)で入力された数値が正しいか判定する.
double型を超える数値の入力または数値以外が入力された場合,"Input more than significant digits or non-numeric input"と出力され再度数値の入力を求める.
setjmpマクロを実行すると,現在の情報をjmp_buf型の引数jmpに保存し,ゼロが返る.
そして,Division_cal()関数が呼び出され分母(deno)に0が入っているとlongjmp()関数が呼び出される.longjmp()関数がjmp_buf型の引数jmpを伴って呼び出されると,longjmp()関数の第二引数を返り値として,setjmpに処理が移る.第二引数の値は1なのでif else文の判定は偽となり,Exception_handling()関数が呼び出され,"0 is included in a denominator"と出力される.
正しい数値が入力されている場合は,Division_cal()関数により除算が行われその返り値を変数resに代入する.そしてresの値を整数部・小数部含めて5桁表示で出力する.
このプログラムは小規模で名前衝突の可能性がないため,using namespace stdを使用している.
scanfはバッファオーバーランなど様々な危険性があるため,cinを用いた.
プログラムを書き終えた後,visual studio2019デバッグなしでは想定の動作をしていたが,visual studio2017デバッグなしではプログラムの実行が終わるとコマンドプロンプトが終了するようになっていた.またvisual studio2019のデバッグありでも同様の動作をした.調べてみると「VS2010からどうも「空のプロジェクト」を作るとデフォの状態だとプログラムの実行が終わると自動でウィンドウが消えてしまう様になっているらしい」とブログで書いている方がいた.設定から変えられるみたいだが,プログラムのほうで一時停止をいれることにしたためsystem("PAUSE")をいれた.それによってvisual studio2019デバッグありでは計算結果が出力されたが,デバッグなしではキー入力待ちが2回になってしまった.それでも計算結果が出力されなければ話にならないのでこのプログラムにした.
setjmp(),longjmp()を使用したプログラムを書いたことをなかったため,動きを調べることから始まった.
下記のサイトを参考にした.
https://qiita.com/jj1bdx/items/ba1b71641cd51a5ac186
以上で課題晒しは終わりです.
上のソースコードはダブルクリックで全体を選択できます.
↓ ↓ ↓ githubはこちら ↓ ↓ ↓
github.com