Scientific Calculator

(public) Giordano/FunzioniStringa

By Giordano Giordano Cignani

// 22/03/2020
	
Char=function(x){if(x==37 or x==38 or x>=127)->"null" else char(x)};
ASC=function(){var asc=ones(8,16);var k=-1;
    var tt=MAP(x->(k+=1),asc);MAP(x->[x,Char(x)],tt)};
// in una stringa legge il carattere alla posizione kk	
readc=function(s,kk){var k = (kk==null) ? 0 : kk;s[k]};
// [primo char di un stringa,la parte rimanente]
shiftc=function(s){var sl=string:split(s,"");
    [shift(sl),string:join(sl)]};
// posizione del carattere "c" nella stringa "s"; altrimenti -1
findc=function(c,ss){var s=vertype(ss,"string","");var k=0;var j =len(s);
    while  ((k<j) and (readc(s,k) != c)) ->k+=1;k<j ? k : -1};
//trova un carattere di "str" in "s". [posizione,carattere]; altrimenti [-1,null]
findstr=function(str,ss){var s=vertype(ss,"string","");
		var k=0;var j =len(s);var c="";var p=-1;
    while  (k<j) -> (c=readc(s,k);
        p=findc(c,str);
        if (p == -1) -> (k+=1) else (j=k));
    (p== -1)? [-1,null] : [k,s[k]]};
// sottostringa dalla posizione k per una lunghezza lun o fine stringa,
substr=function(ss,k,lun){var s=vertype(ss,"string","");
	var (sj,j,sl)=[[],k,string:split(s,"")];
    while (j< min(k+lun,len(s)))->(push(sj,sl[j]);j+=1);
    string:join(sj)};
	
// [valore della prima sequenza numerica in strng,parte residua della stringa]
val2=function(strng){var t:ss=(strng==null) ? "" : clone(strng);
    var (d,v,cif,f,fd,segno,buono,ex,due)=[0,0,clone(cifre),false,false,1,true,0,true];
// Funzioni
	var est=function(ch,st){findc(ch,st) != -1};
	var aggiornastr=function(valid,dest){var cc=findstr(valid,dest)[0];
		(cc != -1) ? substr(dest,cc,len(dest)): ""};
	var azzera=function(){segno= 1;fd=false;v=0;d=0};
	var GUT=function(){
		while (buono) -> (
        var (c,t:ss)=(var nn=shiftc(t:ss);if (nn[0]==null) -> nn[0]="";nn);
		CASE([
			(est(c,cifre) or (c=="")),x-> buono=false;
			est(c,"+-"),              x-> (if (c=="-")->segno*= -1);
			(c==".") and est(t:ss[0],cifre),                 x-> fd=true;
			due,                      x-> (t:ss=aggiornastr(concat("+-.",cifre),t:ss);azzera());
            not due,                  x-> buono=false
			]));
		if (not fd) -> cif=concat(".",cif);
        while (findc(c,cif) != -1)->(
          if fd ->d+=1; 
          v= (c==".") ? (fd=true;cif=shiftc(cif)[1];v) :(f=true;v*10+(charCode(c)-48));
		  var(c,t:ss)=shiftc(t:ss));
        if (c != null) ->t:ss=concat(c,t:ss);
	f ? v*segno*10^ -d : null};
// Fine Funzioni    
	t:ss=aggiornastr(concat("+-.",cifre),t:ss);
	var vv=GUT();
     due=false; azzera(); 
    if (f and (findc(t:ss[0],"eE") != -1) and
			(findc(t:ss[1],concat("+-.",cifre)) != -1)) ->(
                buono=true;
                t:ss=shiftc(t:ss)[1];
                ex=GUT();ex= (ex==null) ? 0 : ex);
	[vv= f ? vv*10^ex : vv,t:ss]
	};
	
// valore della prima sequenza numerica in strg
val=function(strg){val2(strg)[0]};
// tutti i valori delle sequenze numeriche in strg
VAL=function(strg){var sg=[];ss=clone(strg);
    while (ss != "") ->(var sn=val2(ss);
        if (sn[0] != null) -> push(sg,sn[0]);
		ss=sn[1]);sg};

spam? | offensive?

1 Comment

Sign in to leave a comment