Oppure

Loading
28/02/14 13:57
perillitommaso
il mio professore mi ha regalato questo pezzetto di codice che è ancora in work in progress, non me l'ha spiegato e piano piano che inizio a capirci qualcosa ci metto qualche commento, manca comunque la somma
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a; //numero decimale
    int b;
    char abcd[3]; //numero a in bcd
    char bbcd[3]; //numero b in bcd
    char aascii[6]; //numero a in ascii
    char bascii[6]; //numero b in ascii
    char cbcd[3];
    int aabs; //
    int babs;
    int asegno;//segno di a
    int bsegno;//segno di b
    int asegnobcd;
    int bsegnobcd;
    int csegnobcd;//segno di c in bcd
    int somma; //somma
    int riporto; //riporto

    printf("Somme in BCD\n");
    printf ("Primo numero? ");
    scanf ("%d", &a);
    printf ("Secondo numero? ");
    scanf ("%d", &b);

    if (a >= 0) {
        asegno = 1;
        asegnobcd = 0x0c; //segno di a in bcd
        aabs = a; //valore assoluto di a
    } else {
        asegno = -1;
        asegnobcd = 0x0d;
        aabs = -a;
    }

    sprintf (aascii, "%05d", aabs); //stampa il valore assoluto di a in 5 parti, il numero decimale verrà visualizzato a destra dopo gli 0

    abcd[0] = (aascii[0] - 0x30) * 16 + (aascii[1] - 0x30); //togliamo 30h per togliere ascii e moltiplichiamo per 16 per schiftare a sinistra di 4 bit
    abcd[1] = (aascii[2] - 0x30) * 16 + (aascii[3] - 0x30);
    abcd[2] = (aascii[4] - 0x30) * 16 + asegnobcd;

    printf ("a=%02x%02x%02x\n", abcd[0], abcd[1], abcd[2]);

    if (b >= 0) {
        bsegno = 1;
        bsegnobcd = 0x0c;
        babs = b;
    } else {
        bsegno = -1;
        bsegnobcd = 0x0d;
        babs = -b;
    }

    sprintf (bascii, "%05d", babs);

    bbcd[0] = (bascii[0] & ~(0x30)) * 16 + (bascii[1] & ~(0x30));
    bbcd[1] = (bascii[2] & ~(0x30)) * 16 + (bascii[3] & ~(0x30));
    bbcd[2] = (bascii[4] & ~(0x30)) * 16 + bsegnobcd;

    printf ("b=%02x%02x%02x\n", bbcd[0], bbcd[1], bbcd[2]);

    //somma in bcd
    if ((abcd[2] & 0x0f) == (bbcd[2] & 0x0f)) {
        csegnobcd = abcd[2] & 0x0f;
    } else {
      if (aabs > babs) {
        csegnobcd = abcd[2] & 0x0f;
      } else {
        csegnobcd = bbcd[2] & 0x0f;
      }
    }
    somma = abcd[2] / 16 + bbcd[2] / 16;
    if (somma > 9) {
        riporto = 1;
        somma = somma - 10;
    } else {
        riporto = 0;
    }
    cbcd[2] = somma * 16 + csegnobcd;

    return 0;
}
aaa
28/02/14 14:24
Scusa ... mi prendi in giro ?

Qui ci sono dei vettori

char abcd[3]; //numero a in bcd
char bbcd[3]; //numero b in bcd
char aascii[6]; //numero a in ascii
char bascii[6]; //numero b in ascii

che mi hai SUBITO escluso perché non li avevi fatti.

Senza parlare del segno

asegnobcd = 0x0c;

che come vedi vale C esadecimale (e mi hai fatto una manfrina su quello che ci poteva stare in un BCD e cosa no ...) e del fatto che quel codice è INUTILMENTE complicato (le poche righe che ti ho proposto fanno l a stessa identica cosa e senza vettori ... sarebbe bene che il tuo professore le studiasse ...) ...

E, per concludere, mi pare che alla fine ci sia la somma dove dice

//somma in bcd

O NO?


Sono stato per 40 post a discutere del nulla ... non penso perderò altro tempo ... :noway:
Ultima modifica effettuata da 28/02/14 14:32
28/02/14 14:59
perillitommaso
vedi che tu non hai assolutamente perso tempo, perchè noi i vettori non li abbiamo fatti per niente in informatica, se lui li ha utilizzati so cazzi suoi, io nemmeno sapevo che un vettore è una variabile di tipo char!!
aaa