所以我最近开始学习Steven Kochan的“C语言编程”一书,我目前正在学习第8章 - “功能”。 运动8.16有问题: “修改程序8.14,以便用户可以转换任意数量的整数 当输入零作为值的值时终止程序的规定 要转换的号码。“
计划8.14的代码如下:
#include <stdio.h>
#include <stdlib.h>
int convertedNumber[64];
long int numberToConvert;
int base;
int digit = 0;
void getNumberAndBase(void)
{
printf("Number to be converted? ");
scanf("%li", &numberToConvert);
printf("Base? ");
scanf("%i", &base);
if ( base < 2 || base > 16)
{
printf("Bad base - must be between 2 and 16\n");
base = 10;
}
}
void convertNumber(void)
{
do
{
convertedNumber[digit] = numberToConvert % base;
digit++;
numberToConvert /= base;
}
while ( numberToConvert != 0);
}
void displayConvertedNumber (void)
{
const char baseDigits[16] =
{ '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
int nextDigit;
printf ("Converted number =");
for (--digit; digit >= 0; digit--)
{
nextDigit = convertedNumber[digit];
printf("%c", baseDigits[nextDigit]);
}
printf("\n");
}
int main (void)
{
void getNumberAndBase (void), convertNumber(void),
displayConvertedNumber (void);
getNumberAndBase();
convertNumber ();
displayConvertedNumber ();
return 0;
}
我的想法最初是在主要功能中围绕三个函数使用do-while循环,如下所示:
do
{
getNumberAndBase();
convertNumber ();
displayConvertedNumber ();
}
while ( numberToConvert != 0);
但显然它不起作用。这是本章的最后一次练习,我设法完成剩下的工作,但不是为了这个世界我可以弄清楚这里有什么问题。 可能我只是遗漏了一些明显的东西。
答案 0 :(得分:0)
测试do-while
条件时,它始终为零。方法convertNumber()
有自己的do-while
,一直持续到numberToConvert为零。
do
{
getNumberAndBase();
convertNumber (); // Sets numberToConvert to zero before returning
displayConvertedNumber ();
}
while ( numberToConvert != 0);
void convertNumber(void)
{
do {
...
} while ( numberToConvert != 0);
}
部分问题是成员变量用于传递方法的返回值。这些方法的副作用并不明显。
请考虑从方法中返回值。
long int numberToConvert = 0;
do
{
numberToConvert = getNumberAndBase();
long int convertedNumber = convertNumber( numberToConvert );
displayConvertedNumber ( convertedNumber );
}
while ( numberToConvert != 0);
现在本地变量numberToConvert不受convertNumber()方法的影响,您可以从本地上下文中确定循环行为。
答案 1 :(得分:0)
numberToConvert
已被convertNumber()
使用,所以我们不要打扰它。
放整个块
getNumberAndBase();
convertNumber (); // Sets numberToConvert to zero before returning
displayConvertedNumber ();
在while(1)
循环内,并检查numberToConvert
函数中的getNumberAndBase()
值。一旦获得0值,就会突破循环。
当然,您可以使用其他do...while
循环,但不知何故,您需要使用numberToConvert
扫描值来满足条件
“...当输入零作为要转换的数字的值时,为程序提供终止。”
那就是说,
scanf()
的返回值以确保成功。我们需要更高水平的封装。 :)
答案 2 :(得分:0)
这个练习很难,因为它需要使用全局变量 - 这种方法与正确使用函数有关。
无论如何,这是我的解决方案。请注意,每次转换数字时,必须将gDigit设置为0。
/* Exercise 7.16
Modify Program 7.15 so that the user can convert any number of integers.
Make provision for the program to terminate when a zero is typed in as
the value of the number to be converted.
notes: includes the modified version of Program 7.15 from Exercise 7.15
the statement gDigit = 0 has been moved from the start of the program to
the start of the convertNumber() function -- gDigit must be set to 0 each
time a number is to be converted
*/
#include <stdio.h>
int gConvertedNumber[64];
long int gNumberToConvert;
int gBase;
int gDigit;
void getNumber (void)
{
printf ("\nNumber to be converted (0 to exit)? ");
scanf ("%li", &gNumberToConvert);
}
void getBase (void)
{
do {
printf ("Base (between 2 and 16)? ");
scanf ("%i", &gBase);
}
while ( gBase < 2 || gBase > 16 );
}
void convertNumber (void)
{
gDigit = 0;
do {
gConvertedNumber[gDigit] = gNumberToConvert % gBase;
++gDigit;
gNumberToConvert /= gBase;
}
while ( gNumberToConvert != 0 );
}
void displayConvertedNumber (void)
{
const char baseDigits[16] =
{ '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
printf ("Converted number = ");
for ( --gDigit; gDigit >= 0; --gDigit )
printf ("%c", baseDigits[gConvertedNumber[gDigit]]);
printf ("\n");
}
int main (void)
{
void getNumber (void);
void getBase (void);
void convertNumber (void);
void displayConvertedNumber (void);
while (1) {
getNumber ();
if ( gNumberToConvert == 0 )
break;
getBase ();
convertNumber ();
displayConvertedNumber ();
}
return 0;
}