Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    [C] funzione contenente numeri in rapp.binaria

    Ciao ragazzi questo è il mio primo thread.colevo innanzitutto complimentarvi col vostro sito che ritengo sia eccezionale.
    sono alle prime armi con la programmazione in C e oggi mi sono imbattuto in questo esercizio, ma non so proprio da dove partire.potreste darmi una mano?
    ecco il testo:
    Scrivere una funzione in linguaggio C che restituisca un vettore di 8 byte (caratteri) contenente tutti i numeri la cui rappresentazione binaria differisca di un solo bit rispetto al valore di una variabile char passata come parametro.

    in attesa di un vostro aiuto vi ringrazio sin d'ora

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ciao, come scritto nel regolamento in questo forum non si risolvono esercizi,
    si può aiutare a correggerli. Ciao.

  3. #3
    Originariamente inviato da c0der
    Ciao, come scritto nel regolamento in questo forum non si risolvono esercizi,
    si può aiutare a correggerli. Ciao.
    ma visto che non so nemmeno come cominciarlo potreste darmi qualche dritta così da avere almeno uno spunto da dove cominciare?

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Mi pare un esercizio un po difficile per uno che è agli inizi con il linguaggio c .

    A me viene in mente un modo , con cui affrontare l'esercizio , e dargli una soluzione .

    ma fa uso della funzione itoa() che è una funzione non standar c ,presente in molti compilatori compreso MS Vs c++

    usare questa funzione , magari per un esercizio scolastico , potrebbe essere valutato un
    grosso errore


    il mio approccio sarebbe questo

    1 converto il codice ascii del carattere passato per argomento in un array di char
    rappresentante il valore binario itoa (i,buffer,2); ottengo cosi "10101010" un array buffer di char

    2 in una array di char temporaneo , tramite un ciclo for copio la sequenza binaria
    cambiando un solo carattere , poi chiamo una mia funzione che converte la sequenza
    di caratteri 01 in un valore decimale , e la memorizzo nell'array di uscita

    codice:
      int i, k;
      char temp[9];
     for(i=0;i<8;i++)// ciclo per ogni elemento dell'arrey di uscita 
     {
            for(k=0;k<8;k++)//ciclo per ogni elemento binario di buffer
               {
                   temp[k]=buffer[k];
                   if(k==i)//modifico di volta in volta un solo bit
                     {
                        if(temp[k]==0)
                              temp[k]=1; 
                         else
                               temp[k]=0 ;  
                     } 
    
               }
              convertibinariodecimale(arraydiuscita,temp,posizione array di uscita i);
     }
    Tecnologia

  5. #5

    Re: Ciao

    Originariamente inviato da torn24
    Mi pare un esercizio un po difficile per uno che è agli inizi con il linguaggio c .

    A me viene in mente un modo , con cui affrontare l'esercizio , e dargli una soluzione .

    ma fa uso della funzione itoa() che è una funzione non standar c ,presente in molti compilatori compreso MS Vs c++

    usare questa funzione , magari per un esercizio scolastico , potrebbe essere valutato un
    grosso errore


    il mio approccio sarebbe questo

    1 converto il codice ascii del carattere passato per argomento in un array di char
    rappresentante il valore binario itoa (i,buffer,2); ottengo cosi "10101010" un array buffer di char

    2 in una array di char temporaneo , tramite un ciclo for copio la sequenza binaria
    cambiando un solo carattere , poi chiamo una mia funzione che converte la sequenza
    di caratteri 01 in un valore decimale , e la memorizzo nell'array di uscita

    codice:
      int i, k;
      char temp[9];
     for(i=0;i<8;i++)// ciclo per ogni elemento dell'arrey di uscita 
     {
            for(k=0;k<8;k++)//ciclo per ogni elemento binario di buffer
               {
                   temp[k]=buffer[k];
                   if(k==i)//modifico di volta in volta un solo bit
                     {
                        if(temp[k]==0)
                              temp[k]=1; 
                         else
                               temp[k]=0 ;  
                     } 
    
               }
              convertibinariodecimale(arraydiuscita,temp,posizione array di uscita i);
     }
    ci sarebbe un metodo per verificare l'esattezza del tuo codice?
    hai per caso provato a compilarlo?

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    @parlermo92 ma sei un compagno di scuola di pablito92? come i suoi testi anche qui mi sembra che ci sia ambiguità.

    Allora:
    << Scrivere una funzione in linguaggio C che restituisca un vettore di 8 byte (caratteri) contenente tutti i numeri la cui rappresentazione binaria differisca di un solo bit rispetto al valore di una variabile char passata come parametro. >>

    il prototipo della funzione sarà senza dubbio qualcosa del genere:
    char *get_array(char n) ;

    Se chiamo la funzione con:
    char *risultato = get_array(170); // 10101010

    Come deve essere fatto l'array ritornato?
    1) per torn24 mi pare di aver capito una cosa come: { 0, 1, 0, 1, 0 , 1, 0, 1 }
    2) io ho capito invece ogni posizione dell'array deve contenere un char che ha 1 solo bit modificato rispetto al parametro, cioè { 00101010, 11101010, 10001010, 10111010, 10100010, 10101110, 10101000, 10101011 }
    ovviamente tradotti in base 10.

    Quale delle 2?

  7. #7
    Originariamente inviato da c0der
    @parlermo92 ma sei un compagno di scuola di pablito92? come i suoi testi anche qui mi sembra che ci sia ambiguità.

    Allora:
    << Scrivere una funzione in linguaggio C che restituisca un vettore di 8 byte (caratteri) contenente tutti i numeri la cui rappresentazione binaria differisca di un solo bit rispetto al valore di una variabile char passata come parametro. >>

    il prototipo della funzione sarà senza dubbio qualcosa del genere:
    char *get_array(char n) ;

    Se chiamo la funzione con:
    char *risultato = get_array(170); // 10101010

    Come deve essere fatto l'array ritornato?
    1) per torn24 mi pare di aver capito una cosa come: { 0, 1, 0, 1, 0 , 1, 0, 1 }
    2) io ho capito invece ogni posizione dell'array deve contenere un char che ha 1 solo bit modificato rispetto al parametro, cioè { 00101010, 11101010, 10001010, 10111010, 10100010, 10101110, 10101000, 10101011 }
    ovviamente tradotti in base 10.

    Quale delle 2?
    mi sa che hai ragione tu cioè l'esercizio è il 2)

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Conviene studiare gli operatori bitwise per risolvere in maniera semplice e rapida quest'esercizio.

    @parlermo92 ma sei un compagno di scuola di pablito92?
    devi essere molto giovane ^_^
    every day above ground is a good one

  9. #9
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Non si può compilare uno spezzone di codice , che aveva solo lo scopo di essere un esempio !


    come ti hanno detto nell'ultimo messaggio da persone esperte , la soluzione corretta non
    è quella che ti ho proposto io !

    Ma solo per fare vedere che era una soluzione , NON la migliore , sicuramente .

    posto come saprei risolverlo io , visto che gli operatori su bit non so usarli !

    Codice testato e funzionante



    codice:
    #include <stdio.h>
    #include <stdlib.h>
    void convertibinariodecimale(char output[],char temp[],int posizione);
    char *get_array(char n) ;
    int main(int argc, char *argv[])
    {
      int i;  
      char *risultato;
      risultato=get_array('a');
      for(i=6;i>=0;i--)
          printf("lettera %c  codice ascii %d \n",risultato[i],risultato[i]);
      system("PAUSE");	
      return 0;
    }
    
    
    char *get_array(char n) 
    {
      int i, k;
      char *output=(char*)malloc(sizeof(char)*8);
      char temp[8];
      char buffer[8];
      itoa(n,buffer,2);
      printf("codice binario di partenza   -->  ");
      puts(buffer);
      puts("******");
      puts("codici binari risultanti");
     for(i=6;i>=0;i--)// ciclo per ogni elemento dell'arrey di uscita 
     {
            for(k=6;k>=0;k--)//ciclo per ogni elemento binario di buffer
               {
                   temp[k]=buffer[k];
                    if(k==i)//modifico di volta in volta un solo bit
                     {
                        if(temp[k]=='0')
                              temp[k]='1'; 
                         else
                               temp[k]='0' ;  
                     } 
    
               }
               puts(temp);
              convertibinariodecimale(output,temp,i);
     }
     
      puts("*****************************");
       return output;
    } 
    
    
    
    void convertibinariodecimale(char output[],char temp[],int posizione)
    {
        
        int i=0;
        int valore_cifra_binaria=1;
        int numero_convertito=0;
        int bit=0;
        for(i=6;i>=0;i--)
            {
               if(temp[i]=='1')
                  bit=1;
               else 
                  bit=0;    
               numero_convertito +=valore_cifra_binaria*bit;
               valore_cifra_binaria*=2;//passo al valore decimale del prossimo bit
                
            }    
        
        
           output[posizione]=numero_convertito;
        
        
        }
    Tecnologia

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Scriverti la soluzione completa senza neppure un tentativo non mi sembra corretto.
    Se la soluzione è la (2) si risolve in 3 righe.

    Ho usato unsigned char invece di char per non avere numeri negativi.
    Ho passato l'array come parametro per non usare malloc.

    codice:
     
    void riempi_array(unsigned char n, unsigned char array[8])
    {
        int i;
    
        for (i = 0; i < 8; i++)
            array[i] = QUESTA RIGA LA PUOI COMPLETARE TU
    }
    Ti posso solo dire che nella parte che lascio a te basta usare
    l'operatore XOR e di shift.

    Ciao.

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