PDA

View Full Version : C++ una quesione di stringhe


misterx
05-12-2002, 20:28
Problema


siano date due stringhe così formate:

N.B: i (.......) stanno a rappresentare che nella parte sinistra vi sono altri caratteri e vanno filtrati


.................A-332.359$
.................A52.589$


la fine di tali stringhe è segnalata dal caratere ( $ )

Da queste stringhe si desidera:

a) prelevarne la parte numerica (-332.359) facendo la scansione delle stringhe tenendo presente che tale parte numerica rappresenta un angolo nella notazione "sessadecimale"

b) convertirla nel tipo di dato più appropriato

c) calcolare dalla suddetta parte numerica il suo "angolo complementare?" (non ricordo se si chiamava così)
e cioè:

alfa_gradi = 360 +/- (......)

tenendo in cosiderazione che dopo il punto decimale si desidera considerare solo 3 cifre

e) riconvertire nuovamente il tutto in formato stringa


chicca finale

Usando la minor quantità di codice possibile

vincio
05-12-2002, 20:37
Mah, io ci provo...

float gradi;
char *s[28] = ".................A-332.359$";

s[strlen(s)-1] = '\0';
gradi = atof(&s[18]);

// ...e hai in gradi l'angolo da lavorare

/\/\@®¢Ø
05-12-2002, 23:01
domanda base. Che stringhe stai utilizzando ? char* o std::string ?
Nel secondo risulta molto piu' semplice.

/\/\@®¢Ø
05-12-2002, 23:27
ad esempio, modo molto pigro:

(n.b.: suppongo che 'A' sia il carattere che identifica l'inizio dei gradi )


#include <string>
#include <sstream>

using namespace std;

...


string foo( const string& s )
{
string::size_type i = s.find_last_of('A');
string num1 = s1.substr( i, s.end() -1 );
float f;
{
istringstream in(num1);
in >> f;
}

// Intendi dire l'angolo complementare ( 90.0 - x ) oppure l'opposto ? - x ).
f = -f;

// Il dato va salvato nella vecchia stringa ? Suppongo di sì

// Per prima cosa salviamo la parte alfanumerica
string result = string( s[0], s[ i+1 ] );
// Aggiungiamo il numero
ostringstream r(result);
// Impostiamo un numero fisso (3) di decimali
r.precision( 3 )
r << f;
// E infine il carattere di terminazione
r << '$';
return r.str()
}



Il trucco sta nell'usare la stringa come un canale ( isstream e osstream ) cosi' che puoi sfruttare la formattazione fornita dal sistema ( anche con le chiamate del C penso si possa fare qualcosa del genere ).


domande varie...


a) prelevarne la parte numerica (-332.359) facendo la scansione delle stringhe tenendo presente che tale parte numerica rappresenta un angolo nella notazione "sessadecimale"

Ovvero un decimale tra 0.000 e 360.000 o sbaglio ?


b) convertirla nel tipo di dato più appropriato

E cioe' ? Un float suppongo


c) calcolare dalla suddetta parte numerica il suo "angolo complementare?" (non ricordo se si chiamava così)
e cioè:
alfa_gradi = 360 +/- (......)

Vedi sopra.. complementare od opposto ? :p


e) riconvertire nuovamente il tutto in formato stringa

da ributtare nella stessa stringa ?



chicca finale

Usando la minor quantità di codice possibile
fatto ( forse :D )


Disclaimer: codice non testato. Sicuramente ci sono errori e qualche indice sara' sbagliato ( i+1 ? i-1 ? :D ).
Serve soltanto per dare l'idea del funzionamento.


... infatti ho subito trovato un errore (corretto) :D ...
... secondo errore corretto ... :D

misterx
09-12-2002, 20:11
io sono riuscito a scrivere tutto su di una riga ma, il codice è illeggibile:)

mi è sparita una discussione però:(