elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 22:26  


Tema destacado: ¡Aprende hacking con práctica! - WarZone, el wargame de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Imprimir una sola vez el mensaje en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Imprimir una sola vez el mensaje en C  (Leído 400 veces)
Jlrr

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Imprimir una sola vez el mensaje en C
« en: 3 Febrero 2012, 21:29 »

Hola estoy haciendo un programa en C para comparar varios nombres y saber si son iguales o no,primero escribo el numero de personas a las que le asignare los nombres luego con un ciclo escribo los nombres para las personas que escribi,despues comparo los nombres en un ciclo con dos opciones,la primera es una funcion que compara las cadenas para saber si son iguales y la segunda es la opcion que se da si la primera no se da,ambas con un mensaje diferente que se imprime al final.El problema que tengo es que cuando compilo el programa funciona pero imprime dos mensajes,uno por cada una de las dos opciones y queria saber si alguien me podria decir como cambiar el programa para que solo lo imprima un  mensaje segun sea la opcion

Código
#include <stdio.h>
#include <stdlib.h>
struct Datos
{
char Nombre[25];
};
int main(int argc, char *argv[])
{
 struct Datos P[100];
 int m,i;
 char nom[25];
 
 printf("ingrese el n\xA3mero de personas: ");
 scanf("%d",&m);
 for(i=0;i<m;i++)
 {
  fflush(stdin);
  printf("ingrese el nombre de la persona #%d: ",i+1);
  gets(P[i].Nombre);
 }
 printf("Escriba el nombre de la persona que quiere buscar: ");
 scanf("%s",&nom);
 for(i=0;i<m;i++)
 {
  if(strcmp(nom,P[i].Nombre)==0)
  {
   printf("%s esta en la base de datos\n",nom);
  }
  else
  {
   printf("%s no esta en la base de datos\n",nom);
  }
 }
 system("PAUSE");
 return 0;
}

Ejemplo:escribo el numero de personas:2
             --Estos son los nombres que se deberian guardar--
             escribo el primer nombre:marco
             escribo el segundo nombre:mateo
             escribo el nombre que quiero buscar:mateo
             --Al final aparece esto--
             mateo no esta en la base de datos
             mateo esta en la base de datos
           --Lo mismo pasa si coloco  3( o mas nombres) solo que  aparece dos veces   
             un mensaje incorrecto y una vez el mensaje correcto--


En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Imprimir una sola vez el mensaje en C
« Respuesta #1 en: 3 Febrero 2012, 21:39 »

Hola.

Prueba poniendo "break" en los if y else.

Así:

Código
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Datos
{
char Nombre[25];
};
int main(int argc, char *argv[])
{
 struct Datos P[100];
 int m,i;
 char nom[25];
 
 printf("ingrese el n\xA3mero de personas: ");
 scanf("%d",&m);
 for(i=0;i<m;i++)
 {
  fflush(stdin);
  printf("ingrese el nombre de la persona #%d: ",i+1);
  gets(P[i].Nombre);
 }
 printf("Escriba el nombre de la persona que quiere buscar: ");
 scanf("%s",&nom);
 for(i=0;i<m;i++)
 {
  if(strcmp(nom,P[i].Nombre)==0)
  {
  printf("%s esta en la base de datos\n",nom);
  break;
  }
  else
  {
   printf("%s no esta en la base de datos\n",nom);
   break;
  }
 }
 system("PAUSE");
 return 0;
}
 

Saludos.

EDITO: Me parece que en tu código faltaba también la librería string.h


En línea
Jlrr

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Imprimir una sola vez el mensaje en C
« Respuesta #2 en: 3 Febrero 2012, 21:58 »

Hola Dick al colocarle los break al final del if y el else el programa ya solo imprime un mensaje el problema es que al realizar la comparacion de cadenas solo hace la comparacion con el primer nombre es decir que el al comparar 2 o mas nombres para saber si estan o no estan el programa solo hace la comparacion con el primer nombre,el resto los toma como si no existieran automaticamente.
En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Imprimir una sola vez el mensaje en C
« Respuesta #3 en: 3 Febrero 2012, 22:09 »

Ah, sí. Debes quitar el else, sustituyéndolo por un if, y sacarlo fuera del for. Así:

Código
for(i=0;i<m;i++)
 {
  if(strcmp(nom,P[i].Nombre)==0)
  {
  printf("%s esta en la base de datos\n",nom);
  break;
  }
 
}
  if(strcmp(nom,P[i].Nombre)!=0)printf("%s no esta en la base de datos\n",nom);
 

Saludos.
En línea
Caster


Desconectado Desconectado

Mensajes: 405


Divide y vencerás


Ver Perfil WWW
Re: Imprimir una sola vez el mensaje en C
« Respuesta #4 en: 3 Febrero 2012, 22:16 »

No me voy a meter en el tema principal pero, un consejo, quita esto:

Código
system("PAUSE");

Y pon esto:

Código
getchar();
En línea

"Saber que se sabe lo que se sabe y que no se sabe lo que no se sabe, he aquí el verdadero saber."
(Confucio)

Jlrr

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Imprimir una sola vez el mensaje en C
« Respuesta #5 en: 3 Febrero 2012, 22:23 »

Gracias dirk cuando converti el else en if y lo saque del for ya se arregla el problema de la comparacion de cadenas ahora ya compara todos los nombres e imprime el mensaje adecuado si estan o no estan en la base de datos,aunque no entiendo bien porque era necesaria la tercera libreria.

Demon al hacer el cambio el programa se termina antes de que muestre el mensaje final creo que es mejor no cambiarlo.
En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Imprimir una sola vez el mensaje en C
« Respuesta #6 en: 3 Febrero 2012, 22:25 »

¿La tercera librería?

Esa contiene strcmp, necesario para hacer la comparación. ¿Te compiló sin usarla?
En línea
Jlrr

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Imprimir una sola vez el mensaje en C
« Respuesta #7 en: 3 Febrero 2012, 22:29 »

Si,no aparecio ningun problema especificamente el programa lo estoy haciendo en C con DEV-C++ 4.9.9.2 sin utilizar
Código
#include <string.h>.
En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Imprimir una sola vez el mensaje en C
« Respuesta #8 en: 3 Febrero 2012, 22:33 »

Pues yo utilizo la misma versión de tu compilador (DEV-C++ 4.9.9.2), y sin usar esa librería no me compila bien xD (y, de hecho, en los manuales que tengo viene que es necesario usar dicha librería...)
En línea
Jlrr

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Imprimir una sola vez el mensaje en C
« Respuesta #9 en: 3 Febrero 2012, 22:44 »

Que raro no sabia que se necesitaba esa libreria para usar strcmp en esta versión,aunque el DEV-C++ en si lo consegui de una pagina de mi centro de estudios puede que lo hayan alterado o cambiado algo aunque tambien he visto que esta versión actua diferente segun el sistema operativo cuando lo uso en XP en mas facil que cuando lo uso con windows 7,se traba menos.
En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Imprimir una sola vez el mensaje en C
« Respuesta #10 en: 4 Febrero 2012, 00:53 »

La forma mas sencilla de realizar la operación es utilizando al contador como bandera de estado, de esta forma:
Código
for (i = 0; i < m; i++)
  if (strcmp(nom, P[i].Nombre) == 0)
     break;
if (i != m)
  printf("%s esta en la base de datos\n", nom);
else
  printf("%s no esta en la base de datos\n", nom);

----

En cuanto al prototipo de las funciones: se recomienda por "buenos modales" y en ciertos casos es obligatorio (por ejemplo con funciones variadicas).

Cuando no se tiene acceso al prototipo de una función se infiere este en base a la primera llamada asumiendo:

1) La función retorna un valor de tipo "signed int".
2) El numero y tipo de argumentos esta dado exactamente en la llamada.

En el caso de DickGumshoe la única llamada a "strcmp" es:
Código:
strcmp(nom,P[i].Nombre) == 0
Y como esta coincide con su prototipo no hay problema.

Pero si se tratara de una función que retorna algún otro tipo de valor (por ejemplo un "double") o una de las funciones printf/scanf/etc si seria un error.

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
MI PC se apaga sola.... « 1 2 »
Hardware
LiBr@_girL 26 2,213 Último mensaje 4 Agosto 2005, 23:03
por LiBr@_girL
2 AP una sola red
Hacking Wireless
keroberos 13 2,642 Último mensaje 9 Septiembre 2005, 01:57
por keroberos
Se Reinicia Sola
Hardware
jorgeneo560 2 297 Último mensaje 27 Diciembre 2005, 01:56
por Carlosnuel
Ni una sola IV « 1 2 »
Hacking Wireless
droverto 18 965 Último mensaje 18 Julio 2006, 19:27
por longits
Como imprimir un .pdf que no te deja imprimir?
Windows
nichihack 7 5,542 Último mensaje 12 Noviembre 2009, 19:20
por Saphir
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines