はじめに
看護師から C# 開発者への転身を目指す私の学習の旅で、これは 6 回目の学習ノートです。今日はプログラム制御とデータ構造についてさらに学び、プログラム内のデータとフローをより適切に整理・管理するための知識を習得しました。
Continue 文
Continue 文は、現在のループを即座に終了し、ループ条件を評価します。条件が成立すれば次のループに入り、成立しなければループを終了します。これは看護業務において、特定の患者に該当しない手順をスキップし、ケア計画の他の部分を続行する場面を連想させます。
Continue の使用例を示します。
// 病室ラウンドのシミュレーション、空ベッドをスキップ
for (int bedNumber = 1; bedNumber <= 10; bedNumber++)
{
// 4号ベッドと7号ベッドは空と仮定
if (bedNumber == 4 || bedNumber == 7)
{
Console.WriteLine($"{bedNumber}号ベッドは空室、チェックをスキップ");
continue; // 現在のループをスキップし、次のループへ
}
// 患者チェック手順を実行
Console.WriteLine($"患者{bedNumber}号ベッドをチェック中");
// その他のチェックコード...
}
この例では、1 から 10 までのベッド番号をループし、空ベッド(4 号と 7 号)に遭遇すると continue 文で現在のループをスキップし、患者チェック手順を実行せずに次のベッドのチェックに進みます。
別の例として、患者データの処理を示します。
// 患者の体温データを処理、無効なデータをスキップ
double[] temperatures = { 36.5, 37.2, 0, 36.8, 39.1, 0, 36.9 };
double sum = 0;
int validCount = 0;
for (int i = 0; i < temperatures.Length; i++)
{
// 0の無効なデータをスキップ
if (temperatures[i] == 0)
{
Console.WriteLine($"第{i+1}番目の体温データは無効、スキップ");
continue;
}
// 有効なデータを処理
sum += temperatures[i];
validCount++;
Console.WriteLine($"有効な体温を記録: {temperatures[i]}°C");
}
// 平均体温を計算
double average = sum / validCount;
Console.WriteLine($"患者の平均体温: {average:F1}°C");
看護業務において、continue 文は一連の標準的な看護手順を実行する際、患者の状況に応じて特定の不適切な手順をスキップし、次の段階に直接進むプロセスに似ています。この柔軟性により、さまざまな状況に効率的に対処できます。
三項演算子
三項演算子の構文は次のとおりです。式1 ? 式2 : 式3
- 式1は通常、関係式です。
- 式1の値が true の場合、式2の値が三項演算子全体の値になります。
- 式1の値が false の場合、式3の値が三項演算子全体の値になります。
注意点として、式2の結果の型は式3の結果の型と一致している必要があり、さらに三項演算子全体の結果の型とも一致している必要があります。
いくつかの例を用いて三項演算子の使用法を説明します。
// 例1:体温に基づいて発熱の有無を判断
double temperature = 37.8;
string result = temperature >= 37.5 ? "患者は発熱" : "体温は正常";
Console.WriteLine(result); // 出力:患者は発熱
上記の例は、次の if-else 文と同等です。
double temperature = 37.8;
string result;
if (temperature >= 37.5)
{
result = "患者は発熱";
}
else
{
result = "体温は正常";
}
Console.WriteLine(result);
このように、三項演算子を使用するとコードがより簡潔になります。
もう少し複雑な例を見てみましょう。
// 例2:血圧値に応じて異なる看護アドバイスを返す
int systolicBP = 145; // 収縮期血圧
string advice = systolicBP >= 140 ?
(systolicBP >= 180 ? "緊急処置、即時降圧" : "観察が必要、医師の指示に従い投薬") :
"血圧正常、継続監視";
Console.WriteLine(advice); // 出力:観察が必要、医師の指示に従い投薬
この例では、ネストされた三項演算子を使用して複数の条件を処理しています。収縮期血圧が 140 を超える場合、さらに 180 以上の緊急状態かどうかを判断します。
三項演算子は値の計算にも役立ちます。
// 例3:薬剤投与量の計算(体重に基づく)
double weight = 65.5; // 患者の体重(kg)
double baseDose = 5.0; // 基本投与量(mg)
double doseMultiplier = weight < 50 ? 0.8 : (weight > 80 ? 1.2 : 1.0);
double finalDose = baseDose * doseMultiplier;
Console.WriteLine($"患者の体重: {weight}kg");
Console.WriteLine($"投与量調整係数: {doseMultiplier}");
Console.WriteLine($"最終薬剤投与量: {finalDose}mg");
私の看護業務でも、このような迅速な判断場面はよくあります。患者の各種指標に基づいて異なる看護レベルを割り当てたり、評価結果に基づいて対策を決定したりします。三項演算子を使用すると、これらの判断ロジックを簡潔にコードで表現できます。
if-else でできることはすべて三項演算子でも実行できますが、ロジックが複雑になりすぎる場合は、コードの可読性を考慮して従来の if-else を使用するほうが明確な場合があります。
定数
定数の宣言構文は次のとおりです。
const 変数の型 変数名 = 値
定数は一度宣言すると再代入できません。看護業務では、正常体温範囲や血圧基準値などの固定された医療パラメータに似ています。
いくつかの例を用いて定数の使用法を説明します。
// 医療関連の定数を定義
const double NORMAL_BODY_TEMP = 36.5; // 正常体温基準値
const int NORMAL_SYSTOLIC_BP = 120; // 正常収縮期血圧基準値
const int NORMAL_DIASTOLIC_BP = 80; // 正常拡張期血圧基準値
const int MIN_ADULT_HEART_RATE = 60; // 成人最低心拍数
const int MAX_ADULT_HEART_RATE = 100; // 成人最高心拍数
const string HOSPITAL_NAME = "仁愛医院"; // 病院名
// 定数の使用
double patientTemp = 38.2;
if (patientTemp > NORMAL_BODY_TEMP + 1.0)
{
Console.WriteLine("患者の体温が明らかに上昇、医師の評価が必要");
}
int patientSystolicBP = 135;
if (patientSystolicBP > NORMAL_SYSTOLIC_BP)
{
Console.WriteLine("患者の血圧が高い");
}
Console.WriteLine($"{HOSPITAL_NAME}へようこそ!");
定数の命名は通常、すべて大文字で、複数の単語はアンダースコアで区切ります。これは一般的な命名規則です。
定数の利点:
- コードの可読性向上 – マジックナンバー(例:36.5 を体温として使用)の代わりに意味のある名前を使用
- 保守が容易 – 値を変更する必要がある場合、定数定義を 1 か所修正するだけ
- エラー防止 – コード内でこれらの値を誤って変更するのを防ぐ
定数に再代入しようとするとコンパイルエラーが発生します。
const int ADMISSION_AGE = 18;
ADMISSION_AGE = 16; // コンパイルエラー:定数に代入できません
私の看護業務では、バイタルサインの正常範囲、薬剤投与量の上限、標準治療手順など、多くの固定された基準や閾値があります。プログラミングで定数を使用することは、これらの医療基準を思い起こさせ、この概念の理解と記憶に役立ちます。
列挙型
列挙型は開発を標準化するのに役立ちます。構文は次のとおりです。
[public] enum 列挙型名
{
値1,
値2,
値3,
...
}
public はアクセス修飾子で、公開・パブリックを意味し、任意の場所からアクセスできます。列挙型名は Pascal 命名規則に従います。列挙型は名前空間の下、クラスの外側に宣言し、その名前空間内のすべてのクラスがこの列挙型を使用できるようにします。
列挙型は基本的に、int、double、string、decimal などと同様の変数型ですが、宣言、代入、使用方法が通常の変数型とは異なります。列挙型の変数は int 型や string 型と相互変換できます。
医療現場の例を用いて列挙型の使用法を説明します。
// 看護評価における疼痛レベルの列挙型を定義
public enum PainLevel
{
None, // 0 - 疼痛なし
Mild, // 1 - 軽度の疼痛
Moderate, // 2 - 中等度の疼痛
Severe, // 3 - 重度の疼痛
Unbearable // 4 - 耐え難い疼痛
}
// 看護タスクの優先度を定義
public enum NursingPriority
{
Routine = 1, // 通常看護
Urgent = 2, // 緊急看護
Emergency = 3 // 危機的状況
}
// 患者リスク評価結果を定義
public enum RiskAssessment
{
Low = 10, // 低リスク
Medium = 20, // 中リスク
High = 30 // 高リスク
}
// プログラム内で列挙型を使用
class Program
{
static void Main(string[] args)
{
// 1. 基本的な列挙型の使用
PainLevel patientPain = PainLevel.Moderate;
Console.WriteLine($"患者の疼痛レベル: {patientPain}"); // 出力: 患者の疼痛レベル: Moderate
// 2. 疼痛レベルに基づいて看護優先度を決定
NursingPriority priority;
if (patientPain >= PainLevel.Severe)
{
priority = NursingPriority.Urgent;
}
else if (patientPain == PainLevel.None)
{
priority = NursingPriority.Routine;
}
else
{
priority = NursingPriority.Routine;
}
Console.WriteLine($"看護優先度: {priority}"); // 出力: 看護優先度: Routine
// 3. 列挙型を使用した判断
switch (patientPain)
{
case PainLevel.None:
Console.WriteLine("鎮痛薬は不要");
break;
case PainLevel.Mild:
Console.WriteLine("市販の鎮痛薬を検討");
break;
case PainLevel.Moderate:
Console.WriteLine("医師の指示に従い経口鎮痛薬を投与");
break;
case PainLevel.Severe:
case PainLevel.Unbearable:
Console.WriteLine("直ちに医師に連絡、注射用鎮痛薬を検討");
break;
default:
Console.WriteLine("無効な疼痛評価");
break;
}
// 4. 列挙型と整数の相互変換
int painValue = (int)patientPain;
Console.WriteLine($"疼痛数値: {painValue}"); // 出力: 疼痛数値: 2
// 整数を列挙型に変換
PainLevel convertedPain = (PainLevel)3;
Console.WriteLine($"変換後の疼痛レベル: {convertedPain}"); // 出力: 変換後の疼痛レベル: Severe
// 5. 列挙型を文字列に変換
string painString = patientPain.ToString();
Console.WriteLine($"疼痛説明: {painString}"); // 出力: 疼痛説明: Moderate
// 6. 文字列を列挙型に変換
PainLevel parsedPain = (PainLevel)Enum.Parse(typeof(PainLevel), "Mild");
Console.WriteLine($"解析後の疼痛レベル: {parsedPain}"); // 出力: 解析後の疼痛レベル: Mild
// 7. 数字の文字列を変換
PainLevel numericPain = (PainLevel)Enum.Parse(typeof(PainLevel), "1");
Console.WriteLine($"数値解析の疼痛レベル: {numericPain}"); // 出力: 数値解析の疼痛レベル: Mild
// 8. 発生する可能性のある例外の処理
try
{
PainLevel invalidPain = (PainLevel)Enum.Parse(typeof(PainLevel), "Critical");
Console.WriteLine($"解析結果: {invalidPain}");
}
catch (ArgumentException)
{
Console.WriteLine("'Critical' を有効な疼痛レベルに変換できません。列挙型にこの値がありません。");
}
// 9. 列挙型のすべての可能な値を取得
Console.WriteLine("すべての疼痛レベル:");
foreach (PainLevel level in Enum.GetValues(typeof(PainLevel)))
{
Console.WriteLine($"- {level} ({(int)level})");
}
}
}
この例からわかるように:
- 列挙型の定義:看護関連の 3 つの列挙型(疼痛レベル、看護優先度、リスク評価)を定義しました。
- デフォルト値:値を指定しない場合、列挙型の最初のメンバーは 0、後続のメンバーは順に 1 ずつ増加します。
- カスタム値:
NursingPriorityやRiskAssessmentのように、列挙メンバーにカスタム整数値を指定できます。 - 列挙型の比較:同じ列挙型の異なる値を大なり、等しいなどの演算子で比較できます。
- 型変換:列挙型は int および string と相互変換できます。
- エラー処理:存在しない文字列を列挙型に変換しようとすると例外がスローされます。
私の看護業務でも、同様の分類システムはよく見られます。例えば:
- 疼痛評価スケール(0-10 点)
- 褥瘡リスク評価(Braden スケール)
- 転倒リスクレベル
- 静脈炎の重症度分類
- 薬剤分類システム
列挙型を使用することで、コードの標準化と理解が容易になり、「マジックナンバー」(意味を説明せずに 1、2、3 などを直接使用すること)を避けることができます。また、コンパイラが型安全性をチェックするため、列挙値を誤って使用するのを防げます。
構造体
構造体を使用すると、異なる型の複数の変数を一度に宣言できます。通常は名前空間の下に記述します。構文は次のとおりです。
[public] struct 構造体名(Pascal形式に準拠)
{
メンバー; // フィールド
}
変数がプログラム実行中に 1 つの値しか保持できないのに対し、構造体は複数の値を格納できます。看護現場の例を用いて構造体の使用法を説明します。
// 患者のバイタルサイン構造体を定義
public struct VitalSigns
{
public double Temperature; // 体温
public int HeartRate; // 心拍数
public int SystolicBP; // 収縮期血圧
public int DiastolicBP; // 拡張期血圧
public int RespiratoryRate; // 呼吸数
public int OxygenSaturation; // 酸素飽和度
}
// 患者基本情報構造体を定義
public struct PatientInfo
{
public string Name; // 名前
public int Age; // 年齢
public char Gender; // 性別('M' または 'F')
public string ID; // カルテ番号
public string Ward; // 病棟
public int BedNumber; // ベッド番号
public VitalSigns Vitals; // バイタルサイン
}
// 構造体の使用例
class Program
{
static void Main(string[] args)
{
// 患者情報を作成・初期化
PatientInfo patient;
patient.Name = "张三";
patient.Age = 45;
patient.Gender = 'M';
patient.ID = "P20250305001";
patient.Ward = "内科";
patient.BedNumber = 12;
// 患者のバイタルサインを設定
patient.Vitals.Temperature = 37.2;
patient.Vitals.HeartRate = 78;
patient.Vitals.SystolicBP = 130;
patient.Vitals.DiastolicBP = 85;
patient.Vitals.RespiratoryRate = 16;
patient.Vitals.OxygenSaturation = 98;
// 患者情報を表示
DisplayPatientInfo(patient);
// バイタルサインを評価
AssessVitalSigns(patient.Vitals);
}
// 患者情報を表示するメソッド
static void DisplayPatientInfo(PatientInfo patient)
{
Console.WriteLine("患者基本情報:");
Console.WriteLine($"名前: {patient.Name}");
Console.WriteLine($"年齢: {patient.Age}歳");
Console.WriteLine($"性別: {(patient.Gender == 'M' ? "男性" : "女性")}");
Console.WriteLine($"カルテ番号: {patient.ID}");
Console.WriteLine($"病棟: {patient.Ward}");
Console.WriteLine($"ベッド番号: {patient.BedNumber}号");
Console.WriteLine("\nバイタルサイン:");
Console.WriteLine($"体温: {patient.Vitals.Temperature}°C");
Console.WriteLine($"心拍数: {patient.Vitals.HeartRate}回/分");
Console.WriteLine($"血圧: {patient.Vitals.SystolicBP}/{patient.Vitals.DiastolicBP} mmHg");
Console.WriteLine($"呼吸数: {patient.Vitals.RespiratoryRate}回/分");
Console.WriteLine($"酸素飽和度: {patient.Vitals.OxygenSaturation}%");
}
// バイタルサインを評価するメソッド
static void AssessVitalSigns(VitalSigns vitals)
{
Console.WriteLine("\nバイタルサイン評価:");
// 体温評価
if (vitals.Temperature > 37.5)
Console.WriteLine("- 体温が高め、監視が必要");
// 心拍数評価
if (vitals.HeartRate < 60 || vitals.HeartRate > 100)
Console.WriteLine("- 心拍数が異常、注意が必要");
// 血圧評価
if (vitals.SystolicBP >= 140 || vitals.DiastolicBP >= 90)
Console.WriteLine("- 血圧が高め、再検査を推奨");
// 呼吸数評価
if (vitals.RespiratoryRate < 12 || vitals.RespiratoryRate > 20)
Console.WriteLine("- 呼吸数が異常、観察が必要");
// 酸素飽和度評価
if (vitals.OxygenSaturation < 95)
Console.WriteLine("- 酸素飽和度が低め、酸素投与を検討");
}
}
この例からわかるように:
- 構造体の定義:2 つの構造体(
VitalSignsとPatientInfo)を定義し、患者関連情報を格納します。 - 構造体のネスト:
PatientInfo構造体の中にVitalSigns構造体を含めることで、構造体のネストを示しています。 - 構造体の初期化:構造体変数を作成し、そのフィールド値を設定する方法を示しています。
- 構造体を引数として使用:構造体をメソッドの引数として渡す方法を示しています。
- 構造体の実際の応用:バイタルサインを評価するメソッドを通じて、実際のシナリオでの構造体の使用方法を示しています。
このデータの整理方法は、看護業務におけるカルテ記録システムを思い起こさせます。カルテでも、患者の各種情報(基本情報、バイタルサイン、検査結果など)を特定の形式でまとめています。構造体を使用することで、これらの関連データをより適切に管理でき、コードの整理と保守性が向上します。
配列
配列を使用すると、同じ型の複数の変数を一度に格納できます。構文は次のとおりです。
配列の型[] 配列名 = new 配列の型[配列の長さ]
例:int[] nums = new int[10];
上記のコードを記述すると、メモリ上に連続した 10 個の領域が確保されます。各領域を配列の要素と呼びます。配列の特定の要素にアクセスするには、要素の添え字(インデックス)を使用します。配列の最後の要素のインデックスは長さから 1 を引いた値です。
看護業務におけるいくつかの例を用いて配列の使用法を説明します。
// 例1:週間の病棟患者数を記録
int[] wardPatients = new int[7]; // 長さ7の配列を作成
// 各日の患者数を設定
wardPatients[0] = 45; // 月曜日
wardPatients[1] = 42; // 火曜日
wardPatients[2] = 48; // 水曜日
wardPatients[3] = 50; // 木曜日
wardPatients[4] = 47; // 金曜日
wardPatients[5] = 40; // 土曜日
wardPatients[6] = 38; // 日曜日
// 平均入院患者数を計算
int totalPatients = 0;
for (int i = 0; i < wardPatients.Length; i++)
{
totalPatients += wardPatients[i];
}
double averagePatients = (double)totalPatients / wardPatients.Length;
Console.WriteLine($"今週の平均入院患者数: {averagePatients:F1}人");
// 例2:配列の初期化方法
// 方法1:直接初期化
double[] temperatures = { 36.5, 36.8, 37.2, 36.9, 37.0 };
// 方法2:newキーワードで初期化
string[] medications = new string[] { "ペニシリン", "セファロスポリン", "アモキシシリン", "イブプロフェン" };
// 方法3:宣言後に代入
int[] bedNumbers;
bedNumbers = new int[] { 101, 102, 103, 104, 105 };
// 例3:2次元配列 - 複数患者の1日の体温記録
double[,] patientTemps = new double[3, 4]; // 3人の患者、1日4回の体温記録
// 体温データを設定
patientTemps[0, 0] = 36.5; // 1号患者、朝
patientTemps[0, 1] = 36.8; // 1号患者、昼
patientTemps[0, 2] = 37.1; // 1号患者、午後
patientTemps[0, 3] = 36.9; // 1号患者、夜
// 2次元配列を走査
string[] timeSlots = { "朝", "昼", "午後", "夜" };
for (int patient = 0; patient < 3; patient++)
{
Console.WriteLine($"\n{patient + 1}号患者の体温記録:");
for (int time = 0; time < 4; time++)
{
Console.WriteLine($"{timeSlots[time]}: {patientTemps[patient, time]}°C");
}
}
// 例4:配列をメソッドの引数として使用
static double CalculateAverageTemp(double[] temps)
{
double sum = 0;
foreach (double temp in temps)
{
sum += temp;
}
return sum / temps.Length;
}
// メソッドの呼び出し
double[] patient1Temps = { 36.5, 36.8, 37.2, 36.9 };
double avgTemp = CalculateAverageTemp(patient1Temps);
Console.WriteLine($"患者の平均体温: {avgTemp:F1}°C");
// 例5:配列の一般的な操作
string[] nurses = { "張看護師", "李看護師", "王看護師", "趙看護師" };
// 配列の長さを取得
Console.WriteLine($"看護師の人数: {nurses.Length}");
// 要素の検索
string searchNurse = "李看護師";
bool found = Array.IndexOf(nurses, searchNurse) != -1;
Console.WriteLine($"検索結果「{searchNurse}」: {found}");
// 配列のソート
Array.Sort(nurses);
Console.WriteLine("ソート後の看護師名簿:");
foreach (string nurse in nurses)
{
Console.WriteLine(nurse);
}
// 配列のコピー
string[] backupNurses = new string[nurses.Length];
Array.Copy(nurses, backupNurses, nurses.Length);
これらの例からわかるように:
- 配列の作成:複数の方法で配列を作成・初期化できます。
- 配列へのアクセス:インデックスを使用して配列要素にアクセスします。
- 配列の走査:for ループや foreach ループを使用して配列を走査します。
- 2次元配列:より複雑なデータ構造を格納するために使用します。
- 配列を引数として使用:配列をメソッドの引数として渡せます。
- 配列の一般的な操作:長さの取得、要素の検索、ソート、コピーなど。
配列の長さは一度固定されると変更できません。これは病院の医薬品払い出しシステムを連想させます。各薬剤には固定された保管場所と数量があります。看護業務では、以下のような一連の関連データを扱うことがよくあります。
- 病棟のベッド番号
- 患者の体温記録
- 薬剤リスト
- 看護シフトスケジュール
- バイタルサイン測定データ
配列を使用することで、これらのデータを効果的に整理・管理でき、プログラムの構造化と保守性が向上します。
バブルソート
バブルソートは、配列の要素を降順または昇順に並べ替えるために使用します。例えば、次の配列の場合:
int[] nums = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
以下は、患者の優先度に従ってソートする完全なバブルソートの例です。
// 患者優先度配列(数値が大きいほど優先度が高い)
int[] priorities = { 2, 5, 1, 7, 3, 8, 4, 6 };
string[] patientNames = { "张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十" };
Console.WriteLine("ソート前の患者優先度:");
for (int i = 0; i < priorities.Length; i++)
{
Console.WriteLine($"{patientNames[i]}: 優先度 {priorities[i]}");
}
// バブルソート(降順)
for (int i = 0; i < priorities.Length - 1; i++)
{
for (int j = 0; j < priorities.Length - 1 - i; j++)
{
// 現在の要素が次の要素より小さい場合、位置を交換(降順)
if (priorities[j] < priorities[j + 1])
{
// 優先度を交換
int tempPriority = priorities[j];
priorities[j] = priorities[j + 1];
priorities[j + 1] = tempPriority;
// 対応する患者名も交換
string tempName = patientNames[j];
patientNames[j] = patientNames[j + 1];
patientNames[j + 1] = tempName;
}
}
}
Console.WriteLine("\nソート後の患者優先度(降順):");
for (int i = 0; i < priorities.Length; i++)
{
Console.WriteLine($"{i+1}. {patientNames[i]}: 優先度 {priorities[i]}");
}
これは、看護業務において患者の重症度に応じてトリアージや治療の優先順位を決定するプロセスに似ています。バブルソートの考え方は、看護ステーションで患者の状態に基づいて誰を先に処理するかを決める場面を連想させます。
メソッド
メソッドは、コードの塊を再利用するための仕組みです。構文は次のとおりです。
[public] static 戻り値の型 メソッド名([パラメータリスト])
{
メソッド本体;
}
看護関連のいくつかの例を用いてメソッドの使用法を説明します。
class NursingProgram
{
// 1. パラメータなし、戻り値なしのメソッド
public static void DisplayNursingProtocol()
{
Console.WriteLine("標準看護手順:");
Console.WriteLine("1. バイタルサイン測定");
Console.WriteLine("2. 輸液状況の確認");
Console.WriteLine("3. 病状変化の観察");
Console.WriteLine("4. 看護記録の記入");
}
// 2. パラメータあり、戻り値ありのメソッド
public static double CalculateIdealWeight(double height, char gender)
{
// 身長と性別から理想体重を計算
if (gender == 'M' || gender == 'm')
{
return (height - 100) * 0.9;
}
else
{
return (height - 100) * 0.85;
}
}
// 3. 複数パラメータのメソッド
public static double CalculateBMI(double weight, double height)
{
double heightInMeters = height / 100;
return weight / (heightInMeters * heightInMeters);
}
// 4. メソッドのオーバーロード - 体温評価
public static string EvaluateTemperature(double temperature)
{
if (temperature < 35.5) return "低体温";
if (temperature <= 37.2) return "正常";
if (temperature <= 38.0) return "微熱";
if (temperature <= 39.0) return "中等度発熱";
return "高熱";
}
// 同名メソッドだが、パラメータが異なる
public static string EvaluateTemperature(double temperature, bool isInfant)
{
if (isInfant)
{
// 乳児の体温基準は若干異なる
if (temperature < 36.0) return "乳児低体温";
if (temperature <= 37.5) return "乳児正常体温";
if (temperature <= 38.5) return "乳児微熱";
return "乳児高熱";
}
else
{
return EvaluateTemperature(temperature); // 別のオーバーロードメソッドを呼び出す
}
}
// 5. パラメータのデフォルト値
public static string AssessBloodPressure(int systolic, int diastolic, bool detailed = false)
{
string result = "";
if (systolic >= 140 || diastolic >= 90)
{
result = "血圧高い";
if (detailed)
{
result += $" (収縮期:{systolic}, 拡張期:{diastolic})";
}
}
else if (systolic < 90 || diastolic < 60)
{
result = "血圧低い";
if (detailed)
{
result += $" (収縮期:{systolic}, 拡張期:{diastolic})";
}
}
else
{
result = "血圧正常";
}
return result;
}
// 6. refパラメータを使用したメソッド
public static void UpdateVitalSigns(ref double temperature, ref int pulse)
{
// 新しい測定値をシミュレート
temperature = 37.2;
pulse = 75;
}
// メインメソッドでこれらのメソッドを使用
static void Main(string[] args)
{
// パラメータなしメソッドの呼び出し
DisplayNursingProtocol();
// 理想体重の計算
double height = 170;
char gender = 'F';
double idealWeight = CalculateIdealWeight(height, gender);
Console.WriteLine($"\n身長{height}cmの{(gender == 'F' ? "女性" : "男性")}の理想体重: {idealWeight:F1}kg");
// BMIの計算
double weight = 65;
double bmi = CalculateBMI(weight, height);
Console.WriteLine($"BMI指数: {bmi:F1}");
// メソッドのオーバーロードを使用した体温評価
double adultTemp = 38.5;
double infantTemp = 37.8;
Console.WriteLine($"\n成人の体温{adultTemp}°C評価: {EvaluateTemperature(adultTemp)}");
Console.WriteLine($"乳児の体温{infantTemp}°C評価: {EvaluateTemperature(infantTemp, true)}");
// デフォルトパラメータの使用
int systolic = 145;
int diastolic = 88;
Console.WriteLine($"\n血圧評価: {AssessBloodPressure(systolic, diastolic)}");
Console.WriteLine($"血圧評価(詳細): {AssessBloodPressure(systolic, diastolic, true)}");
// refパラメータの使用
double temp = 36.8;
int pulse = 80;
Console.WriteLine($"\n更新前 - 体温: {temp}°C, 脈拍: {pulse}回/分");
UpdateVitalSigns(ref temp, ref pulse);
Console.WriteLine($"更新後 - 体温: {temp}°C, 脈拍: {pulse}回/分");
}
}
これらの例からわかるように:
- パラメータなしのメソッド:
DisplayNursingProtocol()は、パラメータなしのメソッドを定義・使用する方法を示しています。 - パラメータあり・戻り値ありのメソッド:
CalculateIdealWeight()とCalculateBMI()は、入力パラメータを処理して計算結果を返す方法を示しています。 - メソッドのオーバーロード:
EvaluateTemperature()は、同じメソッド名に異なるパラメータバージョンを提供する方法を示しています。 - デフォルトパラメータ:
AssessBloodPressure()は、省略可能なパラメータを使用する方法を示しています。 - 参照パラメータ:
UpdateVitalSigns()は、ref パラメータを使用してメソッド内で変数の値を変更する方法を示しています。
これらのメソッドは、看護業務における標準業務手順書(SOP)を思い起こさせます。
- 各看護手順には明確な入力(患者の状態など)と出力(看護措置など)があります。
- 同じ看護手順でも、患者の種類(成人や小児など)によって異なるバリエーションがあります。
- 一部の看護操作は患者の状態を直接変化させます(投薬など)。
- 看護評価には簡易版と詳細版があります。
メソッドを看護実践と関連付けることで、これらのプログラミング概念の理解と記憶が容易になります。メソッドはコードを整理し、標準化された看護手順と同様に、作業効率と正確性を向上させます。
return 文
return 文には 2 つの役割があります。
- メソッド内で戻り値を返す
- 現在のメソッドの実行を即座に終了する
以下は return 文を使用した例です。
// 患者の体温状態を評価し、看護アドバイスを返す
static string EvaluateTemperature(double temperature)
{
// 低体温
if (temperature < 35.5)
{
return "体温低下、保温と監視が必要";
}
// 正常体温
if (temperature >= 35.5 && temperature <= 37.2)
{
return "体温正常、定時監視";
}
// 微熱
if (temperature > 37.2 && temperature <= 38.0)
{
return "微熱、注意深く観察";
}
// 中等度発熱
if (temperature > 38.0 && temperature <= 39.0)
{
return "中等度発熱、物理的冷却と投薬を検討";
}
// 高熱
return "高熱、緊急処置、直ちに医師に連絡";
}
// Mainメソッドで呼び出し
static void Main(string[] args)
{
double[] patientTemps = { 36.5, 37.8, 39.2, 35.0, 38.5 };
foreach (double temp in patientTemps)
{
string advice = EvaluateTemperature(temp);
Console.WriteLine($"体温 {temp}°C: {advice}");
}
}
この例では、条件が満たされると、return 文が対応するアドバイスを返し、メソッドの実行を即座に終了します。その後の条件はチェックされません。これは看護判断において、患者の状態が確定したら直ちに該当する措置を講じ、他の可能性を考慮しないプロセスに似ています。
まとめ
看護師から転身した開発者として、プログラミングと看護業務には多くの共通点があることに気づきました。これらのプログラミング概念を看護経験と結びつけることで、知識の理解と応用が促進され、優秀な C# 開発者へと着実に成長しています。