1

嘿,我正在编写一个程序,将十进制数转换为任何基本单位,从二进制到十六进制(2、3、4、....、15、16)。到目前为止,这就是我所拥有的,运行 2 到 15 之间的任何数字都会导致无限循环。我想知道您是否对我的其余项目有任何建议。运行时,这将要求您输入两个整数,第一个应该是大于 0 的十进制整数,第二个应该是您希望将其转换为的基本类型。任何和所有完成此操作的建议将不胜感激!谢谢你。

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int x, y, z, c;

  printf("Please enter two integers: ");
  scanf("%d", &x);
  scanf("%d", &y);

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 | y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  }
  else if(y > 1 && y < 16){

       while(z != 0){
       z = (x/y);
       c = (x%y);
       printf("%d\n", z);
       }
    printf("%d\n", z);
    printf("%d\n", c);
  }
      else if(y == 16){
        printf("%X\n", x);
      }

}

** * ** * ** * ** * ** * ** * ** * *编辑* ** * ** * ** * ** * ** * ** * ** *

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int x, y, z, c, i;

  printf("Please enter two integers: ");
  scanf("%d", &x);
  scanf("%d", &y);

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 || y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  }
  else if(y > 1 && y < 17){

    while(x != 0){
       c = (x%y);
       x = (x/y);

       if( c > 1 && c < 10){
       printf("%d", c);

    }else if( c == 10){
        c = printf("A");
    }else if( c == 11){
        c = printf("B");
    }else if( c == 12){
        c = printf("C");
    }else if( c == 13){
        c = printf("D");
    }else if( c == 14){
        c = printf("E");
    }else if( c == 15){
        c = printf("F");
   }
  }
    printf("\n");
}

这是我迄今为止取得的进展。我的问题是:我无法让值 AF 正确输出以表示数字 10-15。我也无法以正确的方式显示整数。我认为这是一个简单的解决方法,但我还不习惯这个命令。谢谢大家的帮助,受益匪浅。

** * ** * ** *编辑 2** * ** * ** * ***

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int x, y, z, c; //Sets up variables to be used in program

  printf("Please enter two integers: "); //Asks for user input
  scanf("%d", &x);
  scanf("%d", &y); //stores input

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 || y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  } //bug checks

  else if(y > 1 && y < 17){

    while(x != 0){
       c = (x%y);
       x = (x/y); // Loops numbers until a 0 value is reached, can be used with
                  // any Base

     if( c == 10){
        c = printf("A");
    }else if( c == 11){
        c = printf("B");
    }else if( c == 12){
        c = printf("C");
    }else if( c == 13){
        c = printf("D");
    }else if( c == 14){
        c = printf("E");
    }else if( c == 15){
        c = printf("F");
    }else{
        printf("%d", c);
    }
     // Returns for each remainer option
    }
    printf("\n");
  }
}

好的第三次是魅力。我现在的代码唯一的问题是我无法弄清楚如何让它以相反的顺序输出,正确的顺序。忽略我的第二次编辑,我自己解决了。任何输入都会很棒。我真的不知道我将如何让它出现反转。感谢大家!

4

6 回答 6

3

这个很有趣。一些建议:

  • 使用描述性变量名称(基数、余数、数字、数字等)
  • 不要作弊,使用 %X 是错误的
  • 支持以 36 为底的十二进制 (sp?) 怎么样?
  • 为大于 9 的数字符号打印有用的符号(字母?)
  • 考虑终止条件,你没有改变 z (余数),因此你的循环
  • 您以相反的顺序打印出数字,从右到左而不是从左到右

此版本最多为 36 个基数,为大于 9 的数字符号打印字母,并打印相反的顺序和预期的顺序......

#include <stdio.h>
#include <stdlib.h>

char BASIFICATION[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int MAXBASE=36;
int main(void)
{
  int done=0;
  long num, base, remainder, digit;

  printf("Number Base Convertificator\n");
  printf("(enter 0 0 when done)\n");
  while( !done)
  {
    printf("Please enter two integers: ");
    scanf("%d", &num);
    scanf("%d", &base);
    if( (base<2) || (base>MAXBASE) ) //avoid precedence until you are comfortable/confident with it
    {
      printf("Please enter base between 2 and %d.\n",MAXBASE);
      if(base<=0) done=1;
      continue;
    }
    printf("%d\n", num);
    printf("%d\n", base);
    printf("\n");
    if(base == MAXBASE) //cheaters never win!
    {
      printf("%XX\n", num);
      continue;
    }
    //if(base > 1 && base < MAXBASE)
    {
      char reversed[99], ndx=0;
      //this prints your digits in reverse order
      remainder = num;
      while(remainder > 0) //numerical methods, avoid skipping below zero (irrelevant here, but good habit)
      {
         digit = (remainder%base);
         remainder = (remainder/base);
         printf("%c ", BASIFICATION[digit]);
         //printf("%c %d (%d)\n", BASIFICATION[digit], digit, remainder);
         reversed[ndx++] = BASIFICATION[digit];
      }
      printf("\n");
      //reverse digits to print in expected order
      for( ; ndx>0; ) { printf("%c ",reversed[--ndx]); }
      printf("\n");
    }
  }
}

而运行时,

Number Base Convertificator
(enter 0 0 when done)
Please enter two integers: 1020 2
1020
2

0 0 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 0 0 
Please enter two integers: 252 16
252
16

C F 
F C 
Please enter two integers: 99 
8
99
8

3 4 1 
1 4 3 

现在,您将如何修改它以将输入字符串转换为指定的基数?

于 2013-10-03T04:55:33.293 回答
1

由于x在此循环中未修改,z因此始终计算相同的值,并且循环永远不会退出:

   while(z != 0){
   z = (x/y);
   c = (x%y);
   printf("%d\n", z);
   }

要将数字转换为差异基数,您通常要做的是将数字反复除以基数,余数为您提供数字。这将从最后一个到第一个打印出数字:

   while(x != 0){
      c = (x%y); /* remainder of x when divided by y */
      x = (x/y); /* x divided by y */
      printf("%d\n", c);
   }
于 2013-10-02T22:52:14.607 回答
1

嗯介绍一个叫做dry run的老式调试过程

x  y  z c (z != 0) 
16 2  8 0  true
      8 0  true DOH!
于 2013-10-02T22:55:27.327 回答
0

这很奇怪,你返回 0,这意味着当出现错误时“一切正常”,否则你不会返回任何东西。另外,是的,你的意思是|| 不是| 你没有初始化你的 z 变量,如果它是 0,它永远不会进入循环,更糟糕的是,你永远不会对 z 产生新的值,所以如果它不是 0,它永远不会,你处于无限状态环形

于 2013-10-02T23:21:02.480 回答
0

该程序的目的是学习如何将数字转换为其他基数,而不仅仅是尝试它printf何时为您提供了捷径。为什么不试试:

if (y > 1 && y <= 16) {
     parsedNumber = convert(x, y);
} else {
     reportIllegalBase(y);
}

用适当的方法?

另外,不要将xandy用于变量名。您写这篇文章是为了理解,而不是为了玩 Code Golf。

您还应该尝试使其成为更通用的程序。不要在计算时打印所有内容,而是构造一个字符串 (a char[]) 并打印它。所以,convert我建议你写的函数应该声明为:

char[] convert(const int number, const int base) {...}

或者

void convert(int * const buffer, const int number, const int base) {...}

顺便说一句,如果x是负数会发生什么?我不确定你是否做对了。您可能希望x先从用户那里获取,然后再y从用户那里获取。这样,如果用户键入1而不是16

int getBase() {
    int base;
    while(true) {
        printf("Please type in the base: ");
        scanf("%d", &base);
        if (base > 1 && base <= 16) {
            return base;
        } else {
            printf("\nThe base must be between 2 and 16 inclusively.  You typed %d.\n",
                base);
        }
     }
}

顺便说一句,即使它不是标准的,也有理由使用更高的碱基。Nathaniel S. Borenstein (ISBN 0691037639) 的一本书我的书名为Programming as if People Mattered ,描述了大学在邮寄标签上打印出随机生成的 ID 的情况。不幸的是,有时 ID 看起来像2378gw48fUCk837he294ShiT4823,接收者认为学校在诅咒他们。

一个委员会召开会议,建议不应出现在这些 ID 中的单词。一位实习生想出了这个想法,让委员会变得不必要:只需使用基数 31 并省略元音。 也就是说,使用0123456789bcdfghjklmnpqrstvwxyz作为 base-31 数字。这减少了工作量,使大量编程变得不必要,并使人们失业。

于 2013-10-02T23:05:37.853 回答
0
#include <stdio.h>
void main(void) {
    char base_digits[16] =
        {'0', '1', '2', '3', '4', '5', '6', '7',
         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    char converted_number[32];
    long int number_to_convert;
    int base, index=0;

    printf("Enter number and desired base: ");
    scanf("%ld %i", &number_to_convert, &base);

    while (number_to_convert != 0)
    {
        converted_number[index] = base_digits[number_to_convert % base];
        number_to_convert = number_to_convert / base;
        ++index;
    }
    --index;
    printf("\n\nConverted Number = ");
    for(  ; index>=0; index--)
    {
        printf("%c", converted_number[index]);
    }
    printf("\n");
}
于 2016-04-22T13:11:57.887 回答