【发布时间】:2016-10-26 12:52:39
【问题描述】:
我正在编写一个程序,将 0 到 3999 之间的整数转换为等效的罗马数字。
目前,我实际执行转换的主要功能工作正常。它取一个数字,用罗马数字变量组成罗马数字数组,直到用户输入的整数变为0:
int main(int argc, const char * argv[])
{
int num;
char roman[10];
int I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000;
printf("Please input a number from 1 to 3999:\n");
scanf("%d", &num);
do {
for (int j = 0; j < 10; j++) {
if (num >= M) {
num -= M;
roman[j] = 'M';
}
else if (num >= D) {
num -= D;
roman[j] = 'D';
}
else if (num >= C) {
num -= C;
roman[j] = 'C';
}
else if (num >= L) {
num -= L;
roman[j] = 'L';
}
else if (num >= X) {
num -= X;
roman[j] = 'X';
}
else if (num >= V) {
num -= V;
roman[j] = 'V';
}
else if (num >= I) {
num -= I;
roman[j] = 'I';
}
}
} while (num != 0);
// check(roman, 'X');
printf("\nYour number in roman numerals is %s\n", roman);
}
注释行是我编写的一个单独的函数(称为check())。理想情况下,这个新函数应该检查任何重复 4 次的字母,如果有则返回 true,否则返回 false。它看起来像这样:
int check(char * numeralArray, char numeral)
{
int counter = 0;
int size = strlen(numeralArray);
for (int i = 0; i < size; i++) {
if(numeralArray[i] == numeral) // check for each iteration if numeral is in numeralArray[i]
counter++; // if it is then counter increases by 1
else
counter = 0; // this resets the value to 0 if its not consecutive.
if(counter == 4) // this stops the loop when 4 consecutive letters have been found.
break;
}
if(counter >= 4) // if counter is 4, it means 4 consecutive letters have been found
return 1; // true
else
return 0; // false
}
所以我的想法是,例如,我将使用该函数并将roman 和I 作为参数传递给check()。然后它会检查I 是否连续出现 4 次。如果是,则该函数返回 true(由 1 表示)。在我的 main 函数中,如果从 check() 返回的值为 1(真),那么我想将这四个连续值(例如 IIII)更改为适当的值(例如 IV)。
问题是,它不能正常工作,check() 函数总是返回 0(假),即使我输入像 14 这样的数字,而不是 XIIII,它应该是 XIV .所以我不知道如何让我的函数在这种情况下返回 true,然后我必须做什么才能对数组进行所需的更改?另外,在我的 main 函数中,我是否一定需要在 do-while 循环中使用 for 循环?或者我可以摆脱 for 循环并在每次 do-while 循环运行时通过数组递增(例如j++)?
【问题讨论】:
-
我想建议有更好的方法来组织转换,而不是生成 4 个字母然后重新映射这些字母。然而,你想要做的应该是可行的,即使不是很方便。请注意,VIIII 应该映射到 IX,但 IIII 应该映射到 IV。也就是说,找到四边形是不够的。您还必须检查它前面的字母(如果有的话;XXIIII 需要映射到 XIV;XXXXIIII 需要映射到 XLIV,等等)。
-
检查功能确实有效,您传递的参数可能存在问题(注意大写与小写)。此外,您已经可以在转换函数中实现该功能
-
@JonathanLeffler 我同意必须有一个更简单的方法,如果你考虑到你对之前的信件所说的话,我的方法效率很低。我发现真正困难的一件事是,一旦确定了四个字母,我将如何在数组中更改它们?我对数组或指针不是很流利,所以这就是我不得不问的地方。
-
我使用了一个包含数字和字符串的数据结构。例如,前两个条目是
1000, "M"和900, "CM"。我用它来指导格式化。扫描——从罗马转换为十进制——需要更多信息,但使用相同的核心数据。 -
我想我知道你说的替换字母是什么意思。我编写了使用类似概念的程序的第二个版本,它没有这个效率那么高,但它有点工作。如果您想看,请告诉我,我会在问题中发布。
标签: c arrays return-value roman-numerals