我正在构建一个单独的应用程序来计算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都是整数,所以我不知道为什么它不起作用!
谢谢
有很多问题.首先,当你写作
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循环.