【问题标题】:Separating every second digit in an integer C++分隔整数 C++ 中的每个第二个数字
【发布时间】:2014-02-17 11:12:01
【问题描述】:

我目前正在完成一项我必须为我的 OOP 课程完成的作业,并且我特别在其中一个部分上苦苦挣扎。请记住,我仍然是初学者。问题如下:

如果字符串包含13个字符,所有字符都是数字并且校验位是模10,这个函数返回true;否则为假。

这是关于 EAN。我基本上必须将每隔一个数字与其余数字分开。例如 9780003194876 我需要用 7,0,0,1,4,7 进行计算。我不知道这样做。

任何帮助将不胜感激!

bool isValid(const char* str){
if (atoi(str) == 13){

}

return false;
}

【问题讨论】:

  • atoi() 将字节字符串转换为整数。将结果与 13 进行比较是检查 str 是否包含 "13"。如果您需要检查字符串的长度,也许您的意思是strlen
  • 顺便说一句,当您甚至找不到字符串的长度时,您的老师尝试教您(可能还有您的同学)OOP 是一个愚蠢的决定。只是说。
  • 可能是 OOP 入门课程中的第一个作业?尽管如此,对于准备开始学习 OOP 的人来说,这应该是一项非常简单的任务。
  • @H2CO3 哎哟。我知道这是一个严酷的现实。但我正在努力变得更好。
  • @user3075178 正如我所说,这不是你的错,而是学校的错。

标签: c++ string numbers boolean


【解决方案1】:

你可以从一个 for 循环开始,每次执行都会增加 2:

for (int i = 1, len = strlen(str); i < len; i += 2)
{
    int digit = str[i] - '0';

    // do something with digit
}

以上只是一个例子……

【讨论】:

    【解决方案2】:

    由于问题被标记为C++ (不是C,所以我建议其他回答者不要使用C库解决这个问题。让我们从一开始就以正确的方式获得OP的C++知识) ,并且是一个 OOP 类,我将使用 C++ 方式解决这个问题:使用std::string

    bool is_valid( const std::string& str )
    {
        if( str.size() == 13 )
        {
            for( std::size_t i = 0 ; i < 13 ; i += 2 )
            {
                int digit = str[i] - '0';
    
                //Do what you wan't with the digit
            }
        }
        else
            return false;
    }
    

    【讨论】:

      【解决方案3】:

      首先,如果是 EAN,您必须处理每个数字,而不仅仅是 每隔一个。事实上,你需要做的只是一个加权和 位数;对于 EAN-13,权重在 1 和 3、从三个开始。最简单的解决方案可能是 把它们放在一张桌子上(即int weigt[] = { 1, 3, 1, 3... };, 并遍历字符串(在这种情况下,使用索引而不是 比迭代器,因为你希望能够索引到 weight 也一样),将每个数字转换为数值 (str[i] - '0',如果isdigit(static_cast&lt;unsigned char&gt;(str[i]) 是真的;如果它是假的,那么你没有数字。),那么 乘以总和。完成后,如果 总数,模 10,为 0,这是正确的。否则,它不是。

      你当然不想使用atoi,因为你不想要 字符串的数值;你想处理每个数字 分开。

      为了记录,专业的,我会写这样的东西:

      bool
      isValidEAN13( std::string const& value )
      {
          return value.size() == 13
              && std::find_if(
                      value.begin(),
                      value.end(),
                      []( unsigned char ch ){ return !isdigit( ch ); } )
                  == value.end()
              && calculateEAN13( value ) == value.back() - '0';
      }
      

      calculateEAN13 在哪里进行实际计算(并且可以是 用于生成和检查)。我怀疑这 然而,这超出了任务的目标,而且所有 你的老师要找的是calculateEAN13函数, 最后一次检查(这就是为什么我没有全部提供)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-08
        • 2020-02-04
        • 2020-10-28
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        相关资源
        最近更新 更多