Allora, questa e' la funzione per acquisire il numero, alla quale viene passato il puntatore della stringa dove verra' contenuto il numero ed il tipo di base del numero che deve essere inserito:
Una volta acquisito il numero viene fatto un controllo sulla sintassi del numero in funzione della base del numero stesso. Dopodiche' se il controllo da' esito positivo procedo alla conversione del numero alla base scelta:codice:void f_leggi_num(char num_da_conv[], tipo_num_t tipo_num) { int base_num; switch (tipo_num) { case bin: base_num = BASE_BIN; break; case ott: base_num = BASE_OTT; break; case dec: base_num = BASE_DEC; break; case esa: base_num = BASE_ESA; break; } printf("\nIl numero deve essere:"); printf("\n\t- Intero"); printf("\n\t- > 0"); printf("\n\t- < %u", UINT_MAX); printf("\n\t- In base %d", base_num); printf("\nInserire il numero da convertire: "); scanf(" %s", num_da_conv); }
(copio di seguito il codice per convertire un numero da base 2,8,16 a base 10)
Pero' se viene inserito un numero maggiore di UINT_MAX di conseguenza la conversione produce un numero errato, per questo io vorrei aggiungere un controllo sul numero inserito il quale deve essere minore ad UINT_MAX.codice:int f_conv_num_a_dec(tipo_conv_t tipo_conv, char num_da_conv[], char num_conv[]) { unsigned num_dec; int num_cifre = strlen(num_da_conv) - 1, cifra, base_num, i; switch (tipo_conv) { case (bin_dec): base_num = BASE_BIN; break; case (ott_dec): base_num = BASE_OTT; break; case (esa_dec): base_num = BASE_ESA; break; } for (i = 0, num_dec = 0; i <= num_cifre; i++) { if (isalpha(num_da_conv[i])) { if (toupper(num_da_conv[i]) == 'A') cifra = toupper(num_da_conv[i]) - 'A' + 10; else if (toupper(num_da_conv[i]) == 'B') cifra = toupper(num_da_conv[i]) - 'B' + 11; else if (toupper(num_da_conv[i]) == 'C') cifra = toupper(num_da_conv[i]) - 'C' + 12; else if (toupper(num_da_conv[i]) == 'D') cifra = toupper(num_da_conv[i]) - 'D' + 13; else if (toupper(num_da_conv[i]) == 'E') cifra = toupper(num_da_conv[i]) - 'E' + 14; else cifra = toupper(num_da_conv[i]) - 'F' + 15; } else cifra = num_da_conv[i] - '0'; num_dec += cifra * pow(base_num, (num_cifre - i)); } sprintf(num_conv, "%u", num_dec); }

Rispondi quotando