Dual in Dezimal mit Void-Funktion

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
IngStud1000
Beiträge: 2
Registriert: Di Jun 08, 2021 10:35 pm

Dual in Dezimal mit Void-Funktion

Beitrag von IngStud1000 » Di Jun 08, 2021 10:54 pm

Guten Abend,

ich habe ein Programm geschrieben, dass eine Dezimalzahl in eine Dualzahl (Binärzahl) umwandeln soll.

Leider gibt mir das Programm keine Werte aus. Ich mache den Programmierkurs erst seit drei Wochen, also erschlagt mich bitte nicht. ;)

Es wäre echt nett, wenn ihr mir helfen könntet.

Code: Alles auswählen

#include <stdio.h>

int main()
{
    int n;

    printf("Please enter a number between 0 and 31. The number must be an integer.");

    scanf("%d", &n);

    if(n < 0 || n > 31)
    {
    printf("The number is out of range. Please retry.");
    }
    else
    {
    void d2b(int n);
    }
    return 0;
}

void d2b(int n)
{
    int x;
    for(int i = 6; i >= 0; i--)

    x = n >> i;

    if(x & 1)
      printf("1");
    else
      printf("0");
}
Die Aufgabe lautet wie folgt:

1. Das Programm soll Dezimal- in Dualzahlen konvertieren.
2. Die Dezimalzahl soll zwischen 0 und 31 liegen. Falls nicht, soll das Programm dies feststellen und dem Benutzer mitteilen.
3. Es soll eine Funktion genutzt werden, die d2b(int n) heißen soll.
4 Was mich irritiert ist die Aufforderung "The function should return no value." Daher kam ich auf eine void Funktion.


Ich bedanke mich im voraus für eure Hilfe.


Bild
Mein erster entwurf war dierser hier, er hat aber auch nicht funktionier.

Code: Alles auswählen

#include<stdio.h>


int main()
{
    int n;
    int a, b, c, d, e;
    printf("Please enter a number between 0 and 31. The number must be an integer!");
    scanf("%d", &n);
    if(n < 0 || n > 31)
    {
    printf("The entered value is out of range. Please enter an integer number between 0 and 31!");
    }
    else
    {
    void d2b(int n);
    }

    printf("%d %d %d %d %d", a, b, c, d, e);


    return 0;
}

void d2b(int n) // Example: 25
{
    int a, b, c, d, e;
    int u, v, w;
    n % 2 == e;  // 25%2 = 1
    n / 2 == u;  // 25/2 = 12
    u % 2 == d;  // 12%2 = 0
    u / 2 == v;  // 12/2 = 6
    v % 2 == c;  //  6%2 = 0
    v / 2 == w;  //  6/2 = 3
    w % 2 == b;  //  3%2 = 1
    w / 2 == a;  //  3/1 = 1
                 // This leads to a b c d e = 11001 -> 16 + 8 + 0 + 0 + 1 = 25
              
    return 0;          


}

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Dual in Dezimal mit Void-Funktion

Beitrag von nufan » Mi Jun 09, 2021 8:49 am

Hallo IngStud1000 :)
IngStud1000 hat geschrieben:
Di Jun 08, 2021 10:54 pm

Code: Alles auswählen

    else
    {
    void d2b(int n);
    }
Mit deiner Anweisung im "else"-Zweig gibst du bekannt, dass es eine Funktion mit dem Namen "d2b" gibt, die einen Integer als Parameter bekommt und nichts ("void") zurück gibt. Das allein ruft deine Funktion allerdings nicht auf, der Code wird also gar nicht ausgeführt. Beim Aufruf werden die Typen des Rückgabewertes sowie der Parameter weggelassen. Das würde in diesem Fall also so aussehen:

Code: Alles auswählen

    else
    {
      d2b(n);
    }
Damit wirst du vom Compiler vermutlich eine Warnung bekommen, dass diese Funktion nicht bekannt ist. Um das zu lösen gibt es zwei Möglichkeiten:
1) Du verschiebst den Code von "d2b" über "main". Bei kleineren Programmen wie diesem ist das in Ordnung.
2) Du verwendest einen Funktions-Prototypen, der nur die Signatur der Funktion bekannt gibt. Das ist eigentlich genau das, was du statt dem Aufruf gemacht hast :)

Code: Alles auswählen

void d2b(int n);    // Nur ein Prototyp, kein Code von "d2b"!

int main()
{
  // ...
  else
  {
    d2b(n);
  }
  // ...
}

void d2b(int n)
{
// Code von "d2b"
}
Vor allem bei größeren Programmen wirst du auf Option 2) zurückgreifen müssen. Es schadet sicher nicht, sich das anzugewöhnen :)

Damit sollte deine Funktion mal aufgerufen werden. Sehen wir uns nun "d2b" an:
IngStud1000 hat geschrieben:
Di Jun 08, 2021 10:54 pm

Code: Alles auswählen

void d2b(int n)
{
    int x;
    for(int i = 6; i >= 0; i--)

    x = n >> i;

    if(x & 1)
      printf("1");
    else
      printf("0");
}
Ohne geschweifte Klammern beziehen sich Kontrollstrukturen wie "for", "if" und "while" nur auf die jeweils nächste Anweisung. Ausgeführt wird mit deinem Code also eigentlich das:

Code: Alles auswählen

void d2b(int n)
{
    int x;
    for(int i = 6; i >= 0; i--)
    {
      x = n >> i;
    }

    if(x & 1)
      printf("1");
    else
      printf("0");
}
Der untere Teil der Funktion wird damit nur ein einziges Mal ausgeführt. Hier musst du also noch die Klammersetzung korrigieren :)

IngStud1000
Beiträge: 2
Registriert: Di Jun 08, 2021 10:35 pm

Re: Dual in Dezimal mit Void-Funktion

Beitrag von IngStud1000 » Mi Jun 09, 2021 12:01 pm

Ich danke dir sehr. Jetzt habe ich es endlich verstanden. :)

Genial, dass man hier so schöne Erklärungen bekommt. Die Programme funktionieren jetzt einwandfrei.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Dual in Dezimal mit Void-Funktion

Beitrag von nufan » Mi Jun 09, 2021 12:13 pm

Freut mich, dass ich dir helfen konnte :)

Übrigens haben wir in unserem Wiki einen eigenen C-Kurs:
https://www.proggen.org/doku.php?id=c:start
Sollte es Fragen dazu geben, kannst du dich natürlich jederzeit im Forum melden.

Antworten