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,...