Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/75: Рейтинг темы: голосов - 75, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 14.05.2017
Сообщений: 25

Проверка номера кредитной карты

17.09.2017, 11:09. Показов 14631. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всего неделю изучаю язык, не особо понимаю что и как в нём, надеюсь на вашу помощь.

Мы имеем 3 карты:
American Express(состоит из 15 цифр и код начинается с 34 или 37),
MasterCard(состоит из 16 цифр и код начинается с 51, 52, 53, 54, или 55),
Visa(состоит из 13 или 16 цифр и код начинается с 4).
INVALID, если карта не начинается с определённых цифр.
Нам надо проверить является эта карта законной и какое у неё наименование. Если не законная

Для примера возьмём карту: 378282246310005.
1) Чтобы проверить является ли карта свободной умножаем каждое второе число на 2:
7 • 2 + 2 • 2 + 2 • 2 + 4 • 2 + 3 • 2 + 0 • 2 + 0 • 2
2) Получаем: 14 + 4 + 4 + 8 + 6 + 0 + 0.
3) Все полученные цифры складываем: 1 + 4 + 4 + 4 + 8 + 6 + 0 + 0 = 27.
4)Теперь добавим эту сумму (27) к сумме цифр, которые не были умножены на 2:
27 + 3 + 8 + 8 + 2 + 6 + 1 + 0 + 5 = 60.
5) Последняя цифра в этой сумме (60) равна 0, поэтому карта является законной.

Я понимаю чисто на словах что нужно проверить, а вот с написанием большие проблемы.
1) Проверяем является ли введённая строка целым числом. Если нет- сразу выводим INVALID.
2) Проверяем на нужное количество цифр в коде. 15- American Express, 16- MasterCard, Visa- 13 или 16. Если нет- выводим INVALID.
3) Проверяем с каких чисел начинается код. American Express- 34 или 37, MasterCard- 51, 52, 53, 54, или 55, Visa- 4. Если с других цифр- выводим INVALID.
4) Проверяем является ли карта законной(пример вычисления есть выше). Если не законная, то выводим INVALID.
5) Если манипуляции выше прошли, то выводим нужную карту и то, что она законна.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.09.2017, 11:09
Ответы с готовыми решениями:

Функция, которая для переданного в параметре номера карты определит следующий
Помогите написать функцию, у меня ни малейшего понятие как это реализовать. Суть задания: Написать функцию GenerateNextCreditCardNumber,...

Безопасная передача данных кредитной карты на сервер
Как безопасно передавать данные кредитки на сервер? Что для этого нужно? Какие есть стандарты? Какие ошибки и уязвимости могут возникнуть?...

Не работает проверка кредитной карты
Добрый день. Я пишу код на javascript который проверяет сколько чисел кредитной карты ввел пользователь. Кредитная карта состоит...

6
112 / 99 / 80
Регистрация: 30.12.2015
Сообщений: 230
17.09.2017, 12:50
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
 
class Program
{
    static void Main(string[] args)
    {
 
        Console.Write("Введите номер карты: ");
 
        Console.WriteLine(Check(Console.ReadLine()));
        Console.ReadKey();
 
    }
    public static string Check(string str)
    {
        int sum = 0;
        string card;
        if (!Int64.TryParse(str, out long result))
            return "INVALID";
        if ((str.StartsWith("34") || str.StartsWith("37")) && (str.Length == 15))
            card = "American Express";
        else if ((str.StartsWith("51")) || (str.StartsWith("52")) ||
           (str.StartsWith("53")) || (str.StartsWith("54")) ||
           (str.StartsWith("55")) && (str.Length == 16))
            card = "MasterCard";
        else if ((str.StartsWith("4")) && ((str.Length == 13) || (str.Length == 16)))
            card = "Visa";
        else
            return "INVALID";
        int temp;
        for (int i = 0; i < str.Length; i ++)
        {
            if (i % 2 == 0)
            {
                sum += int.Parse(str[i].ToString());
            }
            else
            {
                temp = 2 * int.Parse(str[i].ToString());
                if (temp > 9)
                    sum += temp - 9;
                else
                    sum += temp;
            }
        }
 
        if (sum % 10 != 0)
            return "INVALID";
        return $"Карта {card} #{str} законна";
    }
}
1
 Аватар для LazySlacker
93 / 77 / 31
Регистрация: 29.08.2017
Сообщений: 188
17.09.2017, 13:09
C#
1
2
3
4
5
6
7
8
9
10
using System;
using System.Linq;
 
class Program
{
    public static void Main()
    {
        Console.WriteLine("378282246310005".Select((ch, i) => (ch - '0') * (i % 2 + 1)).Sum(x => x > 9 ? x % 10 + 1 : x));
    }
}
1
17.09.2017, 18:06

Не по теме:

LazySlacker, и каким образом Ваш код полностью или, хотя бы, на половину решает поставленную выше задачу?

1
 Аватар для LazySlacker
93 / 77 / 31
Регистрация: 29.08.2017
Сообщений: 188
17.09.2017, 19:21
Цитата Сообщение от SkyBy Посмотреть сообщение
LazySlacker, и каким образом Ваш код полностью или, хотя бы, на половину решает поставленную выше задачу?
По-моему, он решает ее на 90%. Но если уж Вам все разжевать и в рот положить, то вот, пожалуйста, смотрите и (ужас|наслажд)айтесь:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
class Program
{
    private static Dictionary<string, Regex> cards = new Dictionary<string, Regex>()
    {
        ["American Express"] = new Regex(@"\A3[47][0-9]{13}\z"),
        ["MasterCard"] = new Regex(@"\A5[1-5][0-9]{14}\z"),
        ["Visa"] = new Regex(@"\A4[0-9]{12}(?:[0-9]{3})?\z")
    };
 
    public static void Main()
    {
        while (true)
        {
            Console.Write("Input card number: ");
            string card = Console.ReadLine();
            if (card == null) break;
            string answer = cards.SingleOrDefault(kv => kv.Value.IsMatch(card)).Key;
            if (answer == null || card.Select((ch, i) => (ch - '0') * (i % 2 + 1)).Sum(x => x > 9 ? x % 10 + 1 : x) % 10 != 0) answer = "INVALID";
            Console.WriteLine(answer);
        }
    }
}
3
1 / 1 / 0
Регистрация: 14.05.2017
Сообщений: 25
17.09.2017, 20:32  [ТС]
Спасибо. Очень краткое решение. Не думала, что так коротко написать можно.

Добавлено через 3 минуты
Не подскажете как работает эта строка?
Цитата Сообщение от Dekap Посмотреть сообщение
if (!Int64.TryParse(str, out long result))
1
112 / 99 / 80
Регистрация: 30.12.2015
Сообщений: 230
17.09.2017, 21:09
Преобразует строковое представление числа в эквивалентное ему 64-битовое целое число со знаком. Возвращает значение, указывающее, успешно ли выполнено преобразование.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.09.2017, 21:09
Помогаю со студенческими работами здесь

Как настроить чтение кредитной карты на фронталке
Всем привет. Нашел массу библиотек на чтение кредиток, например, ('cards.pay:paycardsrecognizer:1.0.0'). Но они все считывают карту по...

Алгоритм Луна (Проверка корректности номера банковской карты)
Не могу найти никак программу на с++ в которую я бы вводила номер карты и происходила проверка по алгоритму луна

Алгоритм Луна (Проверка корректности номера банковской карты)
Не могу найти никак программу на с++ в которую я бы вводила номер карты и происходила проверка по алгоритму луна

Проверить правильность номера социальной карты
Напишите программу, которая предложит пользователю ввести номер социальной карты в формате ddd-dd-dddd, где d-это цифра.. Вводные данные...

Проверка карты
Здраствуйте. ПОмогите мне создать такого типо http://freelife.az/checkcard.aspx . После того как юзер написал номер карты чтобы из базы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru