基本情報 科目B:擬似言語をC#に置き換える練習(問1〜6)
科目Bの擬似言語は「考え方(アルゴリズム)」を問うための表記です。
実務ではC#等で実装するので、対応関係を固定して変換できるようになるのが狙いです。
科目Bのサンプル問題
目次
まずは変換ルール(最重要)
1) 代入
- 擬似:x ← 式
- C#:x = 式;
2) 条件
- 擬似:if (…) … elseif (…) … else … endif
- C#:if (…) { … } else if (…) { … } else { … }
3) 繰り返し(for)
- 擬似:for (i を 1 から N まで 1 ずつ増やす)
- C#:for (int i = 1; i <= N; i++)
4) 配列の要素番号が「1から始まる」問題
サンプル問2,4は 「要素番号は1から始まる」 と明記されています。
C#配列は0始まりなので、教材としては次のどちらかで統一します。
- 方式A(推奨:試験の追従が楽):1始まり用に a[0] を使わない(要素数+1で確保)
- 方式B:0始まりに読み替えて式を全部変える
この記事は 方式A で統一します。
5) 未定義
擬似言語の「未定義」は、C#では null(参照型)で表すのが自然です。
問1:料金計算(if / else if)
擬似言語(要旨):年齢で100/300/500。
C#(関数版)
static int Fee(int age)
{
int ret;
if (age <= 3)
{
ret = 100;
}
else if (age >= 4) // ここが問1のポイント
{
// ただし 10以上は else に落ちるので、4以上だけで十分
if (age <= 9) ret = 300;
else ret = 500;
}
else
{
ret = 500;
}
return ret;
}
学習ポイント
- 仕様が「区間」なら、条件を最小にできる(4以上だけでもよい)
- ただしC#実装では読みやすさ重視で「4〜9」を明示してもOK
問2:配列を逆順にする(swap)
擬似言語は左右を交換する処理。要素番号は1始まり。
C#(1始まり配列で実装)
int[] array = new int[6]; // 0は使わない
array[1] = 1; array[2] = 2; array[3] = 3; array[4] = 4; array[5] = 5;
int n = 5;
for (int left = 1; left <= (n / 2); left++)
{
int right = n - left + 1;
int tmp = array[right];
array[right] = array[left];
array[left] = tmp;
}
学習ポイント
- right = n – left + 1 は逆順のテンプレ
- 「中央は交換しない」→ ループが n/2 まで
問3:単方向リスト末尾に追加
擬似言語の ListElement をC#クラスに置き換えます。
C#(最小実装)
class ListElement
{
public char Val;
public ListElement? Next; // 未定義=null
public ListElement(char qVal) => Val = qVal;
}
static ListElement? listHead = null;
static void Append(char qVal)
{
var curr = new ListElement(qVal);
if (listHead == null)
{
listHead = curr;
}
else
{
var prev = listHead;
while (prev!.Next != null)
{
prev = prev.Next;
}
prev.Next = curr;
}
}
学習ポイント
- 未定義=null
- 末尾探索は while (next != null) の形になる
問4:疎行列への変換(3配列)
擬似言語は「非0要素の (行,列,値) を3本の配列に詰める」処理。
C#(Listで実装)
static List<int>[] TransformSparseMatrix(int[,] matrix, int rows, int cols)
{
var sparse = new[]
{
new List<int>(), // 行
new List<int>(), // 列
new List<int>() // 値
};
for (int i = 1; i <= rows; i++)
{
for (int j = 1; j <= cols; j++)
{
int v = matrix[i, j]; // 1始まりで持っている前提
if (v != 0)
{
sparse[0].Add(i);
sparse[1].Add(j);
sparse[2].Add(v);
}
}
}
return sparse;
}
学習ポイント
- 「末尾に追加」はC#では List.Add
- 2重ループで非0だけ抽出、という発想が重要
問5:文字の出現割合(ライブラリ呼出し)
擬似言語は freq と freqE を使って確率計算。
C#(Words相当をインターフェース化)
interface IWords
{
int Freq(string str); // 出現回数
int FreqE(string str); // strで終わる英単語数
}
static double Prob(IWords words, char c1, char c2)
{
string s1 = c1.ToString();
string s2 = c2.ToString();
if (words.Freq(s1 + s2) > 0)
{
return words.Freq(s1 + s2) / (double)(words.Freq(s1) - words.FreqE(s1));
}
else
{
return 0.0;
}
}
学習ポイント
- 「文字列の+」=連結(C#も同じ)
- 「÷は実数として計算」→ C#は double キャストが必要
問6:責任共有(クラウド/PaaS)
これは実装問題ではなく判断問題ですが、文章→責任分担表へ落とす練習ができます。
- DBMSの脆弱性:PaaS提供側(B社)
- OSの脆弱性:PaaS提供側(B社)
- ログイン機能(アプリ)の脆弱性:開発運用委託先(C社)
C#に変換する代わりに、実務では「運用チケットの宛先」を決めるイメージです。
まとめ:擬似言語→C#のコツ
- 代入・分岐・繰返しは機械的に置換
- 配列の1始まり問題は方式を決めて統一(この記事は要素数+1方式)
- 未定義は参照型なら null
- 「÷は実数」はC#で double化 を忘れない
訪問数 5 回, 今日の訪問数 5回




ディスカッション
コメント一覧
まだ、コメントがありません