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 .