Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Guarda nombres y comprueba si estan entre los almacenados

Estas en el tema de Guarda nombres y comprueba si estan entre los almacenados en el foro de C/C++ en Foros del Web. Hola, estoy realizando un ejercicio que dice: Cita: Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee un nombre ...
  #1 (permalink)  
Antiguo 31/12/2013, 10:00
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 11 años, 1 mes
Puntos: 0
Guarda nombres y comprueba si estan entre los almacenados

Hola, estoy realizando un ejercicio que dice:

Cita:
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.
He realizado decenas de pruebas, pero no doy con el fallo que explico acontinuacion. El programa compila pero si escribo palabras que ya se guardaron en el array, no me dice las muestra como una almacenada, si no que siempre me indica que esa palabra no se encuentra entre las 10 guardadas.

El ejercicio es esto:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.     char nombre[][50]={};
  8.     char comparacion[50];
  9.     char num[10][20] = {"primer", "segundo", "tercer", "cuarto", "quinto", "sexto", "septimo", "octavo", "noveno", "decimo"};
  10.     int i;
  11.    
  12.     for (i = 0; i < 10; i++){
  13.         printf ("\n Introduce el %s nombre: ", num[i]);
  14.         scanf ("%s", &nombre);
  15.         }
  16.     do{    
  17.         printf ("\n Introduce un nombre para comprobar si se encuentra entre los almacenados: ");
  18.         scanf ("%s", &comparacion);
  19.        
  20.         if (strcmp(nombre, comparacion) == 0){
  21.            printf ("\n El nombre esta entre los almacenados\n\n\n\n");
  22.            break;}
  23.            else{
  24.                 printf ("\n El nombre NO esta entre los almacenados\n\n\n\n");
  25.                 }
  26.                 }while (strcmp(nombre, comparacion) != 0);
  27.  
  28.   system("PAUSE"); 
  29.   return 0;
  30. }
  #2 (permalink)  
Antiguo 31/12/2013, 13:21
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Guarda nombres y comprueba si estan entre los almacenados

Posiblemente la instruccion scanf() que utilizas está incluyendo el \n (cambio de linea) que se ingresa al presionar Enter.

Para comprobarlo, escribir el largo (strlen()) de lo ingresado, o escribir algo como "|%s|", nombre, y si al ingresar A aparece

|A
|

y no aparece

|A|

ese es el problema, y strcmp() tiene la obligacion de decirte que los strings no calzan.

Si esto es el caso, hay que eliminar este \n antes de comparar.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 01/01/2014, 07:36
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Guarda nombres y comprueba si estan entre los almacenados

gracias por la contestacion amigo. No se si lo entendi bien, pero cambie los "scanf" por "gets", aunque el problema persiste:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.     char nombre[][50]={};
  8.     char comparacion[50];
  9.     char num[10][20] = {"primer", "segundo", "tercer", "cuarto", "quinto", "sexto", "septimo", "octavo", "noveno", "decimo"};
  10.     int i;
  11.    
  12.     for (i = 0; i < 10; i++){
  13.         printf ("\n Introduce el %s nombre: ", num[i]);
  14.         gets (nombre);
  15.         //scanf ("%s", &nombre);
  16.         }
  17.     do{    
  18.         printf ("\n Introduce un nombre para comprobar si se encuentra entre los almacenados: ");
  19.         gets (comparacion);
  20.         //scanf ("%s", &comparacion);
  21.        
  22.         if (strcmp(nombre, comparacion) == 0)
  23.            printf ("\n El nombre esta entre los almacenados\n\n\n\n");
  24.            
  25.            else{
  26.                 printf ("\n El nombre NO esta entre los almacenados\n\n\n\n");
  27.                 }
  28.                 }while (strcmp(nombre, comparacion) != 0);
  29.  
  30.   system("PAUSE"); 
  31.   return 0;
  32. }
  #4 (permalink)  
Antiguo 01/01/2014, 10:37
 
Fecha de Ingreso: diciembre-2013
Mensajes: 10
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Guarda nombres y comprueba si estan entre los almacenados

Cuando almacenes un contenido en una variable, utiliza los indices, que en este caso es la letra "i".

Por ejemplo: gets(nombre[i]);

Declara nombre asi: char nombre[10][50]; si no me equivoco esto seria parecido a la declaración que hiciste para num, o sea 10 variables con 50 espacios para cada una.

Para realizar una comparación, también vuelve a utilizar los indices dentro de un ciclo, por que lo que estas comparando con este código: if (strcmp(nombre, comparacion) == 0) es solo el primer valor que almacenaste.

Cualquier duda o pregunta, aquí estamos para ayudarte.

Saludos.
  #5 (permalink)  
Antiguo 01/01/2014, 16:47
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Guarda nombres y comprueba si estan entre los almacenados

Comparto la opinion previa.

Esta declaracion:

Código C:
Ver original
  1. char nombre[][50]={};

deberia cambiarse por

Código C:
Ver original
  1. char nombre[10][50];

y luego utilizar el indice para llenar cada una de las posiciones del arreglo nombre, como te lo indica sabiamente codigo_cpp.

Otra observacion: dentro del ciclo do {} while, por cada vuelta preguntas por el string "comparacion", Creo que hay que hacerlo justo antes de comenzar el ciclo.

En el ciclo, conviene utilizar nuevamente un indice, que parta en 0 y llegue a alguno de estos casos:

- el indice es mayor o igual a 10 o
- encontraste el string.

Algo parecido a ...

Código PseudoCode:
Ver original
  1. <leer "comparacion">
  2. i = 0;
  3. do {
  4.    <comparar numero[i] con "comparacion">
  5.    si calzan -> salir
  6.    si no -> incrementar i
  7. } while (i <10);
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 01/01/2014 a las 17:01
  #6 (permalink)  
Antiguo 13/01/2014, 13:06
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Guarda nombres y comprueba si estan entre los almacenados

Bueno pues despues de casi 2 semanas sin pc, ya estoy de vuelta. Estoy de examenes y no puedo ponerme con estos ejercicios extras que me puse, pero cuanto acabe, vuelvo a este tema pues recuerdo que me seguia fallando.

Gracias gente!

Etiquetas: int, nombres, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:43.