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

Problema con un ejercicio de comparar cadenas

Estas en el tema de Problema con un ejercicio de comparar cadenas en el foro de C/C++ en Foros del Web. Hola, tengo un problema con un ejercicio de programación. Me piden que introduzca un nombre de atleta, apellidos, fecha nacimiento.. entre otros. Y luego tengo ...
  #1 (permalink)  
Antiguo 30/12/2009, 13:05
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Problema con un ejercicio de comparar cadenas

Hola,
tengo un problema con un ejercicio de programación.
Me piden que introduzca un nombre de atleta, apellidos, fecha nacimiento.. entre otros. Y luego tengo que poder modificar la información, pidiendo un nombre y apellido.

Me falla la parte de comparar una cadena del nombre introducido con el nombre del atleta. Lo he hecho con el STRCMP.
Os pongo la parte de modificar, con negrita la parte que me da problemas...




struct atleta {
char nom[atl][max];
char cog1[atl][max];
char cog2[atl][max];
char sexe[atl];
int codi_cmp[atl][comp]; // el codi de competició
} a;

typedef struct {
int dia[atl];
int mes[atl];
int any[atl];
} data;


char nom[max], cognom[max];




printf ("\nModificar datos de un atleta dado su nombre\n");
printf ("************************************\n\n");

printf ("Nombre del atleta que quieres modificar: ");
scanf ("%s", nom);

i=0;
while (i< atl){
if (strcmp (nom, a.nom[i])==0){
error= 1;
}else{
error=0;
}
i++;
}

if (error == 0){
printf ("Este nombre no exististe");
}else{
printf ("Apellido del atleta que quieres modificar: ");
scanf ("%s", cognom);
if (strcmp (cognom, a.cog1[i])==0){
error= 1;
}else{
error= 0;
}

if (error == 0){
printf ("Este apellido no existe");
}else{
printf ("Fecha de nacimiento: %d / %d / %d", d.dia[i], d.mes[i], d.any[i]);
printf ("\nModificar: ");
scanf ("%d %d %d", &dia, &mes, &any);

error=1;
while (error==1 && dia != '\n'){
if (dia >0 && dia<=31 && mes>0 && mes<=12 && any >1900 && any <2100) {
d.dia[i]= dia;
d.mes[i]= mes;
d.any[i]= any;
error=0;
}else{
printf ("Incorrecto. Vuelve a introducir la fecha: ");
scanf ("%d %d %d", &dia, &mes, &any);
error=1;
}
}

printf ("Fecha de naciemiento: %d / %d / %d\n\n", d.dia[i], d.mes[i], d.any[i]);

if (a.sexe[i] == 'h'){
printf ("Sexo: Hombre\n");
}else{
printf ("Sexo: Mujer\n");
}
printf ("Modificar sexo (h/d): "); // h: hombre, d: mujer
scanf ("%c", &hd);

error=1;
while (error==1 && hd !='\n'){
if (hd == 'h' || hd == 'd'){
a.sexe[i]=hd;
error=0;
}else{
printf ("Incorrecto, vuelve a introducir el sexo: ");
scanf ("%c", &hd);
error=1;
}
}
if (a.sexe[i] == 'h'){
printf ("Sexo: Hombe\n");
}else{
printf ("Sexo: Mujer\n");
}
}

// aun faltan cosas!!
}


break;

Última edición por Lunadan; 30/12/2009 a las 13:09 Razón: Traducir algunas palabras...
  #2 (permalink)  
Antiguo 30/12/2009, 13:45
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Problema con un ejercicio de comparar cadenas

que error te sale?
// incluiste <string.h> ?
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #3 (permalink)  
Antiguo 30/12/2009, 14:31
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema con un ejercicio de comparar cadenas

si que incluí el <string.h>
cuando le introduzco un nombre, en teoria tiene que buscar si este nombre está o no en la tupla de cadenas (a.nom[i]).
Pero cuando le introduzco el nombre, dice siempre que no encuentra la palabra. Aunque le cambie el numero del error a 1, me sale lo mismo.

No se si he puesto bien el STRCMP. Porque antes lo he intentado hacerlo sin las tuplas, comparando cadena (nom) con cadena de max (nom[i]), y me ha salido, pero al poner el nom[i] dentro de una tupla... no se como hacerlo, porque no me funciona.
  #4 (permalink)  
Antiguo 30/12/2009, 14:36
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Problema con un ejercicio de comparar cadenas

Ya se cual es el error.
debes colocar algo que interrumpa el ciclo cuando encuentre el nombre, por ejemplo un break;
de lo contrario seguira comparando.

Saludos
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #5 (permalink)  
Antiguo 30/12/2009, 14:38
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Problema con un ejercicio de comparar cadenas

algo asi:
Código C:
Ver original
  1. while (i< atl){
  2. if (strcmp (nom, a.nom[i])==0){
  3. error= 1;
  4. break;
  5. }else{
  6. error=0;
  7. }
  8. i++;
  9. }
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #6 (permalink)  
Antiguo 30/12/2009, 15:03
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema con un ejercicio de comparar cadenas

eres un genio!! gracias XD
  #7 (permalink)  
Antiguo 02/01/2010, 12:02
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema con un ejercicio de comparar cadenas

El siguiente problema de comparar cadenas es que quiero saber si el nombre, el apellido1, y el apellido2 estan o no introducidos, para saber si aquel atleta ya estaba inscrito anteriormente o no. Si esta inscrito, en teoria debe avisar (printf ("El nombre ya esta escrito\n");) y volver a pedir el nombre, el apellido1, y el apellido2.
No me funciona.

Código C:
Ver original
  1. error=1;
  2.         while (error==1){
  3.         printf ("Nombre: ");
  4.         fflush(stdin);
  5.         scanf ("%[^\n]", a.nom[i]);
  6.         printf ("Primer apellido: ");
  7.         fflush(stdin);
  8.         scanf ("%[^\n]", a.cog1[i]);
  9.         printf ("Segundo apellido: ");
  10.         fflush(stdin);
  11.         scanf ("%[^\n]", a.cog2[i]);
  12.  
  13.         for (k=0;k<max;k++){
  14.             if (strcmp (a.nom[i], a.nom[k])==0){
  15.                 for (k=0;k<max;k++){
  16.                     if (strcmp (a.cog1[i], a.cog1[k])==0){
  17.                       for (k=0;k<max;k++){
  18.                             if (strcmp (a.cog2[i], a.cog2[k])==0){
  19.                                 error= 1;
  20.  
  21.                             }else{
  22.                                 error=0;
  23.                             }
  24.                         }
  25.                     }else{
  26.                         error=0;
  27.                     }
  28.                 }
  29.             } else{
  30.                 error=0;
  31.             }
  32.         }
  33.  
  34.  
  35.         if (error == 1){
  36.             printf ("El nombre ya esta escrito\n");
  37.         }
  38.         }

Última edición por Lunadan; 03/01/2010 a las 12:31
  #8 (permalink)  
Antiguo 03/01/2010, 15:52
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Problema con un ejercicio de comparar cadenas

la condicion seria esta:

Código C:
Ver original
  1. if(strcmp (a.nom[i], a.nom[k]) != 0)
  2.    printf ("El nombre ya esta escrito\n");

Saludos
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #9 (permalink)  
Antiguo 04/01/2010, 06:19
 
Fecha de Ingreso: noviembre-2008
Mensajes: 14
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema con un ejercicio de comparar cadenas

No me funciona.
O me sale todo el rato "El nombre ya esta escrito" o simplemente no me sale nada, aunque el nombre esté repetido.
  #10 (permalink)  
Antiguo 04/01/2010, 08:55
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Problema con un ejercicio de comparar cadenas

Pudes hacer una funcion que compare:

Código C:
Ver original
  1. bool comparar(char a[]){
  2.   for(int i=0;i<max;i++){
  3.     if(!strcmp(a,a.nom[i]))
  4.          return true;
  5.   }
  6.  return false;
  7. }

En el main puedes usar esa funcion y comparar de una el valor que ingresas
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
  #11 (permalink)  
Antiguo 04/01/2010, 09:19
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 8 meses
Puntos: 13
Respuesta: Problema con un ejercicio de comparar cadenas

Código C:
Ver original
  1. do{
  2.   cout<<"Ingrese Nombre: ";
  3.   cin>>b;
  4.     if(!comparar(b))
  5.         break;
  6. }while(comparar(nom)); //Mientras ya exista el nombre

Espero haberte ayudado
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse
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 19:20.