Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Ander123 en 27 Octubre 2012, 17:48 pm



Título: Problema variable j
Publicado por: Ander123 en 27 Octubre 2012, 17:48 pm
Hola, tengo un problema con este programa, no entiendo bien el funcionamiento de la variable j y como se puede hacer para que algo que esta declarado en otra variable, la variable fin, se pueda usar en el printf de otros nombres, eso no lo entiendo. Si alguien pudiese explicarme el funcionamiento.. Esque me gusta acabar de entender los programas.

 #include  <stdio.h>
    #include  <string.h>
   
    main()
    {
                int  i,  j;
                char  nombres[10][10],  otrosNombres[10],  fin[]="fin";
               
                printf("\n  Escriba  10  nombres:  \n");
                for  (i=0;  i<10;  i++) 
                        scanf("%s",  &nombres);
                for  (i=0;  i<10;  i++)       
                        printf("%s    ",  nombres);
                do
                {     
                                  printf("\n  Escriba  otro  nombre,  o  \"fin\"  para  terminar:  ");
                                  scanf("%s",  otrosNombres);
                                 
                                  for  (i=0,j=0;  i<10;  i++,j++) 
                                  {
                                            if  (strcmp(otrosNombres,  nombres)  ==  0)
                                                      j--;   
                                  }
                                  if  (i  !=  j)
                                              printf("  Este  nombre  se  encuentra  en  la  lista\n");
                                  else       
                                              printf("  Este  nombre  no  se  encuentra  en  la  lista\n"); 
                                                   
                  }
                  while  (strcmp(otrosNombres,  fin)  !=  0);   
                       
                getchar();
    }


Título: Re: Problema variable j
Publicado por: DickGumshoe en 27 Octubre 2012, 18:49 pm
Hola.

Antes de responder a tu duda, comentaré algunos errores del programa:

Declaras la variable nombres[10][10]. Eso bien. Pero después, en el primer for, pides los nombres, haciendo esto:

Código
  1. for  (i=0;  i<10;  i++)  
  2.      scanf("%s",  &nombres);

Eso no es correcto. Para pedir un *char (cadena de caracteres), no se debe poner el & en el scanf, y para meter 10 nombres, uno en cada fila de la "matriz de letras", debes poner
Código
  1. scanf("%s", nombres[i]);
(para indicar el número del nombre que vas a pedir, es decir, empiezas por la fila 0 (o nombre 0), y vas así hasta el 9).

Por otra parte, para pedir cadenas de caracteres, te recomiendo usar gets() o fgets(), ya que son funciones específicas para dicha función, y pueden leer espacios, al contrario que scanf(), que cuando lee uno, para de leer los datos.

Código
  1. for  (i=0;  i<10;  i++)  
  2.                        scanf("%s",  nombres[i]);

Dicho esto, respondo a tu duda:

Situémonos en el bucle for que está en el do-while. Las variables i y j incrementan en 1 simultáneamente. Si la variable "otrosNombres" contiene la misma información que "nombres" (strcmp compara dos cadenas: devuelve 0 si ambas son iguales, u otro número si son diferentes), a j se le resta 1. Así, al terminar el bucle for, si i y j son iguales, ninguna cadena contenida en "nombres" será idéntica a "otrosNombres", y si su valor es diferente, sí que hay un nombre igual que a cadena "otrosNombres".

Un saludo.


Título: Re: Problema variable j
Publicado por: rir3760 en 27 Octubre 2012, 19:01 pm
Solo agregar que no es necesario utilizar dos variables para buscar la cadena en el array, basta con revisar el valor del contador al final del bucle para conocer el resultado:
Código
  1. for (i = 0; i < 10 && strcmp(otrosNombres, nombres[ i ]) != 0; i++)
  2.   ;
  3. if (i != 10)
  4.   puts("Este nombre se encuentra en la lista");
  5. else
  6.   puts("Este nombre no se encuentra en la lista");
Y para imprimir una literal terminada con '\n' es mejor utilizar la función "puts".

Un saludo


Título: Re: Problema variable j
Publicado por: Ander123 en 27 Octubre 2012, 23:15 pm
Pero como se relaciona la parte del for que compara con la variable i?


Título: Re: Problema variable j
Publicado por: DickGumshoe en 28 Octubre 2012, 00:26 am
¿Te refieres a esto?:

Código
  1. if  (i  !=  j)
  2.                   printf("  Este  nombre  se  encuentra  en  la  lista\n");
  3.             else        
  4.                   printf("  Este  nombre  no  se  encuentra  en  la  lista\n");  

Si es así, como ya te dije, dentro del bucle for, si las dos variables (i y j) incrementan en 1 simultáneamente, y si las dos cadenas que comparas son iguales, j decrementa, ergo si i != j, significa que hay una cadena en nombres igual idéntica a otrosNombres, y sino, no serán iguales.

Un saludo.


Título: Re: Problema variable j
Publicado por: Ander123 en 28 Octubre 2012, 09:07 am
Si pero en el ciclo for donde se inicializa i  y j etc no entiendo como se relaciona la variable i con las variables.. con la que se relacione, para posteriormente poder igualar a j.


Título: Re: Problema variable j
Publicado por: DickGumshoe en 28 Octubre 2012, 12:57 pm
Si pero en el ciclo for donde se inicializa i  y j etc no entiendo como se relaciona la variable i con las variables.. con la que se relacione, para posteriormente poder igualar a j.

Lo siento, pero no entiendo bien tu pregunta... Tanto i como j empiezan en 0. Si i != j significa "si i es distinto de j". Si son distintos, es que algún nombre coincide, sino, ninguno es igual.