基本情報技術者 企業が行うべきシステム開発の流れ、手法(プログラミング、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

再使用可能(リユーザブル)

再び使用、再び用いることができる

再入可能(リエントラント)

⭐️複数のタスクがあっても、互いに干渉することなく並行して動作する

再帰的(リカーシブ)

自分自身を呼び起こせる


この記事が気に入ったらサポートをしてみませんか?