首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽量减少压缩到条形码程序中的重复代码

尽量减少压缩到条形码程序中的重复代码
EN

Stack Overflow用户
提问于 2015-07-08 21:44:06
回答 2查看 70关注 0票数 0

第一次在这里发帖,所以如果我做错了什么,让我know...new到整个编程的事情。

所以在我的课堂上,我们做的是从邮政编码到条形码转换程序。我的程序运行良好,现在我只是试图减少冗余或重复的编码。例如,通过我的函数运行邮政编码到条形码的实际编译,我有5个开关语句,它们都运行相同的情况。唯一的区别是交换机的条件(digitA,B,C,D,E;邮政编码的数字):

代码语言:javascript
复制
// Short Zip Code Converter Function
int zip_to_bar(int digitA, int  digitB, int digitC, int  digitD, int digitE)

{
    int sum;
    string bar_Code = "!", check_Code;
    switch(digitA)
    {
        case 0: bar_Code += "!!..."; break;
        case 1: bar_Code += "...!!"; break;
        case 2: bar_Code += "..!.!"; break;
        case 3: bar_Code += "..!!."; break;
        case 4: bar_Code += ".!..!"; break;
        case 5: bar_Code += ".!.!."; break;
        case 6: bar_Code += ".!!.."; break;
        case 7: bar_Code += "!...!"; break;
        case 8: bar_Code += "!..!."; break;
        case 9: bar_Code += "!.!.."; break;
    }
    switch(digitB)
    {
        case 0: bar_Code += "!!..."; break;
        case 1: bar_Code += "...!!"; break;
        case 2: bar_Code += "..!.!"; break;
        case 3: bar_Code += "..!!."; break;
        case 4: bar_Code += ".!..!"; break;
        case 5: bar_Code += ".!.!."; break;
        case 6: bar_Code += ".!!.."; break;
        case 7: bar_Code += "!...!"; break;
        case 8: bar_Code += "!..!."; break;
        case 9: bar_Code += "!.!.."; break;
    }
    switch(digitC)
    {
        case 0: bar_Code += "!!..."; break;
        case 1: bar_Code += "...!!"; break;
        case 2: bar_Code += "..!.!"; break;
        case 3: bar_Code += "..!!."; break;
        case 4: bar_Code += ".!..!"; break;
        case 5: bar_Code += ".!.!."; break;
        case 6: bar_Code += ".!!.."; break;
        case 7: bar_Code += "!...!"; break;
        case 8: bar_Code += "!..!."; break;
        case 9: bar_Code += "!.!.."; break;
    }
    switch(digitD)
    {
        case 0: bar_Code += "!!..."; break;
        case 1: bar_Code += "...!!"; break;
        case 2: bar_Code += "..!.!"; break;
        case 3: bar_Code += "..!!."; break;
        case 4: bar_Code += ".!..!"; break;
        case 5: bar_Code += ".!.!."; break;
        case 6: bar_Code += ".!!.."; break;
        case 7: bar_Code += "!...!"; break;
        case 8: bar_Code += "!..!."; break;
        case 9: bar_Code += "!.!.."; break;
    }
    switch(digitE)
    {
        case 0: bar_Code += "!!..."; break;
        case 1: bar_Code += "...!!"; break;
        case 2: bar_Code += "..!.!"; break;
        case 3: bar_Code += "..!!."; break;
        case 4: bar_Code += ".!..!"; break;
        case 5: bar_Code += ".!.!."; break;
        case 6: bar_Code += ".!!.."; break;
        case 7: bar_Code += "!...!"; break;
        case 8: bar_Code += "!..!."; break;
        case 9: bar_Code += "!.!.."; break;
    }
    // Sum of Zip_Digits
    sum = (digitA + digitB + digitC + digitD + digitE);
    // Calculation of check_Digit_Code
    check_Code = check_Digit_Code(sum);
    // Assignment of check_Bar_Code to check_Digit_Code
    cout << bar_Code + check_Code << endl;
    return sum;
}

我想在某种程度上将其最小化到只有一个开关语句,因为它们都是相同的,它会在一个循环中运行每一个数字。我之所以想这么做,是因为我们不得不使用短格式(#####)、标准(#)和高级(#+##)格式的邮政编码。因此,正如你可以想象的那样,这个程序正在变得非常长,而且是重复的。

我认为for语句循环可以很好地工作,但是我一直在考虑如何设置它的条件(当函数中有5个变量时,应该初始化什么?)。很明显,我所得到的不是我想要的,而是我到目前为止得到的(关于如何处理这个问题的任何建议)。

代码语言:javascript
复制
    // Reformatted Version of Short Zip Code Converter Function
    int zip_to_bar_srt(int digitA, int digitB, int digitC, int  digitD, int digitE)
{

    for(int digitA; digitA < 5; digitA++)
    {
        switch(digitA)
        {
            int sum;
            string barCode = "!", check_bar;

            case 0: barCode += "!!..."; break;
            case 1: barCode += "...!!"; break;
            case 2: barCode += "..!.!"; break;
            case 3: barCode += "..!!."; break;
            case 4: barCode += ".!..!"; break;
            case 5: barCode += ".!.!."; break;
            case 6: barCode += ".!!.."; break;
            case 7: barCode += "!...!"; break;
            case 8: barCode += "!..!."; break;
            case 9: barCode += "!.!.."; break;

                sum += digitA;
                check_bar = check(sum);
                cout<<barCode+check_bar<<endl;
                return sum;
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-08 21:50:50

创建一个函数,为您提供单数的条形码部分:

代码语言:javascript
复制
string get_barcode_part(int digit)
{
    switch(digitA)
    {
        case 0: return "!!...";;
        case 1: return "...!!";;
        case 2: return "..!.!";;
        case 3: return "..!!.";;
        case 4: return ".!..!";;
        case 5: return ".!.!.";;
        case 6: return ".!!..";;
        case 7: return "!...!";;
        case 8: return "!..!.";;
        case 9: return "!.!..";;
        default: return "Invalid"; // or whatever else you want
    }
}

然后,您可以简单地为每个数字调用它:

代码语言:javascript
复制
// Short Zip Code Converter Function
int zip_to_bar(int digitA, int  digitB, int digitC, int  digitD, int digitE)
{
    int sum;
    string bar_Code = "!", check_Code;

    bar_Code += get_barcode_part(digitA);
    bar_Code += get_barcode_part(digitB);
    bar_Code += get_barcode_part(digitC);
    bar_Code += get_barcode_part(digitD);
    bar_Code += get_barcode_part(digitE);

    // Sum of Zip_Digits
    sum = (digitA + digitB + digitC + digitD + digitE);
    // Calculation of check_Digit_Code
    check_Code = check_Digit_Code(sum);
    // Assignment of check_Bar_Code to check_Digit_Code
    cout << bar_Code + check_Code << endl;
    return sum;
}

这是函数(Heh)的基本功能:通过将通用功能放在一个共同的位置来重构和减少复制的代码。

编辑:,您可能应该为您的数字使用一个数组,如下所示:

代码语言:javascript
复制
// Short Zip Code Converter Function
int zip_to_bar(int *digits, int numDigits)
{
    int sum = 0;
    string bar_Code = "!", check_Code;

    for (int i = 0; i < numDigits; i++)
    {
        bar_Code += get_barcode_part(digits[i]);
        // Sum of Zip_Digits
        sum += digits[i];
    }

    // Calculation of check_Digit_Code
    check_Code = check_Digit_Code(sum);
    // Assignment of check_Bar_Code to check_Digit_Code
    cout << bar_Code + check_Code << endl;
    return sum;
}
票数 2
EN

Stack Overflow用户

发布于 2015-07-08 21:59:55

最简单的方法是用桌子

代码语言:javascript
复制
string bar_Codes[] = {"!!...",  "...!!", ...};

然后

代码语言:javascript
复制
bar_Code += bar_Codes[digitA];
bar_Code += bar_Codes[digitB];
bar_Code += bar_Codes[digitC];

效率较低,但同样容易的是设置一个函数:

代码语言:javascript
复制
void getBarCode(int digit, string & bar_Code)
{
    switch(digit)
    {
        case 0: bar_Code += "!!..."; break;
        case 1: bar_Code += "...!!"; break;
        case 2: bar_Code += "..!.!"; break;
        ....
    }
}

然后

代码语言:javascript
复制
getBarCode(digitA, bar_Code);
getBarCode(digitB, bar_Code);
getBarCode(digitC, bar_Code);
...

您所需要做的就是确保数字在允许的范围内。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31304362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档