二进制转换为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;
}
				
			
		强烈支持楼主ing……				
			
		好贵啊~~~纠结				
			
		非常感谢啊,第20行有个小错,改为 if(!s->base)				
			
		强烈支持楼主ing……
只是好贵T_T				
			
		没钱啊鱼币人民币 都没有:cry				
			
		鱼哥,我这个穷人消费不起你的课程啊				
			
		:sad{:1_1:}{:1_1:}{:1_1:}{:1_1:}				
			
		慢慢学习!!!				
			
		强烈支持楼主ing……				
			
		{:1_1:}				
			
		有点贵啊:cry				
			
		八进制和十进制没差太多				
			
		来参考一下源代码				
			
		辛苦老师				
			
		好贵啊啊啊啊				
			
		小泉向西流 发表于 2014-7-9 15:33
二进制转换为8进制,
输出不对啊				
			
		自己写的二进制转换为十六进制作业代码,给各位鱼油参考一下,有更好的也可以分享一下出来
#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就可以了				
			
		强烈支持楼主ing……~~				
			
		强势下载了!!努力赚钱买课件!!!