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

    Ripropongo la mia domanda esercizio 5 conversione

    Ripropongo e chiedo scusa
    eserczio 5 scrivere una function c che converta un intero positivo da base dieci a base 2
    e scrivere un altra function cche converta un intero positivo da base 2 a base 10 che generi un array di caratteri conteneti le cifre decimali graize il mio codice

    codice:
    #include<math.h>
    #include <stdio.h>
    #include<stdlib.h>
    #define base 2
    void inverti(int*);
    void cambiobase(int n,int*);
    
    int main()
    {
      int num;
      int max=32;
      int bin[max];
      printf("Dammi numero in base 10 per conversione in base 2 \n");
      printf("Numero=");
      scanf("%d",&num);
      cambiobase(num,bin);
     system("PAUSE");
     return 0; 
    }
    
    
    void cambiobase(int q,int bin[])
    {
      int i=0,q1,r;
      while(q>0){
        q1=(q/base);
        r=(q%q1);
        q=q1;
        bin[i]=r;
        i++;
                 }
      for(i=0;i<sizeof(bin);i++)
       printf("%d",bin[i]);  //prova stampa per verifica         
    inverti(bin);
    }  
    void inverti(int bin[])
    {
      int i=0,j,m;
      j=sizeof(bin)/sizeof(int)-1;
      m=(i+j+1)/2;
      for(i=0;i<m && j>=m;i++, j--)
      {
        bin[i]^=bin[j];
        bin[j]^=bin[i]; 
        bin[i]^=bin[j];
       }
       for(i=0;sizeof(bin)/sizeof(int);i++)
       {
          printf("%d",bin[i]);
       }
    printf("\n");
    }
    questo è il primo il secondo lo posto dopo se no diventa lunghissimo grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    La prossima volta usa i tag code per postare il codice, altrimenti come vedi si perde l'indentazione e non si capisce niente... guarda la differenza con gli esempi qui sotto.

    Ci sono alcune cose che non vanno... tanto per cominciare, l'algoritmo di conversione è da riscrivere. Ad ogni iterazione, dividi q per "base" e ne salvi il resto nell'i-esima posizione dell'array (con l'operatore modulo), dopodiché aggiorna q alla sua metà. Basta semplicemente:

    codice:
        while (q > 0) {
    	bin[i++] = q % base;
    	q /= base;
        }
    inoltre, non puoi usare l'operatore sizeof() per calcolare la dimensione dell'array "bin" nella funzione cambiobase, perché lì bin è solo un puntatore, e del resto non dovresti comunque scorrere tutto l'array ma solo le posizioni che hai effettivamente riempito (e che non necessariamente sono tutte quante, c'è lo stesso errore anche nella funzione inverti). Il size di quell'array, dopo quel ciclo, è dato proprio da i, quindi per la stampa dichiara un indice j e scrivi semplicemente

    codice:
    for (j = 0; j < i; j++) {
       printf("%d" bin[j]);
    }
    putchar('\n');
    inoltre forse non hai bisogno di "invertire" l'array fisicamente, basta semplicemente stamparlo al contrario quindi potresti scrivere

    codice:
    for (j = i-1; j >= 0; j--) {
       printf("%d" bin[j]);
    }
    putchar('\n');
    Ti consiglio inoltre di evitare come la peste l'allocazione statica ricorrendo alle variabili, benché prevista dallo standard C99. All'inizio di main() scrivi semplicemente

    codice:
    int main(void)
    {
        int num;
        int bin[32];
        ...
    o anche

    codice:
    #define SIZE 32
    ...
    int main(void)
    {
        int num;
        int bin[SIZE];
        ...
    every day above ground is a good one

  3. #3
    Grazie ho modificato l'esercizio come dicevi tu e funziona ..ora vorrei capire cosa nn va nella function inverti perchè mi serve anche per altri programmi . o se tu hai qualke altra soluzione da propormi

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Senza modificare l'algoritmo di fondo, si può modificare la procedura così:

    codice:
    void inverti(int bin[], int size)
    {
        int i = 0, j = size - 1;
    
        for (i = 0; i < size/2 && j >= size/2; i++, j--) {
    	bin[i] ^= bin[j];
    	bin[j] ^= bin[i];
    	bin[i] ^= bin[j];
        }
    
        for (i = 0; i < size; i++) {
    	printf("%d", bin[i]);
        }
        printf("\n");
    }
    e la chiamata alla funzione, se la metti alla fine di cambiobase(), dovrà essere

    codice:
    cambiobase(bin, i);
    every day above ground is a good one

  5. #5
    la fuction inverti nn funziona lo stesso ... ti riscrivo l'esercizio modificato

    codice:
    #include<math.h>
    #include <stdio.h>
    #include<stdlib.h>
    #define base 2
    #define size 32
    void inverti(int*,int);
    void cambiobase(int n,int*);
    
    int main()
    {
        int num;
        int bin[size];
        printf("Dammi numero in base 10 per conversione in base 2 \n");
        printf("Numero=");
        scanf("%d",&num);
        cambiobase(num,bin);
        system("PAUSE");
        return 0; 
    }
    
    
    void cambiobase(int q,int bin[])
    {
        int i=0,j,r;
        while(q > 0) {
    	  bin[i++] = q % base;
    	  q /= base;
                          }
    
        putchar('\n');
        for (j = i-1; j >= 0; j--) {
           printf("%d" ,bin[j]);
                                         }
        putchar('\n');
    
         
        inverti(bin,i);
    }  
    
    void inverti(int bin[],int s)
    {
          int i = 0, j = s - 1;
    
          for (i = 0; i < s/2 && j >= s/2; i++, j--) {
    	  bin[i] ^= bin[j];
    	  bin[j] ^= bin[i];
    	  bin[i] ^= bin[j];
                                                               }
    
          for (i = 0; i < s; i++) {
    	  printf("%d", bin[i]);
                                                               }
          printf("\n");
    }
    mi devi scusare ma nn sono riuscito a fare post code

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Perché dici che non funziona? Ho fatto un bel po' di prove e va bene... con quali numeri hai provato? Quali risultati ottieni?

    Per il codice, vedi il punto sei del regolamento...
    every day above ground is a good one

  7. #7
    l'output è dato da due printf una dopo aver formato l'array e l'atra dopo averlo invertito ...ma i due numeri mi risultano uguali..

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

    Moderazione

    Originariamente inviato da whiterich86
    Ripropongo e chiedo scusa
    Il titolo è inadeguato. L'ho modificato io...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    Si ma il linguaggio è c nn c++...

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da whiterich86
    l'output è dato da due printf una dopo aver formato l'array e l'atra dopo averlo invertito ...ma i due numeri mi risultano uguali..
    Sì ma ti ripeto a me risultano tutti uguali, avrò fatto decine di prove, ti posso postare anche uno snapshot di conferma...

    Ti chiedevo con quali numeri stai provando...

    Se qualcun altro legge, provi l'ultimo codice postato da whiterich86 e dica se l'output è corretto...

    Sennò che dire, prova a cambiare l'algoritmo di "inversione", facendo a meno della XOR swap, anche se non vedo come possa dare problemi.

    codice:
    void inverti(int bin[], int s)
    {
    	int i, temp;
    
    	for (i = 0; i < s/2; i++) {
    		temp = bin[i];
    		bin[i] = bin[s-1-i];
    		bin[s-1-i] = temp;
    	}
    
    	for (i = 0; i < s; i++) {
    		printf("%d", bin[i]);
    	}
    	putchar('\n');
    }
    anche questo mi funziona correttamente.
    every day above ground is a good one

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.