GrimHansl

L_PW6_task_2

Dec 7th, 2020 (edited)
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. /*
  2. Строка содержит запись натурального числа в n-ричной
  3. системе счисления (n задается пользователем, 0 < n < 10).
  4. Получить строку, содержащую десятичную запись этого числа.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10. #include <locale.h>
  11. #define LEN 100
  12.  
  13. char *Scale="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  14.  
  15. int dig2int(char d);
  16. char *convert(char *n, int from, int to, int len);
  17. int FcountNum(char *str);
  18.  
  19. int main(int argc, char *argv[])
  20. {
  21.     setlocale(LC_ALL,"Russian");
  22.     int i;
  23.     char string[LEN] = "";
  24.  
  25.     //ввод строки
  26.     printf("строка: ");
  27.     scanf("%[^\n]%*c", string);
  28.  
  29.     //ввод системы счисления
  30.     int ss;
  31.     printf("Введите n (систему счисления)\nУчтите, что 0 < n < 10\n n = ");
  32.     scanf("%d", &ss);
  33.  
  34.     //проверка введенной строки на наличие цифр
  35.     //только из введенной сс
  36.     //коды в ASCII:
  37.     //0 - \0
  38.     //48 - 0
  39.     do {
  40.         if (string[i] < 48 || string[i] >= ss + 48) {
  41.             printf("\nОШИБКА:\n");
  42.             printf("Введенная строка содержит цифру(ы), которых нет в %d сс\n", ss);
  43.             _Exit(1);
  44.         }
  45.         i++;
  46.     } while (string[i] != 0);
  47.  
  48.     //коррекность ввода системы счисления
  49.     if (ss >= 10 || ss <= 0) {
  50.         printf("\n\nОШИБКА:\n");
  51.         printf("Вы ввели неверное значение n\n");
  52.         _Exit(1);
  53.     }
  54.  
  55.     int countNum = FcountNum(string);
  56.    
  57.     //перевод в другую сс и вывод результата
  58.     char *Q;
  59.     Q = convert(string, ss, 10, countNum);
  60.     printf("результат: %s \n",Q);
  61.       free(Q);
  62.     return 0;
  63. }
  64.  
  65. //подсчет количества натуральных цифр в строке
  66. int FcountNum(char *str)
  67. {
  68.     int FcountNum = 0;
  69.     for(int i = 0; i < LEN; i++) {
  70.         if(str[i] >= 48 && str[i] <= 57) {
  71.             FcountNum++;
  72.         }
  73.     }
  74.     return FcountNum;  
  75. }
  76.  
  77. int dig2int(char d)
  78. {
  79.     int i;
  80.     for (i = 0; i < 36; i++) {
  81.         if (Scale[i]==d) {
  82.             return i;
  83.         }
  84.     }
  85. }
  86.  
  87. char *convert(char *n, int from, int to, int len)
  88. {
  89.     int i,j,l,p,k;
  90.     char *buf;
  91.     l = len;
  92.     p = 0;
  93.     for (i = 0; i < l; i++) {
  94.         p = p * from + dig2int(n[i]);
  95.     }
  96.     buf = (char *) calloc(100, 1);
  97.     k = 99;
  98.     l = 0;
  99.     while(1)
  100.     {
  101.         j = p % to;
  102.         buf[k--] = Scale[j];
  103.         l++;
  104.         p = p / to;
  105.         if (p == 0) {
  106.             break;
  107.         }
  108.     }
  109.     j = 0;
  110.     k++;
  111.     while(1)
  112.     {
  113.         buf[j++] = buf[k++];
  114.         if (k == 100) {
  115.             break;
  116.         }
  117.     }
  118.     buf=(char *) realloc(buf,(l+1));
  119.     return buf;
  120. }
  121.  
Advertisement
Add Comment
Please, Sign In to add comment