Kod:
//
#include <iostream>
#include <math.h>
//#include <string>
using namespace std;
int main ()
{
unsigned char oct[4];
unsigned int loct[4];
int i;
printf(" Podaj adres IP : ");
if (scanf("%u.%u.%u.%u", &loct[0], &loct[1], &loct[2], &loct[3]) != 4) {
fprintf(stderr, "=> Nie poprawny adres IP!\n");
return 1;
}
for (i = 0; i < 4; ++i) {
oct[i] = loct[i];
if (oct[i] != loct[i]) {
fprintf(stderr, "=> Nie poprawny adres IP!\n");
return 1;
}
}
printf("-> Adres IP to %hhu.%hhu.%hhu.%hhu\n",
oct[0], oct[1], oct[2], oct[3]);
int liczba1=oct[0],liczba2=oct[1],liczba3=oct[2],liczba4=oct[3],i1,i2,i3,i4,maska;
//deklaracja tabel do czastkowych fragmentow ip i zmiennych do tabeli do while
int tab[9],tab2[9],tab3[9],tab4[9];
/* do
{
cout<<"podaj ip: (zamiast kropek enter, pamietaj ze maxymalna wartosc to 255)"<<endl;
cin>>liczba1;
cout<<"."<<endl;
cin>>liczba2;
cout<<"."<<endl;
cin>>liczba3;
cout<<"."<<endl;
cin>>liczba4;
cout<<endl;
}
while (liczba1>255 || liczba2>255 || liczba3>255 || liczba4>255 || liczba1<0 || liczba2<0 || liczba3<0 || liczba4<0);
// cout<<"Podaj maske: ";cin>>maska;
cout<<liczba1<<"."<<liczba2<<"."<<liczba3<<"."<<liczba4<<endl;*/
cout<<"IP w zapisie binarnym:"<<endl<<endl;
i1=1;
do {
if (liczba1%2>0) {
tab[i1]=1;
}
if (liczba1%2==0) {
tab[i1]=0;
}
i1++;
liczba1=liczba1/2;
} while (i1<9);
//int j=i1;
do {
i1--;
cout<<tab[i1];
} while (i1!=1);
cout <<".";
//
i2=1;
do {
if (liczba2%2>0) {
tab2[i2]=1;
}
if (liczba2%2==0) {
tab2[i2]=0;
}
i2++;
liczba2=liczba2/2;
} while (i2<9);
do {
i2--;
cout<<tab2[i2];
} while (i2!=1);
cout<<".";
//
i3=1;
do {
if (liczba3%2>0) {
tab3[i3]=1;
}
if (liczba3%2==0) {
tab3[i3]=0;
}
i3++;
liczba3=liczba3/2;
} while (i3<9);
do {
i3--;
cout<<tab3[i3];
} while (i3!=1);
cout<<".";
//
i4=1;
do {
if (liczba4%2>0) {
tab4[i4]=1;
}
if (liczba4%2==0) {
tab4[i4]=0;
}
i4++;
liczba4=liczba4/2;
} while (i4<9);
do {
i4--;
cout<<tab4[i4];
} while (i4!=1);
//
int wartoscklasowa; //a-0, b-1, c-2, d-3, e-4
cout<<endl;
if (tab[i1+8-1]==0) {
cout<<"klasa A";
wartoscklasowa=1;
}
if (tab[i1+8-1]==1 && tab[i1+8-2]==0) {
wartoscklasowa=2;
cout<<"klasa B";
}
if (tab[i1+8-1]==1 && tab[i1+8-2]==1 && tab[i1+8-3]==0) {
cout <<"klasa C";
wartoscklasowa=3;
}
if (tab[i1+8-1]==1 && tab[i1+8-2]==1 && tab[i1+8-3]==1 && tab[i1+8-4]==0) {
cout << "klasa D";
wartoscklasowa=4;
}
if (tab[i1+8-1]==1 && tab[i1+8-2]==1 && tab[i1+8-3]==1 && tab[i1+8-4]==1) {
cout <<"klasa E";
wartoscklasowa=5;
}
cout<<". Maska standardowa to: "<<wartoscklasowa*8<<endl;
// pentla zaporowa dla maski
do {
cout<<"\nPodaj maske: ";
cin>>maska;
cout <<endl;
} while (maska>30 || maska <1);
// cout<<wartoscklasowa<<endl;
// zadeklarowac tablice do przechowywania maski i wypełnic
int tabm[32];
for (int l1=0; l1<32; l1++) {
if (l1<maska)
tabm[l1]=1;
else tabm[l1]=0;
}
//test wyswietlania
cout<<"Maska binarnie"<<endl;
for (int l1=0; l1<32; l1++) {
if (l1==8 || l1== 16 || l1==24)
cout<<".";
cout<<tabm[l1];
}
cout <<endl<< endl;
// jedna tabela na cale ip i czytna od poczatku, nie jak wczesniej od tylu
int tab_cale_ip[32];
for (int l1=0, l2=8; l1<8; l1++,l2--) {
tab_cale_ip[l1]=tab[l2];
}
/* for (int l1=0; l1<8; l1++)
{cout<<tab_cale_ip[l1];
}*/
for (int l1=8, l2=8; l1<16; l1++,l2--) {
tab_cale_ip[l1]=tab2[l2];
}
/*for (int l1=8; l1<16; l1++)
{
cout<<tab_cale_ip[l1];
}*/
for (int l1=16, l2=8; l1<24; l1++, l2--) {
tab_cale_ip[l1]=tab3[l2];
}
for (int l1=24, l2=8; l1<32; l1++, l2--) {
tab_cale_ip[l1]=tab4[l2];
}
//test wyswietlenia ip z kropkami
/* cout<<"ip binarnie jeszcze raz:"<<endl;
for (int l1=0; l1<32; l1++)
{
if (l1==8 || l1== 16 || l1==24)
cout<<".";
cout<<tab_cale_ip[l1];
}
cout<<endl;
*/
//obliczanie adresu sieci - ip AND maska
cout<<"adres sieci"<<endl;
int tab_adres_sieci[32];
for (int l1=0; l1<32; l1++) {
if (tab_cale_ip[l1]==1 && tabm[l1]==1)
tab_adres_sieci[l1]=1;
else tab_adres_sieci[l1]=0;
}
// test wyswietlania adresu sieci binarnie
for (int l1=0; l1<32; l1++) {
if (l1==8 || l1== 16 || l1==24)
cout<<".";
cout<<tab_adres_sieci[l1];
}
cout<<endl<<endl;
//adres rozgloszeniowy:
int tab_rozgloszenie[32];
for (int l1=0; l1<32; l1++) {
if (tabm[l1]==1)
tab_rozgloszenie[l1]=tab_cale_ip[l1];
else
tab_rozgloszenie[l1]=1;
}
cout<<"adres rozgłoszeniowy binarnie:"<<endl;
for (int l1=0; l1<32; l1++) {
if (l1==8 || l1== 16 || l1==24)
cout<<".";
cout<<tab_rozgloszenie[l1];
}
cout<<endl<<endl;
// wyliczenie i wyswietlenie wartsci dziesiętnych
int maska1,maska2,maska3,maska4,rozgl1,rozgl2,rozgl3,rozgl4,siec1,siec2,siec3,siec4;
maska1=tabm[0];
for (int a=1; a<8; a++) {
maska1=maska1*2+tabm[a];
}
maska2=tabm[8];
for (int a=9; a<16; a++) {
maska2=((maska2)*2)+tabm[a];
}
maska3=tabm[16];
for (int a=17; a<24; a++) {
maska3=maska3*2+tabm[a];
}
maska4=tabm[24];
for (int a=25; a<32; a++) {
maska4=maska4*2+tabm[a];
}
cout <<"maska dziesietnie: "<<endl;
cout<< maska1 <<"."<<maska2<<"."<<maska3<<"."<<maska4<<endl<<endl;
siec1=tab_adres_sieci[0];
for (int a=1; a<8; a++) {
siec1=siec1*2+tab_adres_sieci[a];
}
siec2=tab_adres_sieci[8];
for (int a=9; a<16; a++) {
siec2=siec2*2+tab_adres_sieci[a];
}
siec3=tab_adres_sieci[16];
for (int a=17; a<24; a++) {
siec3=siec3*2+tab_adres_sieci[a];
}
siec4=tab_adres_sieci[24];
for (int a=25; a<32; a++) {
siec4=siec4*2+tab_adres_sieci[a];
}
cout<<"adres sieci :"<<endl;
cout<<siec1<<"."<<siec2<<"."<<siec3<<"."<<siec4<<endl<<endl;
rozgl1=tab_rozgloszenie[0];
for (int a=1; a<8; a++) {
rozgl1=rozgl1*2+tab_rozgloszenie[a];
}
rozgl2=tab_rozgloszenie[8];
for (int a=9; a<16; a++) {
rozgl2=rozgl2*2+tab_rozgloszenie[a];
}
rozgl3=tab_rozgloszenie[16];
for (int a=17; a<24; a++) {
rozgl3=rozgl3*2+tab_rozgloszenie[a];
}
rozgl4=tab_rozgloszenie[24];
for (int a=25; a<32;a++) {
rozgl4=rozgl4*2+tab_rozgloszenie[a];
}
cout<<"adres rozgloszeniowy:"<<endl;
cout<<rozgl1<<"."<<rozgl2<<"."<<rozgl3<<"."<<rozgl4<<endl<<endl;
//cześć licząca i wyznaczajaca podsieci
int lp; //licszba podsieci jaka chce zrobic uzytkownik
int pods=2;
int pozyczka=1;
do {
pozyczka=1;
pods=2;
int pewny=1;
do {
cout << "Ile podsieci chcesz uzyskac? (wyswietlone zostanie maxymalnie 57 ostatnich).";
cin >>lp;
if (lp>57) {
pewny=0;
cout<<"jestes pewiem ze chcesz tylu podsieci?? (tak-wpisz: 1)";
cin>>pewny;
}
else break;
} while (pewny !=1);
//obliczam ile bitow mosze pozyczyc dla 2podsieci 1 bit bo 2^1=2, dla 4 2bity bo 2^2=4 dla 8 3bity bo 2^3=8
while (pods<lp) {
pods=pods*2;
pozyczka++;
}
if (lp<=1) {
cout<<"nie musimy nic dzielic";
return 1;
}
cout<<"Musimy pozyczyc "<<pozyczka<<" bitow. Makska jaka chcesz uzyskac to:"<<maska+pozyczka<<"."<<endl;
if (pozyczka+maska >30)
cout <<"maska moze miec maksymalnie 30 jedynek"<<endl;
} while (pozyczka+maska >30 || lp<1);
//musze sprawdzi czy mozliwe jest takie pozyczenie
int tabm_2[32];
for (int l1=0; l1<32; l1++) {
if (l1<maska+pozyczka)
tabm_2[l1]=1;
else tabm_2[l1]=0;
}
cout <<"Nowa maska to: "<<endl<<" a) binarnie: "<<endl<<" ";
for (int l1=0; l1<32; l1++) {
if (l1==8 || l1== 16 || l1==24)
cout<<".";
cout<<tabm_2[l1];
}
cout<<endl<<" b) dziesietnie:"<<endl;
int maska1_2,maska2_2,maska3_2,maska4_2; //4,rozgl1,rozgl2,rozgl3,rozgl4,siec1,siec2,siec3,siec4;
maska1_2=tabm_2[0];
for (int a=1; a<8; a++) {
maska1_2=maska1_2*2+tabm_2[a];
}
maska2_2=tabm_2[8];
for (int a=9; a<16; a++) {
maska2_2=((maska2_2)*2)+tabm_2[a];
}
maska3_2=tabm_2[16];
for (int a=17; a<24; a++) {
maska3_2=maska3_2*2+tabm_2[a];
}
maska4_2=tabm_2[24];
for (int a=25; a<32; a++) {
maska4_2=maska4_2*2+tabm_2[a];
}
// cout <<"maska dziesietnie: "<<endl;
cout<<" "<< maska1_2 <<"."<<maska2_2<<"."<<maska3_2<<"."<<maska4_2<<endl;
//wylicze podsieci, trzebana na pozyczonych bitach kolejno dawac binarnie od 0 do lp-1, usrawiamy to od konca maski st.
int podsiec;
int* tablica=new int [lp];//tu mam binarnie od 0 do ilosc podsieci - 1
for (podsiec=0; podsiec<lp; podsiec++) {
int zm=podsiec;
int licznik=0;
int* tablica_siec=new int [32];
int* tablica_rozgl= new int [32];
do {
if (zm%2>0) {
tablica[licznik]=1;
}
if (zm%2==0) {
tablica[licznik]=0;
}
licznik++;
zm=zm/2;
} while (licznik<pozyczka);
//powyliczac i wyswietlac adr. rozgloszeniowe i adr. sieci
//test wyswietlania
/*
for (int l=0; l<pozyczka; l++)
cout << tablica[l] <<" ";
cout<<endl;
*/
int x=0;
for (int z=0; z<32; z++) {
if (tabm[z] == 1)
tablica_siec[z]=tab_cale_ip[z];
else if (x<pozyczka) {
tablica_siec[z]=tablica[pozyczka-x-1];
x++;
} else tablica_siec[z]=0;
}
/* //TEST WYSWIETLANIA
for (int s=0; s<32; s++)
{
if (s==8 || s== 16 || s==24)
cout<<".";
cout <<tablica_siec[s];
}
cout<<endl;*/
//
int siec_1,siec_2,siec_3,siec_4;
siec_1=tablica_siec[0];
for (int a=1; a<8; a++) {
siec_1=siec_1*2+tablica_siec[a];
}
siec_2=tablica_siec[8];
for (int a=9; a<16; a++) {
siec_2=((siec_2)*2)+tablica_siec[a];
}
siec_3=tablica_siec[16];
for (int a=17; a<24; a++) {
siec_3=siec_3*2+tablica_siec[a];
}
siec_4=tablica_siec[24];
for (int a=25; a<32; a++) {
siec_4=siec_4*2+tablica_siec[a];
}
cout <<"adres podsieci "<<podsiec<<": "<<endl;
cout<< siec_1 <<"."<<siec_2<<"."<<siec_3<<"."<<siec_4<<endl;
//
x=0;
for (int z=0; z<32; z++) {
if (tabm[z] == 1)
tablica_rozgl[z]=tab_cale_ip[z];
else if (x<pozyczka) {
tablica_rozgl[z]=tablica[pozyczka-x-1];
x++;
} else tablica_rozgl[z]=1;
}
int rozgl_1,rozgl_2,rozgl_3,rozgl_4;
rozgl_1=tablica_rozgl[0];
for (int a=1; a<8; a++) {
rozgl_1=rozgl_1*2+tablica_rozgl[a];
}
rozgl_2=tablica_rozgl[8];
for (int a=9; a<16; a++) {
rozgl_2=((rozgl_2)*2)+tablica_rozgl[a];
}
rozgl_3=tablica_rozgl[16];
for (int a=17; a<24; a++) {
rozgl_3=rozgl_3*2+tablica_rozgl[a];
}
rozgl_4=tablica_rozgl[24];
for (int a=25; a<32; a++) {
rozgl_4=rozgl_4*2+tablica_rozgl[a];
}
cout <<"adres rozgloszeniowy:"<<endl;
cout<< rozgl_1 <<"."<<rozgl_2<<"."<<rozgl_3<<"."<<rozgl_4<<endl<<endl;
//
delete tablica_rozgl;
delete tablica_siec;
}
delete tablica;
system("PAUSE");
return EXIT_SUCCESS;
}
//