如何在Pascal二维数组中正确删除元素以避免平均值计算错误?
解决方案
针对你用0标记删除元素导致平均值计算错误的问题,这里有几个实用的解决办法:
方法1:使用生理指标不可能出现的特殊值作为删除标记
因为血压、脉搏这类生理指标都是正数,你可以用负数(比如-1)来标记已删除的元素,计算平均值时跳过这些标记值。
修改删除逻辑:
把原代码里的删除部分:
Else Begin Mesures[jour, param] := 0; End;
改成:
Else Begin Mesures[jour, param] := -1; // 用-1标记已删除 End;
计算平均值的逻辑调整:
计算某参数(比如收缩压)的平均值时,遍历每天的数据,只统计值不为-1的项:
Function CalculerMoyenne(param: Integer): Real; Var jour: Integer; somme: Integer; compte: Integer; Begin somme := 0; compte := 0; For jour := 1 To Nbre_J Do Begin If Mesures[jour, param] <> -1 Then // 跳过已删除的标记值 Begin somme := somme + Mesures[jour, param]; compte := compte + 1; End; End; If compte > 0 Then CalculerMoyenne := somme / compte Else CalculerMoyenne := 0; // 无有效数据时返回0或按需处理 End;
方法2:维护一个独立的有效性标记数组
新增一个布尔类型的二维数组,专门记录每个测量值是否有效。删除时标记为无效,修改或新增时标记为有效,计算平均值时只统计有效项。
步骤1:声明有效性数组
在全局或合适的位置声明:
Var Mesures: array[1..Nbre_J, 1..Max_Param] of Integer; MesuresValides: array[1..Nbre_J, 1..Max_Param] of Boolean; // 新增有效性标记
初始化时把所有MesuresValides[jour, param]设为True(默认所有数据有效)。
步骤2:修改ModifierSupprimerMesure过程
修改删除和修改的逻辑:
If choix = 'M' Then Begin Write('Entrez la nouvelle valeur : '); read(Mesures[jour, param]); MesuresValides[jour, param] := True; // 修改后标记为有效 End Else Begin MesuresValides[jour, param] := False; // 删除时标记为无效,原数值可保留或清零 // Mesures[jour, param] := 0; // 可选:清零原数值,不影响统计 End;
步骤3:计算平均值的逻辑
Function CalculerMoyenne(param: Integer): Real; Var jour: Integer; somme: Integer; compte: Integer; Begin somme := 0; compte := 0; For jour := 1 To Nbre_J Do Begin If MesuresValides[jour, param] Then // 只统计有效项 Begin somme := somme + Mesures[jour, param]; compte := compte + 1; End; End; If compte > 0 Then CalculerMoyenne := somme / compte Else CalculerMoyenne := 0; End;
方法3:动态调整数组(适合动态数组场景)
如果你的Mesures是动态数组,可以真正删除元素,把后续元素前移。但这种方法需要调整数组的长度,且对二维数组来说操作稍复杂,适合需要严格缩减数组大小的场景。比如针对某一天的参数列表删除元素,但考虑到你的结构是[日, 参数]的二维数组,这种方法实用性不如前两种,除非你的数据结构是按参数分组的一维动态数组。
内容的提问来源于stack exchange,提问作者moncef guettouche
相关产品推荐
相关产品推荐

