Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] Scrivere una propria versione di itoa...perchè mai questo dovrebbe funzionare!?!?

    Ciao,
    stò impazzendo con l'esame di laboratorio di programmazione...un esercizio è scrivere una propria versione di itoa....questo è il delirio di soluzione messa online dalla proff...che ovviamente non funziona....potete darmi una mano?!?! non capisco proprio la logica dietro all'itoa()....

    codice:
    #include <stdio.h>
    #include <string.h>
    main()
    (
           int err=O, n=13;
           char s[20];
           int itoa(int n,char s[]);
           err = itoa(n,s);
           s[20]=' ';
                   \0
           printf ("n=%d, s=%s\n",n,s);
    }
    
    itoa(n,s)
    char s[];
    int n;
    {
            int i, segno;
            if((segno = n) < 0) /* controllo segno */
                      n= -n; /* rende n positivo */
            i = 0;
            do
            {
                      /* genera le cifre in ordine inverso */
                      s[i++] = n % 10 + '0'; /* prende la cifra succ.*/
            }while(( n/= 10) > 0); /* la toglie */
            if (segno < 0)
                      s[i++] = ' ;
                                -'
            s[i]= ' ';
                    \0
            reverse(s);
            return (0);
    }
    
    reverse(s) /*inverte la stringa s sul posto */
    char s[];
    {
            int c, i, j ;
            for (i = 0, j = strlen(s)-1, i < j; i++, j--)
            {
                      c=s[il;
                      s[i]=s[j] ;
                      s[j]=c;
            }
    }
    Grazie
    Andrea

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] Aiutino a capire codice di questa funzione itoa()

    Scusate probabilmente sono stupido io ma non mi entra bene nella testa come itoa fà quello che fà...per favore ditemi se i passaggi che ho capito sono corretti e aiutatemi con quelli che non m'entrano...

    in pratica:

    codice:
    /* Riceve l'intero da convertire e  il puntatore alla stringa dove mettere la conversione e non ritorna alcun valore */
    void itoa(int n, char *s)   
    
    {
    
      int i, sign;
    
    
    
      if ((sign = n)<0)
       //imposta la variabile sign con il valore di n e se il numero è negativo
        n = -n;             // allora metti in n il suo modulo
    
      i = 0;
    
      do {
    
        s[i++] = n%10 + '0';//in s[0], s[1],etcetc metti... (che ci mette esattamente)? perchè+0? 
    
      } while ((n /= 10) > 0);  //finchè n!?!?! che condizione è (n /=10)>0 ?!?!?1   
    
      if (sign<0)    //se sign <0 ma non lo aveva già fatto questo controllo? o questo è alla fine? perchè lo rifà?
    
        s[i++] = '-';   //metti - alla fine (ma il carattere - serve ad indicare nella stringa che il numero è negativo?
    
      s[i] = '\0';    // metti il carattere di fine stringa
    
      reverse(s);  // inverti la stringa
    
    }
    Temo di aver fatto parecchia confusione...potete aiutarmi un po'?

    Grazie

  3. #3
    Allora, le cose che ho capito io:
    codice:
     s[i++] = n%10 + '0';//in s[0], s[1],etcetc metti... (che ci mette esattamente)? perchè+0?
    in s ci mette il modulo della divisione per 10, quindi non fa altro che suddividere il numero nelle sue cifre partendo da destra quella meno significativa: se ho 123, ci metto 123 % 10, quindi il resto di 123 / 10 che è 3. Sommarci '0' vuol dire trasformare la cifra numerica in cifra ASCII quindi visualizzabile.
    codice:
    } while ((n /= 10) > 0);  //finchè n!?!?! che condizione è (n /=10)>0 ?!?!?1
    scrivere n /= 10 è come scrivere n = n / 10; essendo n intera rimane la parte intera della divisione, quindi fino a quando il numero è divisibile per 10 prosegue il ciclo; quindi mette in s tutte le cifre del numero: se ho 123 farò i passi:
    - s[0] = 123 % 10 = 3 + '0' = '3';
    - n = 123 / 10 = 12;
    - s[1] = 12 % 10 = 2 + '0' = '2';
    - n = 12 / 10 = 1;
    - s[2] = 1 % 10 = 1 + '0' = '1';
    - esco perchè 1 / 10 è zero.
    Il test lo posso fare per > 0 perchè tanto n è sempre positivo (grazie al test iniziale).
    codice:
    if (sign<0)    //se sign <0 ma non lo aveva già fatto questo controllo? o questo è alla fine? perchè lo rifà?
    Perchè vuole mettere il segno di negativo se il numero era negativo (sign è infatti il valore iniziale di n con segno).
    Infine faccio il reverse (tranne il terminatore \0) perchè in s ho "321\0" e a me serve "123\0". Se fosse stato -123 avrei avuto "321-\0" e quindi "-123\0".
    In fondo non è poi così complicata

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Ho unito le discussioni visto che ce n'era già una precedentemente aperta sull'argomento.

    Non aprire più discussioni sullo stesso problema. Oltre a questo, cerca di orientarti su titoli meno prolissi, o meglio prolissi va bene, ma se sono significativi, senza esortazioni.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.