文号
t77737
阅读
9897
回复
9
收藏
4
关于C语言写数制转换的问题
2015/11/10
IP:福建
以下是程序的代码。
用.c编译一直出错,总是报一些“{”,“(”符号之类乱七八糟的错误,但是用.cpp编译连接就没问题了。请问这是为什么呢?
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define STACK_INIT_SIZE 100    //存储空间初始分配量
#define STACKINCREMENT 10    //存储空间分配增量
#define OK 1  
#define ERROR -1  
#define OVERFLOW -1
#define TURE 1
#define FALSE 0
typedef int SElemType;

typedef int Status;
typedef struct{  
   SElemType *base;
     //在栈构造之前和销毁之后, base的值为NULL
   SElemType *top;                   //栈顶指针
   int stacksize;     //当前已分配的存储空间,以元素为单位
}SqStack;

Status InitStack(SqStack &S)    {// 构造一个空栈S
        S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType));
   if (!S.base)  exit (OVERFLOW);  //存储分配失败
        S.top =S.base;
        S.stacksize =STACK_INIT_SIZE;
   return OK;
}//InitStack

Status Pop (SqStack &S,SElemType &e )
{    //若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
      if(S.top ==S.base)   return ERROR;
           e=*--S.top;
      return OK;
}// Pop
Status Push(SqStack &S,SElemType e) // 插入元素e为新的栈顶元素
{                    
if(S.top -S.base >= S.stacksize)
  {               // 当前存储空间已满,增加分配
      S.base = (SElemType *)realloc(S.base,                                                                
         (S.stacksize+STACKINCREMENT)*sizeof(SElemType));
    if (! S.base ) exit(OVERFLOW); // 存储分配失败
    S.top =S.base+S.stacksize;
    S.stacksize+= STACKINCREMENT; //增加存储容量
   }
  *S.top++=e;
  return OK;
}//  Push

Status StackEmpty(SqStack &S)  
{  
    if (S.base==S.top)  
        return TURE;  
    else  
        return FALSE;  
}  

void conversion()
{
    //对于输入的任意一个非负十进制整数打印输出与其等值的八进制数  构造空栈
    SElemType e,N;
SqStack S;
        InitStack(S);    
        printf("输入8进制整数\n");
        scanf ("%d",&N);
    while (N) {
      Push(S, N % 8);
      N = N/8;
    }
    while (!StackEmpty(S)) {
      Pop(S,e);
      printf( "%d", e );
    }
}
void main()
{ // conversion
  //ElemType e;  
    //Stack S;  
    //InitStack(S);  
    //printf("输入有关元素:\n");  
    //scanf("%d",&e);  
    //Push(S,e);  
    //Pop(S,e);  
    //printf("%d",e);  
    conversion();
        getch();
}
11年1个月前IP:福建
796495
1楼
用VC6.0写的。这是编写成功后的截图 QQ图片20151110170109.jpg
引用
评论
11年1个月前IP:福建
796501
2楼
这个程序写了2天,其实不用栈也可以写出的,也更省事,但是写的代码一点也不短,你们能以最短的代码写出,不一定用什么先进的算法?就是把10进制转换为8进制,程序的printf(“输入8进制整数”)是错误的,应该是10进制……
引用
评论
11年1个月前IP:陕西
796504
3楼
我记得传引用的参数(就是参数前面的&)是C++才有的,C语言只能传指针。(没看过后来的C语言标准,不知新标准里有没有。但VC6肯定不支持)
引用
评论
11年1个月前IP:福建
796506
4楼
引用 金星凌日:
我记得传引用的参数(就是参数前面的&)是C++才有的,C语言只能传指针。(没看过后来的C语言标准,不知新标准里有没有。但VC6肯定不支持)
你说的是不是scanf(“%d",&e);?如果是这个,那么C语言是支持的,
引用
评论
11年1个月前IP:陕西
796508
5楼
引用 季节逝去:
你说的是不是scanf(“%d",&e);?如果是这个,那么C语言是支持的,
是这个:
Status Pop (SqStack &S,SElemType &e )
引用
评论
11年1个月前IP:四川
796509
6楼
是Status InitStack(SqStack &S)
此处应改为SqStack *pS,并把S.base/S.top/S.stacksize改为pS->base/pS->top/pS->stacksize,传参时应该传&s(变量s的地址)。
引用
评论
11年1个月前IP:浙江
796574
7楼
正如3楼的童鞋所说。C不支持引用作为参数传递(最新的标准可能支持了,这方面不清楚),而C++支持于是就不报错了,在C中请使用指针传递。
引用
评论
11年1个月前IP:四川
796585
8楼
引用 phpskycn:
正如3楼的童鞋所说。C不支持引用作为参数传递(最新的标准可能支持了,这方面不清楚),而C++支持于是就不报错了,在C中请使用指针传递。
C应该永远不会支持引用传参,因为没必要→_→引用传参是C++特色,主要可以实现特殊语法特征(如运算符重载)。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的