Консультация № 165476
21.04.2009, 10:43
0.00 руб.
0 3 1
Prıvet!
Pomogıte plız s zadachey..

Маска подсетей
Рассмотрим компьютерную сеть с настроенной TCP/IP маршрутизацией. Будем рассматривать некоторую ее модификацию. А именно в этой сети находить N подсетей. Каждая подсеть характеризуется своей маской. Маска подсети представляет собой 4 однобайтных числа, разделенных точкой. Причем для масок выполнено следующее свойство: если представить маску в двоичном виде, то сначала она будет содержать k единиц, а потом q нулей, причем k + q = 32. Например, 255.255.255.0 — маска подсети, а 192.168.0.1 — нет.

Поясним, как получается двоичное представление IP-адреса. Для этого числа, составляющие IP-адрес, представляются в двоичной системе счисления (при этом каждое из них дополняется ведущими нулями до длины в 8 цифр), после чего удаляются точки. Получившееся 32-битное число и есть двоичное представление IP-адреса. Например, для адреса 192.168.0.1 этот процесс выглядит так: 192.168.0.1 → 11000000.10101000.00000000.00000001 → 11000000101010000000000000000001. Таким образом, двоичным представлением IP-адреса 192.168.0.1 является 11000000101010000000000000000001.

Будем говорить, что два компьютера с IP1 и IP2 лежат в подсети, если IP1 /\ Mask = IP2 /\ Mask, где Mask — маска этой подсети, а /\ — операция побитового логического «и». IP компьютера представляет собой так же 4 однобайтных числа, разделенных точкой.

Вам даны M пар IP адресов компьютеров. Для каждой из них Вам надо определить, в скольких подсетях из заданных они лежат.

Входные данные
В первой строке входного файла INPUT.TXT записано число N — количество подсетей. В следующих N строках перечислены маски этих подсетей. В N + 2 строке находится число M (0 ≤ M ≤ 10000). В следующих M строках записаны пары IP адресов, разделенных пробелом.

Выходные данные
Для каждой пары IP адресов в отдельной строке выходного файла OUTPUT.TXT выведите количество подсетей, в которых лежат оба компьютера.

Prımer
input.txt:
2
255.255.255.255
255.255.255.0
3
192.168.31.1 192.168.31.2
192.168.31.3 192.168.31.4
192.168.31.1 192.167.31.2
output.txt:
1
1
0

SPASIBO!!!

Обсуждение

Неизвестный
21.04.2009, 20:05
общий
это ответ
Здравствуйте, Romanov Abram Tojikovich!
Программа:
Код:

#include <fstream>
#include <string>
#include <sstream>
#include <list>
#include <regex> // Заголовок подключающий библиотеку регулярных выражений

using namespace std;
using namespace std::tr1; // Пространство имен где находятся классы регулярных выражений

class ipadress
{
private:
union
{
unsigned int adress32:32;
unsigned char adress8[4];
}adress;
friend ifstream& operator>>(ifstream& stream,ipadress& ip);
friend bool oneNetwork(const ipadress& ip1,const ipadress& ip2,const ipadress& mask);
};

int main()
{
ifstream in("INPUT.TXT");
ofstream out("OUTPUT.TXT");
unsigned int netMasksCount;
in>>netMasksCount;
list<ipadress> masks;
for(unsigned int i=0;i<netMasksCount;++i)
{
ipadress ip;
in>>ip;
masks.push_back(ip);
}
unsigned int netAdressCount;
in>>netAdressCount;
for(unsigned int i=0;i<netAdressCount;++i)
{
ipadress ip1,ip2;
in>>ip1>>ip2;
unsigned int counter=0;
for(list<ipadress>::const_iterator it=masks.begin();it!=masks.end();++it)
{
counter+=oneNetwork(ip1,ip2,*it);
}
out<<counter<<endl;
}
return 0;
}

ifstream& operator>>(ifstream& stream,ipadress& ip)
{
string str;
stream>>str;
if(!stream.fail())
{
// Регулярное выражение для проверки формата строки
regex regExp("^(\\d{1,3}\\.){3}\\d{1,3}$");
// Проверка формата. Должен быть ddd.ddd.ddd.ddd
if(regex_match(str,regExp))
{
char sa[4];
int ia;
bool good=true;
unsigned __int32 adress=0;
istringstream sstream(str);
for(unsigned int i=0;i<4&&good;++i)
{
if(i)sstream.ignore(1,'.');
sstream.get(sa,4,'.');
ia=atoi(sa);
if(ia>255)good=false;
adress=(adress<<8)|ia;
}
if(good)ip.adress.adress32=adress;
else stream.setstate(ios::badbit);
}
else stream.setstate(ios::badbit);
}
return stream;
}

bool oneNetwork(const ipadress& ip1,const ipadress& ip2,const ipadress& mask)
{
return (ip1.adress.adress32&mask.adress.adress32)==(ip2.adress.adress32&mask.adress.adress32);
}

Следует сказать, что в программе используются регулярные выражения(пространство имён std::tr1) и не всякий компилятор имеет эти библиотеки(проверялась в MS VS 2008). В программе используется для проверки корректности формата введенного ip-адреса. Если Вам это не нужно(тем более, что такие программы пишутся под системы автоматическй проверки решений и условия там задаются стандартные без ошибочных данных) то просто удалите эти места и все проверки корректности ввода. Учитывая уровень вопроса(не для начинающих) код не комментировал. Думаю разбретесь.
Неизвестный
24.04.2009, 01:15
общий
u menya dayot oshibku na DEV-C++ 4.2
neponyal chto vi skazali udalit
pomogite pliz
Неизвестный
24.04.2009, 06:40
общий
Код:


#include <fstream>
#include <string>
#include <sstream>
#include <list>

using namespace std;

class ipadress
{
private:
union
{
unsigned int adress32:32;
unsigned char adress8[4];
}adress;
friend ifstream& operator>>(ifstream& stream,ipadress& ip);
friend bool oneNetwork(const ipadress& ip1,const ipadress& ip2,const ipadress& mask);
};

int main()
{
ifstream in("INPUT.TXT");
ofstream out("OUTPUT.TXT");
unsigned int netMasksCount;
in>>netMasksCount;
list<ipadress> masks;
for(unsigned int i=0;i<netMasksCount;++i)
{
ipadress ip;
in>>ip;
masks.push_back(ip);
}
unsigned int netAdressCount;
in>>netAdressCount;
for(unsigned int i=0;i<netAdressCount;++i)
{
ipadress ip1,ip2;
in>>ip1>>ip2;
unsigned int counter=0;
for(list<ipadress>::const_iterator it=masks.begin();it!=masks.end();++it)
{
counter+=oneNetwork(ip1,ip2,*it);
}
out<<counter<<endl;
}
return 0;
}

ifstream& operator>>(ifstream& stream,ipadress& ip)
{
string str;
stream>>str;
if(!stream.fail())
{
char sa[4];
int ia;
bool good=true;
unsigned __int32 adress=0;
istringstream sstream(str);
for(unsigned int i=0;i<4&&good;++i)
{
if(i)sstream.ignore(1,'.');
sstream.get(sa,4,'.');
ia=atoi(sa);
if(ia>255)good=false;
adress=(adress<<8)|ia;
}
if(good)ip.adress.adress32=adress;
else stream.setstate(ios::badbit);
}
return stream;
}

bool oneNetwork(const ipadress& ip1,const ipadress& ip2,const ipadress& mask)
{
return (ip1.adress.adress32&mask.adress.adress32)==(ip2.adress.adress32&mask.adress.adress32);
}

Не забудьте, когда будете проверять, создать файл "INPUT.TXT" или указать реально существующий файл.
Форма ответа