Intenté buscar la respuesta a esta pregunta, lo cual es un poco complicado cuando no sabes exactamente lo que estás buscando, pero aquí va.

Me estoy abriendo camino a través de CS50 en este momento (muy nuevo en esto, sé un poco de HTML / CSS y mi trabajo diario es en marketing). Estoy en el problema final de la semana 1: estoy haciendo que sea difícil para mí al hacer los problemas más difíciles y los fáciles, pero tengo muchas ganas de aprender. Hasta ahora no hemos hablado de matrices, lo que sospecho que podría ser la respuesta a esta pregunta, pero sin más conocimiento no puedo estar seguro.

Estoy trabajando en un validador de tarjeta de crédito, donde tengo que hacer cosas como obtener la longitud del número de tarjeta para validar, agregar diferentes dígitos, etc. Donde estoy luchando, es que si alteró una variable dentro de un bucle en algunos De esta manera, cuando voy a usar esa variable nuevamente, tiene el nuevo valor, no el original.

¿Cómo almaceno el valor original en algún lugar para poder acceder sin tener que crear docenas de nuevas variables para actuar como marcadores de posición? (Nota: el siguiente es solo un pequeño fragmento de mi código como ejemplo, no quería incluir todo)

E.g.

long long credit;           // credit card number
long long len;              // used to work out len of card number - feeds into count

// validate length of credit card number and get length of card

len = credit;
while (len > 0)
{
    len /= 10;
    count ++;
}

En el ejemplo anterior, si quiero usar len nuevamente más abajo en mi código, su valor será 0. ¿Cómo me aseguro de que el valor original permanezca en algún lugar para que pueda acceder en bucles futuros?

Sospecho que de alguna manera necesito usar una matriz, pero hasta ahora solo hemos cubierto los tipos de datos, booleanos, operadores, declaraciones condicionales y bucles (más printf). Toda la información que he encontrado en línea sobre las matrices habla sobre la necesidad de especificar el tamaño de la matriz (el punto es que no lo sé en este ejemplo; los valores pueden variar entre 13 y 16 dígitos) y parece más complejo de lo que este problema llama para.

Estoy bastante seguro de que me estoy perdiendo algo realmente simple: ¡simplemente no sé qué es!

EDITAR: ¡Gracias a todos los que contribuyeron con respuestas a mi primera pregunta! Si bien puede haber soluciones "mejores", parece que, dadas las limitaciones que tengo con la especificación de mi solución, estaba haciendo bien y realmente estaba pensando demasiado. Tomé el consejo de la gente para copiar variables y finalmente conseguí que todo funcionara hace unos minutos.

Si a alguien le gustaría verlo (aunque estoy seguro de que mi código podría mejorar), mi solución es aquí.

La especificación original que tenía que cumplir era aquí.

Una vez más, realmente aprecié los comentarios, agradezco que este no sea un sitio tutorial, pero a veces puede ser difícil resolver lo que no sabes. ¡Gracias por la ayuda!

-7
Arianne 24 jun. 2017 a las 17:19

3 respuestas

La mejor respuesta

Puede estar buscando la declaración de bloques adicionales como en

#include<stdio.h>
int main() {
  int i=1;
  printf("before %d\n",i);
  {
    int i=0;
    printf("within %d\n",i);
  }
  printf("after %d\n",i);
  return(0);
}

Que cuando se ejecuta produce

before 1
within 0
after 1

Del comentario entiendo que una invocación de función puede ser preferible, que puede ser como

#include<stdio.h>
int div_10_count(long long val) {
    int count=0;
    while(val>0) {
        val /= 10;
        count++;
    }
    return(count);
}

int main() {
  long long val=10000000000L;
  printf("Before: val=%lld\n",val);
  printf("Returned: %d\n",div_10_count(val));
  printf("After: val=%lld\n",val);
  return(0);
}

Muestra

Before: val=10000000000
Returned: 11
After: val=10000000000

Entonces la variable val permanece sin cambios aunque la función funcione con ella. Esto sería diferente al pasar el parámetro por referencia, es decir, como se indica con "&".

1
smoe 24 jun. 2017 a las 14:49

¿Qué tiene de malo usar una variable temporal?

Puedes hacer dos variables

long long len;
long long lenWork;

len = yourValue;
lenWork = len;

/* Work with lenWork */
lenWork = len;
/* Once again */
lenWork = len;
/* etc... */
0
Juju17ification 24 jun. 2017 a las 14:30

Es posible que haya olvidado inicializar la variable count en 0.

Use nombres de variables más explícitos:

unsigned long long credit;  // credit card number

// get length of the credit card number
int count = 0;
for (unsigned long long tmp = credit; tmp > 0; tmp /= 10) {
    count++;
}

Aquí hay un método más directo:

if (snprintf(NULL, 0, "%llu", credit) == 16) {
    /* credit card number has 16 digits */
}

También podría usar un método mucho más simple pero menos legible:

if (credit >= 1000000000000000 && credit < 10000000000000000) {
    /* credit has 16 digits */
}
0
chqrlie 24 jun. 2017 a las 14:36