Проверка на буквы в ведённых данных с помощью умножения на 0. Как вариант для *.
А вот перевод строки в число неявно, когда она попадает в массив иногда даёт ошибку в этом коде. Пробел попадает в массив и преобразуется в логический "0".
Есть же STRFILTER. Им можно оставить только цифры. Ошибку выводить не будет при опечатке, просто пропустит букву. Но зато можно вводить код для наглядности с разделением на разряды
4561 2612 1234 5467
или через TAB
4561 2612 1234 5467
А так я ввёл с пробелами и выдало неправильный результат - 2
Ошибку тоже не показало
[spoiler]9:30:54 последний символ *
9:30:54 анализируемая карта 4561 2612 1234 54670
9:30:54 0 n = 4
9:30:54 1 n = 5
9:30:54 2 n = 6
9:30:54 3 n = 1
9:30:54 4 n =
9:30:54 5 n = 2
9:30:54 6 n = 6
9:30:54 7 n = 1
9:30:54 8 n = 2
9:30:54 9 n =
9:30:54 10 n = 1
9:30:54 11 n = 2
9:30:54 12 n = 3
9:30:54 13 n = 4
9:30:54 14 n =
9:30:54 15 n = 5
9:30:54 16 n = 4
9:30:54 17 n = 6
9:30:54 18 n = 7
9:30:54 19 n = 0
9:30:54 0-4
9:30:54 8
9:30:54 2-6
9:30:54 3
9:30:54 4-
9:30:54 *2
9:30:54 6-6
9:30:54 3
9:30:54 8-2
9:30:54 4
9:30:54 10-1
9:30:54 2
9:30:54 12-3
9:30:54 6
9:30:54 14-
9:30:54 *2
9:30:54 16-4
9:30:54 8
9:30:54 18-7
9:30:54 5
9:30:54 Поиск контрольного числа для 4561 2612 1234 5467*
9:30:54 сумма без последнего числа, sum1= 38
9:30:54 верное контрольное число 2
9:30:54 Исправленный номер 4561 2612 1234 54672 скопирован в буффер обмена.
9:31:00 Введенный номер карты: 4561 2612 1234 54670
9:31:00 20 символов в номере
9:31:00 0 odd, флаг для нечетно
[/spoiler]
А в целом хорошо. Вариант со звёздочкой удобней и наглядней, чем мой простой переключатель.