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();
}
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.
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
Pero como se relaciona la parte del for que compara con la variable i?
¿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.
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.
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.