基本情報技術者 企業が行うべきシステム開発の流れ、手法(プログラミング、UML) ※科目B対策もある
プログラムがCPUに実行されるまで
ソースコード(原始プログラム)
人間がプログラミング言語で書くコード
↓
コンパイラ、インタプリタ
人間がわかるものから、コンピューターがわかる者へと翻訳する
✅コンパイラ(compiler)
ソースコードを一括で変換
※compileとは、「集める」
👍最適化(計算の順序などを改善し、効率的なプログラムに変換すること)ができる
❌すぐ実行できない
✅インタプリタ(interpreter)
一文ずつ変換
※interpretとは、「翻訳する」
👍すぐ実行できる
❌コンパイラのように最適化をしないため、効率悪い
↓
オブジェクトコード(目的モジュール、目的プログラム)
0,1だけで書かれたコード
↓
リンカ
コンピュータが実行できる1つのプログラムを作る
↓
ロードモジュール(実行可能プログラム)
コンピュータが実行できるプログラム
↓
ローダ
ロードモジュールを主記憶に格納
↓
CPUが実行
テスト
プログラムが正しく動くかどうか最後にテストする
人間によるテスト→レビュー
コンピュータによるテスト→静的テスト、動的テスト
静的テスト
✅ソースコード解析ツールソースコードを解析して、プログラムの誤りを見つける
オープンソースソフトウェア(OSS)
ソースコードが一般に公開され、誰でも見れたり変更できたりするもの
代表例には、Eclipseがある
Eclipse
OSSのIDE(統合開発環境と呼ばれる、開発に必要なツールがまとまったソフトウェア)
Javaによるシステム開発で利用される
その他のソフトウェア
✅商用ソフトウェア
企業が有料で販売するソフトウェア
✅パブリックドメインソフトウェア
著作権が放棄されたソフトウェア
コピーライト、パブリックドメイン、コピーレフト
✅コピーライト→著作権
✅パブリックドメイン→著作権が放棄された状態
☑️コピーレフト→著作権は作者が保持するが誰もがプログラムの複製・改変・再配布ができ、二次創作物にも著作権が認められる
↓
改変したものを再配布する場合は、ソースコードも公開しなければならない
オブジェクト指向
ソフトウェアを部品化し開発の生産性を上げること
データ中心アプローチ(開発工程で、システム設計のソフトウェア方式設計で行うもの)の概念をさらに進めてできた
クラス、オブジェクト、データ、メソッド
オブジェクト指向の特徴
メリット👍
クラスさえ作って仕舞えば、オブジェクト(実体)をいくつでも作れる
✅カプセル化
外部から、オブジェクトの詳細を隠すこと
✅継承
親クラス(スーパークラス)のデータやメソッドを、子クラス(サブクラス)が引き継ぐこと
◯親クラスから子クラスを作ることを特化
◯子クラスから親クラスを作ることを汎化
✅多相性
同じ名前の関数でも、異なる引数や返り値が来たら、それに応じた答えを出せるという性質
※オーバーライド
親クラスから継承したメソッドを、子クラスが独自に定義し直して、上書きすること
こうすることにより、多相性を実現する
UML
オブジェクト指向プログラミングで、設計で用いられる記法
UMLで用いる図
クラス図
クラス関の関係を表す。特に良くでる
クラス名、データ、メソッドの3つを記入する
クラス間の関係を表すのに、下の表記が使われる
例題
オブジェクト図
オブジェクト間で送受信されるメッセージを表現して、オブジェクト間の関係を表す
アクティビティ図
ある振る舞いから、次の振る舞いへの制御の流れを表す
ビジネスプロセスの実行順序や、条件による分岐などのワークフローを示す
シーケンス図
オブジェクト間で送受信されるメッセージを表現して、オブジェクト間の相互作用を時系列に表す
UML+多重度に関する例題
【ビット演算 科目B例題】
答え A
3行目 r←00000000
とあるが、Aを参照すると…
↓
rは左にずれ、以下のように動く
00000001
↓
00000011
↓
00000110
↓
00001101
↓
00011010
↓
00110100
↓
01101001
↓
11010010
スタックとキュー
キューのことを、待ち行列ともいう!
配列
✅1次元配列
✅2次元配列
横を行
縦を列という
連結リスト
✅単方向リスト
先頭から末尾まで、一方向に繋ぐリスト
【単方向リスト 科目B 例題】
✅手続きappend
手続きappendは、引数で与えられた文字を、単方向リストに追加する
↓
単方向リストに追加するというのは
「単方向リストの最後に追加する」という意味
①4行目ListElement(qVal)とあるが、これは以下の一つのリストを示している。このリストを、単方向リストの最後に追加したい
⚠️単方向リスト全体のうちの一つではないので、注意
curr←ListElement(qVal)と来たら、以下のように書く
②5、6行目 上の図と合わせて、if(listHeadが(a))…は、以下のようになる
③7、8行目 は、以下のようになる
✅addFirst, addLast
ポイント
プログラムを上から順に追っていこう
①大域:LinkedList: head ←未定義の値
と来たら、下の図を書く
② addFirst(文字列:qVal)と来たら、文章中で手続addFirst について書かれている説明を読もう。
↓
「手続addFirst は、引数で与えられた文字をリストの先頭に追加する。」と書いてあることがわかる
↓
これはリストが作られた後に、先頭に追加することを表すので、まずはリストを作ろう!!!!
③ head ← LinkedList(qVal, (a))とあるので、まずはリストを作ろう!!!
LinkedList の説明として
「引数 qValでメンバ変数Valを、引数 qNextでメンバ変数nextを初期化(未定義)する」
とあるが、その場合下のような図を即座に書く
④ここで初めて、リストの先頭に新たなリストを作ろう!!!!
head ← LinkedList(qVal, (a) )とあるので、以下のようなリストを、先頭に追加する
ここで(a) に入るものは何か…????
未定義を入れてしまうと、LinkedList の説明としてあった、
「引数 qValでメンバ変数Valを、引数 qNextでメンバ変数nextを初期化(未定義)する」
の
「引数 qNextでメンバ変数nextを初期化(未定義)する」に反する。
なぜなら、引数qNext は、何かしらの文字でなければならないため。
未定義は何の文字でもない、ただの空欄と同じ
⑤
✅手続きadd
append👉単純に、最後に追加するだけ
add👉指定された位置に追加する
①add(整数型: idx, 文字型: qVal)と来たら…
前提として単方向リストを作っておかなければならない
↓
よって、ある程度の長さの単方向リストを以下のように作っておく(リストが空の時にheadは未定義であると文章中にあるので、今回はheadは未定義ではない!!!)
②文章中のadd に関する説明を読む
↓
「手続add は引数で与えられた位置に、引数で与えられた文字を追加する」とある
↓
idx番目の位置に、qVal という文字を追加するという意味である
今回の場合、最初に書いたリストの1番目の次に追加するので、add(idx =2 )である
③ その下の
「整数型: i ←1
LinkedList:curr ← LinkedList(qVal, 未定義の値)」
とあるが、これは
先に書いたリストの間にaddしたい(追加したい)リストを下に書いておけ!
と言っている。こんな感じで
④ 10行目以降
LinkedList: ptr ← head
LinkedList: prev ← ptr
となったら、以下のように書く
⑤12行目以降
while (ptr が未定義でない)
if (i がidx と等しい)
とあるが、i =1で、idx=2なので、関係ない
⑥ ifがendし、18行目以降
prev ← ptr
ptr ← ptr.next
とあるが、「ptr.next」とは、ptrの次のValを表す
そのため、以下のようになる
その後20行目に
i ← i+1
とあるが、これはiを一個増やすだけ。なので、i=2になる
↓
13行目に戻り、i=idx=2なので、14〜16行目の内容に従う
✅双方向リスト
末尾から先頭へ、また先頭から末尾へとデータを辿ることができるリスト
✅線形リスト
✅環状リスト
木構造
✅2分探索木(2分探索法)
小さい順にならぶ数の中で、目的の数を見つけるときに使う。
アルゴリズムの分類
整列アルゴリズム
✅クイックソート
配列の中で真ん中にある数よりも、小さいものと大きいものに分ける
↓
大きいものを右に、小さいものを右にやっていけば、小さい順に数が並ぶ
探索アルゴリズム
✅ハッシュ法
✅二分探索法
プログラムの4つの性質
再配置可能(リロケータブル)
主記憶上のどこに配置してもOK
再使用可能(リユーザブル)
再び使用、再び用いることができる
再入可能(リエントラント)
⭐️複数のタスクがあっても、互いに干渉することなく並行して動作する
再帰的(リカーシブ)
自分自身を呼び起こせる
この記事が気に入ったらサポートをしてみませんか?