信用卡支票验证c ++

时间:2016-03-14 10:21:56

标签: c++

问题 - 在C ++中

信用卡号码检查,信用卡号码的最后一位是校验位,可防止转录错误,例如单个数字错误或切换两位数字。以下方法用于验证实际的信用卡号,但为简单起见,我们将对8位数而不是16位的数字进行描述:

•从最右边的数字开始,形成每个其他数字的总和。例如,如果信用卡号是43589795,那么您形成总和:5 + 7 + 8 + 3 = 23.

•将上一步中未包含的每个数字加倍。添加结果数字的所有数字。例如,使用上面给出的数字,从倒数第二个开始,将数字加倍,得到:18 18 10 8.在这些值中添加所有数字得到:1 + 8 + 1 + 8 + 1 + 0 + 8 = 27。

•添加前两个步骤的总和。如果结果的最后一位为0,则该数字有效。在我们的例子中,23 + 27 = 50,所以这个数字是有效的。

编写一个实现此算法的程序,并打印该数字是否有效。

这就是我目前所拥有的

#include <iostream>
#include <cmath>
#include <cstring>

using namespace std;

int main()
{
    int sum_even = 0;
    string oddnum;
    string oddnum_temp;
    cout << "Enter an 8 digit card credit card number: " << endl;
    string number;
    cin >> number;

int length  =  number.length();

if (length != 8)
{
    cout <<"Invalid credit card number: " <<endl;
}


for (int i = 1; i <= 8; i++)
{
    if (i%2 == 0)
    {
        sum_even = number.substr(i, 1); 
    }
    else
    {
        for (int j = 1; i <= 8; i++)
        {
            if (j%2 == 1)
            {
                oddnum =  number.substr(j, 1);
            }
        }
    }
}

for (int i = 1; i <= 8; i++)
{
    oddnum_temp =  oddnum.substr(i, 8);

}

cout << oddnum_temp << endl;

我的做法是对的吗?我如何向前推进,因为我收到了Core Dumped错误

4 个答案:

答案 0 :(得分:1)

索尔,
   在担心校验位之前,您需要通过调试器运行代码。您缺少一些基本概念,这是我注意到的事情。

   在表面上你的j var永远不会增加。 (对for循环,变量范围和递增进行一些研究)

您正试图在不使用oddnum长度的情况下遍历字符串oddnum,并移动经过字符串所拥有的内存。 (做一些关于字符串操作的研究)

c ++中的字符串和所有其他数组都是基于零的,从1开始计算并始终缺少字符串中的第一个元素。 (阵列访问研究)

您需要记住您将数字存储在字符串中。这意味着您必须获取字符串中的每个元素并将字符的值转换为数字(在c ++中有关于铸造的研究)。

 您可能需要更多的东西来清理。但是,您可以通过调试器中的一些断点来最好地捕获错误。

答案 1 :(得分:1)

尝试使用此代码它将与您想要的完全相同

//Credit card no validation
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<conio.h>                        //for getche()
using namespace std;
int main()
{
    int no1=0,od=0,to=0,fi=0;
    int j=(-1),ev=0,odd=0;
    int i=1;
    int max=15;
    int x[max];
    char ch='a';
    string cardno;
    cout<<"Enter the 8 digit card no";
          do
            {
              ch=getche();
              x[i] = ch-48;                //-48 because of ASCII valuse
              ++i;
              ++j;
            }while(ch != '\r');

            if(j!=8)
            {
                cout<<"\nCredit card is INVALID";
                exit(0);
            }

      cout<<endl;
      for(int j=1;j<5;j++)
      ev+=x[2*j];
        for(int j=0;j<4;j++)
      {
          od=2*x[(2*j)+1];
          no1=od%10+od/10;
          odd+=no1;
      }
   cout<<"Total no of DIGITS in CARD is:"<<j<<endl;
   cout<<"Sum of odd digit is "<<ev<<endl;
   cout<<"Sum of even digit is "<<odd<<endl;
   to=ev+odd;
   fi=to%10;
   if(fi==0)
   {
     cout<<"CREDIT CARD IS VALID";
   }
   if(fi!=0)
   {
     cout<<"Credit card is INVALID";
   }

   return 0;

它应该是有帮助的我猜

答案 2 :(得分:0)

在循环中,您将从1到8进行迭代(包括8个)。所以,当你的代码到达时

if (i%2 == 0)
{
    sum_even = number.substr(i, 1); 
}

它将尝试从字符串边界

中创建一个子字符串

答案 3 :(得分:0)

试试这会有所帮助

但该程序是用java语言编写的,所以要理解解决这个问题的方法并在解决方案中使用它

import java.util.Scanner;

public class Creditcard {

    public static void main(String[] args) {
        int sum = 0;
        int sum1 = 0;
        System.out.println("Enter 8 digit credit card number :");
        Scanner kb = new Scanner(System.in);
        String string = kb.nextLine();
        for (int i = 0; i < 8; i++) {

            if (i % 2 != 0) {
                char ch = (string.charAt(i));
                int no = ch - 48;
                sum = sum + no;
            }

            if (i % 2 == 0) {
                char ch1 = (string.charAt(i));
                int no1 = ch1 - 48;
                no1 = (2 * no1);
                while (no1 != 0) {
                    int temp1 = no1 % 10;
                    no1 = no1 / 10;
                    sum1 = sum1 + temp1;
                }

            }

        }
        int result = sum + sum1;
        if (result % 10 == 0) {
            System.out.println("valid");
        } else {
            System.out.println("Invalid");
        }

    }
}