Profilo di Hao电子小虫 PlusBlogElenchiGuestbook Strumenti Guida

Blog


PasCalc在Google创建项目,SVN提交成功

认真查看了GPL协议,简单学习了TortoiseSVN,已经让PasCalc使用了GPL v3开源,并在Google Code立项。

PasCalc2在Google Code的项目:
http://code.google.com/p/pascalc/

BETA(090626)版本下载:
http://pascalc.googlecode.com/files/pascalc2_beta_090626.zip

Bug请在
http://code.google.com/p/pascalc/issues/list
提交。

Cygwin+Gnome实在难整

    今天好不容易设好了Cygwin Ports服务器,下载安装好了Gnome包,不过发现还是整不出桌面。想过KDE,它有KDE on Windows,不过与Cygwin不一个平台,算了吧。目前能用X,不过实在难看,希望Gnome能早日安装好,大不了自己编译。

PasCalc II Beta Test --- 强大的计算器

C语言写的,窝了好久,总算发布了。像彭勃这样的高手可以自行阅读源码,推荐安装codeblocks阅读,方便管理。

PasCalc II Beta Test 帮助

一.简介
    此软件是一个强大的公式计算器,可以进行多种科学运算,可以实现普通科学计算器大部分功能。采
用C语言编写,控制台程序,可以在不同操作系统使用(在Linux、Winodws 2000、Windows XP测试过)。

二.公式规范
    1.一个公式必须写在两个分隔符(空格、换行符)中,建议不要写在同一行;
    2.公式长度不超过255个字符;
    3.任何公式由以下部分构成:数字(如123)、变量(如X)、常量(如pi)、运算符(如+)、函数
(如sin())、后置运算符(如%);
    4.对于虚数,可以直接表示,如6i+2,注意,i不同于I;
    5.公式均采用计算机语言中常用的线性格式,即:函数后括号中写参数,开方、平方等运算一律使用
函数或运算符表示;
    6.在数学上可以省略称号的情况下可以省略乘号,但运算顺序不变;
    7.最后的若干个连续括号可以省略。

三.变量及定义
    1.本程序使用A到Z二十六个英语大写字母表示变量;
    2.M可以使用m+、m-运算进行结果累加(减),mc执行清空;
    3.X用于函数列表,但列表后仍保留原值;
    4.命令dim *用于定义变量,其中*为变量名,回车后输入代入该变量的公式即可。

四.常量
    1.常量由数个小写字符构成;
    2.常量不可改变,但ans常量随上一次计算结果而改变;
    3.常量列表:
        ans     记录上一次计算结果
        pi      圆周率
        e       自然对数的底
        fai     黄金比例数(1.618)
        c       光速(m/s)
        i       虚数单位。

五.运算符及函数优先级
    第零级
        ( )             括号
    第一级(函数)
        abs(a)          a的绝对值
        sin(a)          弧度a的正弦
        cos(a)          弧度a的余弦
        tan(a)          弧度a的正切
        asin(a)         a的反正弦(弧度)
        acos(a)         a的反余弦(弧度)
        atan(a)         a的反正切(弧度)
        sinh(a)         a的双曲正弦
        cosh(a)         a的双曲余弦
        tanh(a)         a的双曲正切
        asinh(a)        a的双曲反正弦
        acosh(a)        a的双曲反余弦
        atanh(a)        a的双曲反正切
        log(a,b)        b以a为底的倒数
        ln(a)           a的自然对数
        exp(a)          a的e次方
        evo(a,b)        a的b次方根
        sqr(a)          a的平方
        sqrt(a)         a的平方根
        int(a)          a的整数部分
        rnd(a)          a四舍五入到整数
        frac(a)         a的小数部分
        hypot(a,b)      以a、b为直角边的直角三角形斜边长
        creal(a)        复数a的实部
        cimag(a)        复数a的虚部
        conj(a)         a的共轭复数
        arg(a)          以弧度表示复数a的相位角(或辐角)
        proj(a)         复数a在Riemann域上的投影
        sum(a,b...)     所有参数之和
        ave(a,b...)     所有参数的平均数
        median(a,b...)  所有参数的中位数
    第二级(后置运算符)
        a%              百分之a
        a'              转换角度a为弧度
        a!              a的阶乘
    第三级
        a^b             a的b次方
    第四级
        a*b             a与b的积
        a/b             a与b的商
    第五级
        a+b             a与b的和
        a-b             a与b的差

    注意,省略的乘号也作为乘号。

六.命令
    dim *   定义变量*
    show    显示所有变量
    clr     清空变量及ans
    func    函数列表模式
    m+      变量M累加
    m-      变量M累减
    mc      清空M
    quit    退出程序

七.函数列表模式
    该模式用于将函数随自变量变化的结果输出,使用func命令进入,出现“f(X)=”后输入以X为自变量
的函数,如X^2+7,回车后出现“Start:”,输入X的起始值(可以为公式),出现“End:”,输入X的结束值,出现“Step:”,输入X变化的步长,回车即可出现结果,第一列为X的值,第二列为函数值。

Pascalc Alpha Test 4 (2008.11.22)

program PasCalc;

uses math;

const VARNAME:set of char=['A'..'Z'];
      NUMNAME:set of char=['0'..'9','.'];
      OPRNAME:set of char=['+','-','*','/','^','(',')',','];
      FUNNAME2:set of char=['%','''','"','!'];
      HOW_MANY_FUN=24;
      FUNNAME:array[1..HOW_MANY_FUN]of string=
      ('abs','sin','cos','tan','cot','asin','acos','atan','sinh','cosh','tanh',
       'asinh','acosh','atanh','log','ln','exp','evo','sqr','sqrt','int','rnd',
       'frac','hypot');

var str_in:string;
    len:byte;
    rd:array[0..100]of string;
    va:array['A'..'Z']of float;

function isfun(s:string):boolean;
 var i:byte;
 begin
  isfun:=true;
  for i:=1 to HOW_MANY_FUN do
   if s=FUNNAME[i] then exit;
  isfun:=false;
 end;

function fc(s:string; a,b:float):float;
 begin
  if s='abs' then fc:=abs(a);

  if s='sin' then fc:=sin(a);
  if s='cos' then fc:=cos(a);
  if s='tan' then fc:=tan(a);
  if s='cot' then fc:=cotan(a);

  if s='asin' then fc:=arcsin(a);
  if s='acos' then fc:=arccos(a);
  if s='atan' then fc:=arctan(a);

  if s='sinh' then fc:=sinh(a);
  if s='cosh' then fc:=cosh(a);
  if s='tanh' then fc:=tanh(a);

  if s='asinh' then fc:=arcsinh(a);
  if s='acosh' then fc:=arccosh(a);
  if s='atanh' then fc:=arctanh(a);

  if s='evo' then fc:=power(b,1/a);
  if s='log' then fc:=logn(a,b);
  if s='ln' then fc:=ln(a);
  if s='exp' then fc:=exp(a);
  if s='sqr' then fc:=sqr(a);
  if s='sqrt' then fc:=sqrt(a);

  if s='int' then fc:=int(a);
  if s='rnd' then
   if frac(a)>=0.5 then
    fc:=int(a)+1 else fc:=int(a);
  if s='frac' then fc:=frac(a);
  if s='hypot' then fc:=hypot(a,b);
 end;

function yxj(s:string):shortint;
 var y:shortint;
 begin
  if (s='')or(s=')')or(s=',') then y:=-1 else
   if (s='+')or(s='-')then y:=0 else
    if (s='*')or(s='/') then y:=1 else
     if s='^' then y:=2 else y:=3;

  yxj:=y;
 end;

procedure til(s:string; var num:float);
 var i:byte;
     tmp:float;
 begin
  tmp:=0;

  if s='%' then tmp:=num/100;
  if s='''' then tmp:=degtorad(num);
  if s='"' then tmp:=gradtorad(num);
  if s='!' then
  begin
   tmp:=1;
   for i:=1 to trunc(num) do
    tmp:=tmp*i;
  end;

  num:=tmp;
 end;

procedure readexp(s:string);
 var i:byte;
     tmp:string;
     ischar:boolean;
 begin
  len:=0;
  tmp:='';
  for i:=0 to 100 do
   rd[i]:='';

  if s[1] in VARNAME+NUMNAME then
   ischar:=false else ischar:=true;

  for i:=1 to length(s) do
  begin
   if s[i] in (OPRNAME+FUNNAME2) then
   begin
    if tmp<>'' then
    begin
     inc(len);

     if tmp[1] in VARNAME then
      str(va[tmp[1]],rd[len]) else
      rd[len]:=tmp;

     tmp:='';
    end;

    inc(len);
    rd[len]:=s[i];

    if (s[i+1] in VARNAME+NUMNAME) then
     ischar:=false else ischar:=true;

    continue;
   end;

   if s[i] in VARNAME+NUMNAME then
   begin
    if ischar then
    begin
     ischar:=false;
     inc(len);

     if tmp[1] in VARNAME then
      str(va[tmp[1]],rd[len]) else
      rd[len]:=tmp;

     tmp:='';
    end;
   end else
    if not(ischar) then
    begin
     ischar:=true;
     inc(len);

     if tmp[1] in VARNAME then
      str(va[tmp[1]],rd[len]) else
      rd[len]:=tmp;

     tmp:='';
    end;

   tmp:=tmp+s[i];
  end;

  if tmp<>'' then
  begin
   inc(len);

   if tmp[1] in VARNAME then
    str(va[tmp[1]],rd[len]) else
    rd[len]:=tmp;
  end;
 end;

function calc(b,f:integer):float;
 var num:array[0..50]of float;
     sym:array[0..50]of string;
     i,j,kuo,k2,nm,sm:byte;
     code:integer;
     ktmp,ktmp2,n:float;

 procedure pop;
  begin
   dec(nm);

   if sym[sm]='+' then
    num[nm]:=num[nm]+num[nm+1];

   if sym[sm]='-' then
    if nm=0 then
     num[nm+1]:=num[nm]-num[nm+1]
    else
     num[nm]:=num[nm]-num[nm+1];

   if sym[sm]='*' then
    num[nm]:=num[nm]*num[nm+1];

   if sym[sm]='/' then
    num[nm]:=num[nm]/num[nm+1];

   if sym[sm]='^' then
    num[nm]:=power(num[nm],num[nm+1]);

   sym[sm]:=chr(0);
   if nm>0 then num[nm+1]:=0;
   dec(sm);
  end;

 begin
  nm:=0;
  sm:=0;
  fillchar(num,sizeof(num),0);

  for i:=0 to 50 do
   sym[i]:='';

  i:=b;
  while i<f do
  begin
   inc(i);

   if rd[i]='(' then
   begin
    j:=i;
    kuo:=1;
    k2:=0;

    repeat
     inc(j);

     if rd[j]='(' then inc(kuo);
     if rd[j]=')' then dec(kuo);
     if (rd[j]=',')and(kuo=1)then k2:=j;
    until (kuo=0)or(j>f);

    if k2=0 then
     ktmp:=calc(i,j-1) else
     begin
      ktmp:=calc(i,k2-1);
      ktmp2:=calc(k2,j-1);
     end;

    i:=j;
    if isfun(sym[sm]) then
    begin
     ktmp:=fc(sym[sm],ktmp,ktmp2);
     sym[sm]:='';
     dec(sm);
    end;

    inc(nm);
    num[nm]:=ktmp;
   end else
   begin
    val(rd[i],n,code);

    if code=0 then
    begin
     inc(nm);
     num[nm]:=n;
    end else
    begin
     if not((isfun(rd[i]))or(rd[i][1] in FUNNAME2)) then
      while (yxj(rd[i])<=yxj(sym[sm]))and(sm>0) do
       pop;

     if (length(rd[i])=1)and(rd[i][1] in FUNNAME2) then
      til(rd[i],num[nm]) else
      begin
       inc(sm);
       sym[sm]:=rd[i];
      end;
    end;
   end;
  end;

  while sm<>0 do pop;

  calc:=num[1];
 end;

procedure comp(s:string);
 begin
  readexp(s);
  va['M']:=calc(0,len);
  writeln(va['M']);
 end;

procedure dim;
 var ch:char;
     s:string;
 begin
  write('Var:');
  readln(ch);
  write(ch,'=');

  if ch in VARNAME then
  begin
   readln(s);
   readexp(s);
   va[ch]:=calc(0,len);
   writeln(ch,'=',va[ch]);
  end else
   writeln('Error');
 end;

procedure show;
 var i:char;
 begin
  for i:='A' to 'Z' do
   writeln(i,'=',va[i]);
 end;

begin
 writeln;
 writeln('##################################################');
 writeln('# Pascalc Alpha Test 4                           #');
 writeln('#  by Cui Hao                                    #');
 writeln('#     2008.11.22                                 #');
 writeln('#                                                #');
 writeln('# Please read "README.TXT"(Chinese) before use.  #');
 writeln('##################################################');

 va['P']:=pi;
 va['E']:=exp(1);

 repeat;
  write('> ');

  readln(str_in);

  if (str_in<>'')and(str_in<>'quit') then
   if str_in='dim' then
    dim else
    if str_in='show' then
     show else
     if str_in='clr' then
     begin
      fillchar(va,sizeof(va),0);
      va['P']:=pi;
      va['E']:=exp(1);
     end else comp(str_in);
 until str_in='quit';
end.

google,baidu真够意思,Numbeng上去了

百度仅此一条
 
谷歌第二条
 
号外:
Datsir也上去了(比Numbeng多,不过大多数出自本博客)

庆祝奥运会开幕,推出Numbeng GUI 1.1(把数字转换为各种语言)

哈哈哈哈,重大升级,放弃了Pascal,我用VB卷土重来了!
  1.0升级内容:
  1.图形界面,适用于32位Winodows,支持汉语;
  2.支持范围扩大,英语支持到正负1×10E18,汉语到正负1×10E20,并支持小数;
  3.英语分为英式美式两种;
  4.取消了法语支持;
  5.优化了代码。
 
  1.1:
  1.优化了界面,采用菜单
  2.界面可转化为英语
  3.溢出自动报错
  4.采用动态数组
 

Numbeng 0.3 出品

     如题,今天我修正了一个小错误,在中文翻译中整100,1000...的数翻译中会多一个Ling。
     简单说一下,Numbeng是一个可以将数字转换为英语,法语,汉语拼音的软件,DOS/WINDOWS平台,今年寒假用Pascal编。
     将来我准备将此软件进行重大升级,可以支持超过长整型的数(要用高精度了)。
 
PAS:
EXE: