# Đề tài: Bài tập C cơ bản - Kiểm tra việc nhập Credit Card number???

1. Thành viên mới
Ngày gia nhập
05 2009
Bài viết
14

## Bài tập C cơ bản - Kiểm tra việc nhập Credit Card number???

Credit cards numbers use check digits to guard against mistakes and to check for validity. In the section the credit cards MasterCard, VISA, American Express, and Discover will be considered. All of these cards use the same format for determining and verifying check digits.

Why have a check digit in a credit card number?:

* It can determine if a person keys in a number incorrectly
* If a credit card is scanned it can determine of the scanner made a mistake

When dealing with credit cards it is important to realize that some have different lengths and have different prefixs.

* MasterCard is of length 16 and has a prefix of 51, 52, 53, 54, 55
* VISA is of length 13 or 16 and has a prefix of 4
* American Express is of length 15 and has a prefix of 34 or 37
* Discover is of length 16 and has a prefix of 6011

All of the above credits use (mod 10) to determine a check digit, and in all cases the check digit is the right-most digit in the number. To determine the check digit for a credit card follow the below steps.

NOTE: In MasterCard and VISA include the prefix digits in the calculation. In American Express and Discover the prefix digits are omitted from all calculations.

NOTE: For the below example we consider a random possible MasterCard number 5368235896831135.

Step 1: Starting from the second digit from the right and moving towards the left, multiply every digit by 2.

3*2 = 6
1*2 = 2
8*2 = 16
9*2 = 18
5*2 = 10
2*2 = 4
6*2 = 12
5*2 = 10

Step 2: Sum the digits from Step 1.

6 + 2 + 1 + 6 + 1 + 8 + 1 + 0 + 4 + 1 + 2 + 1 + 0 = 33

Step 3: Sum all of the digits not originally mutliplied by 2.

3 + 8 + 3 + 8 + 6 + 3 + 1 = 32

Step 4: Sum together the results from Step 2 and Step 3.

33 + 32 = 55

Step 5: Subtract the sum from the next highest multiple of 10.

60 -55 = 5 [check digit]

A person can determine if the check digit of a given credit card is valid by repeating Steps 1, 2, 3, 4 above for all digits, including the check digit. The sum, s, obtained in Step 4 should be s = 0(mod 10). In our case 60 = 0 (mod 10).
Đề bài ở bên trên các bác ạ. Em đã thử code nhưng vẫn mắc lỗi, CT chỉ tính được total1 (Tổng các chữ số sau khi đã nhân 2) chứ total2 (Tổng các số chưa bị x2) nó không chịu gộp lại, chỉ tính đơn lẻ từng trường hợp. Bây giờ em muốn nó tính cả total1 lẫn total2 thì làm sao hả các bác.
Đoạn code em đã viết đây, em mới học 8 buổi thôi nên dốt lắm, viết đến đâu phải comment đến đó không là không hiểu được. Mong các bác giúp dùm. Em bí quá rồi 12h đêm mai là deadline. Chết mất.
C Code:
1. #include<stdio.h>
2. #include<conio.h>
3. #include<stdlib.h>
4. main()
5. {
6.       __int64 serial;
7.       int card_type, i=0, digit, digit2, sum=0, total2=0, sum1, sum2, multiplied, fraction, sumboth;
8.       printf("Please choose the kind of your Credit Card: ");
9.       printf("\n 1. Master Card");
10.       printf("\n 2. VISA");
11.       printf("\n 3. American Express");
12.       printf("\n 4. Discover\n");
13.       printf(" Your Choice: ");
14.       scanf("%d",&card_type);
15.       switch (card_type)
16.       {
17.             case 1:
18.             case 2: printf (" Please enter your Credit Card Serial Number: ");
19.                     scanf("%I64d",&serial);
20.                     while(serial>0)
21.                     {
22.                                    digit=serial%10;  /*digit  = fraction*/
23.                                    serial=serial/10; /*Serial = integer */
24.                                    /*test*/printf("\n Digit %d \n", digit);
25.                                    /*EDITED FROM HERE*/
26.                                    i=i+1;
27.
28.                                    while(i%2==0)/*condition: When i/2 and has no number behind the commas*/
29.                                    {multiplied=digit*2;/* x2 the choosed numbers*/
30.                                    /*test*/printf(" Multi %d", multiplied);
31.                                    fraction=multiplied%10;
32.                                    /*test*/printf(" fraction %d", fraction); /*because multiplied is an integer value
33.                                                                               so, only the value behind the commas
34.                                                                               is printed on screen*/
35.                                    multiplied=multiplied/10; /*Only the integer part is showed*/
36.                                    sum1=multiplied+fraction; /* integer + fractional*/
37.                                    printf("\n sum1 is %d\n", sum1);
38.                                    break;
39.                                    }
40.                                    sum=sum+sum1;
41.                                    printf(" Total 1 is %d\n", sum); /* The last sum of integer and fraction of choosed numbers*/
42.                                    }
43.
44.                     for(i=1;i%2!=0;i=i++)/*start from i=1, because if i=0, the most right number would be counted too*/
45.                     {
46.                                    digit2=serial%10;
47.                                    serial=serial/10;
48.                                    /*test*/printf("\n DIGIT 2 %d", digit2);
49.                                    sum=0;
50.                                    sum2=sum+digit2;
51.                                    printf("\n Sum 2 is %d\n", sum2);
52.                                    break;
53.                                    }
54.                                    total2=total2+sum2; /*the last sum of un-multiplied numbers*/
55.                                    printf("\n Total 2 is %d \n", total2);
56.
57.                     }
58.
59.                      getch();
60.                     }
@noob:nhớ thêm highlight cho code nữa nha bạn!!
Đã được chỉnh sửa lần cuối bởi lethanh : 17-05-2009 lúc 02:57 PM.

2. bạn nên nói rõ một tý về đề bài,nhiều người khả năng dịch không được tốt như mình chẳng hạn thì không hiểu cho lắm.
Nên mình mới chỉ đọc phần tính sum1 và sum2 của bạn thôi.bạn nên viết hàm tính sum1 và sum2 riêng rẽ ra để cho chuơng trình nhìn thoáng hơn.mà việc tính sum1 và 2 cũng khá đơn giản.bạn cho 1 biến đếm trong quá trình chia nhỏ serial ra.nếu là số chẵn thì cộng thêm vào s1,lẻ thì s2.
đây là hàm mình viết bạn thử xem có giúp được j kô
Code:
```void sum(int n){
int i=0,sum1=0,sum2=0;
while(n>0){
i++;
if(i%2) sum2+=n%10;
else sum1+=2*(n%10);
n/=10;
}
printf("%d %d",sum1,sum2);
}```

3. Thành viên mới
Ngày gia nhập
05 2009
Bài viết
14
C Code:
1. #include<stdio.h>
2. #include<conio.h>
3. #include<stdlib.h>
4. main()
5. {
6.       __int64 serial;
7.       int card_type, i=0, sochan, tongchan=0, tongle=0,mul,integer=0,fraction=0,sum1,multiple,substract;
8.       printf("Please choose the kind of your Credit Card: ");
9.       printf("\n 1. Master Card");
10.       printf("\n 2. VISA");
11.       printf("\n 3. American Express");
12.       printf("\n 4. Discover\n");
13.       printf(" Your Choice: ");
14.       scanf("%d",&card_type);
15.       switch (card_type)
16.       {
17.             case 1:
18.             case 2: {
19.                     printf (" Please enter your Credit Card Serial Number: ");
20.                     scanf("%I64d",&serial);
21.                     int comparenumber=serial%10;/*So dung de so sanh sau khi da ra tong cuoi cung*/
22.                     while(serial>0){
23.                                     int a=serial%10;
24.                                     serial=serial/10;
25.                                     i++;
26.                                     if(i%2==0){
27.                                                mul=a*2;
28.                                                fraction=fraction+mul%10;
29.                                                integer=integer+mul/10;
30.                                                tongchan=fraction+integer;
31.                                                }
32.                                     else if(i!=1&&i%2!=0){
33.                                                tongle=tongle+a;
34.                                                }
35.                                                }
36.                                     sum1=tongchan+tongle;
37.                                     printf("\n Tong cac so le va cac so chan la %d",sum1);
38.                                     int b=sum1/10;
39.                                     multiple=b*10+10;
40.                                     printf("\n Boi so gan nhat cua 10 la %d",multiple);
41.                                     /*phep kiem tra cuoi cung xac dinh xem so serial chinh xac hay khong*/
42.                                     substract=multiple-sum1;
43.                                     if (substract==comparenumber){
44.                                                                  printf("\n The Serial numbers are correct. ");}
45.                                     else {printf("\n The Serial numbers are incorrect. ");}
46.                                     break;
47.                                     }
48.
49.               case 3:
50.               case 4: printf (" Please enter your Credit Card Serial Number: ");
51.                       scanf("%I64d",&serial);
52.                       int comparenumber=serial%10;/*So dung de so sanh sau khi da ra tong cuoi cung*/
53.                       while(serial>0){
54.                                     int a=serial%10;
55.                                     serial=serial/10;
56.                                     i<=14;
57.                                     i++;
58.                                     if(i%2==0){
59.                                                mul=a*2;
60.                                                fraction=fraction+mul%10;
61.                                                integer=integer+mul/10;
62.                                                tongchan=fraction+integer;
63.                                                }
64.                                     else if(i!=1&&i%2!=0&&i<=14){
65.                                                tongle=tongle+a;
66.                                                }
67.                                                }
68.                                     sum1=tongchan+tongle;
69.                                     printf("\n Tong cac so le va cac so chan la %d",sum1);
70.                                     int b=sum1/10;
71.                                     multiple=b*10+10;
72.                                     printf("\n Boi so gan nhat cua 10 la %d",multiple);
73.                                     /*phep kiem tra cuoi cung xac dinh xem so serial chinh xac hay khong*/
74.                                     substract=multiple-sum1;
75.                                     if (substract==comparenumber){
76.                                                                  printf("\n The Serial numbers are correct. ");}
77.                                     else {printf("\n The Serial numbers are incorrect. ");
78.                                     }
79.                                     break;
80. [B][COLOR="Red"]default: printf("Invalid choice, please choose an available option:[/COLOR] ");[/B] [COLOR="SeaGreen"]/*Lỗi nằm ở đây các bác ạ, rõ ràng default nằm trong switch rồi*/[/COLOR]
81.                                     }
82.                                     getch();
83.                     }
Cả tối ngồi cũng thoáng đầu ra chút mình làm nó rối tung cả lên, làm lại thì ra. Nhưng lại mắc chỗ khác, mình muốn thêm đoạn default: printf("xxxxxx"); vào switch nhưng không hiểu sao không thêm được. Toàn báo lỗi thôi. Các bác xem hộ mình nên để default nằm ở đâu thì mới không lỗi.
Thanks.
Đã được chỉnh sửa lần cuối bởi lethanh : 17-05-2009 lúc 02:59 PM.

4. Thành viên mới
Ngày gia nhập
05 2009
Bài viết
14
Nguyên bản được gửi bởi minhgiang_hedspi
bạn nên nói rõ một tý về đề bài,nhiều người khả năng dịch không được tốt như mình chẳng hạn thì không hiểu cho lắm.
Nên mình mới chỉ đọc phần tính sum1 và sum2 của bạn thôi.bạn nên viết hàm tính sum1 và sum2 riêng rẽ ra để cho chuơng trình nhìn thoáng hơn.mà việc tính sum1 và 2 cũng khá đơn giản.bạn cho 1 biến đếm trong quá trình chia nhỏ serial ra.nếu là số chẵn thì cộng thêm vào s1,lẻ thì s2.
đây là hàm mình viết bạn thử xem có giúp được j kô
Code:
```void sum(int n){
int i=0,sum1=0,sum2=0;
while(n>0){
i++;
if(i%2) sum2+=n%10;
else sum1+=2*(n%10);
n/=10;
}
printf("%d %d",sum1,sum2);
}```
Mình tóm tắt ngắn gọn nha, chương trình yêu cầu nhập 1 dãy series của Credit Card (4 loại có nói rõ ở đề bài). Sau đó, nó sẽ tự động nhặt ra các số nằm thứ 2 từ phải sang trái, x2 các số đó. Sau đó cộng từng-chữ-số lại với nhau để ra sum1 (Có nghĩa là khi x2, nếu số nào =16 chẳng hạn, thì sẽ cộng là 1+6). Sau đó, tính nốt tổng các số chưa bị x2 (Tuy nhiên không tính số đầu tiên bên phải), gộp 2 tổng lại. Dựa vào tổng đó, tìm ra bội số gần nhất của 10 (Ví dụ tổng 65, bội là 70. Nếu tổng là 83, bội là 90). Lấy bội đó trừ đi tổng, ra kết quả, đem so sánh với số đầu tiên bên phải của dãy serial vừa nhập vào, nếu = nhau thì báo là số serial phù hợp. Sai thì báo sai. Tuy nhiên 2 loại thẻ cuối thì không được tính các số prefix vào quá trình tính toán (prefix là 2 số đứng đầu tiên bên trái).
Có vậy thôi các bác ạ
Đã được chỉnh sửa lần cuối bởi noob : 17-05-2009 lúc 11:40 AM.

5. Pa ơi default nằm ngoài case mà. Khi không có giá trị nào ứng với case thì nó chạy default. pa cho default nằm trong case 4 thì lỗi là phải roài.
Nhìn code không khoa học tí nào. {} đánh lung tung. Nhưng nhìn thấy cái break là đích thị default nằm trong case 4. Ekek

6. Thành viên mới
Ngày gia nhập
05 2009
Bài viết
6

## (:-)? Có ai thư so sánh các code trên với code mình cho ý kiến không (:-)?

Cho mình hỏi luôn hàm
Code:
`__int64 là hàm gì luôn.`
Thank các bạn trước nha!!
Code:
```#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
int sum=0,type_card,digit,type,check_sum;
unsigned long serial;
printf("Please choose the kind of your Credit Card: ");
printf("\n 1. Master Card");
printf("\n 2. VISA");
printf("\n 3. American Express");
printf("\n 4. Discover\n");
printf(" Your Choice: ");
scanf("%d",&type_card);
switch((type_card-1)/2)
{
case 0: type=1; break;
case 1: type=100; break;
default: exit(0);
}
printf (" Please enter your Credit Card Serial Number: ");
scanf("%ld",&serial);
check_sum=serial%10;
serial/=10;
while ( serial>=type) 	//kiem tra xem con so can lay khong
{
digit=serial%10;
sum+=digit+(digit*2)%10+(digit*2)/10;
serial=serial/100;		//nhay 2 so
}
if ( ((sum/10+((sum%10)!=0))*10-sum)==check_sum)
printf("\n The Serial numbers are correct. ");
else
printf("\n The Serial numbers are incorrect.");
getch();
}```

#### Quyền hạn của bạn

• Bạn không thể gửi đề tài mới
• Bạn không thể gửi bài trả lời
• Bạn không thể gửi các đính kèm
• Bạn không thể chỉnh sửa bài viết của bạn