IPC

Universidad de San Carlos

Segundo semestre 2021


Semana 0 Scratch

Semana 1 C

Semana 2 Arrays

Semana 3 Algoritmos

Semana 4 Memoria

Semana 6 Python

Proyecto Final


Programa de estudios

Horas de oficina

Conjuntos de problemas

Preguntas Frecuentes


Text editor

GitHub

Manual

Scrath

Guías de estilo

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/63fd8be9-afbf-4e82-8e87-5fc4a2b5deca/Untitled.png

Credit Card


Objetivos


Objetivo General

Relacionar al estudiante con los conceptos básicos de programación.

Objetivos Específicos

Descripción del Problema


Una tarjeta de crédito (o débito), es una tarjeta de plástico con la que puede pagar bienes y servicios. Impreso en esa tarjeta hay un número que también se almacena en una base de datos en algún lugar, de modo que cuando su tarjeta se usa para comprar algo, el acreedor sabe a quién facturar. Hay muchas personas con tarjetas de crédito en este mundo, por lo que esos números son bastante largos: American Express usa números de 15 dígitos, MasterCard usa números de 16 dígitos y Visa usa números de 13 y 16 dígitos. Esos números son decimales (0 a 9), no binarios, lo que significa, por ejemplo, que American Express podría imprimir hasta 10^15 = 1,000,000,000,000,000 tarjetas únicas. (Eso es, un billón).

En realidad, eso es un poco exagerado, porque los números de las tarjetas de crédito tienen cierta estructura. Todos los números de American Express comienzan con 34 o 37; la mayoría de los números de MasterCard comienzan con 51, 52, 53, 54 o 55 (también tienen otros números iniciales potenciales de los que no nos preocuparemos por este problema); y todos los números de Visa comienzan con 4. Pero los números de tarjetas de crédito también tienen una "suma de verificación" (checksum) incorporada; esto es una relación matemática entre al menos un número y otros. Esa suma de comprobación permite a las computadoras (o humanos a los que les gustan las matemáticas) detectar errores tipográficos (por ejemplo, transposiciones), si son números fraudulentos, sin tener que consultar una base de datos, lo que puede ser lento. Por supuesto, un matemático deshonesto ciertamente podría crear un número falso que, no obstante, respete la restricción matemática, por lo que aún es necesaria una búsqueda en la base de datos para realizar comprobaciones más rigurosas.

Algoritmo de Luhn


Entonces, ¿cuál es la fórmula secreta? Bueno, la mayoría de las tarjetas utilizan un algoritmo inventado por Hans Peter Luhn de IBM. Según el algoritmo de Luhn, puede determinar si un número de tarjeta de crédito es (sintácticamente) válido de la siguiente manera:

  1. Multiplica cada dos dígitos por 2, comenzando con el penúltimo dígito del número y luego suma los dígitos de esos productos.
  2. Suma la suma a la suma de los dígitos que no se multiplicaron por 2.
  3. Si el último dígito del total es 0 (o, dicho de manera más formal, si el módulo total 10 es congruente con 0), ¡el número es válido!

Ejemplo

Teniendo un número de tarjeta: 4003600000000014 Primero deben marcarse los números cada 2 posiciones iniciando con el segundo dígito de derecha a izquierda

4 0 0 3 6 0 0 0 0 0 0 0 0 0 1 4

Luego multiplicamos cada uno de los dígitos por 2

4 * 2 = 8 0 * 2 = 0 6 * 2 = 12 0 * 2 = 0 0 * 2 = 0 0 * 2 = 0 0 * 2 = 0 1 * 2 = 2

Si alguno de los resultados tiene más de un dígito, lo separamos y sumamos cada uno de los dígitos obtenidos

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

Ahora se suma el resultado anterior con todos los dígitos que no se multiplicaron anteriormente

13 + 0 + 3 + 0 + 0 + 0 + 0 + 0 + 4 = 20

Como el último dígito de 20 es 0, entonces el número de tarjeta es válido.

Implementación


En un archivo llamado credit.c dentro del directorio ~/pset1/credit/, el estudiante debe escribir un programa que solicite al usuario un número de tarjeta de crédito y luego informe mediante un print si es un número de tarjeta American Express, MasterCard o Visa válido, según las definiciones del formato explicadas anteriormente. Para automatizar las pruebas del código, se sugiere que la última línea de salida de su programa sea AMEX\n o MASTERCARD\n o VISA\n o INVALID\n. El estudiante puede suponer que la entrada del usuario será completamente numérica (es decir, sin guiones, como podría estar impreso en una tarjeta real). No debe asumir que la entrada del usuario encajará en un int. Se recomienda usar get_long de la biblioteca de CS50 para obtener las entradas de los usuarios.

Considere la siguiente representación de como el programa debe comportarse para un número de tarjeta válido.

$ ./credit
Number: 4003600000000014
VISA

Ahora, el mismo get_long rechazará los guiones (y demás):

$ ./credit
Number: 4003-6000-0000-0014
Number: foo
Number: 4003600000000014
VISA

Depende del estudiante capturar las entradas que no sean números de tarjetas de crédito (por ejemplo, un número de teléfono), incluso si son numéricos:

$ ./credit
Number: 6176292929
INVALID

Se sugiere probar el programa con un montón de entradas, tanto válidas como inválidas. A continuación, se muestran algunos números de tarjeta que PayPal recomienda para realizar pruebas.

Restricciones

Penalizaciones

Observaciones

Cómo enviar