2个回答
推荐于2018-04-24
展开全部
var
x:longint;
z:array[1..100] of byte;
top:byte;
y,modd:byte;
procedure push;
begin
inc(top); z[top]:=modd;
end;
procedure pop;
begin
if top>0 then begin y:=z[top]; dec(top); end
else writeln('stack overflow !');
end;
begin
x:=1234567890;
top:=0;
repeat
modd:=x mod 16;
x:=x div 16;
push;
until x=0;
while top>0 do begin
pop;
if (y>=10) then write(chr(y-10+ord('A')):1)
else write(chr(y+ord('0')):1);
end;
end.
展开全部
主要思想:
1)由于在C语言中没有对十六进制类型的变量,所以输入的十六进制数应如何处理以确保存储在内存中仍保持十六进制?
基于这一原因,只能以字符串的形式来存储输入的十六进制数,即把数作为字符存入内存。
2)为了实现转换,将输入的一串字符一个一个地入栈,用栈的好处是什么?
好处是:不用判断输入的这个十六进制数是几位数,而且栈顶就是个位数字(当然也很容易判断是几位数:字符串的长度就是十六进制数的位数);
3)算法实现:设转换后的十进制为Dec(初值为0)、设i=0(且i<字符串的长度,这个长度不是额外求的,而是在入栈的同时计算来的);将栈中的字符一个一个出栈,每出栈一个字符c就判断它是(‘0’~‘9’)、还是(‘A’~‘F’)或是(‘a’~‘f’):
①若c是(‘0’~‘9’),则转换时按下述原则进行:Dec=Dec+(c-48)*16n;
②若c是(‘A’~‘F’),则转换时按下述原则进行:
若c=’A’,则Dec=Dec+10*16n;
若c=’B’,则Dec=Dec+11*16n;
若c=’C’,则Dec=Dec+12*16n;
若c=’D’,则Dec=Dec+13*16n;
若c=’E’,则Dec=Dec+14*16n;
若c=’F’,则Dec=Dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
Dec=Dec+((c-65)+10)*16n;
③若c是(‘a’~‘f’),则转换时按下述原则进行:
若c=’a’,则dec=dec+10*16n;
若c=’b’,则dec=dec+11*16n;
若c=’c’,则dec=dec+12*16n;
若c=’d’,则dec=dec+13*16n;
若c=’e’,则dec=dec+14*16n;
若c=’f’,则dec=dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
dec=dec+((c-97)+10)*16n;
#include "stdio.h"
#include "math.h"
typedef char datatype; /*定义栈的数据结构*/
typedef struct
{datatype data[100];
int top;
}SQstack;
void push(SQstack *s,datatype e) /*入栈操作*/
{(*s).top++;
(*s).data[(*s).top]=e;
}
datatype pop(SQstack *s,datatype *e) /*出栈操作*/
{*e=(*s).data[(*s).top];
(*s).top--;
return (*e);}
void initstack(SQstack *s) /*建空栈*/
{(*s).top=-1;
}
int emptystack(SQstack s) /*判断栈是否为空*/
{if(s.top==-1) return 1;
else return 0;
}
datatype gettop(SQstack s) /*取栈顶元素、并返回*/
{if(emptystack(s)) return NULL;
else return s.data[s.top];
}
trans16_10() /*输入十六进制数、入栈、出栈并判断转换*/
{SQstack *s;
char e,ch[100],c;
int i=0,j;
double Dec=0,x;
clrscr();
initstack(s);
ch=getchar(); /*输入的十六进制数用ch接收*/
while(ch!='#') /*入栈、i表示字符串的长度、以’#’为结束输入标志*/
{push(s,ch);
i++;
ch=getchar();}
j=0;
while(j<i) /*出栈并判断转换*/
{c=pop(s,&e); /*注意:这里必须使用中间变量c,因下面程序的每个if的条件部分要两次用到同一个栈顶c*/
if(c>='0' && c<='9')
Dec+=(c-48)*pow(16,j);
else if(c>='a' && c<='f')
switch(c)
{case 'a':Dec+=10*pow(16,j);break;
case 'b':Dec+=11*pow(16,j);break;
case 'c':Dec+=12*pow(16,j);break;
case 'd':Dec+=13*pow(16,j);break;
case 'e':Dec+=14*pow(16,j);break;
case 'f':Dec+=15*pow(16,j);break;
}
else if(c>='A' && c<='F')
switch(c)
{case 'A':Dec+=10*pow(16,j);break;
case 'B':Dec+=11*pow(16,j);break;
case 'C':Dec+=12*pow(16,j);break;
case 'D':Dec+=13*pow(16,j);break;
case 'E':Dec+=14*pow(16,j);break;
case 'F':Dec+=15*pow(16,j);break;
}
j++;
}
return Dec;
}
void main()
{ double Dec; Dec=trans16_10();
printf("\n%.0lf",Dec); }
1)由于在C语言中没有对十六进制类型的变量,所以输入的十六进制数应如何处理以确保存储在内存中仍保持十六进制?
基于这一原因,只能以字符串的形式来存储输入的十六进制数,即把数作为字符存入内存。
2)为了实现转换,将输入的一串字符一个一个地入栈,用栈的好处是什么?
好处是:不用判断输入的这个十六进制数是几位数,而且栈顶就是个位数字(当然也很容易判断是几位数:字符串的长度就是十六进制数的位数);
3)算法实现:设转换后的十进制为Dec(初值为0)、设i=0(且i<字符串的长度,这个长度不是额外求的,而是在入栈的同时计算来的);将栈中的字符一个一个出栈,每出栈一个字符c就判断它是(‘0’~‘9’)、还是(‘A’~‘F’)或是(‘a’~‘f’):
①若c是(‘0’~‘9’),则转换时按下述原则进行:Dec=Dec+(c-48)*16n;
②若c是(‘A’~‘F’),则转换时按下述原则进行:
若c=’A’,则Dec=Dec+10*16n;
若c=’B’,则Dec=Dec+11*16n;
若c=’C’,则Dec=Dec+12*16n;
若c=’D’,则Dec=Dec+13*16n;
若c=’E’,则Dec=Dec+14*16n;
若c=’F’,则Dec=Dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
Dec=Dec+((c-65)+10)*16n;
③若c是(‘a’~‘f’),则转换时按下述原则进行:
若c=’a’,则dec=dec+10*16n;
若c=’b’,则dec=dec+11*16n;
若c=’c’,则dec=dec+12*16n;
若c=’d’,则dec=dec+13*16n;
若c=’e’,则dec=dec+14*16n;
若c=’f’,则dec=dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
dec=dec+((c-97)+10)*16n;
#include "stdio.h"
#include "math.h"
typedef char datatype; /*定义栈的数据结构*/
typedef struct
{datatype data[100];
int top;
}SQstack;
void push(SQstack *s,datatype e) /*入栈操作*/
{(*s).top++;
(*s).data[(*s).top]=e;
}
datatype pop(SQstack *s,datatype *e) /*出栈操作*/
{*e=(*s).data[(*s).top];
(*s).top--;
return (*e);}
void initstack(SQstack *s) /*建空栈*/
{(*s).top=-1;
}
int emptystack(SQstack s) /*判断栈是否为空*/
{if(s.top==-1) return 1;
else return 0;
}
datatype gettop(SQstack s) /*取栈顶元素、并返回*/
{if(emptystack(s)) return NULL;
else return s.data[s.top];
}
trans16_10() /*输入十六进制数、入栈、出栈并判断转换*/
{SQstack *s;
char e,ch[100],c;
int i=0,j;
double Dec=0,x;
clrscr();
initstack(s);
ch=getchar(); /*输入的十六进制数用ch接收*/
while(ch!='#') /*入栈、i表示字符串的长度、以’#’为结束输入标志*/
{push(s,ch);
i++;
ch=getchar();}
j=0;
while(j<i) /*出栈并判断转换*/
{c=pop(s,&e); /*注意:这里必须使用中间变量c,因下面程序的每个if的条件部分要两次用到同一个栈顶c*/
if(c>='0' && c<='9')
Dec+=(c-48)*pow(16,j);
else if(c>='a' && c<='f')
switch(c)
{case 'a':Dec+=10*pow(16,j);break;
case 'b':Dec+=11*pow(16,j);break;
case 'c':Dec+=12*pow(16,j);break;
case 'd':Dec+=13*pow(16,j);break;
case 'e':Dec+=14*pow(16,j);break;
case 'f':Dec+=15*pow(16,j);break;
}
else if(c>='A' && c<='F')
switch(c)
{case 'A':Dec+=10*pow(16,j);break;
case 'B':Dec+=11*pow(16,j);break;
case 'C':Dec+=12*pow(16,j);break;
case 'D':Dec+=13*pow(16,j);break;
case 'E':Dec+=14*pow(16,j);break;
case 'F':Dec+=15*pow(16,j);break;
}
j++;
}
return Dec;
}
void main()
{ double Dec; Dec=trans16_10();
printf("\n%.0lf",Dec); }
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询