Program specification
----------------------
American Express uses 15 digit numbers,
MasterCard uses 16 digit numbers,
and Visa uses 13 and 16 digits numbers.
American Express numbers all start with 34 or 37
MasterCard numbers all start with 51, 52, 53, 54, or 55
and Visa numbers all start with 4.
But credit card numbers also have a “checksum” built into them, a
mathematical relationship between at least one number and others.
The formula:
i) Multiply every other digit by 2, starting with the number’s
second to last digit, and then add those products’ digits together.
ii) Add the sum to the sum of the digits that weren’t multiplied by 2.
iii) If the total’s last digit is 0 (or, put more formally, if the total
modulo 10 is congruent to 0), the number is valid.
In credit.c, write a program that prompts the user for a credit card number
and then reports (via printf) whether it is a valid American Express, MasterCard,
or Visa card number, per the definitions of each’s format herein.
So that we can automate some tests of your code, we ask that your program’s last
line of output be AMEX\n or MASTERCARD\n or VISA\n or INVALID\n, nothing more,
nothing less. For simplicity, you may assume that the user’s input will be entirely
numeric (i.e., devoid of hyphens, as might be printed on an actual card).
But do not assume that the user’s input will fit in an int! Best to use GetLongLong
from CS50’s library to get users’ input. (Why?)
Of course, to use GetLongLong, you’ll need to tell gcc about CS50’s library. Be sure
to put
#include <cs50.h>
toward the top of credit.c.
And be sure to compile your code with a command like the below.
gcc -o credit credit.c -lcs50
Consider the below representative of how your own program should behave when passed a
valid credit card number (sans hyphens); highlighted in bold is some user’s input.
user@appliance (~): ./credit
Number: 378282246310005
AMEX
Of course, GetLongLong itself will reject hyphens (and more)
anyway:
user@appliance (~): ./credit
Number: 3782-822-463-10005
Retry: foo
Retry: 378282246310005
AMEX
But it’s up to you to catch inputs that are not credit card numbers
(e.g., my phone number), even if numeric:
user@appliance (~): ./credit
Number: 6175230925
INVALID
UHJvZ3JhbSBzcGVjaWZpY2F0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkFtZXJpY2FuIEV4cHJlc3MgdXNlcyAxNSBkaWdpdCBudW1iZXJzLAkKTWFzdGVyQ2FyZCB1c2VzIDE2IGRpZ2l0IG51bWJlcnMsCQphbmQgVmlzYSB1c2VzIDEzIGFuZCAxNiBkaWdpdHMgbnVtYmVycy4KCkFtZXJpY2FuIEV4cHJlc3MgbnVtYmVycyBhbGwgc3RhcnQgd2l0aAkzNCBvciAzNwpNYXN0ZXJDYXJkIG51bWJlcnMgYWxsIHN0YXJ0IHdpdGggNTEsIDUyLCA1MywgNTQsIG9yIDU1CmFuZCBWaXNhIG51bWJlcnMgYWxsIHN0YXJ0IHdpdGgJNC4KCkJ1dCBjcmVkaXQgY2FyZAludW1iZXJzCWFsc28gaGF2ZSBhIOKAnGNoZWNrc3Vt4oCdIGJ1aWx0IGludG8gdGhlbSwgYQkKbWF0aGVtYXRpY2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGF0IGxlYXN0IG9uZSBudW1iZXIgYW5kIG90aGVycy4KClRoZSBmb3JtdWxhOgoKaSkgICAgIE11bHRpcGx5IGV2ZXJ5IG90aGVyIGRpZ2l0IGJ5IDIsIHN0YXJ0aW5nIHdpdGggdGhlIG51bWJlcuKAmXMJCiAgICAgICBzZWNvbmQgdG8gbGFzdCBkaWdpdCwgYW5kIHRoZW4gYWRkIHRob3NlIHByb2R1Y3Rz4oCZIGRpZ2l0cyB0b2dldGhlci4JCiAgCmlpKSAgICBBZGQgdGhlIHN1bSB0byB0aGUgc3VtIG9mIHRoZSBkaWdpdHMgdGhhdCB3ZXJlbuKAmXQgbXVsdGlwbGllZCBieSAyLgkKICAKaWlpKSAgIElmIHRoZSB0b3RhbOKAmXMgbGFzdCBkaWdpdCBpcyAwIChvciwgcHV0IG1vcmUgZm9ybWFsbHksIGlmIHRoZSB0b3RhbAkKICAgICAgIG1vZHVsbyAxMCBpcyBjb25ncnVlbnQgdG8gMCksIHRoZSBudW1iZXIgaXMgdmFsaWQuCgoKSW4gY3JlZGl0LmMsIHdyaXRlIGEgcHJvZ3JhbSB0aGF0IHByb21wdHMgdGhlIHVzZXIgZm9yIGEgY3JlZGl0IGNhcmQgbnVtYmVyCQphbmQgdGhlbiByZXBvcnRzICh2aWEgcHJpbnRmKSB3aGV0aGVyIGl0IGlzIGEgdmFsaWQgQW1lcmljYW4gRXhwcmVzcywgTWFzdGVyQ2FyZCwJCm9yIFZpc2EgY2FyZCBudW1iZXIsIHBlciB0aGUgZGVmaW5pdGlvbnMgb2YgZWFjaOKAmXMgZm9ybWF0IGhlcmVpbi4JClNvIHRoYXQgd2UgY2FuIGF1dG9tYXRlIHNvbWUgdGVzdHMgb2YgeW91ciBjb2RlLCB3ZSBhc2sgdGhhdCB5b3VyIHByb2dyYW3igJlzIGxhc3QJCmxpbmUgb2Ygb3V0cHV0IGJlIEFNRVhcbiBvciBNQVNURVJDQVJEXG4gb3IgVklTQVxuIG9yIElOVkFMSURcbiwgbm90aGluZyBtb3JlLAkKbm90aGluZyBsZXNzLiBGb3Igc2ltcGxpY2l0eSwgeW91IG1heSBhc3N1bWUgdGhhdCB0aGUgdXNlcuKAmXMgaW5wdXQgd2lsbCBiZSBlbnRpcmVseQkKbnVtZXJpYyAoaS5lLiwgZGV2b2lkIG9mIGh5cGhlbnMsIGFzIG1pZ2h0IGJlIHByaW50ZWQgb24gYW4gYWN0dWFsIGNhcmQpLiAKQnV0IGRvIG5vdCBhc3N1bWUgdGhhdCB0aGUgdXNlcuKAmXMgaW5wdXQgd2lsbCBmaXQgaW4gYW4gaW50ISBCZXN0IHRvIHVzZQlHZXRMb25nTG9uZwkKZnJvbSBDUzUw4oCZcyBsaWJyYXJ5IHRvIGdldCB1c2Vyc+KAmSBpbnB1dC4gKFdoeT8pCQogIApPZiBjb3Vyc2UsIHRvIHVzZSBHZXRMb25nTG9uZywgeW914oCZbGwgbmVlZCB0byB0ZWxsIGdjYyBhYm91dCBDUzUw4oCZcyBsaWJyYXJ5LiBCZSBzdXJlCQp0byBwdXQgCgojaW5jbHVkZSA8Y3M1MC5oPiAKCnRvd2FyZCB0aGUgdG9wIG9mIGNyZWRpdC5jLgkKQW5kIGJlIHN1cmUgdG8gY29tcGlsZSB5b3VyIGNvZGUgd2l0aCBhIGNvbW1hbmQgbGlrZSB0aGUgYmVsb3cuCQogIApnY2MgLW8gY3JlZGl0IGNyZWRpdC5jIC1sY3M1MAoKQ29uc2lkZXIgdGhlIGJlbG93IHJlcHJlc2VudGF0aXZlIG9mIGhvdyB5b3VyIG93biBwcm9ncmFtIHNob3VsZCBiZWhhdmUgd2hlbiBwYXNzZWQgYQp2YWxpZCBjcmVkaXQgY2FyZCBudW1iZXIgKHNhbnMgaHlwaGVucyk7IGhpZ2hsaWdodGVkIGluIGJvbGQgaXMgc29tZSB1c2Vy4oCZcyBpbnB1dC4JCiAgCnVzZXJAYXBwbGlhbmNlICh+KTogLi9jcmVkaXQKTnVtYmVyOiAzNzgyODIyNDYzMTAwMDUKQU1FWAoKCk9mIGNvdXJzZSwgR2V0TG9uZ0xvbmcgaXRzZWxmIHdpbGwgcmVqZWN0IGh5cGhlbnMgKGFuZCBtb3JlKQkKYW55d2F5OgkKICAKdXNlckBhcHBsaWFuY2UgKH4pOiAuL2NyZWRpdApOdW1iZXI6IDM3ODItODIyLTQ2My0xMDAwNQpSZXRyeTogZm9vClJldHJ5OiAzNzgyODIyNDYzMTAwMDUKQU1FWAkKICAKCkJ1dCBpdOKAmXMgdXAgdG8geW91IHRvIGNhdGNoIGlucHV0cyB0aGF0IGFyZSBub3QJY3JlZGl0IGNhcmQgbnVtYmVycwkKKGUuZy4sIG15IHBob25lIG51bWJlciksIGV2ZW4gaWYgbnVtZXJpYzoJCiAgCnVzZXJAYXBwbGlhbmNlICh+KTogLi9jcmVkaXQKTnVtYmVyOiA2MTc1MjMwOTI1CklOVkFMSUQK