Erste Schritte beim Programmieren mit Eurer Hilfe



  • //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....



  • Hallo, wisst ihr rat?
    und zwar soll der Rückgabewert eine von den Hostwerten sein (habe ich fett markiert) (je nachdem welches netz eingegeben wurde) die ich durch eine if-schleife getrennt habe.

    [/cpp]#include <stdio.h>
    #include <iostream.h>

    //Eigener Datentyp Struktur anlegen
    struct IP
    {
    int dez_okt1,dez_okt2,dez_okt3,dez_okt4;
    int bin_okt1[8],bin_okt2[8],bin_okt3[8],bin_okt4[8];
    int hostanzahl;
    };

    //Wandelt Dezimalzahl zw. 0-255 in ein 8 Bit Feld 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);
    }

    void Eingabe(IP &IP_1)
    {
    char Punkt;
    //Eingabe der IP_Adresse
    cout << "Geben Sie eine IP Adresse ein: (192.1.1.1): ";
    cin >>IP_1.dez_okt1>>Punkt>>IP_1.dez_okt2>>Punkt>>IP_1.dez_okt3>>Punkt>>IP_1.dez_okt4;

    dezi_to_bin(IP_1.dez_okt1,IP_1.bin_okt1);
    dezi_to_bin(IP_1.dez_okt2,IP_1.bin_okt2);
    dezi_to_bin(IP_1.dez_okt3,IP_1.bin_okt3);
    dezi_to_bin(IP_1.dez_okt4,IP_1.bin_okt4);
    }

    void AusgabeBin(IP &IP_1)
    {
    //Ausgabe der IP_Adresse binär
    for(int i=0;i<8;i++)
    {
    cout <<IP_1.bin_okt1[i];
    }
    cout <<".";

    for(int i=0;i<8;i++)
    {
    cout <<IP_1.bin_okt2[i];
    }
    cout <<".";

    for(int i=0;i<8;i++)
    {
    cout <<IP_1.bin_okt3[i];
    }
    cout <<".";

    for(int i=0;i<8;i++)
    {
    cout <<IP_1.bin_okt4[i];
    }
    }

    //Subnetzmaske bestimmung
    void sub(IP &IP_1)
    {
    int i,host=1;

    if (IP_1.dez_okt1 >= 192 && IP_1.dez_okt1 <= 223)
    {
    for (i=1;i<=8;i++)
    {
    host = host* 2;
    }
    host = host -3;

    cout << endl << host << endl;
    }

    if (IP_1.dez_okt1 >= 128 && IP_1.dez_okt1 <= 191)
    {
    for (i=1;i<=8;i++)
    {
    host = host* 2;
    }
    host = (host -1)*(host -1)-2;

    cout << "Es sind " << host << " Hosts moeglich";
    }

    if (IP_1.dez_okt1 > 0 && IP_1.dez_okt1 <= 126)
    {
    for (i=1;i<=8;i++)
    {
    host = host* 2;
    }
    host = (host -1)(host -1)(host -1)-2;

    cout << "Es sind " << host << " Hosts moeglich";
    }
    }

    void main()
    {
    IP IP_1;
    Eingabe(IP_1);
    cout <<endl;
    AusgabeBin(IP_1);
    cout <<endl;
    sub (IP_1);

    getchar();
    }[cpp]



  • if-Schleife? kenn ich nich.
    es heißt <iostream> nicht <iostream.h>
    Deinen Code habe ich nicht durchgelesen sieht mir zu unübersichtlich aus (mach die c++-Tags bitte richtigrum und rück den Text ein)

    mfg kaffee



  • kaffee schrieb:

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

    Ältere Compiler akzeptieren (nur) <iostream.h>. Allerdings ist der korrekte Header schon länger <iostream>.

    Erwartest du, dass du jedes mal, wenn ein Fehler auftaucht du einfach hier deinen Code postest und die eine Lösung vorgesetzt bekommst? Wie du schon selber gesagt hast, du verstehst nicht was du da machst. Das bestätigen ja auch deine Aussagen ala if-Schleife. Es bringt nichts, wenn wir deinen Code korregieren, du ihn kopierst und in deine IDE einfügst. Dadurch werden die Probleme zwar gelöst allerdings weißt du beim nächsten mal immernoch nicht, wo die fehler liegen.
    Außerdem beschreibst du in einer Zeile völlig unzureichend deine Probleme und hängst einen unstrukturierten und unformatierten Code an. Du solltest ganz klar über deine eigenen Fähigkeiten und deine Ziele nachdenken.



  • temporärer-gast schrieb:

    kaffee schrieb:

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

    Ältere Compiler akzeptieren (nur) <iostream.h>. Allerdings ist der korrekte Header schon länger <iostream>.

    Echt? Meiner aktzeptiert <iostream.h> nicht.



  • Ok, Ich habe mich etwas unklar ausgedrückt:
    Ältere Compiler akzeptieren <iostream.h> allerdings akzeptieren sie <iostream> nicht. Das gegenteil ist bei neueren Compilern der Fall.



  • Sorry, leuts. Aber ich verstehe nicht viel vom Programmieren *g ihr könnt mich über Heizungsanlagen ausquetschen, darüber könnte ich euch ne Menge erzählen...
    Aber das ist ein anderes Ding. Fakt ist, das ich mitten in einer Umschulung stecke und ich es fast geschafft habe... werde das Programmieren wohl nach meiner Ausbildung nie wieder brauchen. Aber man soll ja nie nie sagen 😉

    ja, ich benutze einen älteren compiler (dev c++ ver. 4.9.5.0)

    ich muss mit den veralteten Befehlen Arbeiten, da wir in der Schule nur mit diesen arbeiten. (dort benutzen wir BorlandC++ 5.02)

    Das Prog funktioniert so wie ich es gepostet hab.
    Erklären könnte ich es. zu 80%.

    Warum ich poste. weil ich auf hilfe hoffe. quäle mich mit der sch. da ich es bis zum 29.05.07 fertig haben und das ganze präsentieren soll. sonst könnt ich meine bewerbung im sommer vergessen... Aber wie das ist, wisst ihr selbst...

    Was ich von meiner seite aus tu'e. ich lese in 4 verschiedenen Büchern. Leider sind diese alle veraltet aber im prinzip stimmt der code soweit noch.
    finde nicht immer alles und weiß leider oft nicht weiter... so dass es nur sperrlich vorran geht.

    Und ja, es gibt bestimmt ne elegantere Lösung als mit if...
    Jedoch fehlt mir einfach die übung, das ich darauf komme, und wenn man etwas sieht dann funzt es halt besser.

    sogar die großen schauen sich aus links sachen ab und kopieren sich diese in ihr trade lassen den kompiler drüber laufen und schauen, was dieser macht und verstehen es so...

    Habe ja nicht umsonst diesen Tread "Erste Schritte" genannt...
    ___________________________________________________________

    Was ich zuerst hinbekommen muss ist dies:
    //Die Funktion berechnet die Maximale Anzahl der Hosts
    //Abhängig davon welche Ip Adresse übergeben wird
    //Rückgabewert ist die Anzahl der maximalen Hosts
    //Die Maxhosts soll zusätzlich in der Datenstrukur netzwerk.anzahl_Rechner_gesamt gespeichert werden!
    //Erstellen Sie auch ein Struktogramm für die Funktion

    Nur damit ihr wisst, wo meine Ziele sind. Falls ich meine Probleme zu undeutig beschreibe.

    MFG



  • Anbei hier nochmal das Funktionierende Programm (u.a. unter devC++ vers. 4.9.5.0 oder BorlandC++ 5.02) übersichtlich.

    //Rückgabewert ist die Anzahl der maximalen Hosts <-- Meine Aufgabe

    Was ich nicht weiß ist, wie ich es mit return zurück gebe. wenn ich dies hinein füge "return host" funktionierts nicht mehr.(wenn ich es in der Funktion
    "//Subnetzmaske bestimmung" einfüge)

    #include <stdio.h>
    #include <iostream.h>
    
    //Eigener Datentyp Struktur anlegen
    struct IP
    {
       int dez_okt1,dez_okt2,dez_okt3,dez_okt4;
       int bin_okt1[8],bin_okt2[8],bin_okt3[8],bin_okt4[8];
       int hostanzahl;
    };
    
    //Wandelt Dezimalzahl zw. 0-255  in ein 8 Bit Feld um
    void dezi_to_bin(int dezimalzahl, int *binaer_feld)
    {
       int modrest=0, divisionsrest,  i;
    
       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);
    }
    
    void Eingabe(IP &IP_1)
    {
       char Punkt;
       //Eingabe der IP_Adresse
       cout << "Geben Sie eine IP Adresse ein: (192.1.1.1): ";
       cin >>IP_1.dez_okt1>>Punkt>>IP_1.dez_okt2>>Punkt>>IP_1.dez_okt3>>Punkt>>IP_1.dez_okt4;
    
       dezi_to_bin(IP_1.dez_okt1,IP_1.bin_okt1);
       dezi_to_bin(IP_1.dez_okt2,IP_1.bin_okt2);
       dezi_to_bin(IP_1.dez_okt3,IP_1.bin_okt3);
       dezi_to_bin(IP_1.dez_okt4,IP_1.bin_okt4);
    }
    
    void AusgabeBin(IP &IP_1)
    {
       //Ausgabe der IP_Adresse binär
       for(int i=0;i<8;i++)
       {
          cout <<IP_1.bin_okt1[i];
       }
       cout <<".";
    
       for(int i=0;i<8;i++)
       {
          cout <<IP_1.bin_okt2[i];
       }
       cout <<".";
    
       for(int i=0;i<8;i++)
       {
          cout <<IP_1.bin_okt3[i];
       }
       cout <<".";
    
       for(int i=0;i<8;i++)
       {
          cout <<IP_1.bin_okt4[i];
       }
    }
    
    //Subnetzmaske bestimmung
    void sub(IP &IP_1)
    {
       int i,host=1;
    
       if (IP_1.dez_okt1 >= 192 && IP_1.dez_okt1 <= 223)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = host -3;
    
          cout << endl << host << endl;
       }
    
       if (IP_1.dez_okt1 >= 128 && IP_1.dez_okt1 <= 191)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = (host -1)*(host -1)-2;
    
          cout << "Es sind " << host << " Hosts moeglich";
       }
    
       if (IP_1.dez_okt1 > 0 && IP_1.dez_okt1 <= 126)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = (host -1)*(host -1)*(host -1)-2;
    
          cout << "Es sind " << host << " Hosts moeglich";
       }
    }
    
    void main()
    {
       IP IP_1;
       Eingabe(IP_1);
       cout <<endl;
       AusgabeBin(IP_1);
       cout <<endl;
       sub (IP_1);
    
       getchar();
    }
    


  • wenn du eine Ganzzahl (int) zurückgeben willst muss die Funktion int heißen nicht void



  • main() sollte immer int zurückgeben!



  • Alles klar, werde es in zukunft beherzigen... 🙄

    Habe es geändert, jedoch bekomme ich nun als Rückgabewert 0.
    bei weiterem ausprobieren (umschreiben) bekomme ich 1244952 angezeigt.

    was muss ich beim Rückgabewert noch beachten, das er mir das ergebnis zur ausgabefunktion weiterleitet ?

    //Subnetzmaske bestimmung
    int sub(IP &IP_1)
    {
       int i,host=1;
    
       if (IP_1.dez_okt1 >= 192 && IP_1.dez_okt1 <= 223)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = host -3;
          return (host);
          cout << endl << host << endl;
       }
    
       if (IP_1.dez_okt1 >= 128 && IP_1.dez_okt1 <= 191)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = (host -1)*(host -1)-2;
          return (host);
          cout << "Es sind " << host << " Hosts moeglich";
       }
    
       if (IP_1.dez_okt1 > 0 && IP_1.dez_okt1 <= 126)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = (host -1)*(host -1)*(host -1)-2;
          return (host);
          cout << "Es sind " << host << " Hosts moeglich";
       }
       return (host);
    }
    
    void ausgabe_host(host)
    {
       cout << "\nDie maximale Anzahl der Host's lautet: " << host <<endl;
    }
    
    void main()
    {
       int host;
    
       IP IP_1;
       Eingabe(IP_1);
       cout <<endl;
       AusgabeBin(IP_1);
       cout <<endl;
       sub (IP_1);
       ausgabe_host(host);
    
       getchar();
    }
    


  • Das hat wirklich was mit totalen Grundlagen zu tun. Schau dir das ganze in einem Tutorial deiner Wahl an.
    Ein gutes englisches Tutorial ist http://www.cplusplus.com/doc/tutorial/
    Bei deutschen Tutorials schaut http://tutorial.schornboeck.net/inhalt.htm
    noch ganz ok aus. Weitere findest du über Google.
    Zur Lösung:

    void ausgabe_host(host)
    {
       cout << "\nDie maximale Anzahl der Host's lautet: " << host <<endl;
    }
    
    void main()
    {
       int host;
    
       IP IP_1;
       Eingabe(IP_1);
       cout <<endl;
       AusgabeBin(IP_1);
       cout <<endl;
       sub (IP_1);
       ausgabe_host(host);
    
       getchar();
    }
    }
    

    Du musst den Datentyp angeben, den du an die Funktion übergibst.
    Außerdem musst du die main Funktion etwas verändern. Du könntest allerdings auch einfach die Ausgabe in der main Funktion stattfinden lassen anstatt sie über eine extra Funktion auszuführen.
    Möglichkeit 1:

    void ausgabe_host(int host)
    {
       cout << "\nDie maximale Anzahl der Host's lautet: " << host <<endl;
    }
    
    void main()
    {
       IP IP_1;
       Eingabe(IP_1);
       cout <<endl;
       AusgabeBin(IP_1);
       cout <<endl;
       ausgabe_host(sub (IP_1));
    
       getchar();
    }
    

    oder die Ausgabe direkt in der main Funktion:

    void main()
    {
       IP IP_1;
       Eingabe(IP_1);
       cout <<endl;
       AusgabeBin(IP_1);
       cout <<endl;
       cout << "\nDie maximale Anzahl der Host's lautet: " << sub (IP_1) << endl;
    
       getchar();
    }
    

    So ich denke der Code sollte so funktionieren, wie du es dir gedacht hast allerdings habe ich ihn nicht getestet. Bei Problemen helfe ich gerne. Zum verständnis des Codes solltest du dir die entsprechenden Teile in einem der besagten Tutorials ansehen. Mir scheint als wäre das Kapitel Funktionen an dir vorbeigelaufen.



  • temporärer-gast schrieb:

    void main()
    {
       IP IP_1;
       Eingabe(IP_1);
       cout <<endl;
       AusgabeBin(IP_1);
       cout <<endl;
    -->   ausgabe_host(sub (IP_1));  <---
    
       getchar();
    }
    

    Was tut er?
    Sehe ich das Richtig, das Du ihm angibst, das die Endfunktion die "ausgabe_host" ist und er mit "sub (IP_1)" anfangen soll??

    hoffe, das ich nie mehr funktionen aufrufen muss und so lasse ich dies vorerst mal auf sich beruhen...

    Und es Funktioniert 👍 und der Link ist einfach Klasse.

    Warum ich so viele Funktionen verwende.?!
    Na weil unser Lehrer Funktionsgeil ist und es so wünscht 😉
    wünschte mir, das er es auch so gut erklären würde. aber naja.
    musste leider feststellen, das die lehrerm, an der schule, nicht der hit sind... 😞



  • Also ich versuche es mal kurz aber verständlich zu erklären:
    Die Funktion sub gibt einen Integer zurück. Was die besagte Zeile

    ausgabe_host(sub (IP_1));
    

    nun tut ist nicht mehr als die Funktion sub aufzurufen und den Wert, der durch return zurückgegeben wird als Parameter an ausgabe_host zu übergeben. Du kannst dir vorstellen, dass anstatt der Funktion, der Rückgabewert der Funktion in der Klammer steht, die Funktion aber trotzdem ausgeführt wird. Du könntest den return Wert aber auch in eine Variable speichern. Diese Alternative zur oben genannten Code Zeile wäre dann:

    int anzahlHosts = sub (IP_1);
    ausgabe_host(anzahlHosts);
    

    Der Rückgabewert von sub wird jetzt in die Variable anzahlHosts geschrieben und diese wird anschließend als Parameter an ausgabe_host übergeben. Ich denke das sollte auch klarer machen, was

    ausgabe_host(sub (IP_1));
    

    tut.



  • Hallo,
    Nun weiß ich nach stundenlangem grübeln und probieren nicht mehr weiter.

    Und zwar möchte ich die Anzahl der nullen am ende herraus finden.
    Bsp.: sm: 255.255.255.0
    binär: 11111111.11111111.11111111.00000000
    und diese dann
    z.B.
    bei 5 Subnetze fallen nur 3 nullen (Bit) weg, sodass die sm 248 (255-7)ausgegeben werden kann.

    1 Bit --> 1 Subnetz
    2 " " --> 2- 3 Subnetze
    3 " " --> 4- 7 " "
    4 " " --> 8-15 " "
    5 " " -->16-31 " "
    6 " " -->32-63 " "
    7 " " -->64-127 " "
    8 Bit -->128-255 Subnetze

    //Umwandlung der Subnet-Maske
    //Wandelt Dezimalzahl zw. 0-255  in ein 8 Bit Feld um
    int dezi_to_subb(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);
    
    // Hatte es hier mal mit einer for schleife veruscht, aber vergeblich
       for (i=0;i<8;i++)
       {
          if (divisionsrest=0)
          {
             divisionsrest=divisionsrest + 1;
          }
       }   
       cout << divisionsrest;   
    }
    

    Damit ihr mein Ziel wisst:
    Die Funktion berechnet die Anzahl der entlehnten Bits Abhängig davon der Angabe der Anzahl der Subnetze die vorher in network.anzahl_subnete angegeben werden muss.

    #include <stdio.h>
    #include <iostream.h>
    
    //Eigener Datentyp Struktur anlegen
    struct IP
    {
        int dez_okt1,dez_okt2,dez_okt3,dez_okt4;
        int bin_okt1[8],bin_okt2[8],bin_okt3[8],bin_okt4[8];
    };
    
    struct netzwerk
    {
       int host;
    };
    
    struct subnet
    {
        int subd_okt1,subd_okt2,subd_okt3,subd_okt4;
        int subb_okt1[8],subb_okt2[8],subb_okt3[8],subb_okt4[8];
    };
    
    //Subnetberechnung
    struct network
    {
       int sub_okt1,sub_okt2,sub_okt3,sub_okt4;
       int subb_okt1[8],subb_okt2[8],subb_okt3[8],subb_okt4[8];
       int anzahl_sub;
    };
    
    //Wandelt Dezimalzahl zw. 0-255  in ein 8 Bit Feld um
    int 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);
    }
    
    int Eingabe(IP &IP_1)
    {
        char Punkt;
        //Eingabe der IP_Adresse
        cout << "Geben Sie eine IP Adresse ein: (192.1.1.1): ";
        cin >>IP_1.dez_okt1>>Punkt>>IP_1.dez_okt2>>Punkt>>IP_1.dez_okt3>>Punkt>>IP_1.dez_okt4;
    
        dezi_to_bin(IP_1.dez_okt1,IP_1.bin_okt1);
        dezi_to_bin(IP_1.dez_okt2,IP_1.bin_okt2);
        dezi_to_bin(IP_1.dez_okt3,IP_1.bin_okt3);
        dezi_to_bin(IP_1.dez_okt4,IP_1.bin_okt4);
    }
    
    //Umwandlung der Subnet-Maske
    //Wandelt Dezimalzahl zw. 0-255  in ein 8 Bit Feld um
    int dezi_to_subb(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);
    }
    
    int AusgabeBin(IP &IP_1)
    {
        //Ausgabe der IP_Adresse binär
        for(int i=0;i<8;i++)
        {
            cout <<IP_1.bin_okt1[i];
        }
        cout <<".";
    
        for(int i=0;i<8;i++)
        {
            cout <<IP_1.bin_okt2[i];
        }
       cout <<".";
    
       for(int i=0;i<8;i++)
        {
            cout <<IP_1.bin_okt3[i];
        }
       cout <<".";
    
       for(int i=0;i<8;i++)
        {
            cout <<IP_1.bin_okt4[i];
        }
       cout << endl;
    }
    
    //Subnetzmaske bestimmung
    int max_host(IP &IP_1 , netzwerk &anzahl_Rechner_gesamt)
    {
       int i,host=1;
    
       if (IP_1.dez_okt1 >= 192 && IP_1.dez_okt1 <= 223)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = host -3;
          return (host);
          cout << endl << host << endl;
       }
    
       if (IP_1.dez_okt1 >= 128 && IP_1.dez_okt1 <= 191)
       {
          for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = (host -1)*(host -1)-2;
            return (host);
           cout << "Es sind " << host << " Hosts moeglich";
       }
    
       if (IP_1.dez_okt1 > 0 && IP_1.dez_okt1 <= 126)
       {
           for (i=1;i<=8;i++)
          {
             host =  host* 2;
          }
          host = (host -1)*(host -1)*(host -1)-2;
            return (host);
           cout << "Es sind " << host << " Hosts moeglich";
       }
       return (host);
    }
    
    void ausgabe_host(int host_1)
    {
       cout << "\nDie maximale Anzahl der Host's lautet: " << host_1 <<endl;
    }
    
    int netzwerk_klasse(IP &IP_1, subnet &subnet_1)
    {
       int modrest=0, divisionsrest,  i;
    
       if (IP_1.dez_okt1 >= 0 && IP_1.dez_okt1<=126)
       {
          cout << "Sie befinden sich in der Klasse A mit der Subnetmaske 255.0.0.0";
          subnet_1.subd_okt1=255;
          subnet_1.subd_okt2=0;
          subnet_1.subd_okt3=0;
          subnet_1.subd_okt4=0;
    
           //Eingabe der IP_Adresse
          cout << "\n\n\nUebernahme von der Subnetmaste anhand der IP: \n";
    
           dezi_to_subb(subnet_1.subd_okt1,subnet_1.subb_okt1);
           dezi_to_subb(subnet_1.subd_okt2,subnet_1.subb_okt2);
           dezi_to_subb(subnet_1.subd_okt3,subnet_1.subb_okt3);
           dezi_to_subb(subnet_1.subd_okt4,subnet_1.subb_okt4);
       }
    
       if (IP_1.dez_okt1 >= 127 && IP_1.dez_okt1<=191)
       {
          cout << "Sie befinden sich in der Klasse B mit der Subnetmaske 255.255.0.0";
    
          subnet_1.subd_okt1=255;
          subnet_1.subd_okt2=255;
          subnet_1.subd_okt3=0;
          subnet_1.subd_okt4=0;
    
           //Eingabe der IP_Adresse
          cout << "\n\n\nUebernahme von der Subnetmaste anhand der IP: \n";
    
           dezi_to_subb(subnet_1.subd_okt1,subnet_1.subb_okt1);
           dezi_to_subb(subnet_1.subd_okt2,subnet_1.subb_okt2);
           dezi_to_subb(subnet_1.subd_okt3,subnet_1.subb_okt3);
           dezi_to_subb(subnet_1.subd_okt4,subnet_1.subb_okt4);
       }
    
       if (IP_1.dez_okt1 >= 192 && IP_1.dez_okt1<=223)
       {
          cout << "Sie befinden sich in der Klasse C mit der Subnetmaske 255.255.255.0";
    
          subnet_1.subd_okt1=255;
          subnet_1.subd_okt2=255;
          subnet_1.subd_okt3=255;
          subnet_1.subd_okt4=0;
    
           //Eingabe der IP_Adresse
          cout << "\n\n\nUebernahme von der Subnetmaste anhand der IP: \n";
    
           dezi_to_subb(subnet_1.subd_okt1,subnet_1.subb_okt1);
           dezi_to_subb(subnet_1.subd_okt2,subnet_1.subb_okt2);
           dezi_to_subb(subnet_1.subd_okt3,subnet_1.subb_okt3);
           dezi_to_subb(subnet_1.subd_okt4,subnet_1.subb_okt4);
       }
       else
       cout << "nicht bekannt";
    }
    
    int AusgabeSubb(subnet &subnet_1)
    {
        //Ausgabe der IP_Adresse binär
        for(int i=0;i<8;i++)
        {
            cout <<subnet_1.subb_okt1[i];
        }
        cout <<".";
    
        for(int i=0;i<8;i++)
        {
            cout <<subnet_1.subb_okt2[i];
        }
       cout <<".";
    
       for(int i=0;i<8;i++)
        {
            cout <<subnet_1.subb_okt3[i];
        }
       cout <<".";
    
       for(int i=0;i<8;i++)
        {
            cout <<subnet_1.subb_okt4[i];
        }
       cout << endl;
    }
    
    int eingabe_subnetze(network &subnetze_1)
    {
    	cout << "\nBitte geben Sie die gewuenschte Anzahl der Subnetze ein: ";
     	cin >> subnetze_1.anzahl_sub;
       cout << endl;
    	return (subnetze_1.anzahl_sub);
    }
    
    int ausgabe_subnetze(network &subnetze_1)
    {
      cout << subnetze_1.anzahl_sub;
    }
    
    void main()
    {
    
       IP IP_1;
       netzwerk anzahl_Rechner_gesamt;
       subnet subnet_1;
       network subnetze_1;
    
       Eingabe(IP_1);
       cout << endl;
       AusgabeBin(IP_1);
       cout << endl;
       netzwerk_klasse (IP_1,subnet_1);
       cout << endl;
       AusgabeSubb(subnet_1);
       cout << endl;
       ausgabe_host(max_host (IP_1,anzahl_Rechner_gesamt));
    
       eingabe_subnetze(subnetze_1);
       ausgabe_subnetze(subnetze_1);
    
       getchar();
    }
    

Anmelden zum Antworten