【问题标题】:C++ Binary Bar Code AssignmentC++ 二进制条码赋值
【发布时间】:2016-04-18 20:12:41
【问题描述】:

我正在学习计算机科学入门课程,并使用 C++。

我们的任务是创建不同的“条形码扫描仪” - 二进制、代码 39 和代码 48。这是二进制部分的代码,其中条形码由交替的黑白条纹组成,其中每个条纹要么宽,要么狭窄的。宽条被解释为 1,窄条被解释为 0。

作业的指导方针是:

  • 读取一个数字 b 表示代码中的条数(奇数 1 ≤ b ≤ 21 )
  • 读取 b 个字符,一次一个
  • 每个字符都是 w 表示宽或 n 表示窄
  • 宽条为 1,窄条为 0
  • 将条码转换为等效数字并显示数字

我觉得我的代码没问题,但它不会返回超过 6 位数的任何内容。如果我输入 b 为 7 到 21 之间的任何值,它仍然要求输入那么多整数,但只打印其中的 6 个。

感谢您的帮助!

#include <iostream>

using namespace std;

int main(){
int b; //number of bars
int i = 0; //loop variables
int k = 0;
int l = 0;

cout << "Number of bars in code (between 1 and 21): " ;
cin >> b;
char arraychars[b]; //barcode as w's and n's
int arrayint[b]; //whole barcode as ints
while (b <= 21 && b >= 1) //b is in range
{
    for (i=0; i<b; i++)
    {
        cout << "Enter character (w for wide, n for narrow): " << endl;
        cin >> arraychars[i];
    }
    for (k=0; k<b; k++)
    {
        if (arraychars[k] == 'w')
            arrayint[k] = 1;
        else if (arraychars[k] == 'n')
            arrayint[k] = 0;
        else
            break;
    }
    for (l=0; l<b; l++) //prints
        cout << arrayint[l] ;
        break; //exits loop
}
return 0;
}

【问题讨论】:

  • 我不知道它是如何打印出多于 一个 数字的,因为在输出任何数字之后你要做的下一件事是 break; 退出循环。
  • 这与您遇到的问题无关(除非巧合),但您的第二个循环使用 i 作为其上限。碰巧在第一个循环之后i 等于b,但你真的应该使用b。此外,当你肯定想要一个独占的上限(k&lt;i,或者更确切地说是k&lt;b)时,你有一个包容的上限(k&lt;=i):你明白为什么吗?
  • 您的输出将是二进制的。这实际上是您被要求做的,还是应该将二进制 0 和 1 视为整数的位并以十进制输出该整数?
  • 它应该是二进制的,如 010101。break; 是一个错误,包含范围也是如此。我会改变它。感谢您指出:)

标签: c++ barcode


【解决方案1】:

main() 的前两行应该已经引发了大量警告。关键是 C++ 中的数组是静态大小的,在这里,您创建一个数组,其大小由之前未初始化的 b 的值确定。天知道编译器对此做了什么。将其替换为 std::vectorstd::string

【讨论】:

    【解决方案2】:

    你必须在"int b;"之后声明你的数组;

    int b; //number of bars
    int i = 0; //loop variables
    int k = 0;
    int l = 0;
    cout << "Number of bars in code (between 1 and 21): " ;
    cin >> b;
    
    char *arraychars = new char[b]; //barcode as w's and n's
    int *arrayint = new int[b]; //whole barcode as ints
    
    while (b <= 21 && b >= 1) //b is in range
    {
        for (i=0; i<b; i++)
        {
            cout << "Enter character (w for wide, n for narrow): " << endl;
            cin >> arraychars[i];
        }
        for (k=0; k<b; k++)
        {
            if (arraychars[k] == 'w')
                arrayint[k] = 1;
            else if (arraychars[k] == 'n')
                arrayint[k] = 0;
            else
                break;
        }
        for (l=0; l<b; l++) //prints
            cout << arrayint[l] ;
            break; //exits loop
    }
    return 0;
    }
    

    否则你的变量 b 取值不清楚。

    你无法知道数组的大小

    【讨论】:

    • char arraychars[b]; 不是标准的。该操作应使用std::vectorstd::unique_ptr&lt;&gt;
    • @NathanOliver 使用 VLA 的一个原因 -- 查看这个问题以表明使用 VLA 的 hides bugs that could be detected by vector
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多