[ Foro de C ]

duda con ejercicio 5.4.1

27-Jul-2014 23:36
Invitado (sara)
4 Respuestas

Tengo una duda con este ejercicio, ya que he visto uno resuelto en este link:http://www.nachocabanes.com/c/curso/c_soluciones.php y yo lo he hecho diferente.

Así es como estaba resuelto:


/*-------------------------*/
/*  Solucion al ejercicio  */
/*    propuesto 5.4a       */
/*  s0504a.c               */
/*                         */
/*  Buscar nombre en un    */
/*  array                  */
/*                         */
/*  Curso de C,            */
/*    Nacho Cabanes        */
/*-------------------------*/
 
#include <stdio.h>
#include <string.h>
 
int main()
{
    int i;
    char nombres[10][80];
    char nombreBuscar[80];
    int encontrado;
 
    printf("\n Escriba 10 nombres: \n");
 
    for (i=0; i<10; i++) 
        gets(nombres[i]);
 
    do
    {  
        printf("Escriba nombre a buscar, o \"fin\" para terminar: ");
        gets(nombreBuscar);
        encontrado = 0;
 
        if (strcmp(nombreBuscar, "fin") != 0)
        {
            for (i=0; i<10; i++) 
            {
                  if (strcmp(nombreBuscar, nombres[i]) == 0)
                      encontrado = 1;  
            }
            if (encontrado == 1)
                  printf("Este nombre se encuentra en la lista\n");
            else    
                  printf("Este nombre no se encuentra en la lista\n"); 
        }
    }
    while (strcmp(nombreBuscar, "fin") != 0);  
 
    return 0;
}


y yo lo he hecho así:


#include<stdio.h>
#include<string.h>
//Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee un nombre
// y dirá si se encuentra o no entre los 10 que se han tecleado antes. 
//Volverá a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que se teclee "fin".

int main()
{
	char nom_memorizar[10][70];
	char nom_teclear[70];
	int i, encontrado;
	printf("Introduce diez nombres\n");
	for(i=0; i<10; i++)
	{
		gets (nom_memorizar[i]);
	}
		
	do
	{
		encontrado = 0;
		printf("Teclea un nombre\n");
		gets (nom_teclear);
		for(i = 0; i < 10; ++i)
		{
			if(strstr(nom_memorizar[i], nom_teclear)!=NULL)
			{
				encontrado = 1;
			}
		}
		if(encontrado) 
		{
			printf("El nombre se encoontraba en la lista de nombres memorizados\n");
		}
		else
		{
			printf("El nombre no ha sido encontrado\n");
		}
	}
	while(strcmp(nom_teclear, "fin") != 0);
	return 0;
}


Me funciona adecuadamente pero, está bien o lo tenía que haber hecho de la otra manera?


31-Jul-2014 06:08
León Sánchez

EL uso que haces de strstr no es el adecuado ya que busca coincidencias entre dos cadenas. Por ejemplo si introduces "leosan" como uno de los nombres y luego introduces a buscar "san" te dará que hay coincidencia, lo cual es lógico ya que "san" está dentro de "leosan" dando con ello un resultado erróneo.

Y otra cosita, acostúmbrate a indentar el código, es más legible, fácil de releer y además ten en cuenta que los if, while, for, etc, si su cuerpo se compone de una sola línea no hace falta las llaves, Todo ello hace que el código sea más llevadero. Como ejemplo:


#include<stdio.h>
#include<string.h>

int main() {
  char nom_memorizar[ 10 ] [70 ] ;
  char nom_teclear[ 70 ] ;
  int i , encontrado ;

  printf ("Introduce diez nombres\n") ;
  for( i = 0 ; i < 10 ; i++ )
    gets ( nom_memorizar[i] ) ;

  do {
  encontrado = 0;
  printf ( "Teclea un nombre\n" ) ;
  gets ( nom_teclear ) ;
  for( i = 0 ; i < 10 ; ++i )
    if( strcmp ( nom_memorizar[ i ] , nom_teclear ) == 0 )
      encontrado = 1;
    if( encontrado )
      printf( "El nombre se encontraba en la lista de nombres memorizados\n" ) ;
    else
      printf ( "El nombre no ha sido encontrado\n" ) ;
  } while ( strcmp( nom_teclear , "fin" ) != 0 ) ;
  return 0 ;
}





31-Jul-2014 20:39
Invitado (sara)

Vale, muchas gracias :)
Por cierto tengo otra duda en otro ejercicio parecido a ese, la parte del case3, no funciona como debería, y por más que le doy vueltas no llego a la solución,   me podrías decir que tengo mal?
Gracias


#include<stdio.h>
#include<string.h>
//programa que almacene datos de hasta 100 canciones. Deberá tener un menú que permita las opciones:añadir una nueva canción, 
//mostrar el título de todas las canciones, buscar la canción que contenga un cierto texto (en el artista o en el título).

int main()
{
	struct
	{
		char titulo[100];
		char artista[100];
		float duracion;
		float tamanio;
	} cancion[100];
	int i = 0;
	int opcion = 0;
	int encontrado = 0;
	int num_canciones = 0;
	char nom_buscar[20];
	char input[20];
	do
	{
		puts("Elige una opcion del menu");
		puts("1. Aniadir una nueva cancion");
		puts("2. Mostrar titulo de todas las canciones");
		puts("3. Buscar una cancion");
		puts("0. Salir.\n");
		gets(input);
		opcion = atoi(input);
		switch(opcion)
		{
			case 1:
		
				if (num_canciones<100)
				{
					printf("Introduce el titulo de la cancion:\n");
					printf("Elige una cancion que te guste y rellena los siguientes datos\n");
					gets(cancion[num_canciones].titulo);//mea culpa
					printf("Introduce el artista de la cancion:\n");
					gets(cancion[num_canciones].artista);
					printf("Introduce la duracion de la cancion:\n");
					gets(input);
					cancion[num_canciones].duracion = atof(input);
					printf("Introduce el tamanio de la cancion:\n");
					gets(input);
					cancion[num_canciones].tamanio = atof(input);
					num_canciones++;
					printf("%d\n", num_canciones);
					puts("");
				}
				else
				{
					printf("Se ha alcanzado el limite\n");
				}
			break;
			case 2:
				puts("====CANCIONES===\n");
				for(i=0; i<num_canciones; i++)
				{
					printf("%d\t%s\n", i + 1, cancion[i].titulo);
				}
				puts("");
			break;
			case 3:
				printf("Introduzca el nombre del titulo de la cancion para buscar:\n");
				gets(nom_buscar);
				encontrado = 0;
				for (i=0; i<num_canciones; i++)
				{
					if(strcmp(cancion[i].titulo, nom_buscar) == 0);
					{
						printf("Cancion encontrada: %s\n", cancion[i].titulo);
						encontrado = 1;
					
					}
				}
					if(!encontrado)
					puts("El nombre no pertenece a la lista\n");
				
				break;
		}
	}
	while(opcion!=0);
	
	return 0;
}



01-Aug-2014 11:19
Raúl Abascal (+4)

El problema lo tienes en esta línea:


if(strcmp(cancion[i].titulo, nom_buscar) == 0); 


Al añadir el ";" al final, entiende que si se cumple el "if" tiene que ejecutar la instrucción que hay entre el cierre de la condición y el punto y coma - Ninguna en este caso - y luego sigue ejecutando lo que hay entre llaves. Si quitas el punto y coma el "if" ejecutará lo que hay encerrado entre las llaves de manera correcta.

Saludos.


04-Aug-2014 21:25
Invitado (sara)

Vale, muchas gracias!!!!;:)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)