Erste Schritte beim Programmieren mit Eurer Hilfe
-
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) =14somit 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 FunktionNur 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.