Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Errore logico incomprensibile

    Ciao, ho un problema in cui non so dove sbattere la testa. Ecco il testo:
    "Si sviluppi un programma in linguaggio C che acquisisca in ingresso due numeri binari di 8
    bit e li memorizzi in due vettori num1 e num2. Successivamente ne faccia la somma
    algebrica interpretandoli come numeri rappresentati in complemento a due, ponendo il
    risultato (rappresentato in complemento a due) in un vettore somma e segnalando all’utente
    se c’è stato overflow."

    Ecco il mio codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        /* vettori da utilizzare */
        int num1[8];
        int num2[8];
        int somma[8];
        /* creazione di due variabili: riporto e "nona posizione": "nona posizione" sarà il riporto dell'ultimo bit */
        int carry=0, nona_posizione=0;
        /* variabile ciclo */
        int i;
        /* acquisizione primo numero */
        printf("Inserire in formato binario, il primo numero: \n");
        for(i=0; i<8; i++)
        {
                printf("%d° numero da destra: ", (i+1));
                scanf("%d", &num1[i]);
        }
        printf("*** FINE ACQUISIZIONE PRIMO NUMERO ***\n");
        /* acquisizione secondo numero */
        printf("Inserire in formato binario, il secondo numero: \n");
        for(i=0; i<8; i++)
        {
                printf("%d° numero da destra: ", (i+1));
                scanf("%d", &num2[i]);
        }
        printf("*** FINE ACQUISIZIONE SECONDO NUMERO *** \n");
        /* esecuzione somma */
        for(i=0; i<=8; i++)
        {
          /* ora i vari controlli: se 0 e 0  e carry=0 => 0 e carry=0
                                   se 0 e 1  e carry=0 => 1 e carry=0
                                   se 1 e 0  e carry=0 => 1 e carry=0
                                   se 1 e 1  e carry=0 => 0 e carry=1
                                   ----
                                   se 0 e 0  e carry=1 => 1 e carry=0
                                   se 0 e 1  e carry=1 => 0 e carry=1
                                   se 1 e 0  e carry=1 => 0 e carry=1
                                   se 1 e 1  e carry=1 => 1 e carry=1
           quando i=7 e carry=1, porremo nona_posizione=1
           */
           if(i!=8)
           {
                   /* 1 */
                   if(((num1[i]==0) && (num2[i]==0)) && (carry==0))
                   {
                       somma[i]=0;
                       carry=0;
                       /*printf("-> 0");*/
                   }
                   /* 2 */
                   if(((num1[i]==0) && (num2[i]==1)) && (carry==0))
                   {
                       somma[i]=1;
                       carry=0;
                   }
                   /* 3 */
                   if(((num1[i]==1) && (num2[i]==0))&& (carry==0))
                   {
                       somma[i]=1;
                       carry=0;
                   }
                   /* 4 */
                   if(((num1[i]==1) && (num2[i]==1)) && (carry==0))
                   {
                       somma[i]=0;
                       carry=1;
                   }
                   /* 5 */
                   if(((num1[i]==0) && (num2[i]==0)) && (carry==1))
                   {
                       somma[i]=1;
                       carry=0;
                   }
                   /* 6 */
                   if(((num1[i]==0) && (num2[i]==1)) && (carry==1))
                   {
                       somma[i]=0;
                       carry=1;
                   }
                   /* 7 */
                   if(((num1[i]==1) && (num2[i]==0)) && (carry==1))
                   {
                       somma[i]=0;
                       carry=1;
                   }
                   if(((num1[i]==1) && (num2[i]==1)) && (carry==1))
                   {
                       somma[i]=1;
                       carry=1;
                   }
           }
           else
           {
               if(carry == 1)
               { nona_posizione=1; }
           }
        } /* fine ciclo */
        /* scrittura del risultato */
        printf("Il risultato è: ");
        for(i=7; i>=0; i--)
        {
                printf("%d", somma[i]);
        }
        printf("\nE' stato rilevato overflow? ");
        /* controllo per overflow */
        if(carry==nona_posizione)
        { printf("No \n"); }
        else { printf("Si \n"); }
      system("PAUSE");	
      return 0;
    }
    Provando inserendo come num1: 00000001 e num2:00000001 ottengo come risultato: 00000011

    perché??? è un errore logico ma qualcosa mi sfugge!!! per me è in qualche ciclo for e non penso ad istruzioni logiche ma non sono proprio sicuro

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Intanto, penso che questa

    for(i=0; i<=8; i++)

    dovrebbe essere

    for(i=0; i<8; i++)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Scusa, nel sistemare avevo sbagliato = in effetti, ma il risultato è lo stesso!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Power Dragon
    Scusa, nel sistemare avevo sbagliato = in effetti
    Anche la if con

    !=8

    ?

    ma il risultato è lo stesso!
    Certo ... prova a seguire l'ordine di esecuzione ...

    Quando sono trovati i due bit 1 e 1, viene impostata la somma a 0 e il carry a 1

    Ma poi viene eseguita un'altra if con i due bit 1 e 1 e il carry a 1 e il risultato cambia ...

    Capito l'errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.