Перевод из одной системы счисления в другую - C (СИ) (151074)

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

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

Задача следующая: 1)Пользователь вводит числа в 16 системе в бессконечную строку (список), по вводу "!" происходит окончание ввода 2)Потом осуществляется перевод из 16 в двоичную Проблема в том, что мне как-то нужно хранить соответствия числа в 16 система к 2-ой системе. К примеру F соответствует 1111. В итоге должно получиться число представленное двоичными эквивалентами к примеру AB=1010 1011 Пробовал массивом символов сделать, что бы анализируемое число указывало на элемент в массиве, что бы можно было найти соответствие. Однако, потом я вспомнил, что в массиве char может храниться 1 символ. Хотел через enum сделать, но просто числа не могут быть элементами перечисления. На ум приходит 2 варианта: Либо в лоб написать 16 IF, что неправильно Либо создавать динамический массив(по сути список). Может есть какой-нибудь вариант проще? Не хочется с еще 1 списком возится... Код:
Листинг программы
  1. #pragma hdrstop
  2. #pragma argsused
  3. #include <stdio.h>
  4. #include <malloc.h>
  5. #include <string.h>
  6. #ifdef _WIN32
  7. #include <tchar.h>
  8. #else
  9. typedef char _TCHAR;
  10. #define _tmain main
  11. #endif
  12. struct Line
  13. {
  14. char litter;
  15. struct Line *next;
  16. };
  17. const char dict[16][2]={
  18. {'0','0'},
  19. {'1','1'},
  20. {'2','10'},
  21. {'3','11'},
  22. {'4','100'},
  23. {'5','101'},
  24. {'6','110'},
  25. {'7','111'} ,
  26. {'8','1000'} ,
  27. {'9','1001'} ,
  28. {'A','1010'},
  29. {'B','1011'},
  30. {'C','1100'},
  31. {'D','1101'},
  32. {'E','1110'},
  33. {'F','1111'}};
  34. void enterString(struct Line *);
  35. struct Line * createElement(struct Line*);
  36. void outputString();
  37. char checkValue(char);
  38. void processingString(struct Line*);
  39. int getIndex(struct Line);
  40. int _tmain(int argc, _TCHAR* argv[])
  41. {
  42. struct Line string;
  43. struct Line *head = &string;
  44. puts("Enter string");
  45. enterString(&string);
  46. string=*head;
  47. processingString(&string);
  48. return 0;
  49. }
  50. void enterString(struct Line *string) {
  51. char chr;
  52. struct Line *head = string;
  53. while (scanf("%c",&chr) > 0) {
  54. if (chr=='!') {
  55. return;
  56. }
  57. if (checkValue(chr)!='\0') {
  58. string->litter=chr;
  59. }
  60. else continue;
  61. string=createElement(string);
  62. }
  63. }
  64. struct Line * createElement(struct Line *string)
  65. {
  66. string->next = malloc(sizeof(struct Line));
  67. string = string->next;
  68. string->next = NULL;
  69. return string;
  70. }
  71. char checkValue(char chr)
  72. {
  73. static char schr;
  74. if (strpbrk(&chr,"123456789ABCDEF \t")>0) {
  75. if (chr=='\t') {
  76. chr=' ';
  77. }
  78. if (chr==schr) {
  79. return '\0' ;
  80. }
  81. return schr=chr;
  82. }
  83. else return '\0';
  84. }
  85. int getIndex(struct Line string){
  86. return (int)string.litter>57?(int)string.litter-55:(int)string.litter-48;
  87. }
  88. void processingString(struct Line *string)
  89. {
  90. int i,uBOUND;
  91. char *pattern;
  92. struct Line *partString ;
  93. while (string->next!=NULL)
  94. {
  95. if (string->litter==' ') {
  96. string= string->next;
  97. continue;
  98. }
  99. partString=string->next;
  100. uBOUND=strlen(dict[getIndex(*string),1]);
  101. for (i = 0; i <= uBOUND; i++)
  102. {
  103. if (uBOUND>1) {
  104. string->litter=pattern[i-1];
  105. string=createElement(string);
  106. }
  107. else string->litter=pattern[i-1];
  108. }
  109. string->next=partString;
  110. string= string->next;
  111. }
  112. }

Решение задачи: «Перевод из одной системы счисления в другую»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. struct Line
  6.     {
  7.      char litter;
  8.      struct Line *next;
  9.     };
  10.  
  11. const char *dict[16][2]={
  12.       {"0","0000"},
  13.       {"1","0001"},
  14.       {"2","0010"},
  15.       {"3","0011"},
  16.       {"4","0100"},
  17.       {"5","0101"},
  18.       {"6","0110"},
  19.       {"7","0111"} ,
  20.       {"8","1000"} ,
  21.       {"9","1001"} ,
  22.       {"A","1010"},
  23.       {"B","1011"},
  24.       {"C","1100"},
  25.       {"D","1101"},
  26.       {"E","1110"},
  27.       {"F","1111"}};
  28.  
  29. void enterString(struct Line *);
  30. struct Line * createElement(struct Line*);
  31. void processingString(struct Line*, struct Line*);
  32. void outputString(struct Line *);
  33. int value(char);
  34.  
  35. int main(int argc, char* argv[])
  36. {
  37.     struct Line Sstring, Dstring;
  38.  
  39.     puts("Enter string");
  40.     enterString(&Sstring);
  41.     outputString(&Sstring);
  42.     processingString(&Sstring, &Dstring);
  43.     outputString(&Dstring);
  44.     return 0;
  45. }
  46.  
  47. void outputString(struct Line *string) {
  48.     if (string->litter) {
  49.         putchar(string->litter);
  50.         outputString(string->next);
  51.     }
  52.     else
  53.         putchar('\n');
  54. }
  55.  
  56. void enterString(struct Line *string) {
  57.     char chr;
  58.     struct Line *item = string;
  59.     while ((chr=toupper(getchar())) != '!') {
  60.     if (( chr>='0' && chr<='9' )||
  61.         ( chr>='A' && chr<='F' ) )
  62.     {
  63.         item->litter = chr;
  64.         item = createElement(item);
  65.     }
  66.     }
  67.     item->litter='\0';
  68. }
  69.  
  70. struct Line * createElement(struct Line *string)
  71.     {
  72.         string->next = malloc(sizeof(struct Line));
  73.     string = string->next;
  74.         string->next = NULL;
  75.         return string;
  76.     }
  77.  
  78.  
  79. void processingString(struct Line *source, struct Line *destination)
  80.     {
  81.         struct Line *ditem = destination, *sitem = source;
  82.         while (sitem->litter) {
  83.             int v = value(sitem->litter);
  84.             ditem->litter = dict[v][1][0];
  85.             (ditem = createElement(ditem))->litter = dict[v][1][1];
  86.             (ditem = createElement(ditem))->litter = dict[v][1][2];
  87.             (ditem = createElement(ditem))->litter = dict[v][1][3];
  88.             (ditem = createElement(ditem))->litter = ' ';
  89.             (ditem = createElement(ditem))->litter = '\0';
  90.  
  91.             sitem = sitem->next;
  92.  
  93.         }
  94.     }
  95.  
  96. int value(char chr) {
  97.     if (chr>='0' && chr<='9')
  98.         return chr - '0';
  99.     else
  100.         return chr - 'A' + 10;
  101. }

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

В этом коде реализована функция перевода строки из одной системы счисления в другую. Структура данных, представляющая строку, состоит из символа и указателя на следующий элемент. Для работы со строкой вводится функция создания нового элемента списка, а также функция вывода строки на экран. В функции ввода строки пользователю предлагается ввести строку в кодировке ASCII. Затем эта строка преобразуется в список элементов, где каждый символ представлен отдельным элементом списка. Функция обработки строки принимает два указателя на начало и конец строки. В этой функции происходит перевод каждого символа строки из одной системы счисления в другую, при этом каждому числу в двоичной системе счисления соответствует определенный набор символов в шестнадцатеричной системе счисления. Функция определения значения символа в строке вычисляет числовое значение символа в соответствии с его позицией в алфавите. В функции вывода строки на экран происходит обход всех элементов списка и вывод их на экран. При этом если элемент является последним в списке, то после него выводится символ новой строки.

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


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

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

10   голосов , оценка 4.3 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы