Come ottenere i valori corretti

di il
8 risposte

Come ottenere i valori corretti

Salve a tutti, ho un piccolo problema con c#.
Come faccio a inserire una misura espressa in mm e deve convertire in metri per un calcolo, se inserisco 10, mi ritorna 0.001, 12.5 = 0.00125 se metto centesimi di millimetro: 0.5 = 0.0005.
 il problema si pone quando si inserisce 12.5 che non riesce a distinguere se è un millimetro o centesimi di millimetro 

        static double GetOutputInput(string prompt, bool isMM)
        {
              double value;
              bool inptValidate;
            do
            {

              
                string input;
                
                bool isCent = false;


                Write(prompt);
                input = ReadLine();
                input.Trim();
                input = input.Replace(".", ",");

                if (input.Contains('.') )
                {
                    isCent = true;
                
                }

                input = new string(input.Where(char.IsDigit).ToArray());
                inptValidate = double.TryParse(input, out value);

                if (!inptValidate)
                {
                    WriteLine("input non valido, riprova\n");
                }

                  
                  if (isMM)
                  {
                      if (isCent )
                      {
                          return value / 10000;
                      }
                      else
                      {
                        return value / 1000;
                      }
                  }

            } while (!inptValidate);
            return value;

Volevo capire come mi dovrei approcciare con la logica e se per caso dovrei usare qualche libreria come input di dati su una console e ringrazio anticipatamente per chi mi può spiegare :) 

8 Risposte

  • Re: Come ottenere i valori corretti

    Il problema e' “concettuale”. 

    Il codice, per quello che si puo' vedere, implementa regole “contrastanti” 

    Da una parte passi un parametro ‘isMM’. 

    Dall'altra parte il codice fa strane elucubrazioni per la presenza del punto? virgola? decimale? 
    PERCHE' lo fa? A che gli serve?
    Che poi divide per 10000? 
    PERCHE' ? 
    Che senso ha? 

    Idee confuse = codice confuso = non fa quello che ti serve

    SEMPLIFICA.

    DUE regole:

    • SOLO il punto per indicare la parte decimale. E BASTA. Niente virgola, niente punti separatori di migliaia, NIENTE PASTICCI 
    • UN SOLO parametro ‘isMM’, per dire se sono METRI O Millimetri. O centimetri, se la tua unita' di misura oltre ai millimetri e' SOLTANTO ED UNICAMENTE centimetri. 

    E BASTA! 

    Nessuna ‘elucubrazione’ su formati alternativi, unita' di misura alternative, ecc.

    Se ti servono cose piu' “raffinate” l'attuale approccio E' TOTALMENTE FALLIMENTARE: codice INUTILMENTE INCASINATO e pure sbagliato.

    Comunque tranquillo: per sapere come si fa una cosa e' FONDAMENTALE farla piu' volte e sbagliare ogni volta! 

  • Re: Come ottenere i valori corretti

    Booh… non saprei, da mm a m quanti posti ci sono?

    Con 10 mm come fai tu (non il programma) a sapere quanti m sono?

    Che operazione hai fatto?

    Fallo con 12.5 mm. Fatto? Hai usato la stessa formula?

    Fallo con 100 mm fatto? Hai usato la stessa formula?

  • Re: Come ottenere i valori corretti

    Scusa Daniel ma il problema qual è?

    S3 l'input è SEMPRE in mm che problemi hai?

  • Re: Come ottenere i valori corretti

    Salve, allora vi spiego un po'il codice, questo programma lavora esclusivamente in mm e spesse volte usa i centesimi del mm, poiche quando si inserisce i dati è come se stessimo simulando un pezzo meccanico con le tolleranze  abbastanza strette, quindi ogni centesimo di mm sono fondamentali e non possono tollerare il margine di errore e le formule da calcolo che mi hanno fornito sono espresse in metri, per questo bisogna convertire in metri

     input = input.Replace(".", ",");

    questa parte serve per evitare che l'utente se sbaglia a mettere la virgola, sostituisce il punto o non riesce a distinguere.

    per quando riguarda isMM serve per definire se sto usando una misura o no

     	Parametri[CORPO, HOLE] = GetOutputInput("Diametro del foro : ",true);
        Parametri[BODY, COUNT] = Convert.ToInt32(GetOutputInput($"quanti fori ci sono : ", false));
    

    per convertire mm in metri basta dividere per 1000, c'e' un piccolo problema se inserisco 12 mi converte senza problemi, se inserisco .5 mi converte senza problemi poiche è diviso per 1000 quindi in teoria dovrebbe converte il centesimo di mm in metri (ho fatto il debug e ho scoperto che non funziona come previsto), appena inserisco 12.5 mi segna come 0,125 che sono 125 mm quando in realta è 12mm e mezzo

    questi sono gli risultati del debug

    Elemento 0 : 12
    Elemento 1 : 12.5
    Elemento 2 : 5
    0,012			// questo valore è corretto
    0,125			// sono 125 mm e dovrebbe essere 0.0125
    0,005			// in teoria dovrebbe essere 0.0005 
    
    

    sono giorni che provo a risolvere questo piccolo problema e non riesco a darmi una spiegazione logica…

  • Re: Come ottenere i valori corretti

    Input= 12

    Risultato= input /1000 = 12/1000 = 0,012

    Input= 12,5

    Risultato= input /1000 = 12,5/1000 = 0,0125

    Input= 5

    Risultato= input /1000 = 5/1000 = 0,005

    Input= 0,5

    Risultato= input /1000 = 0,5/1000 = 0,0005

    Puoi anche verificare con una calcolatrice da 1 euro.

    Ora, il problema qual è?

    1. Controllare che l'utente inserisca solo numeri 
    2. Che il separatore decimale sia il punto
    3. Applicare la formula.

    Per il punto 1 puoi scegliere se 

    A: mettere una maschera di input

    B: provare la conversione sollevando e gestendo l'eccezione

    C: intercettare i tasti premuti sull'evento keypress ed accettare solo da 0 a 9 e il punto avendo cura di accettare solo una volta il punto o la virgola

    D: modificare la virgola in punto se key=, allora key=. (a spanne non ricordo la codifica ma la trovi sul web sia come numero che come tasti virtuale)

    Per il punto 2 

    Obsoleto se il punto 1 funziona

    Per il punto 3

    Hai un pc che fa qualcosa in più della calcolatrice da 1 euro… puoi lavorare direttamente dall'input o convertire l'input e lavorare con risultato. Fai tu.

    Se hai ulteriori dubbi puoi prendere un libro e ripassare il sistema metrico decimale. ;) 

    Si parla di tornio o di fresa?

  • Re: Come ottenere i valori corretti

    Guarda Daniel che il problema del tuo codice è solo in questa linea

    input = new string(input.Where(char.IsDigit).ToArray());

    in cui tu rimuovi la virgola se presente.

    Infatti se la elimini temporaneamente tutto funziona senza problemi. La questione del flag dei centesimi e la divisione per 10000 non ha alcun senso, toglila.

  • Re: Come ottenere i valori corretti

    24/02/2024 - Daniel KR ha scritto:


    input = input.Replace(".", ",");

    Se input è 1 restituisce 1

    Se input è 1.1 restituisce 1.1

    Se input è 1,1 restituisce 1.1

    24/02/2024 - Daniel KR ha scritto:


    if (input.Contains('.') ) { isCent = true;

    Convertito l'input che te frega se ha o non ha decimali?

    A parte che 10 sono 1 centesimo e zero millimetri e a parte che sai se contiene il . Proprio perché lo hai convertito

    Prova a metterlo nell'abaco. Trovi esercizi sui libri di terza elementare.

    Quello che ti consiglierei è verificare se input è un numero.

    L'utente potrebbe scrivere 1.023,5 ( 1 metro zero decimetri due centimetri tre millimetri e 1 decimo di millimetro sempre sull'abaco) cosa fai? Rimpiazzi tutto? (1.023.5 non è un numero).

    Ma se l'utente sbaglia e scrive s,2 anche li non hai un numero.

    Se s,2 *1 da errore allora non è stato inserito un numero.

    Chiarito questo, sappiamo che alla fine l'utente inserisce un numero ( 12,5  un centimetro due millimetri e 5 decimi di millimetro nell'abaco)

    In metri 0,0125 che nell'abaco sono zero metri zero decimetri un centimetro due millimetri e 5 decimi di millimetro.

    Ismm che senso ha?

    Una volta convertiti 12,5 mm in 0,0125 m esegui la formula che ti serve (avanzamento utensile, nr giri utensile se fresa o nr giri mandrino se tornio, nr taglienti ecc…).

    Hai scritto codice superfluo e, come ti ha fatto notare oregon, pure sbagliato.

  • Re: Come ottenere i valori corretti

    27/02/2024 - Daniel KR ha scritto:


    Elemento 0 : 12 Elemento 1 : 12.5 Elemento 2 : 5 0,012 // questo valore è corretto 0,125 // sono 125 mm e dovrebbe essere 0.0125 0,005 // in teoria dovrebbe essere 0.0005

    Perché 5 dovrebbe essere 0,0005?  Anche 1 dovrebbe darti 0,0001.

    Se metti come input ,5 senza lo zero devi sempre convertirlo in numero così diventa 0,5.

Devi accedere o registrarti per scrivere nel forum
8 risposte