Lapā tiek izmantotas sīkdatnes 

Norēķinu kartes


Problēmas apraksts

Norēķinu kartes mūsdienās plaši lieto bezskaidras naudas norēķiniem, lai apmaksātu pirkumus. Uz kartes vienmēr ir uzdrukāts tās unikālais numurs, kurš glabājas datu bāzē. Karšu numuri ir pietiekoši gari un tiem ir savas likumsakarības... American Express kartēm ir 15 cipari, MasterCard kartēm ir 16 cipari, bet Visa kartēm ir 13 vai 16 ciparus gari karšu numuri.

Sākuma cipari norāda kartes piederību noteiktai grupai. Ja numurs sākas ar 34 vai 37, tā ir American Express karte. Ja sākuma cipari ir 51, 52, 53, 54 vai 55, tad tā ir MasterCard karte. Savukārt, ja numurs sākas ar 4, tad tā ir Visa karte.

Papildus aizsardzībai lieto tā saukto "čeksummu" jeb matemātisku sakarību starp visiem kartes cipariem. To sauc par Lūna algoritmu. Tas palīdz izslēgt kļūdas iespēju, sastādot kartes numuru.

Lūna algoritms


Hanss Pīters Lūns no kompānijas IBM sastādīja algoritmu, ko karšu numuru validācijai lieto vēl šobaltdien.

Algoritms darbojas sekojoši:

1) Ņemam katru otro ciparu sākot no iepriekšpēdējā (virzienā pa kreisi) un sareizinām to ar 2

4003600000000014

Izskatās tas sekojoši:

1•2 + 0•2 + 0•2 + 0•2 + 0•2 + 6•2 + 0•2 + 4•2

2) Iegūstam virkni:

2 + 0 + 0 + 0 + 0 + 12 + 0 + 8

3) Saskaitām visus virknes skaitļu ciparus kopā

2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13

4) Saskaita visus pārējos ciparus, kas netika saskaitīti 1. solī

4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 7

5) Sasummē rezultātus kopā

13 + 7 = 20

Ja gala summa beidzas ar 0, kartes numurs ir derīgs

Piemēru var apskatīt šeit

Nosacījumi


Izveido mapi kartes, kurā izveido failu numuri.py. Sastādi tajā algoritmu, kas saņem ievadītu kartes numuru, pārbauda tā garumu, sākuma ciparus un pārbauda "čeksummu" pēc Lūna algoritma. Ja karte ir derīga, izvada VISA, MasterCard vai AMEX, citādi izvada INVALID.

class Card:
    # konstruktors, kas iestata sākotnējās īpašības, rakstāms šeit ...
    # īpašības: valid, card_type, card_number, owner

    # iestata True, ja čeksumma ir derīga, citādi iestata False
    def Luhn_checks_my_card(self):
        ...
        self.valid = ""

    # iestata kartes nosaukumu, ja čeksumma ir derīga, citādi iestata "INVALID"
    def check_card_type(self):
        ...
        self.card_type = ""

    # metode kartes datu izvadam, ja izmanto print()
    def __repr__(self):
        # izdrukā kartes_numurs un kartes_tips vienā rindā

my_visa_card = Card("400360000000001")
my_visa_card.Luhn_checks_my_card()
my_visa_card.check_card_type()
print(my_visa_card.card_type)

Kad algoritms darbojas, testu failā test_cards.py sastādi 2 testa funkcijas ar 5 testa gadījumiem katrā.

Pārbaudi savu bankas karti un tās numuru!

Izmanto testpiemērus!

Testpiemēri


Ievaddati Izvaddati
4003600000000014 VISA
6176292929 INVALID
371449635398431 AMEX
5555555555554444 MasterCard
4111111111111111 VISA