Advertisement
Mouseartiom

Untitled

Mar 28th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.97 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. int base = 16;
  6. void man(int);
  7. unsigned long long int power(int, int);
  8. unsigned long long int convert(int*, int);
  9. void char2int (char*, int*, int);
  10.  
  11. void main (int argc, char * argv[]) {
  12.  
  13.     unsigned long long int answer = 0;
  14.     int *decPointer, wasMinus = 0, length, i = 0, arrayLength[18] = {0, 0, 64, 41, 32 ,28, 25, 23, 22, 21, 20, 19, 18, 18, 17, 17, 16};
  15.     char *hexPointer, c;
  16.    
  17.     if (argc > 2) man(2);
  18.     if (argc == 2)
  19.     {
  20.         if (strcmp(argv[1], "-help") == 0) man(0);
  21.         if (argv[1][0] == '-') man(3);
  22.         base = atoi(argv[1]);
  23.     }
  24.     if (base == 0) man(3);
  25.     if (base > 16) man(4);
  26.     if (argc == 1) man(5);
  27.     char hex[arrayLength[base]];
  28.     int dec[arrayLength[base]];
  29.     hexPointer = &hex[0];
  30.     decPointer = &dec[0];
  31.  
  32.     printf("Перевод из системы с основанием %d в десятеричную. Максимум %d символов в каждом числе.\n", base, arrayLength[base]);
  33.     while ((c = getchar()) != '\n')
  34.     {
  35.         if (c == '-') {putchar(c); c = getchar(); wasMinus = 1;}
  36.         while ((c != ' ') && (c != '\n'))
  37.         {
  38.             *(hexPointer+i) = c;
  39.             i++;
  40.             c = getchar();
  41.             wasMinus = 0;
  42.         }
  43.  
  44.         length = i;
  45.         if (length > arrayLength[base]) man(6);
  46.         if ((length > 0) && (wasMinus == 0))
  47.         {
  48.             i = 0;
  49.             char2int(&hex[0], &dec[0], length);
  50.             answer = convert(&dec[0], length);
  51.             printf("%llu ", answer);
  52.             if (c == '\n') printf("\n");
  53.         }
  54.     }
  55. }
  56.  
  57. unsigned long long int power (int base, int degree) {
  58.     int i;
  59.     unsigned long long int result = 1;
  60.     for (i = 1; i <= degree-1; i++)
  61.     {
  62.         result = result * base;
  63.     }  
  64.     return result;
  65. }
  66.  
  67. unsigned long long int convert(int *decPointer, int len) {
  68. unsigned long long int result = 0;
  69. int i = 0;
  70.     while (len > 0)
  71.     {
  72.         result = result + (*(decPointer+i) * power(base, len));
  73.         len--;
  74.         i++;
  75.     }
  76.     return result;
  77. }
  78.  
  79. void char2int (char *hexPointer, int *decPointer, int hexLength) {
  80. int num, n = 0;
  81. while (n < hexLength)
  82.     {
  83.         num = *(hexPointer+n);
  84.         if ((num >= '0') && (num <= '9')) {*(decPointer+n) = num-'0';}
  85.         else if ((num >= 'A') && (num <= 'F')) {*(decPointer+n) = num-55;}
  86.         else if ((num >= 'a') && (num <= 'f')) {*(decPointer+n) = num-87;}
  87.         else man(1);
  88.         if (*(decPointer+n) > base) man(1);
  89.         n++;
  90.     }
  91. }
  92.  
  93. void man (int action)
  94. {
  95.     switch (action) {
  96.     case 0:
  97.         printf("\n**********Руководство по использованию программы***********\n* Данная программа может осуществлять перевод чисел       *\n* из любой системы с основанием от 2 до 16 в десятеричную.*\n* По умолчанию используется шестнадцатеричная система.    *\n");
  98.         printf("* Вы можете выбрать свою систему при помощи аргументов.   *\n* Пример: ./a.out 12                                      *\n***********************************************************\n");
  99.         exit(1);
  100.         break;
  101.     case 1:
  102.         printf("Введённое число не соответствует выбранной системе счисления.\nДля подробной информации используйте аргумент -help.\n");
  103.         exit(1);
  104.         break;
  105.     case 2:
  106.         printf("Слишком много аргументов. -help для подробной информации.\n");
  107.         exit(1);
  108.         break;
  109.     case 3:
  110.         printf("Неверный аргумент. Используйте -help для справки.\n");
  111.         exit(1);
  112.         break;
  113.     case 4:
  114.         printf("Выбранное основание слишком велико. Используйте -help для справки.\n");
  115.         exit(1);
  116.         break;
  117.     case 5:
  118.         printf("Программа запущена без аргументов. Используйте -help для справки.\n");
  119.         break;
  120.     case 6:
  121.         printf("Введённое число слишком большое.\n");
  122.         exit(1);
  123.         break;
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement