2012-03-27 69 views
1

我修改了一下代码,并具有下面的内容。即输出的数量是现在更现实,但它仍然是不正确的(例如,输入54个#导致36输出时,它应该拿出44)C中的八进制到十进制

#include <stdio.h> 
#include <math.h> 

main() 
{ 
    printf("Please enter an octal number ending with # \n"); 
    int nextNum = getchar(); 
    int number[100]; 
    int numberOfSlots = 0; //Records how many digits are entered 
    int power = 0; //Sets power of 8 during conversion 
    int decimalNumber = 0; 
    int i=0; 

    while(nextNum != '#') //reads in the whole number, putting the characters together to form one Octal number. 
     { 
      if(nextNum >='0' && nextNum <='9') 
       nextNum = (nextNum - '0'); 
      else{printf("Oops! That's not a valid number!");} 

      number['i'] = (nextNum); 
      //numberOfSlots++; 
      i++; 
      nextNum = getchar(); 
printf("%d\n", number['i']); 

    } 


    //Begin converson from Octal to Decimal 

    for(i; i > 0; i--) 
    { 
     decimalNumber = decimalNumber + (number['i'] * pow(8,power)); 
     power++; 
    } 

    printf("%d", decimalNumber); 

} 

回答

2

由于这是家庭作业,我会给出提示,而不是一个答案:

getchar()返回一个字符,而不是一个号码的功能。字符具有基于系统字符编码的值(请参见ASCII)。

看看这实际上是分配给数和从你得到实际的数值应该是什么什么换算的数值。

+0

我曾试图解决使用char nextNum =(的getchar() - '0');但它似乎仍然是关闭的。 – CoolerScouter 2012-03-27 18:55:43

+0

@ user1247751。不。然后你对'#'的检查进行折腾 – 2012-03-27 18:56:28

+0

@ user1247751 - 在你解决了Pavan评论的含义后,请阅读我的答案。 – Attila 2012-03-27 18:58:29

0
printf("%d", number[numberOfSlots]);

您正在访问一个尚未初始化索引(计数器numberOfSlots已预先递增。)

无论移动增量的printf后或通过numberOfSlots-1printf

访问该元素由于numberOfSlots上的最后一个增量指向number中的最后一个有效元素,因此上面的代码在转换循环中也会出现问题。如同Eric J.所说的,getchar()返回字符的整数代码,而不是字符代表的数字(通常是ASCII值,但是它取决于平台)。

1

埃里克已经指出了原因。下面是你需要做的

int nextNum= getchar(); 
if (nextNum >='0' && nextNum <='9') 
    nextNum = nextNum -'0'; 

number[numberOfSlots] = nextNum; 

,脱下在申报时的初始getchar()并使其循环

0
decimalNumber = (decimalNumber + (number[numberOfSlots] * (pow(8, power)))); 

您使用pow()功能找麻烦内通用的。对于大整数,浮点值将不再保存整数值,并且会有错误。在这种情况下,你绝对不应该混合使用浮点数学。您应该使用整数变量。

0
#include <stdio.h> 

main(){ 
    printf("Please enter an octal number ending with # \n"); 
    int number[21]; 
    int numberOfSlots = 0; 
    int decimalNumber = 0; 
    int nextNum, i; 

    for(nextNum=getchar();nextNum != '#'; nextNum=getchar()){ 
     number[numberOfSlots++] = nextNum - '0'; 
    } 

    for(i=0; i< numberOfSlots ; ++i){ 
     decimalNumber = decimalNumber * 8 + number[i]; 
    } 

    printf("%d", decimalNumber); 

} 
/* 
17777777777# 
2147483647 
*/ 
#if 0 
#include <stdio.h> 

int main(){ 
    int n, ch; 
    printf("Please enter an octal number ending with # \n"); 

    for(n=0 ; '#' != (ch = getchar());){ 
     n = n * 8 + ch - '0'; 
    } 

    printf("%d", n); 
    return 0; 
} 
#endif 
0

固定

#include <stdio.h> 
#include <math.h> 

main() 
{ 
    printf("Please enter an octal number ending with # \n"); 
    int nextNum = getchar(); 
    int number[100]; 
    int numberOfSlots = 0; //Records how many digits are entered 
    int power = 0; //Sets power of 8 during conversion 
    int decimalNumber = 0; 
    int i=0; 

    while(nextNum != '#') //reads in the whole number, putting the characters together to form one Octal number. 
     { 
      if(nextNum >='0' && nextNum <='9'){ 
       nextNum = (nextNum - '0'); 
       number[numberOfSlots] = nextNum; 
       numberOfSlots++; 

      } else{ 
       printf("Oops! That's not a valid number!"); 
      } 

      nextNum = getchar(); 

    } 


    //Begin converson from Octal to Decimal 

    for(i=numberOfSlots-1; i >= 0; i--) 
    { 
     decimalNumber = decimalNumber + (number[i] * pow(8,power)); 
     power++; 
    } 

    printf("%d", decimalNumber); 

} 
相关问题