Delphi - 计算列表中项目的最小最大值和平均值

Vaa*_*jan -1 delphi

我正在构建一个单独的应用程序来计算List中的Min Max和Avg of Values.

它实际上是温度.所以我认为我几乎是正确的,但有2个错误.

var
  Count, Average, Sum,i, Max, Min, K   : Integer;
  Temperatures : Array of Integer;
  NoItems : Double;
begin
  Count := 0;
  Sum := 0;
  Max := 0;
  Min := 0;
  Average := 0;

  Count := lstTemp.Items.Count;

  {Calculate Sum of Values in the list}
  for i := 0 to Count - 1 do
    Sum := Sum + StrToInt(lstTemp.Items[i]);

  {Calculate Min and Max}
  SetLength(Temperatures,Count);
  for K:=0 to Count-1 do
    Temperatures[K] := lstTemp.Items[K];
  if (Temperatures[K] > Max) then
    Max := Temperatures[K];
  if (Temperatures[K] < Min) then
    Min := Temperatures[K];
  {Calculate Average}
    Average := Sum / Count;

  edtAvg.Text:=IntToStr(Average); //Display Average
  edtAvg.Text:=IntToStr(Min); //Display Minimum Temp.
  edtAvg.Text:=IntToStr(Max); //Display Maximum Temp.
end; 
Run Code Online (Sandbox Code Playgroud)

因此2个错误是错误:不兼容的类型:得到"AnsiString"预期"LongInt"这是针对Average:= Sum/Count; 错误:不兼容的类型:得到"Set Of Byte"预期"Double"此错误适用于Temperatures [K]:= lstTemp.Items [K];

任何想法如何解决这个问题?

Sum和Count都是整数,所以我不知道为什么它不起作用!

谢谢

And*_*and 7

有很多问题.首先,当你写作

for K:=0 to Count-1 do
Temperatures[K] := lstTemp.Items[K];
if (Temperatures[K] > Max) then
Max := Temperatures[K];
if (Temperatures[K] < Min) then
Min := Temperatures[K];
Run Code Online (Sandbox Code Playgroud)

你真的这样做

for K:=0 to Count-1 do
  Temperatures[K] := lstTemp.Items[K];

if (Temperatures[K] > Max) then
  Max := Temperatures[K];
if (Temperatures[K] < Min) then
  Min := Temperatures[K];
Run Code Online (Sandbox Code Playgroud)

这是胡说八道.您希望所有这些行都成为for循环的一部分:

for K:=0 to Count-1 do
begin
  Temperatures[K] := lstTemp.Items[K];
  if (Temperatures[K] > Max) then
    Max := Temperatures[K];
  if (Temperatures[K] < Min) then
    Min := Temperatures[K];
end;
Run Code Online (Sandbox Code Playgroud)

其次,为了使该算法起作用,Min(Max)的初始值需要比列表中的值更大(更小).这可能适用Max := 0,但可能不适用Min := 0.Min显然,在运行循环之前需要设置一个非常大的值.您可以使用的最佳值是最高可能的带符号32位整数值,即2 ^ 31 - 1,这是MaxInt常量的值.

第三,

Temperatures[K] := lstTemp.Items[K];
Run Code Online (Sandbox Code Playgroud)

可能是错的.Temperatures是一个整数数组,lstTemp.Items[K]而是一个字符串(至少根据StrToInt(lstTemp.Items[i])),所以你需要

Temperatures[K] := StrToInt(lstTemp.Items[K]);
Run Code Online (Sandbox Code Playgroud)

第四,你声明Average为integer,但它需要是一个浮点数(显然),像real或double.

五,

edtAvg.Text:=IntToStr(Average); //Display Average
edtAvg.Text:=IntToStr(Min); //Display Minimum Temp.
edtAvg.Text:=IntToStr(Max); //Display Maximum Temp.
Run Code Online (Sandbox Code Playgroud)

在技​​术上不正确,但很可能不会做你想要的.

第六,虽然不是一个错误,没有必要为你初始化Count并Average到0.最后,您只需要一个for循环.

  • max和min的良好初始值是数组的第一个值. (3认同)