Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 5391|回复: 7

Lazarus宝藏,等你来发现(回复论坛网友的成绩统计问题)

[复制链接]

该用户从未签到

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

评分

参与人数 2威望 +16 收起 理由
+ 5 优秀文章
猫工 + 11 原创内容

查看全部评分

回复

使用道具 举报

该用户从未签到

发表于 2009-11-17 14:52:41 | 显示全部楼层
这么好的文章,要好好看一下
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-11-30 00:37:46 | 显示全部楼层
留个脚印方便查找,猫老大,怎么论坛不能有收藏哦。
有收藏放便多了,可以随时查找到。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-4-22 14:04:19 | 显示全部楼层
路过,收藏
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-10-23 20:11:53 | 显示全部楼层
顶啊~
不错...............
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-10-26 10:47:46 | 显示全部楼层
作个学习记号!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-10-30 16:01:55 | 显示全部楼层
相信Lazarus中还有很多宝藏
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-1-8 13:26:14 | 显示全部楼层
StringsReplace 函数很牛逼啊
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-7-2 01:20 , Processed in 0.038977 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表