#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct _TAddress
{ char IPclass;
int a[ 4 ] ;
int freeBits;
int Nbits;
int Mbits;
} TAddress;
void FillPow2 ( int pow2[ ] )
{ int i = 0 ;
pow2[ 0 ] = 1 ;
while ( ++ i< 25 )
pow2[ i] = pow2[ i- 1 ] * 2 ;
}
int IsClass ( char c)
{ char * alphabet = "ABC" ;
int i = strlen ( alphabet) ;
while ( -- i > - 1 )
if ( c == alphabet[ i] )
return 1 ;
return 0 ;
}
TAddress * CreateAddress ( char cl)
{ TAddress * address = ( TAddress* ) malloc ( sizeof ( TAddress) ) ;
address- > IPclass = cl;
address- > a[ 0 ] = 255 ;
address- > a[ 1 ] = address- > a[ 2 ] = address- > a[ 3 ] = 0 ;
if ( cl == 'A' )
address- > freeBits = 24 ;
else
{ address- > a[ 1 ] = 255 ;
if ( cl == 'B' )
address- > freeBits = 16 ;
else
{ address- > a[ 2 ] = 255 ;
address- > freeBits = 8 ;
}
}
address- > Mbits = address- > Nbits = - 1 ;
return address;
}
void DeleteAddress ( TAddress * address)
{ free ( address) ;
}
void PrintAddress ( TAddress * address)
{ int i;
for ( i = 0 ; i< 4 ; i++ )
printf ( "%3d." , address- > a[ i] ) ;
printf ( "\n " ) ;
}
void FillBits ( TAddress * address, int N, int M, int pow2[ ] )
{ int i;
if ( N)
{ for ( i = 0 ; i< 25 ; i++ )
if ( N <= pow2[ i] - 2 )
{ address- > Nbits = i;
break ;
}
for ( i = 0 ; i< 25 ; i++ )
if ( M <= pow2[ i] - 2 )
{ address- > Mbits = i;
break ;
}
}
else
{ address- > Nbits = 0 ;
address- > Mbits = address- > freeBits;
}
}
int CheckBits ( TAddress * address)
{ return address- > Nbits + address- > Mbits <= address- > freeBits && address- > Nbits>= 0 && address- > Mbits> 0 ;
}
int ai ( int pow2[ ] , int bits)
{ int i = 0 , sum = pow2[ 7 ] ;
while ( ++ i < bits)
sum + = pow2[ 7 - i] ;
return sum;
}
void CreateMask ( TAddress * address, int pow2[ ] )
{ if ( ! address- > Nbits)
return ;
if ( address- > IPclass == 'C' )
{ address- > a[ 3 ] = ai( pow2, address- > Nbits) ;
return ;
}
if ( address- > IPclass == 'B' )
{ if ( address- > Nbits <= 8 )
{ address- > a[ 2 ] = ai( pow2, address- > Nbits) ;
return ;
}
else
{ address- > a[ 2 ] = 255 ;
address- > a[ 3 ] = ai( pow2, address- > Nbits- 8 ) ;
return ;
}
}
if ( address- > Nbits <= 8 )
{ address- > a[ 1 ] = ai( pow2, address- > Nbits) ;
return ;
}
else if ( address- > Nbits <= 16 )
{ address- > a[ 1 ] = 255 ;
address- > a[ 2 ] = ai( pow2, address- > Nbits- 8 ) ;
return ;
}
else
{ address- > a[ 1 ] = address- > a[ 2 ] = 255 ;
address- > a[ 3 ] = ai( pow2, address- > Nbits- 16 ) ;
return ;
}
}
int main( )
{
flag:
setlocale( 0 ,"Russian" ) ;
int pow2[ 25 ] , N, M;
FillPow2 ( pow2) ;
char cl;
do
{ printf ( "Класс:\t " ) ;
cl = toupper ( getc ( stdin ) ) ;
getc ( stdin ) ;
} while ( ! IsClass ( cl) ) ;
TAddress * address = CreateAddress ( cl) ;
printf ( "Стандартная маска в классе:\t " ) ;
PrintAddress ( address) ;
printf ( "\n \n Количество подсетей N = " ) ;
scanf ( "%d" , & N) ;
printf ( "Максимальное количество ПК в подсети M = " ) ;
scanf ( "%d" , & M) ;
getc ( stdin ) ;
FillBits ( address, N, M, pow2) ;
printf ( "Cвободно битов: %d\t Битов под подсети: %d\t Битов под пк: %d" , address- > freeBits, address- > Nbits, address- > Mbits) ;
if ( CheckBits ( address) )
{ CreateMask ( address, pow2) ;
printf ( "\n \n Конфигурация маски:\t " ) ;
PrintAddress ( address) ;
}
else
printf ( "\n \n Невозможно создать в данной конфигурации.\n " ) ;
DeleteAddress ( address) ;
getchar ( ) ;
goto flag;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KIAp0eXBlZGVmIHN0cnVjdCBfVEFkZHJlc3MKeyAgIGNoYXIgSVBjbGFzczsKICAgIGludCBhWzRdOwogICAgaW50IGZyZWVCaXRzOwogICAgaW50IE5iaXRzOwogICAgaW50IE1iaXRzOwp9ICAgVEFkZHJlc3M7CiAKdm9pZCBGaWxsUG93MiAoaW50IHBvdzJbXSkKeyAgIGludCBpID0gMDsKICAgIHBvdzJbMF0gPSAxOwogICAgd2hpbGUgKCsraTwyNSkKICAgICAgICBwb3cyW2ldID0gcG93MltpLTFdKjI7Cn0KIAppbnQgSXNDbGFzcyAoY2hhciBjKQp7ICAgY2hhciAqYWxwaGFiZXQgPSAiQUJDIjsKICAgIGludCBpID0gc3RybGVuKGFscGhhYmV0KTsKICAgIHdoaWxlICgtLWkgPi0xKQogICAgICAgIGlmIChjID09IGFscGhhYmV0W2ldKQogICAgICAgICAgICByZXR1cm4gMTsKICAgIHJldHVybiAwOwp9CiAKVEFkZHJlc3MgKkNyZWF0ZUFkZHJlc3MgKGNoYXIgY2wpCnsgICBUQWRkcmVzcyAqYWRkcmVzcyA9IChUQWRkcmVzcyopIG1hbGxvYyAoc2l6ZW9mKFRBZGRyZXNzKSk7CiAgICBhZGRyZXNzLT5JUGNsYXNzID0gY2w7CiAgICBhZGRyZXNzLT5hWzBdID0gMjU1OwogICAgYWRkcmVzcy0+YVsxXSA9IGFkZHJlc3MtPmFbMl0gPSBhZGRyZXNzLT5hWzNdID0gMDsKIAogICAgaWYgKGNsID09ICdBJykKICAgICAgICBhZGRyZXNzLT5mcmVlQml0cyA9IDI0OwogICAgZWxzZQogICAgeyAgIGFkZHJlc3MtPmFbMV0gPSAyNTU7CiAgICAgICAgaWYgKGNsID09ICdCJykKICAgICAgICAgICAgYWRkcmVzcy0+ZnJlZUJpdHMgPSAxNjsKICAgICAgICBlbHNlCiAgICAgICAgeyAgIGFkZHJlc3MtPmFbMl0gPSAyNTU7CiAgICAgICAgICAgIGFkZHJlc3MtPmZyZWVCaXRzID0gODsKICAgICAgICB9CiAgICB9CiAgICBhZGRyZXNzLT5NYml0cyA9IGFkZHJlc3MtPk5iaXRzID0gLTE7CiAKICAgIHJldHVybiBhZGRyZXNzOwp9CiAKdm9pZCBEZWxldGVBZGRyZXNzIChUQWRkcmVzcyAqYWRkcmVzcykKeyAgIGZyZWUgKGFkZHJlc3MpOwp9CiAKdm9pZCBQcmludEFkZHJlc3MgKFRBZGRyZXNzICphZGRyZXNzKQp7ICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpPDQ7IGkrKykKICAgICAgICBwcmludGYoIiUzZC4iLCBhZGRyZXNzLT5hW2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQogCnZvaWQgRmlsbEJpdHMgKFRBZGRyZXNzICphZGRyZXNzLCBpbnQgTiwgaW50IE0sIGludCBwb3cyW10pCnsgICBpbnQgaTsKICAgIGlmIChOKQogICAgeyAgIGZvciAoaSA9IDA7IGk8MjU7IGkrKykKICAgICAgICAgICAgaWYgKE4gPD0gcG93MltpXS0yKQogICAgICAgICAgICB7ICAgYWRkcmVzcy0+TmJpdHMgPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpPDI1OyBpKyspCiAgICAgICAgICAgIGlmIChNIDw9IHBvdzJbaV0tMikKICAgICAgICAgICAgeyAgIGFkZHJlc3MtPk1iaXRzID0gaTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7ICAgYWRkcmVzcy0+TmJpdHMgPSAwOwogICAgICAgIGFkZHJlc3MtPk1iaXRzID0gYWRkcmVzcy0+ZnJlZUJpdHM7CiAgICB9Cn0KIAppbnQgQ2hlY2tCaXRzIChUQWRkcmVzcyAqYWRkcmVzcykKeyAgIHJldHVybiBhZGRyZXNzLT5OYml0cyArIGFkZHJlc3MtPk1iaXRzIDw9IGFkZHJlc3MtPmZyZWVCaXRzICYmIGFkZHJlc3MtPk5iaXRzPj0wICYmIGFkZHJlc3MtPk1iaXRzPjA7Cn0KIAppbnQgYWkgKGludCBwb3cyW10sIGludCBiaXRzKQp7ICAgaW50IGkgPSAwLCBzdW0gPSBwb3cyWzddOwogICAgd2hpbGUgKCsraSA8IGJpdHMpCiAgICAgICAgc3VtICs9IHBvdzJbNy1pXTsKICAgIHJldHVybiBzdW07Cn0KIAp2b2lkIENyZWF0ZU1hc2sgKFRBZGRyZXNzICphZGRyZXNzLCBpbnQgcG93MltdKQp7ICAgaWYgKCFhZGRyZXNzLT5OYml0cykKICAgICAgICByZXR1cm47CiAgICBpZiAoYWRkcmVzcy0+SVBjbGFzcyA9PSAnQycpCiAgICB7ICAgYWRkcmVzcy0+YVszXSA9IGFpKHBvdzIsIGFkZHJlc3MtPk5iaXRzKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoYWRkcmVzcy0+SVBjbGFzcyA9PSAnQicpCiAgICB7ICAgaWYgKGFkZHJlc3MtPk5iaXRzIDw9IDgpCiAgICAgICAgeyAgIGFkZHJlc3MtPmFbMl0gPSBhaShwb3cyLCBhZGRyZXNzLT5OYml0cyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsgICBhZGRyZXNzLT5hWzJdID0gMjU1OwogICAgICAgICAgICBhZGRyZXNzLT5hWzNdID0gYWkocG93MiwgYWRkcmVzcy0+TmJpdHMtOCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoYWRkcmVzcy0+TmJpdHMgPD0gOCkKICAgIHsgICBhZGRyZXNzLT5hWzFdID0gYWkocG93MiwgYWRkcmVzcy0+TmJpdHMpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGVsc2UgaWYgKGFkZHJlc3MtPk5iaXRzIDw9IDE2KQogICAgeyAgIGFkZHJlc3MtPmFbMV0gPSAyNTU7CiAgICAgICAgYWRkcmVzcy0+YVsyXSA9IGFpKHBvdzIsIGFkZHJlc3MtPk5iaXRzLTgpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGVsc2UKICAgIHsgICBhZGRyZXNzLT5hWzFdID0gYWRkcmVzcy0+YVsyXSA9IDI1NTsKICAgICAgICBhZGRyZXNzLT5hWzNdID0gYWkocG93MiwgYWRkcmVzcy0+TmJpdHMtMTYpOwogICAgICAgIHJldHVybjsKICAgIH0KfQogCiAKaW50IG1haW4oKQp7CiAgICBmbGFnOgogICAgc2V0bG9jYWxlKDAsIlJ1c3NpYW4iKTsKICAgIGludCBwb3cyWzI1XSwgTiwgTTsKICAgIEZpbGxQb3cyIChwb3cyKTsKICAgIGNoYXIgY2w7CiAKICAgIGRvCiAgICB7ICAgcHJpbnRmKCLQmtC70LDRgdGBOlx0Iik7CiAgICAgICAgY2wgPSB0b3VwcGVyIChnZXRjKHN0ZGluKSk7CiAgICAgICAgZ2V0YyhzdGRpbik7CiAgICB9IHdoaWxlICghSXNDbGFzcyAoY2wpKTsKIAogICAgVEFkZHJlc3MgKmFkZHJlc3MgPSBDcmVhdGVBZGRyZXNzIChjbCk7CiAgICBwcmludGYoItCh0YLQsNC90LTQsNGA0YLQvdCw0Y8g0LzQsNGB0LrQsCDQsiDQutC70LDRgdGB0LU6XHQiKTsKICAgIFByaW50QWRkcmVzcyAoYWRkcmVzcyk7CiAKICAgIHByaW50ZigiXG5cbtCa0L7Qu9C40YfQtdGB0YLQstC+INC/0L7QtNGB0LXRgtC10LkgTiA9ICIpOwogICAgc2NhbmYgKCIlZCIsICZOKTsKICAgIHByaW50Zigi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INCf0Jog0LIg0L/QvtC00YHQtdGC0LggTSA9ICIpOwogICAgc2NhbmYgKCIlZCIsICZNKTsKICAgIGdldGMoc3RkaW4pOwogCiAgICBGaWxsQml0cyAoYWRkcmVzcywgTiwgTSwgcG93Mik7CiAgICBwcmludGYoIkPQstC+0LHQvtC00L3QviDQsdC40YLQvtCyOiAlZFx00JHQuNGC0L7QsiDQv9C+0LQg0L/QvtC00YHQtdGC0Lg6ICVkXHTQkdC40YLQvtCyINC/0L7QtCDQv9C6OiAlZCIsIGFkZHJlc3MtPmZyZWVCaXRzLCBhZGRyZXNzLT5OYml0cywgYWRkcmVzcy0+TWJpdHMpOwogICAgaWYgKENoZWNrQml0cyAoYWRkcmVzcykpCiAgICB7ICAgQ3JlYXRlTWFzayAoYWRkcmVzcywgcG93Mik7CiAgICAgICAgcHJpbnRmKCJcblxu0JrQvtC90YTQuNCz0YPRgNCw0YbQuNGPINC80LDRgdC60Lg6XHQiKTsKICAgICAgICBQcmludEFkZHJlc3MgKGFkZHJlc3MpOwogICAgfQogICAgZWxzZQogICAgICAgIHByaW50ZigiXG5cbtCd0LXQstC+0LfQvNC+0LbQvdC+INGB0L7Qt9C00LDRgtGMINCyINC00LDQvdC90L7QuSDQutC+0L3RhNC40LPRg9GA0LDRhtC40LguXG4iKTsKIAogICAgRGVsZXRlQWRkcmVzcyAoYWRkcmVzcyk7CiAgICBnZXRjaGFyKCk7CiAgICBnb3RvIGZsYWc7CiAgICByZXR1cm4gMDsKfQ==