Input controllato

di il
22 risposte

Input controllato

Salve, ho bisogno di un aiuto!
Devo scrivere un programma che converta un numero da una base iniziale ad una base finale (le basi sono da 2 a 10). Ho bisogno
di controllare l' input iniziale del numero in base,appunto, alla base presa in input.
ES.
INSERISCO 14(uno, quattro) e ammetiamo che l'utente sbagli inserendo la base 3,
chiaramente 4 non è un valore presente in base 3,quindi come mi consigliate di procedere in modo che l' algoritmo che svilupperò si possa adattare a tutti i casi possibili, quindi dalla base 2 a 10??
Grazie!

22 Risposte

  • Re: Input controllato

    Spiegati meglio perché 10 è un numero valido in base 3
    Acquisisci carattere per carattere e controlla che venga immessa ogni volta una cifra valida nella tua base
  • Re: Input controllato

    Inoltre ci sono dei modi abbastanza comuni per indicare la base:

    0 -> base 8
    0x -> base 16
    0b -> base 2 e' abbastanza recente

    b^^numero_in_base_b -> base espressa in base decimale. ad esempio 20^^ABC -> 4232 in base 20
    oppure 3^^10 -> 3 in base 3
  • Re: Input controllato

    Scusi ho sbagliato, ora troverà la domanda riformulata correttamente!
    Salve.
  • Re: Input controllato

    Salve, stavo pensando anch' io di prendere cifra per cifra con una precisone di 4 bit, ma il problema che dopo questo programma deve effettuare la conversione dalla base di partenza a quella di arrivo, e quindi ho bisogno di un unico numero.
  • Re: Input controllato

    Salve, stavo pensando anch' io di prendere cifra per cifra con una precisone di 4 bit, ma il problema che dopo questo programma deve effettuare la conversione dalla base di partenza a quella di arrivo, e quindi ho bisogno di un unico numero.
  • Re: Input controllato

    Quando passi da base 10 ad altre basi, devi fare delle divisioni successive, quindi ti conviene inserirlo come numero. Quando passi da altra base a base 10, puoi usare come input una stringa e controllare i numeri (che poi sono caratteri) uno ad uno, controllare che siano giusta e fare l'elevamentova a potenza. Per qualsiasi conversione tra basi, puoi passare per la base 10.
    Attenzione alle conversioni da carattere a numero se usi le stringhe.

    Oppure c'è il modo più semplice: inserisci, per esempio in binario, un bit per volta e controlli se è giusto, poi fai la potenza e la somma.

    PS: devi farlo in C o in C++?
  • Re: Input controllato

    Il programma deve essere eseguito in C++. Non capisco perchè devo prendere i numeri come stringhe, potrei anche prendere un intero e fare un controllo se quest'ultimo non supera il valore della base:
    es.
    1
    4
    base 3 4>3? --> si, dunque 4 non è un numero in base 3, senza dover utilizzare le stringhe, evitando il casting.
    ciao!
  • Re: Input controllato

    E se l'utente scrive a ?
  • Re: Input controllato

    Si hai ragione, però quello che mi chiedo è: come faccio a controllare ogni numero immesso e vedere che sia minore della base per essere accettato,se è una stringa,dovrei fare il casting per ogni stringa ?
    Stavo pensando di creare ogni variabile dove andrà ogni num immesso ma non è molto efficiente perché se l’utente vuole inserire 5 numeri e metto 4 variabili, non può farlo. Non posso fare questo appunto proprio perché non so l’utente quanti valori vorrà inserire
    E poi prendendo ogni numero singolarmente poi come faccio a considerarlo tutt’uno quando passo alla conversione?
  • Re: Input controllato

    Non ho letto tutto il thread ma fino a quale base devi poter accettare?

    Dovresti controllare la stringa "carattere per carattere" e determinare se è un simbolo valido per la base scelta attraverso l'esame del suo codice ASCII.
  • Re: Input controllato

    Dany30 ha scritto:


    Si hai ragione, però quello che mi chiedo è: come faccio a controllare ogni numero immesso e vedere che sia minore della base per essere accettato,se è una stringa,dovrei fare il casting per ogni stringa ?
    Stavo pensando di creare ogni variabile dove andrà ogni num immesso ma non è molto efficiente perché se l’utente vuole inserire 5 numeri e metto 4 variabili, non può farlo. Non posso fare questo appunto proprio perché non so l’utente quanti valori vorrà inserire
    E poi prendendo ogni numero singolarmente poi come faccio a considerarlo tutt’uno quando passo alla conversione?
    Leggete i vecchi thread, la chiedete tante volte questa cosa.

    Copio e incollo la soluzione in C con una modifica minima
    
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
        int b;
        long n, i;
        char buffer[100]; 
    
        while(1)
        {
            printf("Inserisci la base: ");
            scanf("%d",  &b);   
            if(b < 2 || b > 36)
                goto end;
            printf("Inserisci un valore: ");
            scanf("%s",  buffer);   
            n = strtol(buffer, NULL, b);
            if(!n)
              for(i = 0; buffer[i] != '\0'; i++)
                  if(buffer[i] != '0')
                    goto end;
            printf("Hai inserito il valore decimale %ld\n", n);
        }
        
    end:
        return 0;
    }
    
    Vedi tu come adattare in C++
  • Re: Input controllato

    Non conosco il C, potresti brevemente spiegare cosa hai fatto?
    Grazie!
  • Re: Input controllato

    Non conosci il C? E come vorresti scrivere il programma?
  • Re: Input controllato

    @Dany30: a quanto sembra e' EVIDENTE che ti mancano dei CONCETTI FONDAMENTALI senza i quali non ne esci!

    UNA COSA e' la rappresentazione TESTUALE DI UN NUMERO, la STRINGA
    UN"ALTRA COSA e' la rappresentazione INTERNA del numero, in BINARIO.

    Per STRINGA, NON SI INTENDE quella cosa scritta tra virgolette, MA LA RAPPRESENTAZIONE DEL NUMERO fatta mediante i caratteri ASCII che scrivi sulla tastiera OPPURE dentro un sorgente di un linguaggio di prorammazione.

    Quello che devi fare e':

    1) ricevere in ingresso UNA STRINGA, composta da UNO o piu' CIFRE NELLA BASE che viene specificata. Per la base 2 sono {0,1},per la base 4 sono {0,1,2,3}, per la base 8 sono {0,1,2,3,4,5,6,7}, per la base 10 {0,1,2,3,4,,6,7,8,9}, per la base 16 {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} (ed eventualmente {a,b,c,d,e,f}) ecc.
    2) convertire il numero fornito NELLA RAPPRESENTAZIONE INTERNA (binaria)
    3) creare la NUOVA rappresentazione usando la NUOVA BASE. E questa rappresentazione e' DI NUOVO, una STRINGA
Devi accedere o registrarti per scrivere nel forum
22 risposte