嘿,我正在编写一个程序,将十进制数转换为从二进制到十六进制的任何基本单位(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);
}
}
的 的 ** * ** * ** * 的** * ** * ** * ** * * 修改< / EM> * ** * ** * ** * ** * ** * ** * ** *
#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");
}
这是我迄今取得的进步。我的问题是:我无法正确输出值A-F来表示数字10-15。另外,我无法以正确的方式显示整数。我认为这是一个简单的修复方法,但是我还不习惯这个命令。谢谢大家的帮助,这非常有益。
的 的 ** * ** * ** * 的 编辑2 ** * ** * ** * < / EM> ***
#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");
}
}
好的第三次是魅力。我现在对我的代码唯一的问题是,我无法弄清楚如何以相反的顺序,正确的顺序输出它。忽略我的第二次编辑,我自己解决了。任何输入都会很棒。我真的不知道我怎么会让它逆转出来。谢谢大家!
答案 0 :(得分:3)
这很有趣。 一些建议:
此版本最多可达36位,打印数字符号字母&gt; 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
现在,您如何修改此项以将输入字符串转换为指定的基础?
答案 1 :(得分: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);
}
答案 2 :(得分:1)
介绍一种称为干运行的旧式调试过程
x y z c (z != 0)
16 2 8 0 true
8 0 true DOH!
答案 3 :(得分:0)
此计划的目的是学习如何将数字转换为其他基础,而不仅仅是在为您提供快捷方式时尝试printf
。为什么不尝试:
if (y > 1 && y <= 16) {
parsedNumber = convert(x, y);
} else {
reportIllegalBase(y);
}
用适当的方法?
另外,请勿将x
和y
用于变量名称。你是为了理解而写的,不是为了玩Code Golf。
您还应该尝试将其设为更通用的程序。不是在计算时打印所有内容,而是构造一个字符串(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)编写的一本名为编程,好像人们很重要的书描述了一种情况,即大学在邮寄标签上打印出随机生成的ID。不幸的是,有时ID看起来像 2378gw48fUCk837 或 he294ShiT4823 ,收件人认为学校正在诅咒他们。
一个委员会召开会议,建议不应出现在这些身份证中的词语。一名学生实习生提出了这个想法,使委员会不必要:只需使用基数31并省去元音。即使用 0123456789bcdfghjklmnpqrstvwxyz 作为基数为31的数字。这减少了工作量,不需要很多编程,让人们失业。
答案 4 :(得分:0)
这很奇怪,你返回0,这意味着当出现错误时“一切都很顺利”,否则你将不会返回任何内容。 再加,是的,你的意思是||不是| 你没有初始化你的z变量,它永远不会进入循环,如果它是0,更糟糕的是,你永远不会对z感兴趣的新值,所以如果它不是0,它永远不会是你,你是无限的环
答案 5 :(得分: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");
}