Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13
  1. #11
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    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:

    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);
    }
    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:

    (copio di seguito il codice per convertire un numero da base 2,8,16 a base 10)

    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);
    }
    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.

  2. #12
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    Originariamente inviato da oregon
    Beh il double ha un limite ma non penso tu possa superarlo inserendo un dato da tastiera ...
    Ho capito quello che vuoi dire tu, pero' io vorrei anche prevedere il caso in cui uno inserisce una sfilza di numeri (tipo 2-300) e quindi dove anche il doble in virgola mobile va in overflow. Quello che mi chiedo è: non esiste un parametro che indica l'overflow della variabile?

  3. #13
    potresti creare un array di stringhe, di dimension MAX predefinita, per prelevare i dati da tastiera crei una tua funzione di inserimento utilizzanzo il metodo char c = getch()
    inserendo questo in un ciclo diverebbe
    codice:
    char str[MAX]
    .
    .
    .
    for i=0;i < MAX;i++
    {
     str[i] = getch();
      if str[i] = // caratere ascii dell'invio then i=MAX
    }
    pui anke perfezionare gestendo solo un range di valori di tastiera etc
    in questo modo però hai pieno controllo di ciò ke viene digitato e quindi MAX lo gestisci quanto lo vuoi lungo. Secondo me è il metodo più comodo evitando così casting da real a int
    -----
    101110101011101111100000
    -----

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.