fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. typedef struct _TAddress
  7. { char IPclass;
  8. int a[4];
  9. int freeBits;
  10. int Nbits;
  11. int Mbits;
  12. } TAddress;
  13.  
  14. void FillPow2 (int pow2[])
  15. { int i = 0;
  16. pow2[0] = 1;
  17. while (++i<25)
  18. pow2[i] = pow2[i-1]*2;
  19. }
  20.  
  21. int IsClass (char c)
  22. { char *alphabet = "ABC";
  23. int i = strlen(alphabet);
  24. while (--i >-1)
  25. if (c == alphabet[i])
  26. return 1;
  27. return 0;
  28. }
  29.  
  30. TAddress *CreateAddress (char cl)
  31. { TAddress *address = (TAddress*) malloc (sizeof(TAddress));
  32. address->IPclass = cl;
  33. address->a[0] = 255;
  34. address->a[1] = address->a[2] = address->a[3] = 0;
  35.  
  36. if (cl == 'A')
  37. address->freeBits = 24;
  38. else
  39. { address->a[1] = 255;
  40. if (cl == 'B')
  41. address->freeBits = 16;
  42. else
  43. { address->a[2] = 255;
  44. address->freeBits = 8;
  45. }
  46. }
  47. address->Mbits = address->Nbits = -1;
  48.  
  49. return address;
  50. }
  51.  
  52. void DeleteAddress (TAddress *address)
  53. { free (address);
  54. }
  55.  
  56. void PrintAddress (TAddress *address)
  57. { int i;
  58. for (i = 0; i<4; i++)
  59. printf("%3d.", address->a[i]);
  60. printf("\n");
  61. }
  62.  
  63. void FillBits (TAddress *address, int N, int M, int pow2[])
  64. { int i;
  65. if (N)
  66. { for (i = 0; i<25; i++)
  67. if (N <= pow2[i]-2)
  68. { address->Nbits = i;
  69. break;
  70. }
  71. for (i = 0; i<25; i++)
  72. if (M <= pow2[i]-2)
  73. { address->Mbits = i;
  74. break;
  75. }
  76. }
  77. else
  78. { address->Nbits = 0;
  79. address->Mbits = address->freeBits;
  80. }
  81. }
  82.  
  83. int CheckBits (TAddress *address)
  84. { return address->Nbits + address->Mbits <= address->freeBits && address->Nbits>=0 && address->Mbits>0;
  85. }
  86.  
  87. int ai (int pow2[], int bits)
  88. { int i = 0, sum = pow2[7];
  89. while (++i < bits)
  90. sum += pow2[7-i];
  91. return sum;
  92. }
  93.  
  94. void CreateMask (TAddress *address, int pow2[])
  95. { if (!address->Nbits)
  96. return;
  97. if (address->IPclass == 'C')
  98. { address->a[3] = ai(pow2, address->Nbits);
  99. return;
  100. }
  101. if (address->IPclass == 'B')
  102. { if (address->Nbits <= 8)
  103. { address->a[2] = ai(pow2, address->Nbits);
  104. return;
  105. }
  106. else
  107. { address->a[2] = 255;
  108. address->a[3] = ai(pow2, address->Nbits-8);
  109. return;
  110. }
  111. }
  112. if (address->Nbits <= 8)
  113. { address->a[1] = ai(pow2, address->Nbits);
  114. return;
  115. }
  116. else if (address->Nbits <= 16)
  117. { address->a[1] = 255;
  118. address->a[2] = ai(pow2, address->Nbits-8);
  119. return;
  120. }
  121. else
  122. { address->a[1] = address->a[2] = 255;
  123. address->a[3] = ai(pow2, address->Nbits-16);
  124. return;
  125. }
  126. }
  127.  
  128.  
  129. int main()
  130. {
  131. flag:
  132. setlocale(0,"Russian");
  133. int pow2[25], N, M;
  134. FillPow2 (pow2);
  135. char cl;
  136.  
  137. do
  138. { printf("Класс:\t");
  139. cl = toupper (getc(stdin));
  140. getc(stdin);
  141. } while (!IsClass (cl));
  142.  
  143. TAddress *address = CreateAddress (cl);
  144. printf("Стандартная маска в классе:\t");
  145. PrintAddress (address);
  146.  
  147. printf("\n\nКоличество подсетей N = ");
  148. scanf ("%d", &N);
  149. printf("Максимальное количество ПК в подсети M = ");
  150. scanf ("%d", &M);
  151. getc(stdin);
  152.  
  153. FillBits (address, N, M, pow2);
  154. printf("Cвободно битов: %d\tБитов под подсети: %d\tБитов под пк: %d", address->freeBits, address->Nbits, address->Mbits);
  155. if (CheckBits (address))
  156. { CreateMask (address, pow2);
  157. printf("\n\nКонфигурация маски:\t");
  158. PrintAddress (address);
  159. }
  160. else
  161. printf("\n\nНевозможно создать в данной конфигурации.\n");
  162.  
  163. DeleteAddress (address);
  164. getchar();
  165. goto flag;
  166. return 0;
  167. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘int IsClass(char)’:
prog.cpp:22:22: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
 {   char *alphabet = "ABC";
                      ^~~~~
prog.cpp: In function ‘int main()’:
prog.cpp:132:26: error: ‘setlocale’ was not declared in this scope
     setlocale(0,"Russian");
                          ^
stdout
Standard output is empty