假设该比赛规定第一名得9分,第2-8名分别得7-1分,那么得分和名次如下:
1001 张三 1.75米 第一名 9分
3412 李四 1.70米 第二名 6.5分((7+6)/2)
2387 刘德 1.70米 第二名 6.5分
1132 王妃 1.65米 第四名 5分
注意:第三名不存在,而2人并列第二名,则第二名和第三名的得分累加起来均分给二人。现在我可以根据录入的成绩进行自动排名,就是不知道怎么根据排名自动给分~如何实现??

解决方案 »

  1.   

    这小问题。还真有点麻烦,输入是名次表,比如你说的1,2,2....8,输出是1 9,2 6.5, 2 6.5, 4 5  procedure CaculateScore(Input, Return: TStrings);
      Var
        I, J, Total, Order, Count, NextOrder: Integer;
        Score: Array[1..8] Of Integer;
      begin
        For I:= 1 to 8 do
          Score[I] := 9 - I;
        Score[1] := 9;
        I := 0;
        Order := 1;
        Count := 1;
        Return.Clear;
        For I:= 0 to 7 do
        begin
          Order := StrToInt(Input[I]);
          if I = 7 then
            NextOrder := Order
          else
            NextOrder := StrToInt(Input[I+1]);
          if (Order = NextOrder) then
            Inc(Count)
          else
          begin
            Total := 0;
            for J := Order to Order + Count -1 do
              Total := Total + Score[J];
            for J :=0 to Count - 1 do
              Return.Add(Format('%d %f', [Order,  Total/Count]));
            Count := 1;
          end;
        end;
      end;
      

  2.   

    看不大明白哦~我那排名记录是在数据库里面的~怎么让他传值给那过程  还有那return  什么用~那个也要传值给他么 然后怎么返回所得的分数呢   ~希望高人指点下~谢谢了
      

  3.   

    不知道可可以
    建表
    代码,身高,姓名,  名次,得分,序号
    1001 张三 1.75米 第1名       1 
    3412 李四 1.70米 第2名       2
    2387 刘德 1.70米 第2名       3
    null null  null  null      4
    1132 王妃 1.65米 第4名       5
    1132 王妃 1.65米 第5名       6
    1132 王妃 1.65米 第5名       7
    null null  null  null      8
    1132 王妃 1.65米 第6名       9
    1132 王妃 1.65米 第7名       10
    可以分为两个部分:1:下一名为空,2:下一名部位空(名次)
    1:首先获取名次为空的序号 (当然这里可能有好多),数据循环利用序号-1为条件获取并列名次个数和分数
    2:不要上面那就是直接得分了,,,
      

  4.   

    非常感谢dirt提供的那算法 我会给你分的,不过如果我现在要它从数据库里去取数据,为什么显示为空呢 请问下这样把数据库里的数值赋给 input~~谢谢procedure TForm1.Button1Click(Sender: TObject);
     var Input,Return:TStrings;
    begin    Input:=TStringlist.Create;
        return:=tstringlist.Create;
        return.CommaText:='';
        adoquery1.Close;
        adoquery1.SQL.Clear;
        adoquery1.SQL.Add('select top 8 status from Score order by Achievement desc');
        adoquery1.Open;
        adoquery1.First;
        while adoquery1.Eof do
          begin
            input.Add(adoquery1.Fieldbyname('status').Value) ;
            adoquery1.Next;
          end;
          showmessage(input.CommaText);
       // input.Text:='1,2,2,4,5,6,6,8';
        //CaculateScore(Input, Return);
        //showmessage(return.CommaText);
    end;
      

  5.   

    数据库取就比较简单了。编号 姓名 身高   (名次) 分数
    1001 张三 1.75米 第一名 9分 
    3412 李四 1.70米 第二名 6.5分((7+6)/2) 
    2387 刘德 1.70米 第二名 6.5分 
    1132 王妃 1.65米 第四名 5分 select 
        编号 as 编号,
        姓名 as 姓名,
        '第'+cast((select count(1) from 表名 where 分数<Main.分数)+1) as varchar)+'名' as 名次,
        分数 as 分数
    from 表名 as Main
      

  6.   

    数据库取就比较简单了。编号 姓名 身高   (名次) 分数
    1001 张三 1.75米 第一名 9分 
    3412 李四 1.70米 第二名 6.5分((7+6)/2) 
    2387 刘德 1.70米 第二名 6.5分 
    1132 王妃 1.65米 第四名 5分 select 
        编号 as 编号,
        姓名 as 姓名,
        '第'+cast((select count(1) from 表名 where 分数<Main.分数)+1 as varchar)+'名' as 名次,
        分数 as 分数
    from 表名 as Main
      

  7.   

    原来我的代码写的有点问题~自己改了感谢大家的指导~特别是dirt