Перевод из одной системы счисления в другую - C (СИ) (151074)
Формулировка задачи:
#pragma hdrstop
#pragma argsused
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
struct Line
{
char litter;
struct Line *next;
};
const char dict[16][2]={
{'0','0'},
{'1','1'},
{'2','10'},
{'3','11'},
{'4','100'},
{'5','101'},
{'6','110'},
{'7','111'} ,
{'8','1000'} ,
{'9','1001'} ,
{'A','1010'},
{'B','1011'},
{'C','1100'},
{'D','1101'},
{'E','1110'},
{'F','1111'}};
void enterString(struct Line *);
struct Line * createElement(struct Line*);
void outputString();
char checkValue(char);
void processingString(struct Line*);
int getIndex(struct Line);
int _tmain(int argc, _TCHAR* argv[])
{
struct Line string;
struct Line *head = &string;
puts("Enter string");
enterString(&string);
string=*head;
processingString(&string);
return 0;
}
void enterString(struct Line *string) {
char chr;
struct Line *head = string;
while (scanf("%c",&chr) > 0) {
if (chr=='!') {
return;
}
if (checkValue(chr)!='\0') {
string->litter=chr;
}
else continue;
string=createElement(string);
}
}
struct Line * createElement(struct Line *string)
{
string->next = malloc(sizeof(struct Line));
string = string->next;
string->next = NULL;
return string;
}
char checkValue(char chr)
{
static char schr;
if (strpbrk(&chr,"123456789ABCDEF \t")>0) {
if (chr=='\t') {
chr=' ';
}
if (chr==schr) {
return '\0' ;
}
return schr=chr;
}
else return '\0';
}
int getIndex(struct Line string){
return (int)string.litter>57?(int)string.litter-55:(int)string.litter-48;
}
void processingString(struct Line *string)
{
int i,uBOUND;
char *pattern;
struct Line *partString ;
while (string->next!=NULL)
{
if (string->litter==' ') {
string= string->next;
continue;
}
partString=string->next;
uBOUND=strlen(dict[getIndex(*string),1]);
for (i = 0; i <= uBOUND; i++)
{
if (uBOUND>1) {
string->litter=pattern[i-1];
string=createElement(string);
}
else string->litter=pattern[i-1];
}
string->next=partString;
string= string->next;
}
}Решение задачи: «Перевод из одной системы счисления в другую»
#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct Line
{
char litter;
struct Line *next;
};
const char *dict[16][2]={
{"0","0000"},
{"1","0001"},
{"2","0010"},
{"3","0011"},
{"4","0100"},
{"5","0101"},
{"6","0110"},
{"7","0111"} ,
{"8","1000"} ,
{"9","1001"} ,
{"A","1010"},
{"B","1011"},
{"C","1100"},
{"D","1101"},
{"E","1110"},
{"F","1111"}};
void enterString(struct Line *);
struct Line * createElement(struct Line*);
void processingString(struct Line*, struct Line*);
void outputString(struct Line *);
int value(char);
int main(int argc, char* argv[])
{
struct Line Sstring, Dstring;
puts("Enter string");
enterString(&Sstring);
outputString(&Sstring);
processingString(&Sstring, &Dstring);
outputString(&Dstring);
return 0;
}
void outputString(struct Line *string) {
if (string->litter) {
putchar(string->litter);
outputString(string->next);
}
else
putchar('\n');
}
void enterString(struct Line *string) {
char chr;
struct Line *item = string;
while ((chr=toupper(getchar())) != '!') {
if (( chr>='0' && chr<='9' )||
( chr>='A' && chr<='F' ) )
{
item->litter = chr;
item = createElement(item);
}
}
item->litter='\0';
}
struct Line * createElement(struct Line *string)
{
string->next = malloc(sizeof(struct Line));
string = string->next;
string->next = NULL;
return string;
}
void processingString(struct Line *source, struct Line *destination)
{
struct Line *ditem = destination, *sitem = source;
while (sitem->litter) {
int v = value(sitem->litter);
ditem->litter = dict[v][1][0];
(ditem = createElement(ditem))->litter = dict[v][1][1];
(ditem = createElement(ditem))->litter = dict[v][1][2];
(ditem = createElement(ditem))->litter = dict[v][1][3];
(ditem = createElement(ditem))->litter = ' ';
(ditem = createElement(ditem))->litter = '\0';
sitem = sitem->next;
}
}
int value(char chr) {
if (chr>='0' && chr<='9')
return chr - '0';
else
return chr - 'A' + 10;
}
Объяснение кода листинга программы
В этом коде реализована функция перевода строки из одной системы счисления в другую. Структура данных, представляющая строку, состоит из символа и указателя на следующий элемент. Для работы со строкой вводится функция создания нового элемента списка, а также функция вывода строки на экран. В функции ввода строки пользователю предлагается ввести строку в кодировке ASCII. Затем эта строка преобразуется в список элементов, где каждый символ представлен отдельным элементом списка. Функция обработки строки принимает два указателя на начало и конец строки. В этой функции происходит перевод каждого символа строки из одной системы счисления в другую, при этом каждому числу в двоичной системе счисления соответствует определенный набор символов в шестнадцатеричной системе счисления. Функция определения значения символа в строке вычисляет числовое значение символа в соответствии с его позицией в алфавите. В функции вывода строки на экран происходит обход всех элементов списка и вывод их на экран. При этом если элемент является последним в списке, то после него выводится символ новой строки.