|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4641
|
[C]problema con programmino semplice
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: Codice:
numero=numero+((v[i]-48)/j); Codice:
#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);
}
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Funziona se usi dei double al posto dei float, stai sforando sulla dimensione massima
float numero -> double numero float numero2 -> double numero2 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4641
|
pero' se scrivo un numero anche piccolissimo tipo 12,1 non me lo converte in reale, ora provo, grazie
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4641
|
edit, scusate
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
Ultima modifica di Dr.Speed : 24-01-2007 alle 14:55. |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4641
|
Quote:
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4641
|
nessuno ha qualche idea?
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
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
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4641
|
Quote:
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
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 Codice:
0 1 2 3 4 <-- POSIZIONE ARRAY 3 9 , 6 2 <-- CARATTERE CONTENUTO 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: Codice:
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;
}
}
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;
__________________
Il sole è giallo Ultima modifica di yorkeiser : 26-01-2007 alle 13:07. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4641
|
Quote:
grazie
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:00.



















