Newsgroup: it.comp.lang.pascal
Titolo: Conversione stringa-intero

Salve,
vorrei sapere... se io ho una stringa che contiene una cifra:
var a: string;
a:='59';
come posso assegnarne il valore a una variabile che non sia di tipo
stringa ? Qualcosa tipo:
var b: integer;
b:=val(a);
In modo poi da svolgere operazioni arimetiche su di essa. Ho visto
la funzione integer(x) , ma mi sembra lavori solo su char.
Grazie.

 ha scritto nel messaggio
news:353.893T760...@nospam.it...


 la funzione integer(x) , ma mi sembra lavori solo su char.
questa non e' proprio una funzione ma e' `casting': in pratica forzi il tipo
della variabile ad integer, quindi qualunque sia la variabile, vengono
il valora sara' quello dato dai primi due bytes considerati come un integer
Casting lo puoi fare con qualisiasi cosa, sempre con la sintassi
<Tipo>(<variabile>)   e ottieni un'espressione di tipo <Tipo>
il piu' semplice esempio e' `char(x)'  con x: byte che equivale alla funz
Chr ( ) della unit crt
--
Dreadnaut
(Life would be easier if I had the source code)

elevato alla x, dove x dipende dalla posizione del numero.
 Ok, grazie. Quindi il Pascal non offre nulla di suo. Va bene, diciamo
allora che mi creo la mia funzione. Ma cosa intendi per posizione ?
I risultati poi li sommo ? Ad esempio, se volessi convertire il numero
"32"...
-> "32" <-
(51-48)*10^1 + (50-48)*10^2
:-??
function(s: string);
var i,j: integer;
BEGIN
for i:= 1 to length(s) do
begin
    j:=j+ord(s[i]-48) -> poi ???
end;
END;
Ciao e grazie ancora.

 ha scritto nel messaggio
news:560.893T2341...@nospam.it...


beh la Val ( )  esiste effettivamente in pascal :-)
 Ah... ecco mi sembrava infatti. :) Però è implementata come
procedura e non come funzione.
 Grazie mille !

 procedura e non come funzione.
un cosi' grande ostacolo ? :-)


 ha scritto nel messaggio
news:353.893T760...@nospam.it...


              end;
(e in altri punti)
quando c'e' una sola istruzione i blocchi begin/end non sono necessari:
 if punto = true
  then pos := pospunto-2
  else pos := dmstr-1;


function elevazione(base,esponente:word):longint;
var n,j:longint;
begin
n:=1;
case esponente of
0: elevazione:=1;
1: elevazione:=base;
else begin
for j:=1 to esponente do
n:=base*n;
    elevazione:=n;
end;
end;
end;
Function strtoint(S:String):longint;
Var I:Byte;
    N,j:word;
Begin
N:=0;
j:=0;
For I:=length(s) downTo 1 Do begin
    N:=(elevazione(10,j) * (Ord(S[I])-48))+n;
    j:=j+1;
    end;
strtoint:=N;
End;

> function elevazione(base,esponente:word):longint;
no vabbeh.. dato c'e' piu' o meno lo stesso `errore' di
Gianfranco sara' meglio spiegare:
non si puo' ad ogni cifra fare un ciclo per elevarla alla
potenza di dieci giusta: e' troppo `costoso'
Dato che noi le cifre le leggiamo gia' in ordine, perche'
non approfittarne ?
 var 
  s: string;
  n: byte;
  res: longint;
 
 res := 0;
 if s[1] = '-' then
  for n = 2 to length(s) do
   res = - byte(s[n]) + 48 - res * 10
 else
  for n = 1 to length(s) do
   res = byte(s[n]) - 48 + res * 10;
 senza controlli... con c'e' un if in piu' ogni ciclo
 per i reali invece laprima parte e' uguale... la seconda e' l'inverso
 per nonduplicare troppo codice conviene tenere il segno in una var
 var
  segno : boolean;
  res   : real;
  cfd   : real;
  i,d   : byte;
 res := 0;
 if s[1] = '-' then 
  begin
   segno := true;
   i := 2;
  end
 else
  begin
   segno := false;
   i := 1;
  end;
 repeat
  res := byte(s[i]) - 48 + res * 10;
  inc (i);
 until s[i] = '.';
{*}
 cfd := 0;
 for d := length(s) downto i+1 do
  cfd := byte(s[d]) - 48 + cfd / 10;
 res := res + cfd / 10;
 [credo... ho scritto questo mex a 20 km dal piu' vicino compilatore
  pascal... poi a casa controllo :) ]
 {*} se potete lavorare sulla stringa qua ci starebbe un s[i]= #0;
  cosi' si puo' fare il ciclo `downto i' e res := res + cfd;
  si risparmiano <num.di.cifre.decimali> somme :)
 
saluti,
un Dreadnaut ovunque tranne che a casa
(anche se piove sempre...)

ops... in fondo ho svanito un
if segno then res = -res;
ciao ancora,
Dreadnaut che le ballerine di marzapane cantano canzoni metal ?

 beh si potrebbe ottimizzare a paletta...
cosa sarebbe questa paletta?
cmq grazie 1000 per i consigli. in fondo credo che una certa tecnica si
acquisisca solo dopo un po' di tempo, ci vuole esperienza, infatti saper
programmare non e', per quanto mi riguarda, saper mettere una serie di
istruzioni in modo da raggiungere il fine e basta, ma bisogna raggiungerlo
nel miglior modo possibile, e per fare cio', io di strada ne ho ancora un
po'. cmq grazie mille ancora


 cosa sarebbe questa paletta?
temo che l'espressione sia un po' `locale'... diciamo che si
potrebbe ottimizzare in diversi punti / parecchio :-)


"Dreadnaut" <Drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:E_UC8.40534$5k4.8...@twister2.libero.it...


 potrebbe ottimizzare in diversi punti / parecchio :-)
ho capito ho capito, come dire "in toto", no?


> ho capito ho capito, come dire "in toto", no?
beh non proprio... in toto vuol dire "caccia via e rifai la procedura",
ottimizzare a paletta vuol dire eliminare un 20% di codice, mentre
il resto va bene :-)


il resto va bene :-)
 Diciamo che "a paletta" è sinonimo "alla massima velocità, al massimo".
 Quindi "ottimizzare a paletta", significa "ottimizzare moltissimo".
Saluti.
--
    _
 Fa/_)io         A1200 PowerTower, WB 3.9, 060@60, 64MB, FireBall 13GB,
  /__)enedetti   Voodoo3, Digicom-10/100, Philips PCRW1208 - TFT-140/S.

 stringa ? Qualcosa tipo:
Usa la procedura VAL, definita in questo modo:
PROCEDURE VAL (STRINGA, NUMERO, ERR)
Nel tuo caso, ammesso che voglia assegnare il numero a B, basta fare:
VAL (A, B, ERR)
Dove ERR è una variabile INTEGER contenente 0 se non è stato riscontrato
alcun errore oppure un valore diverso da 0 in caso i un errore di
conversione.
Cooper.