|
原题目见http://lazarus.net.cn/read.php?tid=422
用Lazarus做如下编码可以实现统计,同样的代码在Delphi中无法编译,StringsReplace和Sum函数无法识别,在这个题目中,因为用了两个Lazarus 独有的函数,可以省去不少代码,虽然Delphi加上第三方控件会非常强大,但至少从这两个函数在这段代码的应用看,也可以说明Lazarus的基础是很不错的,他绝非编程玩具,完全可以实现高效开发的目的,相信Lazarus中还有很多宝藏,大家一起去发现吧!!!
- program Score;
- uses
- Classes, SysUtils, StrUtils, Math;
- var
- i, j, k: integer;
- SumScore: double;
- InData, TempData, OutData: TStringList;
- AScore: array[0..14] of double;
- begin
- InData := TStringList.Create;
- TempData := TStringList.Create;
- OutData := TStringList.Create;
- InData.LoadFromFile('Score_In.txt');
- OutData.Text := InData.Text;
- //替换A、B、C、D为对应的分数
- InData.Text := StringsReplace(InData.Text, ['A', 'B', 'C', 'D'], ['10', '5', '0', '0'], [rfReplaceAll]);
- for i := 1 to InData.Count - 1 do
- begin
- //将一行数据分解到列表中,从第三个数据开始为考试的成绩数据
- k := ExtractStrings([#9], [], PChar(InData.Strings[i]), TempData);
- //将数据存入数组
- for j := 2 to k - 1 do
- AScore[j - 2] := StrToFloat(TempData.strings[j]);
- //利用数组中的成绩数据计算总成绩,先算出选修课的总成绩,再算出主修和辅修课的成绩累加
- SumScore := IfThen(Sum(AScore, k - 2) - Sum(AScore, 10) > 20, 20, Sum(AScore, k - 2) - Sum(AScore, 10));
- SumScore := (Sum(AScore, 6) + Sum(AScore, 10)) * 0.5 + SumScore;
- //将总成绩写回到列表
- OutData.Strings[i] := FormatFloat('#0.0', SumScore) + '=' + OutData.Strings[i];
- TempData.Clear;
- end;
- //对列表进行排序
- OutData.Sort;
- k := 1;
- //计算名次并将升序排序改为降序排序
- TempData.Add(OutData.strings[OutData.Count - 1]);
- TempData.Add('1' + #9 + OutData.strings[OutData.Count - 2]);
- for i := OutData.Count - 3 downto 0 do
- begin
- if OutData.Names[i]<>OutData.Names[i+1] then k := k + 1;
- TempData.Add(IntToStr(k) + #9 + OutData.Strings[i]);
- end;
- //去除列表中多余的字符
- TempData.Text := StringsReplace(TempData.Text, [#61#9], [''], [rfReplaceAll]);
- TempData.SaveToFile('Score_Out.txt');
- InData.Free;
- TempData.Free;
- OutData.Free;
- end.
复制代码 |
评分
-
查看全部评分
|