简体   繁体   中英

Is there a better way to write this code rather than using all these if loops?

The goal of this program is to be able to translate intergers in the range 0 to 9999 into an English description of the number.

While my program is able to accomplish this. I want to make without all these if loops or at least minimize them. Any tips/help is greatly apprecitaed.

#include <iostream>

using namespace std;

int main()
{
    
    int numberEntered, digitOne, digitTwo, digitThree, digitFour;


    string lessThan20[] = { "zero" , "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", 
                            "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"};
    string tens[] = {"twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety"};
    string hundred = "hundred";
    string thousand = "thousand";

    cout << "Enter A Number: " << endl;
    cin >> numberEntered;

    if (numberEntered <= 20) {
        
        cout << " You entered " << lessThan20[numberEntered] << endl;

    }

    if (numberEntered > 20 && numberEntered <= 99) {
    
    
        digitOne = numberEntered / 10;
        digitTwo = numberEntered -= digitOne * 10;

        if (digitTwo == 0) {
            
            cout << "You entered " << tens[digitOne - 2] << endl;
            
        }
        else {
        
            cout << "You entered " << tens[digitOne - 2] << " " << lessThan20[digitTwo] << endl;
        }

    }


    if (numberEntered > 99 && numberEntered <= 999) {
    
    
        digitOne = numberEntered / 100;
        numberEntered = numberEntered - (digitOne * 100);

        digitTwo = numberEntered / 10;

        digitThree = numberEntered % 10;

        if (digitTwo == 0 && digitThree > 0) {
        
            cout << "You entered " << lessThan20[digitOne] << " hundred " << lessThan20[digitThree];

        }

        if (digitThree == 0 && digitTwo > 0) {
            
            cout << "You entered " << lessThan20[digitOne] << " hundred " << tens[digitTwo] << endl;

        
        }

        if (digitTwo == 0 && digitThree == 0) {
        
            cout << "You entered " << lessThan20[digitOne] << " " << hundred << endl;
            
        }
        
        if (digitOne > 1 && digitTwo > 1 && digitThree > 1) {
        
            cout << "You entered " << lessThan20[digitOne] << " " << hundred << " " << tens[digitTwo - 2] << " " << lessThan20[digitThree] << endl;
     

        }
        
        
    }


    if (numberEntered > 999 && numberEntered <= 9999) {
    
        digitOne = numberEntered / 1000;
        numberEntered = numberEntered - (1000 * digitOne);

        digitTwo = numberEntered / 100;
        numberEntered = numberEntered - (100 * digitTwo);

        digitThree = numberEntered / 10;

        digitFour = numberEntered % 10;

        if (digitOne > 0 && digitTwo > 0 && digitThree > 0 && digitFour >> 0) {
        
        
            cout << "You entered " << lessThan20[digitOne] << " " << thousand << " " << lessThan20[digitTwo] << " " << hundred << " " << tens[digitThree - 2] << " " << lessThan20[digitFour] << endl;
       
        }


        if ( digitTwo == 0 && digitThree > 0 && digitFour > 0) {
        
            cout << "You entered " << lessThan20[digitOne] << " " << thousand << " " << tens[digitThree - 2] << " " << lessThan20[digitFour] << endl;


        }

        if (digitTwo == 0 && digitThree == 0 && digitFour > 0) {

            cout << "You entered " << lessThan20[digitOne] << " " << thousand << " " << lessThan20[digitFour] << endl;


        }

        if (digitTwo == 0 && digitThree == 0 && digitFour == 0) {

            cout << "You entered " << lessThan20[digitOne] << " " << thousand << endl;


        }
    }

}

You cannot avoid the if s, because you must make some decisions.

You could hide a lot of things in a std::map or std__unordered_map .

However, you could optimize the code by using a kind of recursion, where you reuse your own function for parts of the original number.

Something like the below.

But there are millions of potential solutions. Here is one of them:

#include <iostream>
#include <string>
#include <string_view>
#include <array>

constexpr std::array<std::string_view,10> t0_9{ "","one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
constexpr std::array<std::string_view,10> t10_19{ "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen","sixteen", "seventeen", "eighteen", "nineteen" };
constexpr std::array<std::string_view,10> T20_90{ "", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };

std::string convert(unsigned long number) {
    if (number < 10) {
        return std::string(t0_9[number]);
    }
    else if (number < 20) {
        return std::string(t10_19[number - 10]);
    }
    else if (number < 100) {
        return std::string(T20_90[number / 10]) + ((number % 10 != 0) ? " " + convert(number % 10) : "");
    }
    else if (number < 1000) {
        return convert(number / 100) + " hundred" + ((number % 100 != 0) ? " " + convert(number % 100) : "");
    }
    else if (number < 1000000) {
        return convert(number / 1000) + " thousand" + ((number % 1000 != 0) ? " " + convert(number % 1000) : "");
    }
    else if (number < 1000000000) {
        return convert(number / 1000000) + " million" + ((number % 1000000 != 0) ? " " + convert(number % 1000000) : "");
    }
    else if (number < 1000000000000) {
        return convert(number / 1000000000) + " billion" + ((number % 1000000000 != 0) ? " " + convert(number % 1000000000) : "");
    }
    return "error";
}
int main() {
    std::cout << '\n' << convert(12345) << '\n';
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM