По количеству подсетей, заданному классу и количеству компьютеров определить маску и список IP - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, необходимо разработать приложение на С/С++, которое по заданному классу (А, В или С), количеству подсетей N и максимальному количеству компьютеров M в подсети определяет маску для разбиения на подсети и список возможных IP-адресов подсетей. Если разбиение на подсети невозможно, приложение должно выдавать соответствующее сообщение об ошибке.

Решение задачи: «По количеству подсетей, заданному классу и количеству компьютеров определить маску и список IP»

textual
Листинг программы
/*необходимо разработать приложение на С/С++, которое по заданному классу (А, В или С), 
количеству подсетей N и максимальному количеству компьютеров M в подсети определяет маску для разбиения на
подсети и список возможных IP-адресов подсетей. Если разбиение на подсети невозможно,
приложение должно выдавать соответствующее сообщение об ошибке.*/
 
#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)
{   for (int 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() 
{   int pow2[25], N, M;
    FillPow2 (pow2);
    char cl;
    
    do
    {   printf("Network class:\t");
        cl = toupper (getc(stdin));
        getc(stdin);
    } while (!IsClass (cl));
 
    TAddress *address = CreateAddress (cl);
    printf("Class standard mask:\t");
    PrintAddress (address);
 
    printf("\n\nNumber of subnetworks N = ");
    scanf ("%d", &N);
    printf("Maximum number of computers in one subnetwork M = ");
    scanf ("%d", &M);
    getc(stdin);
 
    FillBits (address, N, M, pow2);
    printf("Free bits: %d\tBits for subs: %d\tBits for comps: %d", address->freeBits, address->Nbits, address->Mbits);
    if (CheckBits (address))
    {   CreateMask (address, pow2);
        printf("\n\nThis configuration mask:\t");
        PrintAddress (address);
    }
    else
        printf("\n\nImpossible to create this configuration\n");
 
    DeleteAddress (address);
    getchar();
    return 0;
}

Объяснение кода листинга программы

  1. Объявление переменных:
    • pow2 - массив для хранения степеней двойки, инициализируется значением 1 в степени от 0 до 25;
    • N, M - переменные для хранения количества подсетей и максимального количества компьютеров в подсети соответственно;
    • cl - переменная для хранения класса сети (A, B или C);
    • address - указатель на структуру TAddress, которая содержит информацию об адресе сети;
    • ai - функция для вычисления суммы степеней двойки от 0 до указанного числа бит;
    • FillBits - функция для заполнения переменных Nbits и Mbits в структуре TAddress, которые содержат количество бит для подсетей и компьютеров соответственно;
    • CheckBits - функция для проверки возможности создания маски для заданных параметров;
    • CreateMask - функция для создания маски для заданных параметров;
    • PrintAddress - функция для вывода информации об адресе сети в консоль.
  2. Основной цикл программы:
    • Пользователю предлагается ввести класс сети;
    • Создается структура TAddress с заданным классом сети;
    • Выводится стандартная маска для заданного класса сети;
    • Пользователю предлагается ввести количество подсетей и максимальное количество компьютеров в подсети;
    • Заполняются переменные Nbits и Mbits в структуре TAddress;
    • Выводится информация о количестве свободных бит, бит для подсетей и бит для компьютеров;
    • Проверяется возможность создания маски для заданных параметров;
    • Если возможно, создается маска и выводится на экран;
    • Если невозможно, выводится сообщение об ошибке;
    • Освобождается память, выделенная под структуру TAddress.
  3. Варианты масок для каждого класса сети:
    • Для класса C: первая октетная сетка (255.255.255.0);
    • Для класса B: первая и вторая октетные сетки (255.255.0.0);
    • Для класса A: первая, вторая и третья октетные сетки (255.255.255.255).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы