输入自然对数可以直接用ln函数,5的自然对数就是ln(5);输入非对数可以用对数换底公式换算,写成关于自然对数的表达式,如:log5(7)可以写成ln(7)/ln(5);对数换底公式loga(b)=logc(b)/logc(a);
如果仅仅是四则运算
可以参考 pascal 版的《数据结构》
里面有实现四则运算算法
然后制定个规则,公式变量序列 x,y,z, 系列字母,满足最大参数要求
调用时提供可变参数,参数按公式变量序列来替代
函数原型建议如下:
Varriant function Operation(expressions: string,)
begin
// 1替换 x,y,z 值
// 2 将替换后的字串执行四则运算
// 3返回可变类型值
end;
experssions: 为你的计算表达式模板,即公式
为可变参数,统一用字串吧
如 i = Operation('y+(x015)','01','3');
即 x = 01 , y = 3
1、关于取整,你没说取整规则。
添加引用:Math
直接删除小数部分,返回整数:trunc,如果trunc(2234),则返回 2。其他:
trunc 和 round 是 system unit 里的函数,缺省就可以用。
floor 直接往小的取,比如 floor(-12355)=-124,floor(12355)=123
trunc 直接切下整数,比如 trunc(-12355)=-123, floor(12355)=123
ceil 直接往大的取,比如 ceil(-12355)=-123, ceil(12355)=124
round 计算四舍五入,比如 round(-12355)=-124,round(12355)=124
2、重启后text自动读取
两种方案,写注册表,或者写ini文件。
写注册表:不用额外添加文件,速度快,但会使注册表变大。不过数据少也无所谓了。
写ini文件:需要生成额外的文件。引用IniFiles。
procedure TForm1Button2Click(Sender: TObject);
var
ini:TIniFile;
num : integer;
name: string;
begin
Ini := TIniFileCreate('c:\aaini');
//读取
num:= iniReadInteger('nums','num1',0);
name:= iniReadString('names','name1','');
//写入
name := '李三';
num := 1;
iniWriteString('names','name1',name);
iniWriteInteger('nums','num1',num);
end;
在你的窗口退出时onclose事件,把每个text的内容写入ini文件
在你的窗口启动时onCreate事件或其他,读取,并给text赋值。
funtion getA(e: extended) : extend;
var
a : extended;
sum : extended;
begin
A := 1;
sum := 1;
e := //先赋值
for a:=1 to a do //这里的a为实际数值,即多少次方
begin
A := sum;
A := A e;
sum := A;
end;
result := sum ;
end;
procedure GetY();
var
e : extended;
i : extended;
X : extended;
Y : extended;
tmp : extended;
sum : extended;
begin
Y := 1;
tmp := 1;
X := ; //赋个实际值给X;
A := getA(e);
for i :=1 to B do //同样B也是实际数值
begin
tmp := sum;
tmp := tmp X;
sum := tmp ;
end;
Y := A tmp;
showmessage(floattostr(Y));
end;
跳转语句
Object Pascal的跳转语句有if和case两个 语句
if语句会计算一个表达式 并根据计算结果决定程序流程 在上文的例程中 根据ColorDialog Execute的返回值 决定窗体的背景颜色 if保留字后跟随一个生成Boolean值True或False的表达式 一般用 = 作为关系运算符 比较产生一个布尔型值 当表达式为True时 执行then后的语句 否则执行else后的代码 if语句也可以不含else部分 表达式为False时自动跳到下一行程序
if语句可以嵌套 当使用复合语句表达时 复合语句前后需加上begin…end else保留字前不能加 而且 编译器会将else语句视为属于最靠近的if语句 必要时 须使用begin…end保留字来强迫else部分属于某一级的if语句
case语句
case语句适用于被判断的变量或属性是整形 字符型 枚举型或子界型时(LongInt除外) 用case语句进行逻辑跳转比编写复杂的if语句容易阅读 而且程序代码整形较快
下面的例程显示一个使用case语句的窗体
建立如下的事件处理过程
procedure TForm Button Click(Sender: TObject); var Number : Integer; begin Number := StrToInt(Edit Text); case Number of : Label Caption := 奇数 ; : Label Caption := 偶数 ; : begin Label Caption := 在 到 之间 ; Form Color := clBlue; end; else Label Caption := 大于 或为负数 ; end; end;
执行程序 当Edit 部件接受到一个值 并按动 OK 按钮触发程序后 Number便被赋值为用户输入的数值 case语句根据Number的值判断该执行哪一条语句 象if语句一样 case语句也有可选择的else部分 case语句以end结尾 循环语句
Object Pascal的循环语句有三种 repeat while和for语句
repeat语句
repeat语句会重复执行一行或一段语句直到某一状态为真 语句以repeat开始 以until结束 其后跟随被判断的布尔表达式 参阅以下的例程
i := ; repeat i := i+ ; Writen(i); until i= ;
当此语句被执行时 窗体的下方会出现 到 的数字 布尔表达式 i= (注意 与其他语言不同的是 = 是关系运算符 而不能进行赋值 *** 作)直到repeat until程序段的结尾才会被计算 这意味着repeat语句至少会被执行一次
while语句
while语句和repeat语句的不同之处是 它的布尔表达式在循环的开头进行判断 while保留字后面必须跟一个布尔表达式 如果该表达式的结果为真 循环被执行 否则会退出循环 执行while语句后面的程序
下面的例程达到和上面的repeat例程达到同样的效果
i := ; while i< do begin i := i+ ; writeln(i); end;
for语句
for语句的程序代码会执行一定的次数 它需要一个循环变量来控制循环次数 您需要说明一个变量 它的类型可以是整形 布尔型 字符型 枚举型或子界型
下面的程序段会显示 到 的数字 i为控制变量
var i : integer; for i := to do writeln(i);
以上介绍了三种循环语句 如果您知道循环要执行多少次的话 可以使用for语句 for循环执行速度快 效率比较高 如果您不知道循环要执行多少次 但至少会执行一次的话 选用repeat until语句比较合适 当您认为程序可能一次都不执行的话 最好选用while do语句 程序模块
程序模块在Object Pascal中是很重要的概念 它们提供了应用程序的结构 决定了变量 属性值的范围及程序执行的过程 它由两个部分组成 可选择的说明部分和语句部分 如果有说明部分 则必在语句部分之前 说明部分包括变量说明 常量说明 类型说明 标号说明 程序 函数 方法的说明等 语句部分叙述了可执行的逻辑行动
在Delphi中 最常见的程序模块便是事件处理过程中的程序模块 下面的事件处理过程是含有变量说明部分的程序模块
procedure TForm Button Click(Sender Tobject); var {程序模块的说明部分} Name : string; begin {程序模块的语句部分} Name := Edit Text; Edit Text := Wele to Delphi +Name; end; {程序模块结束}
库单元也是程序模块 库单元的interface部分含有库函数 类型 私有 公有域的说明 也可以含有常量 变量的说明 这一部分可以作为程序模块的说明部分 在库单元的implementation部分中通常含有各种事件处理过程 它们可以视为模块的语句部分 是事件处理模块 库单元模块结束于库单元结束的end 处
程序模块中可以包含其他的程序模块 上文库单元模块中含有事件处理模块 而库单元模块实际是在工程程序模块中
所有的Delphi应用程序都有相同的基本结构 当程序逐渐复杂时 在程序中加入模块即可 例如在库单元模块中加入事件处理模块 向工程中加入库单元模块等 模块化编程使得程序结构良好 并且对数据具有保护作用
关于作用范围
标识符的作用范围
一个变量 常量 方法 类型或其他标识符的范围定义了这个标识符的活动区域 对于说明这个标识符的最小程序模块而言 此标识符是局部的 当您的应用程序在说明一个标识符的程序模块外执行时 该标识符就不在此范围内 这意味着此时执行的程序无法访问这个标识符 只有当程序再度进入说明这个标识符的程序模块时 才可以访问它
下面的示意图表示一个含有两个库单元的工程 每个库单元中又各有三个过程或事件处理过程
访问其他程序模块中的说明
您可以在当前的程序模块中访问其他程序模块中的说明 例如您在库单元中编写一个事件处理过程来计算利率 则其他的库单元可以访问这个事件处理过程 要访问不在当前库单元中的说明 应在这个说明之前加上其他应用程序的名称和一个点号( ) 例如 在库单元Unit 中有事件处理过程CalculateInterest过程 现在您想在库单元Unit 中调用这一过程 则可以在Unit 的uses子句中加入Unit 并使用下面的说明
Unit CalculateInterest(PrincipalInterestRate : Double)
lishixinzhi/Article/program/Delphi/201311/8504
第三行写错了吧?应该是20002+10003+6004请确认?如果是这样那代码如下DELPHI里新建一个窗体放置一个button两个edit下面都是代码,测试通过unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R dfm}procedure TForm1Button1Click(Sender: TObject);var x,y,z,i:Integer;begin x:=StrToIntDef(edit1Text,0); y:=x-2000; if(y>0)then z:=20002//设置z初始值 else z:=x2; i:=3;//设置i初始值 while (y>=1000) do//对y解析 Begin y:=y-1000;//每一级计算一次 z:=z+1000i; i:=i+1; end; if(y>0)then z:=z+yi;//计算零头 Edit2Text:=FormatFloat('0', z);end;end
答案补充
那这个应该可以解决问题了,你可以试试,有疑问再提
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)