小泉向西流
发表于 2014-7-9 15:33:14
二进制转换为8进制,
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10 //追加的空间大小
typedef char ElemType;
typedef struct
{
ElemType *base; //栈底
ElemType *top; //栈顶
int stackSize; //栈的容量
}sqStack;
void InitStack(sqStack *s)
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(*s->base)
{
exit(0);
}
s->top=s->base;
s->stackSize=STACK_INIT_SIZE; //栈的容量
}
void Push(sqStack *s, ElemType e) //入栈
{
//如果栈满, 追加空间
if(s->top-s->base >= s->stackSize)
{
s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
//realloc追缴空间的函数
if(!s->base)
exit(0);
s->top=s->base+s->stackSize;
s->stackSize=s->stackSize+STACKINCREMENT;
}
*(s->top)=e;
s->top++;
}
void Pop(sqStack *s, ElemType *e) //出栈
{
if(s->top==s->base)
return;
*e= *--(s->top);
}
void ClearStack(sqStack *s) //清空栈
{
s->top=s->base;
}
void DestroyStack(sqStack *s) //销毁栈
{
int i, len;
len=s->stackSize;
for(i=0;i<len ;i++)
{
free(s->base);
s->base++;
}
s->base= s->top= NULL;
s->stackSize = 0;
}
int StackLen(sqStack s) //计算栈的当前容量
{
return(s.top-s.base);
}
int main()
{
ElemType c, c1='0';
sqStack s, s1 ;
int len , len1, i ,j=0;
InitStack(&s);
InitStack(&s1);
printf("请输入二进制数,输入#符号表示结束!\n");
scanf("%c",&c);
while(c!='#')
{
Push(&s, c);
scanf("%c",&c);
}
getchar(); //清理键盘缓冲区, 清空#
len= StackLen(s);
printf("栈的当前容量是%d\n", len);
for(i=0;i<len; i++)
{
Pop(&s, &c);
c1=c1+(c-48)*pow(2,j);
j++;
if(j==3)
{
Push(&s1, c1);
j=0;
c1='0';
}
}
if(i==len&&j!=3)
{
Push(&s1, c1);
}
len1= StackLen(s1);
printf("新栈的当前容量是%d\n", len1);
printf("转换为八进制数是:");
for(i=0;i<len1;i++)
{
Pop(&s1, &c);
printf("%c", c);
}
printf("\n");
return 0;
}
wanmiles
发表于 2014-7-10 22:07:34
强烈支持楼主ing……
Almy
发表于 2014-8-18 11:38:36
好贵啊~~~纠结
一世安
发表于 2014-8-22 21:09:27
非常感谢啊,第20行有个小错,改为 if(!s->base)
hx3718895
发表于 2014-11-7 11:00:57
强烈支持楼主ing……
只是好贵T_T
mrlonely1002
发表于 2014-11-12 10:39:54
没钱啊鱼币人民币 都没有:cry
shisecao
发表于 2014-11-14 22:38:11
鱼哥,我这个穷人消费不起你的课程啊
阿斯顿加扣扣
发表于 2015-2-18 15:25:04
:sad{:1_1:}{:1_1:}{:1_1:}{:1_1:}
jqq
发表于 2015-4-21 08:25:24
慢慢学习!!!
lvss
发表于 2015-4-21 09:11:57
强烈支持楼主ing……
8938
发表于 2015-5-12 22:01:31
{:1_1:}
alexzp
发表于 2015-6-7 23:56:04
有点贵啊:cry
dabaojian
发表于 2015-8-17 11:56:35
八进制和十进制没差太多
怪盗①⒋Ⅻ號
发表于 2015-8-20 18:08:34
来参考一下源代码
minwang
发表于 2015-11-3 19:52:35
辛苦老师
amon91
发表于 2015-11-16 19:51:51
好贵啊啊啊啊
amon91
发表于 2015-11-16 20:28:27
小泉向西流 发表于 2014-7-9 15:33
二进制转换为8进制,
输出不对啊
fzquchs
发表于 2016-2-26 02:29:29
自己写的二进制转换为十六进制作业代码,给各位鱼油参考一下,有更好的也可以分享一下出来
#include <stdio.h>
#include <windows.h>
#include <math.h>
typedef char ElemType;// 元素类型
typedef int Status;
#define ERROR 0
#define OK 1
typedef struct
{
ElemType *base; // 在栈构造之前和销毁之后,base 的值为 NULL
ElemType *top; // 栈顶指针
int stackSize; // 当前已经分配的储存空间,以元素为单位
}sqStack;
#define STACK_INIT_SIZE 100// 储存空间初始分配量
#define STACK_INCREMENT 10 // 储存空间分配增量
//初始化一个栈
Status InitStack(sqStack *s)
{
if( NULL == s)
return ERROR;
s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );
if( !s->base )
return ERROR;//exit(0);
s->top = s->base; // 最开始,栈顶就是栈底
s->stackSize = STACK_INIT_SIZE;
return OK;
}
//压入栈
Status Push(sqStack *s, ElemType e)
{
if( NULL == s)
return ERROR;
//如果栈满, 追加空间
if( s->top - s->base >= s->stackSize )
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INCREMENT)*sizeof(ElemType));
if( !s->base )
return ERROR;// exit(0);
s->top = s->base + s->stackSize;//设置栈顶
s->stackSize = s->stackSize + STACK_INCREMENT; //设置新的容量
}
*(s->top) = e; //写入元素
s->top++; //栈顶上移
return OK;
}
//弹出栈
Status Pop(sqStack *s, ElemType *e)
{
if( NULL == s)
return ERROR;
if( s->top == s->base )// 栈已空空是也
return ERROR;
*e = *--(s->top); //先将栈顶下移,然后取出里面的元素
return OK;
}
//清空栈
Status ClearStack(sqStack *s)
{
if( NULL == s)
return ERROR;
s->top = s->base;
return OK;
}
//销毁这个栈
Status DestroyStack(sqStack *s)
{
int i, len;
if( NULL == s)
return ERROR;
len = s->stackSize;
for( i=0; i < len; i++ )
{
free( s->base );
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
return OK;
}
//计算栈的当前容量
int StackLen(sqStack s)
{
return(s.top - s.base);// 初学者需要重点讲解
}
//若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
Status GetTop(sqStack s, ElemType *e)
{
//若栈不空,则用e返回s的栈顶元素,并返回OK;否则返回ERROR
if( s.base == s.top )
return ERROR;
*e = *(s.top-1);
return OK;
}
int main(int argn, char* argv[], char* arge[])
{
ElemType c;
sqStack s, temp;
int len, i, sum = 0, j;
int flag; //3次标识
InitStack(&s);
InitStack(&temp);
printf("请输入二进制数,输入#符号表示结束\n");//如输入 11001001#
scanf("%c", &c);
/*
请输入要查询的字母:0
你输入的字符 0 对应的十进制数为: 48对应的十六进制数为:30
请输入要查询的字母:1
你输入的字符 1 对应的十进制数为: 49对应的十六进制数为:31
*/
while( c != '#')
{
Push(&s,c);
scanf("%c", &c);
}
fflush(stdin); //把\n从缓冲区清除getchar()也可以
len = StackLen(s);
printf("栈当前容量是: %d\n", len);
flag = 0; // 标识置0
for( i = 0,j = 0; i < len; i++ )
{
Pop(&s,&c);
sum = sum + (c - 48)*pow(2,j);
if(flag == 3 || i == (len-1)) //i == (len-1)是防止循环退出前把数据压栈
{
Push(&temp,sum);
sum = 0; //清空
flag = 0; // 标识置0
j = 0; //次方数置0
}else
{
flag++; //标识递增
j++;
}
}
printf("转化为十六进制数是:");
len = StackLen(temp);
for( i = 0; i < len; i++ )
{
Pop(&temp,&c);
printf("%X", c);
}
//销毁栈
// DestroyStack(&s);
// DestroyStack(&temp);
printf("\n");
///////////////////////////////////////////////
system("pause");
return 0;
}
二进制转换为八进制的代码只要将里面的标识flag改为:flag==2就可以了
newbi110
发表于 2016-8-8 09:37:02
强烈支持楼主ing……~~
c语言的菜鸟
发表于 2016-10-18 15:45:44
强势下载了!!努力赚钱买课件!!!