Erste Schritte beim Programmieren mit Eurer Hilfe



  • Hallo, ich würde gerne eine Eingabe in eine andere Funktion übernehmen.
    jedoch bekomme ich eine falsche Zahl zugewiesen. Könnt ihr mir weiterhelfen?

    Das folgende Programm läuft unter Dev-C++ 4.9.5.0

    #include <stdio.h>
    #include <iostream.h>
    
    //Deklaration der Funktion
    void binear();
    
    //Hauptprogramm
    void main()
    {
        int x=0;
    	int eingabe;
        x = eingabe;    
    
    	cin >> eingabe;
    	x = eingabe;
    
        binear(); 
    }
    
    //Funktion binear soll zahl in 8 Bit umwandeln
    void binear()
    {
        //Wandelt eine Dezimalzahl in ein 8 Bit Binärfeld um!!
    
    	int x;
    	int h=255;
    	int bin[9];    // Array bekommt 9 Felder zugewiesen
    	int i=1;
    
        if (x<=255)
        {   
        for (i=1;i<=8;i++)
        {
            h = h / 2; //128-64-32-16-8-4-2-1
            if (x-h > -1)
            {
                x=x-h;
                bin[i]=1;        //Aufruf des Array's, zahl wird in i gespeichert
            }
    
            else 
            {
                bin[i]=0;
            }
    
        }
    
        cout << endl <<endl;
    
        // Ausgabe des gesamten Arrays
        for (i=1; i <= 8; i++)
        {
            cout << bin[i];
        }
        }
        else
        {
        cout << "Das oktett ist nichtig";
        }
        getchar();
    }
    


  • Du hast ja auch zwei völlig unabhängige Variablen main::x und binaer::x (und letztere wird nicht einmal initialisiert). Wenn du in der Funktion den Wert verwenden willst, den du im Hauptprogramm eingelesen hast, mußt du ihn als Parameter übergeben:

    void binaer(int)
    
    int main()
    {
      int value;
      ...
      binaer(value);
    }
    
    void binaer(int x)
    {
      //x hat jetzt den Wert von 'value' kopiert bekommen
      ...
    }
    

    PS: Gewöhn dir lieber gleich einen standardkonformen Stil an - es heißt "int main()" und "#include <iostream>" (<stio.h> kann man gerade noch durchgehen lassen, aber für dein Programm brauchst du es sowieso nicht).

    Edit: Und ehe ich es vergesse - sfds



  • @CStoll: <cstdio> 🙂



  • habe das ganze mal eingefügt, jedoch bekomme ich leider nur 8mal die null angezeigt.

    wobei ich bei der eingabe von z.b. 12 gerne die ausgabe von 00001100 hätte 😃



  • Zeig doch mal den korrigierten Code - ich vermute mal, du hast irgendwas nicht richtig zusammengefügt.

    @DEvil: Ja, wieso?



  • #include <stdio.h>
    #include <iostream.h>
    
    int binear(int);
    
    void main()
    {
        int x;
    	int eingabe;
    	int value;
    
        x = eingabe;    
    
    	cin >> eingabe;
    	x = eingabe;
    
        binear(value); 
    }
    
    int binear(int x)
    {
        //Wandelt eine Dezimalzahl in ein 8 Bit Binärfeld um!!
    
    	int h=255;
    	int bin[9];    // Array bekommt 9 Felder zugewiesen
    	int i=1;
    
        if (x<=255)
        {   
        for (i=1;i<=8;i++)
        {
            h = h / 2; //128-64-32-16-8-4-2-1
            if (x-h > -1)
            {
                x=x-h;
                bin[i]=1;        //Aufruf des Array's, zahl wird in i gespeichert
            }
    
            else 
            {
                bin[i]=0;
            }
    
        }
    
        cout << endl <<endl;
    
        // Ausgabe des gesamten Arrays
        for (i=1; i <= 8; i++)
        {
            cout << bin[i];
        }
        }
        else
        {
        cout << "Das oktett ist nichtig";
        }
        getchar();
    }
    


  • Du hast viel zu viele Variablen im Hauptprogramm und übergibst dann natürlich genau die falsche 😉 Deine Eingabe wird in 'eingabe' eingelesen und dann nach 'x' kopiert (wozu eigentlich) - und anschließend übergibst du 'value' (das bislang nicht einmal initialisiert ist) an die Hilfsfunktion.

    *tief durchatmet*

    int binear(int);
    
    int main()
    {
        int eingabe;
        cin >> eingabe;
        binear(eingabe); 
    }
    

    PS: Und beherzige bitte die Bonushinweise aus meinem letzten Beitrag - inklusive sfds



  • /Hauptprogramm
    void main()
    {
    int x;

    cin >> x;

    binear(x); //<-- kannst du mir sagen, was ich mit diesem x mach ??
    }

    Ok, jetzt funzt es fast. bis auf bekomme jetzt bei 12 00001111 angezeigt. sollte zwar 00001100 sein aber immer hin 😋



  • Dieses x wird jetzt als Parameter an die Funktion binaer(int x/* <- genau hier*/) übergeben.

    Zu dem Fehler: Vielleicht solltest du die Schleife mit 'h=256;' beginnen, damit du auf die richtigen Werte kommst (int-Division rundet grundsätzlich ab, darum vergleichst du x (=12) nacheinander mit 127,63,31,15,7(x wird 5),3(x wird 2),1(x wird 1) und 0.

    PS: Zum dritten und (hoffentlich) letzten Mal: sfds (bitte einmal lesen und in Zukunft umsetzen - herzlichen Dank)



  • genial, du bist ein Held. Danke, genau die dumme 5 war der fehler.
    Nur komisch, das es ohne die funktion auch mit der 5 funktioniert, aber ok, wohl wieder etwas, was man sich einfach merken muss...

    Jedoch muss ich zu meiner Schandtat gestehen, dass ich aus dem Link nicht wirklich schlau werde.

    jedoch habe ich den befehl return bei der Funktion binear eingesetzt, damit er den Befehl an meine Hauptfunktion zurückgibt.
    😕 ich denk mal, dass das so war...



  • Chaos5 schrieb:

    genial, du bist ein Held. Danke, genau die dumme 5 war der fehler.
    Nur komisch, das es ohne die funktion auch mit der 5 funktioniert, aber ok, wohl wieder etwas, was man sich einfach merken muss...

    Ja, vermutlich 😉

    Jedoch muss ich zu meiner Schandtat gestehen, dass ich aus dem Link nicht wirklich schlau werde.

    Na gut, dann in Kurzfassung - wenn du am Anfang und Ende deiner Quelltexte je einmal auf den Button "C/C++" unter dem Eingabefeld drückst, werden deine Programmtexte in [cpp]-Tags eingeschlossen - und das erleichtert es uns, sie zu lesen (auf die Weise bekommst du auch die wunderbar farbige Darstellung, die du bei meinen Beiträgen siehst ;)).

    jedoch habe ich den befehl return bei der Funktion binear eingesetzt, damit er den Befehl an meine Hauptfunktion zurückgibt.
    😕 ich denk mal, dass das so war...

    😕 Was will uns dieser Satz jetzt sagen?



  • naja, ich hoffe, das ich das mit dem return so richtig erzählt habe.

    *g nun komme ich auch schon zu meinem nächsten prob. denn ich möchte nun 4 mal eine Zahl (mit anderen worten eine IP) eingeben. die in eine binärzahl umgewandelt wird...



  • Dann pack die gesamte Eingeben-Umwandeln-Sequenz in eine Schleife (hier dürfte for() am besten passen).



  • ?? verstehe ich nicht ganz.

    Ich werde mich mal weiter daran versuchen...

    Auf jedenfall muss ich nun 4 oktette eingeben z.B. 192.168.5.1
    die Punkte trennen die oktette. d.h. 192 = okt1 ; 168 =okt2 usw.
    und diese sollen dann seperat ausgewertet werden und dann alle zusammen ausgegeben werden.

    192 --> 11000000
    168 --> 10101000
    5 --> 00000101
    1 --> 00000001



  • Wie gesagt, nimm eine Schleife:

    for(i=0;i<4;++i)
    {
      cin>>eingabe;
      cin.get();//um die Punkte als Trennzeichen zu überlesen
      binaer(eingabe);
      cout<<" ";//Trennung zwischen den Oktetten in der Ausgabe
    }
    


  • //Deklaration von Funktion
    int binear(int);
    int okt(int,int,int,int);
    
    //Hauptprogramm
    void main()
    {
        int x;
    	int okt1,okt2,okt3,okt4;
    	char point;
    
    	cin >> okt1 >> point >> okt2 >> point >> okt3 >> point >> okt4;
    	okt (okt1,okt2,okt3,okt4);
    
    	getchar();
    //    binear(x); //<-- Dieses x wird jetzt als Parameter an die Funktion binaer(int x/* <- genau hier*/) übergeben.
    }
    
    //Oktette weiterleiten zur Berechnung
    int okt(int okt1,int okt2,int okt3,int okt4)
    {
        int x;
        int i;
    
        x=okt1;
        binear(x);
    
        x=okt2;
        binear(x);
    
        x=okt3;
        binear(x);
    
        x=okt4;
        binear(x);
    
        return 0;    
    }
    

    habs mal so gedeichselt. jedoch ist dies noch keine elegante Lösung 😞
    zudem stört mich noch, das die oktette untereinander stehen und nicht nebeneinander durch einen Punkt getrennt...



  • #include <iostream>
    #include <sstream>
    #include <string>
    
    // speichert die Binärdarstellung einer Dezimalzahl in einem String
    std::string binaer(unsigned int dec)
    {
        std::ostringstream s;
        while(dec > 0)
        {
            s << dec % 2;
            dec = dec / 2;
        }
        return s.str();
    }
    
    int main()
    {
        // die vier Oktette
        unsigned int octets[4];
    
        // liest die IP-Addresse als String ein statt als einzelne Zahlen
        std::string s;
        std::cout << "Geben Sie eine IP-Addresse im Format XXX.XXX.XXX.XXX ein: ";
        std::cin >> s;
    
        // extrahiert die vier Oktette als Zahlen aus dem String
        std::istringstream ss(s);
        char point;
        ss >> octets[0] >> point >> octets[1] >> point >> octets[2] >> point >> octets[3];
    
        // gibt die Binärdarstellung der vier Oktette aus
        std::cout << binaer(octets[0]) << std::endl;
        std::cout << binaer(octets[1]) << std::endl;
        std::cout << binaer(octets[2]) << std::endl;
        std::cout << binaer(octets[3]) << std::endl;
    
    	return 0;
    }
    


  • Okay, somit käme ich zu meinem nächsten Prob, wobei ich nicht weiß wie ich es umsetzen muss.
    Also ich möchte die maximale Anzahl der Hosts ermitteln, aus einer x-beliebigen Adresse. z.B. 255.255.255.240
    die binäre Ausrechnung hätten wir ja schonmal...
    11111111.11111111.1111111.11110000 oder ander /28
    28-32 (max Anzahl) = 4
    dann soll er 2^4 rechnen = 16
    und die - 2 (Broadcast und die Netzwerk ID) =14

    somit hätten wir ja unsere Maximale Anzahl unserer hosts.

    jedoch, wie wird das ganze umgesetzt? könnt ihr mir da helfen?

    weiß nicht unter anderem nicht, wie ich es bewerkstelligen soll, dass er die binären 1'zen zusammenzählt 😞



  • #include <stdio.h>
    #include <iostream.h>
    #include <conio.h>
    #include <math.h>
    
    struct IP     //In dieser Struktur sind Variablen hinterlegt, die ich mit IP aufrufen kann
    {
        //Speicherung für Dezimale Darstellung (192.1.1.1)
        int dez_okt1,dez_okt2,dez_okt3,dez_okt4;
        int bin_okt1[8],bin_okt2[8],bin_okt3[8],bin_okt4[8];
    };
    
    //Wandelt eine Dezimalzahl in ein 8 Bit Binärfeld um!!
    void dezi_to_bin(int dezimalzahl, int *binaer_feld)
    {
       int modrest=0, divisionsrest,  i;
       //Initialisierung
       for (i=0;i<=7;i++)
       {
          binaer_feld[i] = 0;
       }
       divisionsrest = dezimalzahl;
       i=7;
       do
       {
    	  modrest=divisionsrest%2;
    	  binaer_feld[i]=modrest;
    	  divisionsrest=divisionsrest/2;
    	  i--;
       }
       while(divisionsrest != 0);
    }
    
    //Hilfsfunktion zum Rechnen mit Exponenten
    int exponent(int basis, int exponent)
    {
       int ergebnis;
       ergebnis=basis;
       if(exponent==0)
       {
          ergebnis=1;
       }
       else
       {
          for(int i=1; i<exponent; i++)
          {
             ergebnis=ergebnis*basis;
          }//for(int i=0; i<=exponent; i++)
       }
       return ergebnis;
    }//int exponent(int basis, int exponent)
    
    //Umrechnung einer Binarzahl in eine Dezimalzahl.
    //Die Binarzahl muss durch ein array mit 8 Elementen uebergeben werden.
    //Es wird die Dezimalzahl vom Typ int zurueckgegeben.
    //Beispiel fuer die Dezimalzahl 192 als Binaerzahl im array.
    //Element [1][1][0][0][0][0][0][0 ]
    //Index    7  6  5  4  3  2  1  0
    int bin_to_dezi(int *binaer_feld)
    {
       int dezizahl, hilf;
    
       dezizahl=0;
    
       for(int i=0; i<8; i++)
       {
          dezizahl=dezizahl+binaer_feld[i]*exponent(2,i);
       }//for(int i=0; i<8; i++)
       return dezizahl;
    }//int bin_to_dezi(int* binarzahl)
    
    //Umwanldeln von dezimale Darstellung in Binäre Darstellung
    void IP_Adress_dezi_to_bin(IP  &ip)
    {
       dezi_to_bin(ip.dez_okt1,ip.bin_okt1);
       dezi_to_bin(ip.dez_okt2,ip.bin_okt2);
       dezi_to_bin(ip.dez_okt3,ip.bin_okt3);
       dezi_to_bin(ip.dez_okt4,ip.bin_okt4);
    }
    
    //Übergabeparameter call by reference (Original)
    void Einlesen(IP &Ip1)
    {
       char point;
       cout <<"Bitte geben Sie die IP-Adresse an:192.1.1.1 :";
       cin >>Ip1.dez_okt1>>point>>Ip1.dez_okt2>>point>>Ip1.dez_okt3>>point>>Ip1.dez_okt4;
    
       //Umwandlung in Binäre Darstellung
       dezi_to_bin(Ip1.dez_okt1,Ip1.bin_okt1);
       dezi_to_bin(Ip1.dez_okt2,Ip1.bin_okt2);
       dezi_to_bin(Ip1.dez_okt3,Ip1.bin_okt3);
       dezi_to_bin(Ip1.dez_okt4,Ip1.bin_okt4);
    }
    
    void main()
    {
        IP Ip1;
        //Binäre Umwandlung
        cout<<"IP: "<<Ip1.dez_okt1<<"."<<Ip1.dez_okt2<<"."<<Ip1.dez_okt3<<"."<<Ip1.dez_okt4;
        getchar();
    }
    

    Also, ich hab kein plan, wie das prog jetzt funzt. wenn ihr es wisst, wäre ich für ne Erklärung dankbar.

    zudem, bekomme ich die Ausgabe von den oktetten nicht hin 😞

    wisst ihr eine Lösung??



  • es heißt <iostream> nicht <iostream.h>

    Chaos5 schrieb:

    Also, ich hab kein plan, wie das prog jetzt funzt. wenn ihr es wisst, wäre ich für ne Erklärung dankbar.

    Wir können dir nicht helfen wenn du sagst du blickst überhaupt nichts . Du musst uns schon genau sagen von was du keinen Plan hast (welche Zeilen du nicht kapierst)



  • Ich blick den Ablauf des Progs nicht durch.
    dadurch weiß ich auch nemme, welche funktion ich schreiben muss, um die okts auszulesen.

    Sagen ma's so, ich weiß das dort einzelne funktionen sind, die ineinander greifen.

    😞 Also viel plan von nichts....


Anmelden zum Antworten