将 while 循环转换为嵌套的 if-else 循环

标签 c

我正在尝试学习如何将 while 循环转换为 C 中的 if else 循环。我采用了这个示例并使用 while 循环对其进行编码,其中当用户输入数字时,程序会为其返回罗马数字。这是我的程序:我需要有人帮我转换为 if-else 语句。本质上,我想看看是否可以仅使用 if-else(嵌套)循环来编写这个程序,而无需单个 while 循环。

#include <stdio.h>

void predigit(char num1, char num2);
void postdigit(char c, int n);

char romanval[1000];
int i = 0;
int main()
{
    int j;
    long number;

    printf("Enter the number: ");
    scanf("%d", &number);
    if (number <= 0)
    {
        printf("Invalid number");
        return 0;
    }
    while (number != 0)
    {
        if (number >= 1000)
        {
            postdigit('M', number / 1000);
            number = number - (number / 1000) * 1000;
        }
        else if (number >= 500)
        {
            if (number < (500 + 4 * 100))
            {
                postdigit('D', number / 500);
                number = number - (number / 500) * 500;
            }
            else
            {
                predigit('C','M');
                number = number - (1000-100);
            }
        }
        else if (number >= 100)
        {
            if (number < (100 + 3 * 100)) 
            {
                postdigit('C', number / 100);
                number = number - (number / 100) * 100;
            }
            else
            {
                predigit('L', 'D');
                number = number - (500 - 100);
            }
        }
        else if (number >= 50 )
        {
            if (number < (50 + 4 * 10))
            {
                postdigit('L', number / 50);
                number = number - (number / 50) * 50;
            }
            else
            {
                predigit('X','C');
                number = number - (100-10);
            }
        }
        else if (number >= 10)
        {
            if (number < (10 + 3 * 10))
            {
                postdigit('X', number / 10);
                number = number - (number / 10) * 10;
            }
            else
            {
                predigit('X','L');
                number = number - (50 - 10);
            }
        }
        else if (number >= 5)
        {
            if (number < (5 + 4 * 1))
            {
                postdigit('V', number / 5);
                number = number - (number / 5) * 5;
            }
            else
            {
                predigit('I', 'X');
                number = number - (10 - 1);
            }
        }
        else if (number >= 1)
        {
            if (number < 4)
            {
                postdigit('I', number / 1);
                number = number - (number / 1) * 1;
            }
            else
            {
                predigit('I', 'V');
                number = number - (5 - 1);
            }
        }
    }
    printf("Roman number is: ");
    for(j = 0; j < i; j++)
        printf("%c", romanval[j]);
    return 0;
}

void predigit(char num1, char num2)
{
    romanval[i++] = num1;
    romanval[i++] = num2;
}

void postdigit(char c, int n)
{
    int j;
    for (j = 0; j < n; j++)
        romanval[i++] = c;
}

最佳答案

如果您想避免 while 循环您的程序,您可以尝试使用递归。

#include <stdio.h>

void predigit(char num1, char num2);
void postdigit(char c, int n);

char romanval[1000];
int i = 0;

void printRomanLetter() {
int j;
 printf("Roman number is: ");
    for(j = 0; j < i; j++)
        printf("%c", romanval[j]);
}
void computeRomanLetter(long number) {

    if(number < 1) return;  //Base return condition

    if (number >= 1000)
        {
            postdigit('M', number / 1000);
            number = number - (number / 1000) * 1000;
        }
        else if (number >= 500)
        {
            if (number < (500 + 4 * 100))
            {
                postdigit('D', number / 500);
                number = number - (number / 500) * 500;
            }
            else
            {
                predigit('C','M');
                number = number - (1000-100);
            }
        }
        else if (number >= 100)
        {
            if (number < (100 + 3 * 100)) 
            {
                postdigit('C', number / 100);
                number = number - (number / 100) * 100;
            }
            else
            {
                predigit('L', 'D');
                number = number - (500 - 100);
            }
        }
        else if (number >= 50 )
        {
            if (number < (50 + 4 * 10))
            {
                postdigit('L', number / 50);
                number = number - (number / 50) * 50;
            }
            else
            {
                predigit('X','C');
                number = number - (100-10);
            }
        }
        else if (number >= 10)
        {
            if (number < (10 + 3 * 10))
            {
                postdigit('X', number / 10);
                number = number - (number / 10) * 10;
            }
            else
            {
                predigit('X','L');
                number = number - (50 - 10);
            }
        }
        else if (number >= 5)
        {
            if (number < (5 + 4 * 1))
            {
                postdigit('V', number / 5);
                number = number - (number / 5) * 5;
            }
            else
            {
                predigit('I', 'X');
                number = number - (10 - 1);
            }
        }
        else if (number >= 1)
        {
            if (number < 4)
            {
                postdigit('I', number / 1);
                number = number - (number / 1) * 1;
            }
            else
            {
                predigit('I', 'V');
                number = number - (5 - 1);
            }
        }
computeRomanLetter(number);
}
int main()
{
    long number;
    printf("Enter the number: ");
    scanf("%ld", &number);
    computeRomanLetter(number);
    printRomanLetter();
    return 0;
}

void predigit(char num1, char num2)
{
    romanval[i++] = num1;
    romanval[i++] = num2;
}

void postdigit(char c, int n)
{
    int j;
    for (j = 0; j < n; j++)
        romanval[i++] = c;
}

关于将 while 循环转换为嵌套的 if-else 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42965816/

相关文章:

c - C中用SIGUSR信号同步父子,让父子依次读取

c - 如何找到用户输入的字符串中的第一个重复字符?

c - 使用数组关闭 'for' 循环时遇到问题

c - 多重定义collect2 : error: ld returned 1 exit status in C

c - 是否需要 %c fprintf 说明符来获取 int 参数

c - 在我的客户端服务器代码中,我可以使用通过 ifconfig 获得的 IP 地址远程登录到服务器?

c++ - 用C++编译器编译C99文件

python - 可以用PyCharm Professional替代CLion-主要用于python

c - 使用 C 中的 fgets 将文本文件解析为多个变量

c++ - 基于条件然后三元运算符获取值的更快方法?