Binärzahladdition

jaecmae

Grünschnabel
Ich hab leider keine Ahnung wie ich das anstellen soll.
Weiss wer wie man zB 2 Zahlen 1010101 + 1000111 zusammen addiert in C. Ich bräuchte das dringend, kenn mich aber mit Feldern und Zeigern noch viel zu wenig aus. Buch hilft mir auch nicht viel weiter, hab unter der Woche leider auch nicht allzu viel Zeit. Programmieren ist leider nicht ganz mein Fach, jetzt zumindest noch, tu mir noch sehr schwer. Wär mir dann sehr geholfen, vielleicht kenn ich mich dann auch gscheiter aus. (... für Oktalzahlberechnung, usw.).
Nicht das ihr denkt ich wär zu faul es alleine zu probieren, ich hab einfach keine Ahnung wie ich das lösen sollt.
Danke, im Vornherein.
 
und wo is der unterschied zwischen einer zahlenvariable die einen oktal, dezimal, hexadezimal oder binärwert ernthällt?

den unterschied gibts nicht

c = a + b is für alle systeme gültig....
 
Code:
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    int a, b;
    char szA[20], szB[20], szBuf[20];

    printf("Erste Binärzahl:");
    gets(szA);
    printf("Zweite Binärzahl:");
    gets(szB);
    a = strtoul(szA, NULL, 2);
    b = strtoul(szB, NULL, 2);
    a += b;
    printf("Resultat: %s\n", ultoa(a, szBuf, 2));
    system("PAUSE");
    return 0;
}
das Resultat wird dann auch binär angezeigt, kannst du aber ändern indem du die 2 aus ultoa auf eine andere basis stellst
 
Bei mir kommen 3 Fehlermeldungen:/Dokumente und Einstellungen/Administrator/Desktop/Beispiele/Übungseinheit 2/Binärzahl.cpp C:\Dokumente und Einstellungen\Administrator\Desktop\Beispiele\Übungseinheit 2\C
In
16 C:\Dokumente und Einstellungen\Administrator\Desktop\Beispiele\Übungseinheit 2\Binärzahl.cpp
`
16 C:\Dokumente und Einstellungen\Administrator\Desktop\Beispiele\Übungseinheit 2\Binärzahl.cpp
(Each


Komisch, hätt mir das nicht so kurz gedacht:
Wir sollen das irgendwie so machen:
Vorschlag für den Funktionskopf:

long dec2digit (long d, long digits [ ], long len)

Die Länge len des Feldes wird als zusätzlichen Parameter übergeben.

Der Rückgabewert der Funktion wird als Fehlerindikator verwendet. Falls die Zahl mit der gegebenen Anzahl von STellen nicht dargestellt werden kann, soll die Funktion deen Wert 1 zurückgeben, andernfalls 0. Achten Sie darauf, dass im Fehlerfall die Feldgrenzen nicht überschritten werden.

Zum Ausgeben der berechneten STellen soll eine Funktion void printDigits (long digits [ ], lon len entwickelt werden.

Im Hauptprogramm werden die Funktionen aufgerufen. Zuerst wird eine nicht- negative Zahl einegelesen, diese in ihre Dezimal-Stellen zerlegt, und die STellen ausgegeben.

Führen Sie im Hauptprogramm eine Schleife ein, in werlcher der Benutzer die Berechnung mit einer anderen Zahl wiederholen kann.

Steht für das Referenzbeispiel:
Es sei eine positive ganze Zahl d gegeben. Gesucht sind die Dezimal-Stellen ai der Zahl d.

d = a0 + a1 * 10 + a2 * 10^2+ ... + an + 10^n

Zum Einlesen einer ganzen Zahl n>=0 entwickeln Sie eine Funktion long readPos().

Entwickeln Sie eine Funktion, welche die Stellen einer Zahl im Dezimal-System berechnet und in einem Feld speichert. Die einzelnen Stellen können dur folgende Anweisungen bestimmt werden:

a0= d Modula 10 (Rest der Ganzzahldivision von d/10)
d = d/10 (Ganzzahlendivision)
a1 = d Modula 10
d = d/ 10
usw.
bis d den Wert 0 annimmt.

Vorschlag für den Funktionskopf: .... siehe oben.

Die Erweiterung:
Schreiben Sie eine Funktion, welche die umgekehrte Aufgabe durchführt: Aus einem Feld mit den Dezimal-Stellen einer natürlichen Zahl wird der Wert der Zahl berechnet. Vorschlag für den Funktionskopf:

long digit2dec (long digits[ ], long len, long *d)

Achten Sie darauf, dass der Bereich der Variablen vom Typ long nicht überschritten wird. Der größte mögliche Wert ist Long_MAX und ist in der Header Datei limts.h definiert. Falls die Zahl nicht in einer long Variablen gespeichert werden kann, soll die Funktion den Wert 1 zurückgeben, andernfalls 0. Zum Testen Ihrer Funktionen bilden Sie die Differenz zwischen der berechneten und der eingelesenen Zahl.

Die Lösung ist dazu:

2.1: Einlesefunktion

Wir entwickeln eine Funktion zum Einlesen einer ganzen Zahl n>= 0. Die Funktion führt zusätzlich eine einfache Fehlerbehandlung durch.
Code:
long readPos()
{
  /* read in a non-negative integer number */

 long d = -1;
 long r;

   while (1)
   {
     printf("Enter a positive number: ");

     r = scanf("%ld", &d);

     /* clear input buffer */

     while (getchar() != ' \n'); /* read characters until ' \n '     is   found */
     if (d >= 0 && r == 1) break; 
     printf("wrong input! /n");

    }
    return d;
}
2.2 Berechnung der Dezimalstellen
Code:
long dec2digit (long d, long digits [ ], long len)
{
 long i;
 
 for (i = 0; i < len; i++)
    digits[i] = 0;
 for ( i = 0; (i < len) && (d ! = 0); i++)

       {
          digits[i] = d % 10; //remainder of integer division
          d = d/10;
       }
       if (d == 0)
           return 0; // return 0 in casse of success
       else
           return 1;
}

2.3 Ausgeben der Dezimalstellen
Code:
          void printfDigits (long digits[ ], long len)
           {
             /* skip trailing zeros */
             len = len - 1 ;
             while ((digits [len]) == 0 && (len > 0))
                    len = len - 1;
             while (len >= 0)
                {
                 printf ("%1ld", digits [len]);
                 len = len - 1;
                }
             printf ("/n/n");
            }
2.4 Berechnung der Zahl aus den Dezimalstellen

Wir überlegen uns die Lösung für den konkreten Fall n = 3 und verallgemeinern dann die Lösung für beliebiges n.
Code:
   d = a0 + a1 * 10 + a2 * 10^2 + a3 *10^3

Wir formen den Ausdruck um indem wir 10 herausheben,
Code:
        d = a0 + 10*(a1 + 10*(a2 + 10*a3)))

und beginnnen die Auswertung mit dem innersten Klammerausdruck:
Code:
                         d = a3
                         d= 10*d + a2
                         d = 10*d + a1
                         d = 10*d +a0

Die wiederkehrenden Zuweisungen werden mit einer for-Schleife programmiert:
Code:
          long d;
          long a[4];
         d = a[3];
          for (i = 2; i >= 0; i = i - 1)
         d = 10 * d + [i];

Die Erweiterung für eine allgemeine Anzahl von Stellen ist naheliegend:
Code:
#define N 20
long d;
long a[N];

d = a [N-1);
for (i = N - 2; i >= 0; i = i - 1)
     d = 10 * d + a [i];

Es kann der Fall eintreten, dass die angegebenen Dezimalstellen eine Zahl bilden, die den Werteberech des Datentyps long überschreitet. Dieser Fall soll erkannt werden. In der Headerdatei limits. h ist der größte mögliche Wert einer long Variablen als LONG_MAX definiert.
Code:
   long digit2Dec (long *d, long digits[], long len)
  { 
    long overflow = =;
    long i;

    *d = digits [ len - 1 ];
    for (i = len - 2; i >=0 && !overflow; i = i -1)
    {
     /* 10 * d + a[ i] <= LONG_MAX */
     /* therefore:   d <= (LONG_MAX - a[ i ]) / 10 */
     
     if (*d <= (LONG_MAX - digits [ i ]) / 10)
          *d = *d * 10 + digits [i];
     else
          overflow = 1;
     }

     return overflow;
   }
2.4.1 Das Hauptprogramm
Code:
#include <stdio.h>
#include <limits.h>

#define MAXDIG 20

/* function declarations */
long readPos();
long dec2digit      ( long  d, long   digits [ ], long len);
void printDigits     (               long   digits [ ], long len);
long digit2Dec      ( long *d, long digits[ ], long len);

main()
{
   long d = readPos ();

 /* compute the digits and check for error */
if  (dec2digit(d, digits, MAXDIG) == 1)
  printf("error: cannot compute all digits of %ld\n", d);
else
        {
          printf("The decimal digits are: ");
          printDigits(digits, MAXDIG);
        }

        // digit [ 12 ] = 1;   /*if you set this, you can test for overflow */
        if (digit2Dec (&d, digits, MAXDIG) == 1)
        {
          printf("error: overflow when trying to compute the number ");
          printfDigits(digits, MAXDIG);
        }
        else 
            printf("The decimal number was %ld\n", d);

         printf("Once again (Y/N) ? ");
          c = getchar();
          getchar();
        }while (c == 'Y'  || c == ' y ');
}

/* jetzt ghörn glaub ich die Punkte 2.1 bis 2.4 eingesetzt, oder? */
Das is so ein Referenzbeispiel das ma bekommen haben.
Und zu den Übungen sollen glaub ich Binärzahladdition oder Oktalzahladdition in dieser Form kommen.
Kann schon sein, dass man das einfacher machen kann, aber wir sind noch nicht so weit. ( 4 Übung!)

Danke. Hoffe, hab mich nicht verschrieben,...



:rolleyes:
 
Ich weiss, danke. Und wie mach ich das jetzt für die Binärzahladdition, mit dem was wir gelernt haben, nach dem Schema wie oben, nur das ichs mit Binär nicht weiss. mit Feldern und Zeigern. mit for schleife und so. for (i = 0; i < LEN; i = i + 1), und wie ichs ihm dann sag dass 1+1 0 ist. :; naja mir fällt der Prog.-Einstieg noch ziehmlich schwer.
 
binaer

Du machst es am besten genau wie im beipsiel und rechnest die binaerzahlen (die nach der eingabe ja erst einmal einen string darstellen) in eine dezimalzahl um. Machst deine Berechnung, und stellst sie wieder als binaerzahl dar. Mit dem Handwerkszeug aus dem Beispiel sollte das kein problem sein. Das einzige was du an neuen brauchst ist die umrechung: binaer<->Dezimal ...
 
Zurück