在上一节课中,我学习了类型转换、算术运算符、关系运算符、逻辑运算符以及各种分支结构,了解了这些语法的含义和执行过程。今天的课程聚焦于如何让我们编写的程序更具健壮性,减少出错的可能性。我学习了另一种分支结构 switch - case,并将其与上节课所学的分支结构进行了对比。此外,还学习了循环结构,这是目前所学内容中较为重要且复杂的一部分。为了更好地吸收和理解这些知识,我放慢了学习脚步,通过不断编写代码来巩固和加深理解。下面是我这节课所学的具体内容:
1.異常な捕獲
介護では、しばしば予期せぬ状況に対処する必要があります。例えば、患者の体温を測定するときに温度計が故障したり、注入時にチューブが詰まったりすることがあります。同様に、プログラミングでは、さまざまな例外に対処する必要があります。C#はこれらの問題をエレガントに処理するための例外処理メカニズムを提供します。
1. try-catchの基本構文
try
{
// 可能出现异常的代码
}
catch (Exception ex)
{
// 处理异常的代码
}
2. 実用的なアプリケーション例
以下は、看護業務における患者のバイタルサインデータの入力例です。
try
{
Console.Write("请输入病人体温: ");
double temperature = Convert.ToDouble(Console.ReadLine());
if (temperature < 35 || temperature > 42)
{
throw new Exception("体温数据异常,请重新检查");
}
Console.Write("请输入收缩压: ");
int systolicPressure = Convert.ToInt32(Console.ReadLine());
if (systolicPressure < 60 || systolicPressure > 200)
{
throw new Exception("血压数据异常,请重新测量");
}
Console.WriteLine($"记录的体温为: {temperature}°C");
Console.WriteLine($"记录的收缩压为: {systolicPressure}mmHg");
}
catch (FormatException)
{
Console.WriteLine("输入格式错误,请输入有效的数字");
}
catch (OverflowException)
{
Console.WriteLine("输入的数值超出范围");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
// 可以在这里记录错误日志
}
finally
{
Console.WriteLine("数据录入操作完成");
// 无论是否发生异常,都会执行的清理工作
}
3. 一般的な例外のタイプ
看護情報システムでは、以下のような異常がしばしば発生します。
-
-
- FormatException ** 数字の代わりに文字を入力した場合など、入力されたデータが正しくない場合にスローされます。
-
-
-
- OverflowException ** 数値が型の範囲外の場合にスローされる
-
-
-
- ArgumentException ** パラメータの値が一致しない場合にスローされる
-
-
-
- NullReferenceException ** 空のオブジェクトにアクセスしようとしたときにスローされる
-
4. カスタム例外。
ビジネスロジックに基づいてカスタム例外をスローする必要がある場合があります。
public class VitalSignException : Exception
{
public VitalSignException(string message) : base(message)
{
}
}
try
{
int heartRate = 150;
if (heartRate > 120)
{
throw new VitalSignException("心率异常升高,需要立即处理!");
}
}
catch (VitalSignException ex)
{
Console.WriteLine($"生命体征异常: {ex.Message}");
// 这里可以添加紧急处理流程
}
5. ベストプラクティス·オブ·ベスト
- 予期される例外のみをキャッチし、すべての例外をキャッチしない
- 適切なレベルでの例外処理
- 後続の分析のための例外情報の記録
- finallyブロックを使用したクリーンアップ作業
- 意味のあるエラーメッセージの提供
(2)変数の範囲
変数のスコープは、その変数を使用できるスコープを指します。病院では、異なる部門の看護師が自分の部門の患者情報しか見ることができないのと同じように、変数には使用範囲に制限があります。
1. 局所変数
ローカル変数のスコープは、それを宣言した括弧から始まり、対応する終了括弧で終わります。ナースステーションで使用される一時的なログシートのようなものです。
void RecordPatientVitals()
{
// temperature 只在这个方法内有效
double temperature = 36.5;
if (temperature > 37.3)
{
// fever 只在if语句块内有效
string fever = "发热";
Console.WriteLine(fever);
}
// 这里无法使用 fever 变量
{
// pulse 只在这个代码块内有效
int pulse = 80;
}
// 这里无法使用 pulse 变量
}
2. クラスレベル変数メンバー変数
クラスレベルの変数のスコープは、クラス全体で表示されます。例えば、病棟の看護記録シートは、すべてのシフトの看護師がアクセスできます。
public class Patient
{
// 这些变量在整个类中都可以访问
private string patientName;
private int patientAge;
private string bedNumber;
public void AdmitPatient(string name, int age)
{
patientName = name; // 可以访问类级变量
patientAge = age; // 可以访问类级变量
}
public void AssignBed(string bed)
{
bedNumber = bed; // 可以访问类级变量
}
}
3. グローバル変数(静的変数)
静的変数はプログラム全体からアクセスでき、病院の一般的な規則に似ています。
public class HospitalConstants
{
// 这些静态变量可以在任何地方访问
public static readonly double NORMAL_TEMPERATURE = 37.0;
public static readonly int NORMAL_SYSTOLIC_PRESSURE = 120;
public static readonly int NORMAL_DIASTOLIC_PRESSURE = 80;
}
public class NursingRecord
{
public void CheckTemperature(double temperature)
{
// 可以在任何类中访问 HospitalConstants 的静态变量
if (temperature > HospitalConstants.NORMAL_TEMPERATURE)
{
Console.WriteLine("体温偏高");
}
}
}
4. 変数の隠蔽
ローカル変数とクラスレベル変数が同じ名前の場合、ローカル変数はクラスレベル変数を“マスク”します
public class VitalSigns
{
private double temperature = 36.5; // 类级变量
public void UpdateTemperature(double temperature) // 参数
{
// 这里的 temperature 指的是参数,而不是类级变量
Console.WriteLine($"新的体温: {temperature}");
// 使用 this 关键字访问类级变量
this.temperature = temperature;
}
}
5. スコープのベストプラクティス
- 変数のスコープはできるだけ小さくし、エラーの可能性を減らします。
- グローバル変数はコードによって変更される可能性があるため避ける。
- 目的を反映した意味のある変数名を使用する
- 未使用のリソースをタイムリーに解放する
- 変数のライフサイクルに注意し、スコープ外の変数へのアクセスを避ける
三、switch - case 语句
在护理工作中,我们经常需要根据不同的情况作出不同的处理决定。switch - case 语句就像我们在护理工作中使用的标准处理流程,根据不同的情况选择相应的处理方案。
1. 支援の種類
switch 语句支持以下类型的表达式:
- 整数类型(
int、long、byte等) - 字符类型(
char) - 字符串类型(
string) - 枚举类型(
enum) - 布尔类型(
bool)- C# 7.0 及以上版本 - パターンマッチングC#7.0以降
- タイプパターンの種類
- 定数モード
- varモデル
- プロパティモードC#8.0以降
例として:
// 枚举类型示例
enum PatientStatus
{
Normal,
Fever,
Pain,
Critical
}
PatientStatus status = PatientStatus.Fever;
switch (status)
{
case PatientStatus.Normal:
Console.WriteLine("继续观察");
break;
case PatientStatus.Fever:
Console.WriteLine("进行降温处理");
break;
case PatientStatus.Pain:
Console.WriteLine("给予止痛治疗");
break;
case PatientStatus.Critical:
Console.WriteLine("立即通知医生");
break;
}
// 模式匹配示例(C# 7.0+)
object obj = "护理记录";
switch (obj)
{
case string s:
Console.WriteLine($"这是一个字符串:{s}");
break;
case int n:
Console.WriteLine($"这是一个整数:{n}");
break;
case null:
Console.WriteLine("对象为空");
break;
default:
Console.WriteLine("未知类型");
break;
}
2. 基本的な文法
switch (表达式)
{
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
default:
默认语句;
break;
}
3. 実用的なアプリケーション例
例えば、患者の痛みのレベルに応じて、さまざまなケア措置がとられます。
int painLevel = 3; // 疼痛等级(0-10)
switch (painLevel)
{
case 0:
Console.WriteLine("无需止痛处理");
break;
case 1:
case 2:
case 3:
Console.WriteLine("建议非药物治疗,如按摩、热敷等");
break;
case 4:
case 5:
case 6:
Console.WriteLine("考虑口服止痛药");
break;
case 7:
case 8:
case 9:
case 10:
Console.WriteLine("需要立即处理,考虑注射止痛药");
break;
default:
Console.WriteLine("无效的疼痛等级");
break;
}
4. 注意事項について
-
-
- break文の重要性 **:各caseブランチはbreakで終わらなければならず、そうでなければ次のcaseに進みます。
-
-
-
- ケースのマージ **:複数のケースが同じ処理ロジックを共有することができます。例えば、痛みレベルのグループ化などです。
-
-
-
- defaultブランチ **:看護の緊急計画に似た、明示的に指定されていないすべての状況を処理する。
-
5. 分岐構造の比較
if、if-else、およびswitchの違い
-
-
- 条件の種類 **:
if:可以判断任何返回布尔值的条件if-else:同样可以判断任何布尔条件,但提供了替代方案switch:只能判断相等性,且要求使用常量表达式
-
-
-
- 該当するシーン **:
if:适合单一条件判断if-else:适合两种及以上情况的判断switch:适合多个等值条件的判断
-
-
- ** パフォーマンスの考慮事項 **:
- 分岐が少ない場合、3つの性能は似ている
- 当分支较多时,
switch通常比多个if-else性能更好,因为编译器会优化成跳转表
if-else ifとスイッチケースの比較
// 使用 if-else if
if (patientStatus == "发热")
{
Console.WriteLine("进行物理降温");
CheckTemperature();
}
else if (patientStatus == "疼痛")
{
Console.WriteLine("评估疼痛等级");
PainAssessment();
}
else if (patientStatus == "出血")
{
Console.WriteLine("立即止血");
StopBleeding();
}
else
{
Console.WriteLine("继续观察");
}
// 使用 switch-case
switch (patientStatus)
{
case "发热":
Console.WriteLine("进行物理降温");
CheckTemperature();
break;
case "疼痛":
Console.WriteLine("评估疼痛等级");
PainAssessment();
break;
case "出血":
Console.WriteLine("立即止血");
StopBleeding();
break;
default:
Console.WriteLine("继续观察");
break;
}
主な違い:
-
-
- 構文 **:
if-else if结构更灵活,可以处理复杂的条件判断switch-case结构更规范,代码更整洁
-
-
-
- 条件付き **:
if-else if可以使用任何条件表达式switch-case只能使用相等性比较
-
-
-
- プロセスの実行 **:
if-else if会逐个判断条件switch-case直接跳转到匹配的 case
-
-
-
- コードのメンテナンス **:
- 当分支较多时,
switch-case的可读性和可维护性通常更好 if-else if适合处理复杂的逻辑判断
-
-
- ** パフォーマンスの考慮事項 **:
- 对于大量分支的情况,
switch-case通常性能更好 - 少数の分岐では、両者のパフォーマンスに大きな差がない
6. 推奨事項の利用
- 変数の異なる値に基づいて異なる操作を実行する必要がある場合は、スイッチケースを優先します。
- 分岐が多い場合、switch-caseは通常if-elseよりも読みやすくなる
- 範囲判定などの複雑な条件判定では、if-elseを使用する方が適切です。
- 可能なすべての状況に対応する処理ロジックがあることを確認
4.循環構造
看護では、1時間ごとにバイタルサインを測定したり、病棟のすべての患者を診察したりするなど、特定の操作を繰り返す必要があります。プログラミングでは、ループ構造はこの反復作業を処理するために使用されます。
1. whileループを
while 循环会在条件为真时重复执行代码块。就像我们在护理工作中,需要持续监测病人的体温直到体温恢复正常:
double temperature = 39.0;
while (temperature > 37.3)
{
Console.WriteLine($"当前体温:{temperature}°C,需要继续降温");
// 模拟降温处理
temperature -= 0.2;
Console.WriteLine("进行物理降温...");
Thread.Sleep(1000); // 模拟等待一段时间
}
Console.WriteLine("体温已恢复正常");
2. do-whileサイクル
do-while 循环至少会执行一次代码块,然后再判断条件。这类似于我们必须先给病人测量一次体温,然后才能决定是否需要继续监测:
int painLevel;
do
{
Console.WriteLine("请评估疼痛等级(0-10):");
painLevel = Convert.ToInt32(Console.ReadLine());
if (painLevel > 0)
{
Console.WriteLine("实施止痛措施...");
// 进行止痛处理
}
} while (painLevel > 3); // 当疼痛等级大于3时继续监测
3. forループ
for 循环通常用于知道具体循环次数的情况。比如查房时需要检查每个病床的病人:
int bedCount = 6; // 假设病房有6张床
for (int bedNumber = 1; bedNumber <= bedCount; bedNumber++)
{
Console.WriteLine($"正在查看{bedNumber}号床的病人");
// 进行查房操作
CheckPatientStatus(bedNumber);
}
4. foreachサイクル
foreach 循环用于遍历集合中的每个元素。例如,查看所有待处理的护理任务:
List<string> nursingTasks = new List<string>
{
"测量生命体征",
"更换药液",
"伤口护理",
"病历记录"
};
foreach (string task in nursingTasks)
{
Console.WriteLine($"执行护理任务:{task}");
// 执行护理任务
PerformNursingTask(task);
}
5. ループ制御文
-
-
- break文 **:ループを直ちに終了する
-
while (true)
{
double temperature = MeasureTemperature();
if (temperature <= 37.3)
{
Console.WriteLine("体温正常,停止监测");
break; // 体温正常时退出循环
}
// 继续监测
}
-
-
- continue文 **:現在のループの残りをスキップし、次のループに進みます。
-
for (int bedNumber = 1; bedNumber <= 6; bedNumber++)
{
if (IsBedEmpty(bedNumber))
{
continue; // 如果床位空着,跳过当前循环
}
// 对有病人的床位进行护理操作
ProvideNursing(bedNumber);
}
6. 循環のベストプラクティス
-
-
- 適切なサイクルを選択 **:
- 不确定循环次数时使用
while - 至少需要执行一次时使用
do-while - 知道具体循环次数时使用
for - 遍历集合时使用
foreach
-
-
-
- 無限ループを避ける **:
- ループ条件が最終的にfalseになることを確認する
- 必要に応じてbreak文を使用してループを終了する
-
-
- ** パフォーマンスの考慮事項 **:
- ループ内で不要な計算を避ける
- ループ·ネストのレベル数をできるだけ少なくする
- continue文の適切な使用不要な操作のスキップ
-
- ** コードは読みやすい **:
- 意味のあるループ変の使用
- ループの目的を説明する適切なコメントの追加
- 循環体をシンプルに保つ
-
- ** 例外の処理 **:
- ループに適切な例外処理を追加する
- サイクル中に発生する可能性のあるエラー状況を考慮する
7. サイクルの応用シナリオ
-
-
- データ処理 **:
-
List<Patient> patients = GetAllPatients();
foreach (Patient patient in patients)
{
UpdatePatientRecord(patient);
}
-
-
- 検証を入力 **:
-
string input;
do
{
Console.Write("请输入有效的体温数值(35-42):");
input = Console.ReadLine();
} while (!IsValidTemperature(input));
-
- *:
while (isNightShift)
{
// 每两小时查房一次
CheckPatients();
Thread.Sleep(TimeSpan.FromHours(2));
}
これらの循環構造により、反復的なケア作業をより効率的に処理し、作業効率と精度を向上させます。プログラミングでは、ループ構造を適切に使用することで、コードをよりクリーンでメンテナンスしやすくなります。
V.手続きの調整
看護業務では、医師の指示の執行状況を確認し、看護記録の正確性を確認する必要があります。プログラミングでは、プログラムが期待通りに動作するかどうかを確認する必要があります。プログラムデバッグは、そのような検証と修正のプロセスです。
1. デバッグメソッド
-
-
- F 11文ごとのデバッグ(ステップ·デバッグ)**
- コードを1行ずつ実行し、各ステップの実行状況を詳細に確認
- 医療処置を段階的に確認するように。
- 特定の問題を特定するのに適したコード行
-
-
-
- F 10プロセスごとのデバッグ **
- プロシージャ単位でコードを実行し、関数内の詳細な実行手順をスキップする
- ラウンドで重要な項目に焦点を当て、マイナーな詳細をスキップするように。
- プログラム全体の実行プロセスを素早く理解する
-
-
-
- ブレークポイントデバッグ **
- キーコード行にブレークポイントを設定します。ブレークポイントまでプログラムの実行が一時停止する
- シフト前に特定の患者を集中的にチェックするようなものです
- 特定の場所の変数の値とプログラム状態を簡単に表示
-
2. デバッグの例
public class PatientMonitor
{
public void MonitorVitalSigns(Patient patient)
{
// 设置断点,检查病人基本信息
var temperature = MeasureTemperature(patient);
if (temperature > 37.3)
{
// 使用F11可以进入函数内部查看测量过程
// 使用F10可以跳过处理函数的内部细节
HandleFever(patient, temperature);
}
// 继续监测其他生命体征
CheckBloodPressure(patient);
CheckHeartRate(patient);
}
}
3. デバッグ技術
-
-
- 合理的なブレークポイント **
- 潜在的に問題のあるコードにブレークポイントを設定する
- クリティカルなビジネスロジックの開始点にブレークポイントを設定する
- 例外処理コードにブレークポイントを設定する
-
-
-
- ウォッチウィンドウの使用 **
- ウォッチウィンドウへのキー変数の追加
- 変数値の変化をリアルタイムで観察
- データ処理の正しさの検証
-
-
-
- 条件付きブレークポイント **
- 特定の条件下でのみトリガーされるブレークポイントの設定
- 例えば、体温が39度を超えるとプログラムを一時停止します。
-
まとめまとめまとめ
このレッスンでは、以下の重要なことを学びました。
-
- ** 例外の処理 **
- try-catch構造体の使い方
- 異なる種類の例外の処理方法
- カスタム例外の作成と使用
-
- ** 変数の範囲 **
- ローカル変数、クラス変数、静的変数の違い
- 変数マスキング現象
- スコープのベストプラクティス
-
-
- ブランチ構造 **
- switch-case文の基本的な使い方
- サポートされるデータ型とパターン一致
- if-else構造体との比較と選択
-
-
-
- サイクル **
- while、do-while、for、foreachの使い方
- ループ制御文break、continue
- ループのベストプラクティスとパフォーマンスに関する考慮事項
-
-
-
- プログラムのデバッグ **
- ステップバイステップとプロセスバイステップのデバッグ
- ブレークポイントの設定と使用
- デバッグツールの有効活用
-
看護師からプログラム開発に転向した学習者として、プログラミングの概念と看護の仕事には多くの類似点があります。看護の仕事が厳格な操作手順、明確な文書化、タイムリーな例外処理を必要とするように、プログラミングには標準化されたコード構造、明確なロジック、完璧なエラー処理が必要です。
これらの基礎を学ぶことで、徐々にプログラミング思考を身につけ、プログラミングの問題を理解し解決できるようになりました。今後の研究では、C#プログラミングのより多くの機能を深く掘り下げ、優れた開発者になるための強固な基盤を築きます。