# C-Programm zur Umrechnung von Dualzahlen in Dezimalzahlen



## ch275 (1. Dezember 2010)

Hallo,

ich soll ein C-Programm zur Umrechnung von Dualzahlen in Dezimalzahlen erstellen, das zunächst prüft, ob die Zahl eine Dualzahl ist. Wenn sie keine ist, soll eine Fehlermeldung erfolgen und eine erneute Eingabeaufforderung. Gerade dieser Teil bereitet mir große Probleme. Vielleicht kann mir aber schon jemand sagen, ob der Rest in etwa richtig oder wo ich noch etwas verbessern müsste. In der main-Funktion soll die Dualzahl eingeben und die Dezimalzahl ausgegeben werden.


#include <stdio.h>

void dezimal(int n, int z){
	if(n>0){
		if(n%10=1){
			x=x+pow(2,i);
			i++;
			n=n/10;
		}
		else {
			i++;
			n=n/10;
		}
	}
	return x;
}
int main(){
	int x;
	int n;
	int z;
	x=0;

	printf("Bitte Dualzahl eingeben: ");
	scanf("%d", &n);

	printf("Die Dezimalzahl ist %d", x);
}


Für Hilfe wäre ich sehr dankbar, habe nämlich noch nicht so viel Ahnung vom Programmieren.


----------



## sheel (1. Dezember 2010)

Willkommen bei tutorials.de 

Zuerst einmal: Wenn du [code=cpp]...[/code] schreibst, machst du das Ganze übersichtlicher und besser lesbarer. Hilft vor allem bei längeren Quelltexten.

Zur Aufgabe: Es wäre sinnvoller, die Dualzahl als String einzulesen

Ein int hat 32 Bit (4 Byte) (bzw. je nach Betriebssystem auch 16, 64 etc, ist jetzt aber egal).
Dh es kann 32 einzelne (Dual-)Stellen haben.
scanf behandelt seine Eingabe aber zuerst einmal als Dezimalzahl, damit hast du max. Werte bis 2^32=4294967296, also 10 Stellen.

Du könntest natürlich auch bei einem int prüfen, ob es nur aus Einsern und Nullern besteht und es dann umrechnen, aber so kommst du nicht auf die 32 bit.

Wenn du die Zahl als String hast (wobei dann jeder "Buchstabe" automatisch genau eine Ziffer ist) kannst du auch leichter prüfen, ob nur 1/0 vorkommt.

Ich schreib am Besten mal ein Beispiel und du sagst, was du nicht verstehst 

edit: Hier

```
#include<stdio.h>

int dezimal(char *x)
{
    int zahl=0, i;
    for(i=0;i<strlen(x);i++)
        zahl=zahl*2+(x[i]-'0');
    return zahl;
}

int main()
{
    char eingabe[32];
    int zahl, i;
    char allespasst;

    while(1)
    {
        printf("Bitte Zahl eingeben:\n");
        fgets(eingabe,31,stdin);
        allespasst=1;
        for(i=0;i<strlen(eingabe);i++)
        {
            if(eingabe[i]!='0'&&eingabe[i]!='1')
                allespasst=0;
        }
        if(allespasst==1)
        {
            zahl=dezimal(eingabe);
            printf("Die Dezimalzahl ist %d\n",zahl);
        }
        else
        {
            printf("Fehlerhafte Eingabe!\n");
        }
    }
}
```


----------



## ch275 (2. Dezember 2010)

Danke für die Antwort.

Ich muss aber leider C schreiben, dass ist das was wir benutzen müssen.

Was ich zudem nicht verstanden habe, ist, an welcher Stelle ruft deine main-Funktion die dezimal-funktion auf? Außerdem, was bedeuten die eckigen Klammern in der if-Schleife?


----------



## vfl_freak (2. Dezember 2010)

Moin,



ch275 hat gesagt.:


> Was ich zudem nicht verstanden habe, ist, an welcher Stelle ruft deine main-Funktion die dezimal-funktion auf?


in Zeile 29 des Beispiels .... 




ch275 hat gesagt.:


> Außerdem, was bedeuten die eckigen Klammern in der if-Schleife?


Meinst Du dies hier: *eingabe[ i ]* 
"eingabe" ist als 32 Zeichen langes char-Array deklariert und hiermit wird auf das i-te Zeichen zugegriffen (Array-Index immer von 0 bsi x-1)

Gruß
Klaus


----------



## sheel (2. Dezember 2010)

ch275 hat gesagt.:


> Ich muss aber leider C schreiben, dass ist das was wir benutzen müssen.


 
Und? Was ist an meinem Code nicht C?

Wegen den [] nocheinmal: eingabe kannst du dir wie eine Menge einzelner Buchstaben vorstellen.
Jeder Tastendruck beim einlesen ist einer (zumindest bei den Buchstaben-Tasten)
Mit [xyz] holst du dir einfach einzelne Buchstaben heraus.
Zu beachten ist aber, dass man nicht bei 1, sondern bei 0 zu zählen beginnt.

eingabe[0] ist also der erste Buchstabe
eingabe[1] der Zweite,
eingabe[2] der Dritte und so weiter.

Und strlen(eingabe) bei der for-Schleife ermittelt, wieviel Buchstaben eigentlich drin sind, von den maximal 32.
Man muss ja nicht immer genau 32 eingeben, es kann ja auch weniger sein.

Gruß

PS: if ist KEINE Schleife!
Schleifen wiederholen sich. Also while, for, dowhile ...


----------



## ch275 (2. Dezember 2010)

Danke für die Hilfe. Wie gesagt, ich habe so gut wie keine Ahnung vom Programmieren. Habe erst seit einem Monat Informatik und es wird alles nicht so gut erklärt.


----------

