基本情報 科目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回