Salve, dopo aver letto la guida, e usufruito della conoscenza degli utenti sul forum
, ho ho provato a fare la somma di numeri binari, niente di complicato sopratutto per chi se ne intende (
XD ), però anche se funziona ci sono delle cose di cui non sono sicuro:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main()
{
int n; //numero di bit dei numeri
int c; //variabile di conteggio delle varie istruzioni
int o; //variabile per invertire la posizione gli array
int riporto; //variabile per il riporto della somma binaria
char *c_bit1; //puntatore per la stringa del primo numero binario
char *c_bit2; //puntatore per la stringa del secondo numero binario
int *bit1; //puntatore per i numeri del primo numero binario
int *bit2; //puntatore per i numeri del secondo numero binario
int *somma; //puntatore per i numeri del numero della somma
printf("inserire il numero di bit di ogni numero\n");
scanf("%d", &n);
c_bit1 = (char *)malloc(sizeof(char) * n); //Allocazione blocco di n bit per la stringa
if(c_bit1 == NULL)
{
printf("Memoria esaurita");
return(0);
}
printf("\nInserire il primo numero di %d bit\n", n);
scanf("%s", &*c_bit1); //Lettura della stringa
bit1 = (int *)malloc(sizeof(int) * n); //Allocazione blocco di n bit per il numero
if(bit1 == NULL)
{
printf("Memoria esaurita");
return(0);
}
o = (n - 1); // Utilizzata per invertire la locazione della variabile nell'array
for(c = 0; c < n; c++)
{
bit1[c] = (int)c_bit1[o]; //Assegnazione (con posizione invertita 0 a 3, 1 a 2...) del valore
o--; // in ASCII della stringa
}
free(c_bit1);
for (c = 0; c < n; c++)
{
if (bit1[c] == 48) //Conversione da codice ASCII ad intero associato
bit1[c] = 0;
else if(bit1[c] == 49)
bit1[c] = 1;
else
{
printf("\nE' stato inserito un carattere errato (%d)", bit1[c]);
return(0); // Se viene inserito un carattere differente da '0' o '1'
}
}
c_bit2 = (char *)malloc(sizeof(char) * n); //Memoria per la seconda stringa
if(c_bit2 == NULL)
{
printf("Memoria esaurita");
return(0);
}
printf("\nInserire il secondo numero di %d bit\n", n); //lettura stringa
scanf("%s", &*c_bit2);
bit2 = (int *)malloc(sizeof(int) * n); //Memoria per il secondo numero
if(bit2 == NULL)
{
printf("Memoria esaurita");
return(0);
}
o = (n - 1); // Utilizzata per invertire
for (c = 0; c < n; c++)
{
bit2[c] = (int)c_bit2[o]; //Assegnazione (con posizione invertita 0 a 3, 1 a 2...) del valore
o--; // in ASCII della stringa
}
free(c_bit2); //Liberazione memoria
for (c = 0; c < n; c++)
{
if(bit2[c] == 48) //Conversione ASCII to intero
bit2[c] = 0;
else if (bit2[c] == 49)
bit2[c] = 1;
else
{
printf("\nE' stato inserito un carattere errato (%d)", bit2[c]);
return(0);
}
}
somma = (int *)malloc(sizeof(int) * n); //Memoria per somma
riporto = 0;
for(c = 0; c < n; c++) //Calcolo della somma binaria
{
somma[c] = bit1[c] + bit2[c] + riporto;
if(somma[c] == 0)
riporto = 0;
else if(somma[c] == 1)
riporto = 0;
else if(somma[c] == 2)
{
somma[c] = 0;
riporto = 1;
}
else if(somma[c] == 3)
{
somma[c] = 1;
riporto = 1;
}
}
free(bit1); //liberazione memoria
free(bit2);
printf("\n");
if (riporto == 1)
printf("1"); //stampa se presente il riporto finale
for(c = (n - 1); c >= 0; c--)
printf("%d", somma[c]); //stamma le cifre della somma
getchar();
getchar();
}
Prima di tutto non è che c'è un modo per eliminare il passaggio di scambio tra c_bit1 e bit1 e quindi anche il convertitore da ASCII utilizzando direttamente i dati in ingresso? (prelevandoli sempre come stringa e non bit per bit).
Secondo, utilizzo della variabile 'o' non è che c'è un modo più sensato?
L'utilizzo di malloc è corretto (o almeno abbastanza XD)?
Grazie in anticipo, spero che il titolo vada bene