假设当X=1 2 3 4 5 6 7 8 9 10的时候
Y分别等于10 25 35 40 52 68 78 82 90 100
现在要求,当X为小数时,Y则平均分其中的差量。
举个例子,当X=4.5时,因为4和5之间相差了12,所以Y此时等于46。当X=9.5时,因为9和10之间相差了10,所以Y=95
依此类堆。请给出最合理最简洁的代码,因为数据有很多。
顺便要求对Y值四舍五入取整。谢谢,不胜感激! 

解决方案 »

  1.   

    const
        a: array[1..10] of Real = (10, 25, 35, 40, 52, 68, 78, 82, 90, 100);
    var
        x, y: Real;
        index: Integer;
    begin
        x := 4.5;
        index := trunc(x); //取出下标
        y := a[index] + (a[index + 1] - a[index]) * (x - index);
        y := Round(y); //对Y值四舍五入取整
        ShowMessage(FloatToStr(y));
    end;
      

  2.   

    楼上的不对吧。
    应该用二维数组或者两个数组
    分整数和小数的情况计算Y的值。整数时,Y等于下标相同的X数组中的值
    小数时,Y等于对应两个相邻下标的平均值代码明天写,太困了。周末愉快。
      

  3.   

    不好意思,今天才想起来,让你坐等一天。
    下面是代码,要运行程序可以留个邮箱,我全部发你。
    输入的有效性判断没怎么做,功能问题应该差不多了
    有问题再联系,记得多给点分我哈,最好全部,嘿嘿
    unit UMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TFrmMain = class(TForm)
        Label1: TLabel;
        Edt_Num: TEdit;
        Label2: TLabel;
        Edt_SeqShow: TEdit;
        Btn_CreatSeq: TButton;
        Label3: TLabel;
        Edt_X: TEdit;
        Label4: TLabel;
        Edt_Y: TEdit;
        Btn_GetY: TButton;
        procedure Btn_CreatSeqClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Btn_GetYClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      FrmMain: TFrmMain;
      Seq: array of Integer;const
      EmptyStr = '';
      BlankStr = ' ';
      ErrInput = '输入X不合法';
    implementation{$R *.dfm}procedure TFrmMain.Btn_CreatSeqClick(Sender: TObject);
    var
      n,i,m: integer;
      TemStr: string;
    begin
      n := StrToInt(Trim(Edt_Num.Text));
      SetLength(Seq,n);  m := n*20;  //构造随机数的范围,暂时将个数乘20,尽量避免重复。
      for i := 0 to n - 1 do
      begin
        Seq[i] := random(m);
      end;   TemStr := EmptyStr;
      for i := 0 to n - 1 do
      begin
        TemStr := IntToStr(Seq[n - 1-i]) + BlankStr +TemStr;
      end;  Edt_SeqShow.Text := TemStr;
    end;procedure TFrmMain.Btn_GetYClick(Sender: TObject);
    var
      TemStr: String;
      TemZS: string; //整数部分
      IntTemZS: integer; 
      IntX,IntY: integer;
      i: Integer;
      SeqNum: Integer;
      TemY: Double;
    begin
      TemStr := Trim(Edt_X.Text);
      SeqNum := length(Seq);
      i := Pos('.',TemStr);  if i > 0 then
      begin  //有小数的情况
        TemZS := Copy(TemStr,1,i-1);
        IntTemZS := StrToInt(TemZS);    if SeqNum > IntTemZS  then
        begin
          TemY :=  (Seq[IntTemZS-1] + Seq[IntTemZS])/2;
          IntY := Trunc(TemY + 0.5);
          Edt_Y.Text := IntToStr(IntY);
        end
        else
          ShowMessage(ErrInput);
      end
      else
      begin //没有小数的情况
        IntX := StrToInt(TemStr);
        if SeqNum >= IntX  then
        begin
          IntY := Seq[IntX-1];
          Edt_Y.Text := IntToStr(IntY);
        end
        else
          ShowMessage(ErrInput);
      end;  
    end;procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       Finalize(Seq);
    end;end.
      

  4.   

    谢谢,不胜感激,我邮箱一零九九七三#qq.com 帮我发一份吧,拜托了。大写数字换成阿拉伯数字即可。