Problema variable j

Iniciado por Ander123, 27 Octubre 2012, 17:48 PM

0 Miembros y 1 Visitante están viendo este tema.

Ander123

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();
    }

DickGumshoe

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:

for  (i=0;  i<10;  i++)  
     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 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.

for  (i=0;  i<10;  i++)  
                       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.

rir3760

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:
for (i = 0; i < 10 && strcmp(otrosNombres, nombres[ i ]) != 0; i++)
   ;
if (i != 10)
   puts("Este nombre se encuentra en la lista");
else
   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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Ander123

Pero como se relaciona la parte del for que compara con la variable i?

DickGumshoe

¿Te refieres a esto?:

if  (i  !=  j)
                   printf("  Este  nombre  se  encuentra  en  la  lista\n");
             else       
                   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.

Ander123

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.

DickGumshoe

Cita de: 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.

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.