PDA

View Full Version : [C]problema con programmino semplice


Dr.Speed
24-01-2007, 13:47
ho un problema con l'ultima parte di questo programmino che deve farmi scrivere a schermo una stringa con i numeri che gli dico io e poi trasformarla in un numero reale, il problema si pone sulle ultime 10 righe,

il problema credo sia qui:
numero=numero+((v[i]-48)/j);

#include <stdio.h>
#include <conio.h>

void main()
{
const char INVIO=13;
char c, v[11];
int i=0, oldx, oldy, segno=1, spia=0;
float numero=0;

do
{
c=getche();

switch(c)
{
case '0':

v[i]=c;
i++;
v[i]='\0';

break;

case '1':

v[i]=c;
i++;
v[i]='\0';

break;

case '2':

v[i]=c;
i++;
v[i]='\0';

break;

case '3':

v[i]=c;
i++;
v[i]='\0';

break;

case '4':

v[i]=c;
i++;
v[i]='\0';

break;

case '5':

v[i]=c;
i++;
v[i]='\0';

break;

case '6':

v[i]=c;
i++;
v[i]='\0';

break;

case '7':

v[i]=c;
i++;
v[i]='\0';

break;

case '8':

v[i]=c;
i++;
v[i]='\0';

break;

case '9':

v[i]=c;
i++;
v[i]='\0';

break;

case '-':

if(i==0)
segno=-1;

break;

case ',':

if(spia==0)
{
v[i]=c;
spia=1;
i++;
v[i]='\0';
}

break;

case INVIO:

break;

case '+':

if(i==0)
segno=1;

break;

default:

oldx=wherex();
oldy=wherey();
gotoxy(1,25); //Va a fine schermo
printf("Carattere sbagliato! Premi un tasto per continuare...");
getch();
gotoxy(1,25); //Va a fine schermo
printf(" ");
gotoxy(oldx-1, oldy); //Torna indietro al numero errato inserito
printf("%c\b", 32); //Cancella con back space



}


}while(c!=INVIO);

printf("\nVisual string ");
printf("%s", v);
printf("\nStringa convertita ");

int spia2=0;
float numero2=0;
i=0;
int j=1;

do
{ //Conversione di una stringa in numero
if(v[i]!=',' && spia==0)
{

numero = numero*10+(v[i]-48);


}

if(v[i]==',')
{
spia=1;
i++;
}

if(spia==1)
{
j=j*10;
numero=numero+((v[i]-48)/j); //qui credo sia il problema!!
}

i++;

}while(v[i]!=0);

numero=numero*segno;

printf("%f", numero);


}

yorkeiser
24-01-2007, 14:25
Funziona se usi dei double al posto dei float, stai sforando sulla dimensione massima

float numero -> double numero
float numero2 -> double numero2

Dr.Speed
24-01-2007, 14:41
pero' se scrivo un numero anche piccolissimo tipo 12,1 non me lo converte in reale, ora provo, grazie :)

Dr.Speed
24-01-2007, 14:52
edit, scusate

Dr.Speed
24-01-2007, 16:12
Funziona se usi dei double al posto dei float, stai sforando sulla dimensione massima

float numero -> double numero
float numero2 -> double numero2
niente, fa la stessa cosa :cry:

Dr.Speed
24-01-2007, 21:58
nessuno ha qualche idea?

yorkeiser
25-01-2007, 10:18
Uhm, non ho capito che problema hai ora: compilando il tuo codice originale storpiava i numeri elevati, evidente problema di sforamento sui bit; utilizzando i double ho fatto due prove e li convertiva bene. Dovresti essere un attimino più specifico su cosa non va

Dr.Speed
25-01-2007, 18:59
Uhm, non ho capito che problema hai ora: compilando il tuo codice originale storpiava i numeri elevati, evidente problema di sforamento sui bit; utilizzando i double ho fatto due prove e li convertiva bene. Dovresti essere un attimino più specifico su cosa non va
si, scusami, non mi converte i numeri con piu di una cifra dopo la virgola, ad esempio funziona con 6876434324,9 ma non funziona con 1,12

yorkeiser
26-01-2007, 12:50
Ah capito, è un convertitore anche sui decimali :)
Beh, quella è sbagliata di sicuro visto che moltiplichi anche la virgola per dieci; oltretutto il tuo codice mi sembra davvero troppo lungo per un convertitore del genere.

Ti spiego al volo la procedura
inserisci un numero e sta anche bene se lo metti nell'array come hai fatto. Poniamo per esempio 39,62


0 1 2 3 4 <-- POSIZIONE ARRAY
3 9 , 6 2 <-- CARATTERE CONTENUTO


La procedura per calcolare il double è:

scorri l'array e ti trovi la posizione della virgola, che ti serve per vedere da che esponente partire per calcolare unità, decine etc; a questo punto:


double esponente = (double)(indice della casella con la virgola - 1)
double numero=0.0;
for (i=0 to MAX_INDICE_ARRAY)
{
if (v[i]>='0' and v[i]<='9')
{
numero=numero+((double)(v[i]-48))*esponente;
esponente /= 10;
}
}


Può darsi che ho dimenticato qualcosa, ma in linea di massima ci dovremmo essere. Non scordare i cast quando fai operazioni tra interi e double, altrimenti ti perdi i decimali

P.S.: quando usi lo switch, se hai vari case che portano allo stesso codice basta metterli uno sull'altro senza i break, così non riscrivi il codice ogni volta

ovvero:

case '0':
case '1':
case '2':
...
case '9':
codice
break;

Dr.Speed
27-01-2007, 01:08
Ah capito, è un convertitore anche sui decimali :)
Beh, quella è sbagliata di sicuro visto che moltiplichi anche la virgola per dieci; oltretutto il tuo codice mi sembra davvero troppo lungo per un convertitore del genere.

Ti spiego al volo la procedura
inserisci un numero e sta anche bene se lo metti nell'array come hai fatto. Poniamo per esempio 39,62


0 1 2 3 4 <-- POSIZIONE ARRAY
3 9 , 6 2 <-- CARATTERE CONTENUTO


La procedura per calcolare il double è:

scorri l'array e ti trovi la posizione della virgola, che ti serve per vedere da che esponente partire per calcolare unità, decine etc; a questo punto:


double esponente = (double)(indice della casella con la virgola - 1)
double numero=0.0;
for (i=0 to MAX_INDICE_ARRAY)
{
if (v[i]>='0' and v[i]<='9')
{
numero=numero+((double)(v[i]-48))*esponente;
esponente /= 10;
}
}


Può darsi che ho dimenticato qualcosa, ma in linea di massima ci dovremmo essere. Non scordare i cast quando fai operazioni tra interi e double, altrimenti ti perdi i decimali

P.S.: quando usi lo switch, se hai vari case che portano allo stesso codice basta metterli uno sull'altro senza i break, così non riscrivi il codice ogni volta

ovvero:

case '0':
case '1':
case '2':
...
case '9':
codice
break;
:ave: :ave: :ave: grazie :)