Ciao , per passatempo ho voluto provare a risolvere un esercizio proposto in un altra discussione , che mi sembra d'obbligo , segnalare .
http://forum.html.it/forum/showthrea...readid=1541320
Per risolvere il problema mi sono basato su le informazioni presenti su questo sito
http://www.electronicprestige.it/codicea.htm
dove è presente un programma script , che si può usare per ottenere il valore corretto .
----------------------------------------------------------------
Il problema che riscontro nell'esercizio che ho svolto , è che a volte restituisce valori corretti , altre volte valori sbagliati,non trovo errori logici o di "algoritmo usato" ,l'errore sembra dovuto a un errato caricamento di un array di char
dopo un confronto di una stringa ottenuta con strtok() tramite strcmp()
Gli errori presumo , risiedono in questi due pezzi di codice
codice:temp=strtok(Colori," ");//separa la stringa in sottostrighe while(i<2) //conversione codice colore in numeri delle prime due bande { /*per ogni colore inserisce la cifra corrispondente nel array Valore */ if(strcmp(temp,"nero")==0) Valore[i]='0'; else if(strcmp(temp,"marrone")==0) Valore[i]='1'; else if(strcmp(temp,"rosso")==0) Valore[i]='2'; else if(strcmp(temp,"arancio")==0) Valore[i]='3'; else if(strcmp(temp,"giallo")==0) Valore[i]='4'; else if(strcmp(temp,"verde")==0) Valore[i]='5'; else if(strcmp(temp,"blu")==0) Valore[i]='6'; else if(strcmp(temp,"viola")==0) Valore[i]='7'; else if(strcmp(temp,"grigio")==0) Valore[i]='8'; else if(strcmp(temp,"bianco")==0) Valore[i]='9'; temp=strtok(NULL," "); //acquisische la sottostriga sucessiva i++; }
e in questo altro punto sembra , a volte dare risultati sbagliati
codice:if(strcmp(temp,"argento")==0) moltiplicatore=0.01; else if(strcmp(temp,"nero")==0) moltiplicatore=1; else if(strcmp(temp,"marrone")==0) moltiplicatore=10; else if(strcmp(temp,"rosso")==0) moltiplicatore=100; else if(strcmp(temp,"arancio")==0) moltiplicatore=1000; else if(strcmp(temp,"giallo")==0) moltiplicatore=10000; else if(strcmp(temp,"verde")==0) moltiplicatore=100000; else if(strcmp(temp,"blu")==0) moltiplicatore=1000000; else if(strcmp(temp,"viola")==0) moltiplicatore=10000000;
L'intero programma
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main(int argc, char *argv[]) { char Colori[50]; char Valore[3]; char *temp; char Unita_misura; int ripete =1; int i=0; float ohm , moltiplicatore; do { printf("Calcolo valore resistenze tradizionali 4 bande \n"); puts("-----------------------------------------------------------------"); printf("Inserisci la sucessione dei colori in minuscolo separati da uno spazio :\n"); gets(Colori); temp=strtok(Colori," ");//separa la stringa in sottostrighe while(i<2) //conversione codice colore in numeri delle prime due bande { /*per ogni colore inserisce la cifra corrispondente nel array Valore */ if(strcmp(temp,"nero")==0) Valore[i]='0'; else if(strcmp(temp,"marrone")==0) Valore[i]='1'; else if(strcmp(temp,"rosso")==0) Valore[i]='2'; else if(strcmp(temp,"arancio")==0) Valore[i]='3'; else if(strcmp(temp,"giallo")==0) Valore[i]='4'; else if(strcmp(temp,"verde")==0) Valore[i]='5'; else if(strcmp(temp,"blu")==0) Valore[i]='6'; else if(strcmp(temp,"viola")==0) Valore[i]='7'; else if(strcmp(temp,"grigio")==0) Valore[i]='8'; else if(strcmp(temp,"bianco")==0) Valore[i]='9'; temp=strtok(NULL," "); //acquisische la sottostriga sucessiva i++; } Valore[i]=0;//aggiungo il terminatore stringa all'array valore puts(Valore);/// STAMPO IL VALORE PER DEBUG /*conversione codice colore terza banda del moltiplicatore temp contiene gia il terzo colore */ if(strcmp(temp,"argento")==0) moltiplicatore=0.01; else if(strcmp(temp,"nero")==0) moltiplicatore=1; else if(strcmp(temp,"marrone")==0) moltiplicatore=10; else if(strcmp(temp,"rosso")==0) moltiplicatore=100; else if(strcmp(temp,"arancio")==0) moltiplicatore=1000; else if(strcmp(temp,"giallo")==0) moltiplicatore=10000; else if(strcmp(temp,"verde")==0) moltiplicatore=100000; else if(strcmp(temp,"blu")==0) moltiplicatore=1000000; else if(strcmp(temp,"viola")==0) moltiplicatore=10000000; ohm=(float)atof(Valore);//converto in float l'array di char valore ohm*=moltiplicatore ;//calcolo il valore di resistenza moltiplicando il valore delle due // bande per il moltiplicatore tutti in ohms /*se il valore è superiore a 1000 homs usa unita di misuro kohms se il valore è superiore a 1000000 homs usa unita di misura Mohms */ if(ohm>1000 && ohm<1000000) { ohm/=1000; Unita_misura='K'; } else if(ohm>1000000) { ohm/=1000000; Unita_misura='M'; } else Unita_misura=' '; puts("-----------------------------------------------------------------"); // stampa risultati printf("Il valore della reististenza --> %.00f %cohms.\n",ohm,Unita_misura); system("PAUSE"); system("cls"); printf("Vuoi continuare 1 = si --> "); scanf("%d",&ripete); fflush(stdin); }while(ripete==1 ); return 0; }
Se qualcuno , potesse aiutarmi , a capire perchè a volte restituisce il valore aspettato e a volte valori sbagliati , ne sarei felice .

Rispondi quotando
