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

Dos programas que ya me traen loco

Estas en el tema de Dos programas que ya me traen loco en el foro de C/C++ en Foros del Web. Hola a todos. Estoy haciendo dos programas y por más que intento no consigo que me funcionen del todo como yo quiero. Ya tengo la ...

  #1 (permalink)  
Antiguo 16/12/2006, 11:26
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Dos programas que ya me traen loco

Hola a todos.

Estoy haciendo dos programas y por más que intento no consigo que me funcionen del todo como yo quiero. Ya tengo la mente tan enredada que no se que hacer. (Pongo sólo el primer programa en este post porques si no se va a hacer muy grande)

En el primer programa hay que introducir una clave de 4 digitos por teclado (seria importante que se viera como *). Luego el usuario debe entrar una clave para comparar con la otra y que nos vaya ayudando a conseguir la clave correcta, diciendonos cuantos digitos hemos acertado y cuantos estan en la clave pero desornadados (en el codigo se ve mejor que explicado con palabras). Yo uso dos bucles for para ir comparando cada caracter de la primera contraseña con los de la segunda. Pero no se como hacer para que una vez encontrados dos caracteres iguales me pare de contar el resto como desordenados. El código es este:

#include <stdio.h>
#include<conio.h>
#define N 4

int error (char cadena[N]) {
int i, j;
for (i=0; i<N; i++) {

//CARACTERES ERRONEOS
if ((cadena[i]!='1') && (cadena[i]!='2') && (cadena[i]!='3') &&
(cadena[i]!='4') && (cadena[i]!='5') && (cadena[i]!='6') && (cadena[i]!='7')
&& (cadena[i]!='8') && (cadena[i]!='9') && (cadena[i]!='0')) {
printf("La clave es numerica.\n");
printf("Intentalo otra vez.\n");
return 1;
}
}
return 0;
}
int desordenados_ (char propuesta[N], char clave[N]) {
int i, j, desordenados=0;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
if (clave[i]==propuesta[j] && i!=j)
desordenados++;
if (desordenados) printf("Hay %d numeros desordenados en la clave.\n", desordenados++);
//else printf("No hay numeros desordenados en la clave.\n");
return desordenados;
}

int aciertos_ (char propuesta[N], char clave[N]) {
int i, aciertos=0;
for (i=0; i<N; i++)
if (clave[i]==propuesta[i])
aciertos++;
if (aciertos) printf("Hay %d aciertos.\n", aciertos);
else printf("No hay aciertos.\n");
return aciertos;
}

int main() {
char cl[N+1], pr[N+1];
int i, aciertos, desordenados;

do {
printf("Escribe la clave que se ha de adivinar (4 digitos): ");
gets(cl);



} while (error(cl));
printf("\n\n");

while (aciertos!=4) {
do {
printf("\nEscribe tu propuesta: ");
gets(pr);
} while (error(pr));
desordenados=desordenados_(pr, cl);
aciertos=aciertos_(pr, cl);
}

if (aciertos==4) printf("\nAcertaste!\n");
return 0;
}
  #2 (permalink)  
Antiguo 17/12/2006, 05:19
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

Cual se supone que es tu problema, pues el programa, compila bien y al parecer también funciona bien, el único detalle que veo es ese ++ al imprimir desordenados.
Cuando mencionas que pare, es que si encuentra coincidencias no tiene que mostrar los desordenados o que?
  #3 (permalink)  
Antiguo 17/12/2006, 05:26
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Hola.

Mira te pongo un ejemplo para que lo veamos los dos mejor.

Si introduces la clave: 1111
Y como propuesta: 1111

Muestra por pantalla que ha habido 4 aciertos y 12 que están desordenados!!! Esos 12 tendrían que ser 0 puesto que he acertado la clave.

Otro ejemplo.

Clave: 1123
Propuesta: 3211

Salida: 6 desordenados; 0 aciertos

En este ejemplo los aciertos los pone bien pero los desordenados deberían ser 4.

El problema se presenta cuando metes una clave con numeros repetidos. Pero no se como solucionarlo.
  #4 (permalink)  
Antiguo 17/12/2006, 05:40
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

la solucion puede ser facil, cual es tu idea?
mira.
se puede interrumpir como tu mecionas, pero aun asi no se resuelve el problema.
  #5 (permalink)  
Antiguo 17/12/2006, 05:49
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Mi idea. No tengo ni idea de como hacer para que no me repita los ordenados. Ya le he dado un montón de vueltas.

La idea sería que cuando vaya recorriendo ambas cadenas y encuentre dos numeros iguales se pare. Pero vamos, que no veo como hacerlo.
  #6 (permalink)  
Antiguo 17/12/2006, 06:34
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

para detener el bucle puedes usar, justo despues de incrementar la variable desordenados un break;
esto se sacara del segundo bucle, mas no del primero, y te permitira continuar con el siguiente numero.
pero ademas tienes que verificar que una repeticion es repeticion solo si no es coincidencia.
  #7 (permalink)  
Antiguo 17/12/2006, 06:53
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

¿Te refieres ahí?

int desordenados_ (char propuesta[N], char clave[N]) {
int i, j, desordenados=0;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
if (clave[i]==propuesta[j] && i!=j)
desordenados++;
break;
if (desordenados) printf("Hay %d numeros desordenados en la clave.\n", desordenados++);

//else printf("No hay numeros desordenados en la clave.\n");
return desordenados;

}
  #8 (permalink)  
Antiguo 17/12/2006, 06:55
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

si, pero esto lo resolvera a medias, aun falta el otro detalle mencionado , en realidad es facil, solo piensalo un poco.
  #9 (permalink)  
Antiguo 17/12/2006, 09:10
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Antes de postear le había dado un montón de vueltas. Se lo que falla pero, gracias a mis escasos conocimientos de C, no se cómo plasmarlo en el código. Que impotencia, madre.
  #10 (permalink)  
Antiguo 17/12/2006, 17:35
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Haber, de entrada, crees que esta condicion algun dia se va a cumplir???
if ((cadena[i]!='1') && (cadena[i]!='2') && (cadena[i]!='3') && (cadena[i]!='4') && (cadena[i]!='5') && (cadena[i]!='6') && (cadena[i]!='7') && (cadena[i]!='8') && (cadena[i]!='9') && (cadena[i]!='0'))

Yo diria que no.
Mas bien tendrias que hacer un or (||). No se cual sea tu proposito, pero es lo que supongo.

ahora hay algo que pues no se si es parte de tu funcion pero
en
if (clave[i]==propuesta[j] && i!=j)
i!=j como que no valdria mucho.
si pones eso y j==i entonces estaras omitiendo una calve correcta ordenada.
digo, igual y tu lo quieres asi, pero no parece muy logico.

Por ultimo quita esta linea:
if (aciertos==4)

esta de mas.

SAludos
  #11 (permalink)  
Antiguo 17/12/2006, 18:07
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Se nota que no lo has compilado, porque la condición se cumple perfectamente.

Y el i!=j si que es necesario porque ahi estamos tratando los desordenados.

Al poner i!=j quitamos 4 al resultado de los desordenados que corresponde a los aciertos en la clave. Si quitásemos esa condición aparecerían 16 desordenados que son las combinaciones con repetición que se pueden obtener con 2 claves de 4 dígitos cada una.
  #12 (permalink)  
Antiguo 17/12/2006, 18:55
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Cita:
Se nota que no lo has compilado, porque la condición se cumple perfectamente.
Tienes razon, habia confundido los desiguales con iguales. Mi error.

Cita:
Y el i!=j si que es necesario porque ahi estamos tratando los desordenados.
Yo no te dije que estaba mal, solo que no se me hacia logico, si asi es tu programa adelante.

Cita:
Si quitásemos esa condición aparecerían 16 desordenados que son las combinaciones con repetición que se pueden obtener con 2 claves de 4 dígitos cada una.
Podria ser... pero algo no me gusta ahi....tendria que revisarlo con mas detalle

Ahora, que problema mas tieneS?

Saludos
  #13 (permalink)  
Antiguo 17/12/2006, 19:01
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

No, si no tengo ningún problema más. Sólo eso que me cuenta más desordenados de os que son. El máximo debería estar en 4 (p.e 1234 y 4321).

Bueno, una cosa si, el usuario tendría que tener 5 intentos para acertar la clave y si al escribirla se imprimieran **** para que no se viera la clave el programa estarí más completo.

Saludos.
  #14 (permalink)  
Antiguo 17/12/2006, 19:05
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Cita:
Iniciado por Nevhazovat Ver Mensaje
No, si no tengo ningún problema más. Sólo eso que me cuenta más desordenados de os que son. El máximo debería estar en 4 (p.e 1234 y 4321).

Bueno, una cosa si, el usuario tendría que tener 5 intentos para acertar la clave y si al escribirla se imprimieran **** para que no se viera la clave el programa estarí más completo.
No es posible con las funciones de ANSI-C.

¡Ah! Borra #include <conio.h>
  #15 (permalink)  
Antiguo 17/12/2006, 19:07
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Como no va a ser posible. Tiene que serlo. C e sun lenguaje muy rico.
  #16 (permalink)  
Antiguo 17/12/2006, 19:11
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Cita:
Iniciado por Nevhazovat Ver Mensaje
Como no va a ser posible. Tiene que serlo.
Piensa lo que quieras :)

Cita:
C e sun lenguaje muy rico.
Al revés, C es de los lenguajes más pequeños que existen.
  #17 (permalink)  
Antiguo 17/12/2006, 19:17
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

En que te basas para decir que no e posible hacer el programa en C.
  #18 (permalink)  
Antiguo 17/12/2006, 19:38
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

¿Qué te parece esto?

Código:
int desordenados_ (char *propuesta, char *clave) { 
int i=0, j=0, desordenados = 0; 
    
    while(i < N) { 
            if (clave[i]!=propuesta[j]) 
                desordenados++; 
            j++; 
            i++; 
    } 
    
    if (desordenados) 
        printf("Hay %d numeros desordenados en la clave.\n", desordenados++); 
return desordenados;
  #19 (permalink)  
Antiguo 17/12/2006, 21:05
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Para los asteriscos mejor usa alguna libreria como la de windows(windows.h) para hacer eso. Y tenlo ligermanete aislado.

C es muy rico por las librerias estandar y no estandar(pero portables), no por cosas como conio.h.

hay algunas maneras de hacer ese efecto de los asteriscos, pero ningun de esats es posible con el estandar ansi C

SAludos
  #20 (permalink)  
Antiguo 18/12/2006, 01:11
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Cita:
Iniciado por Nevhazovat Ver Mensaje
En que te basas para decir que no e posible hacer el programa en C.
En mi conocimiento del ANSI-C de más de 4 años de experiencia.
  #21 (permalink)  
Antiguo 20/12/2006, 15:05
 
Fecha de Ingreso: diciembre-2006
Mensajes: 13
Antigüedad: 17 años, 4 meses
Puntos: 1
Re: Dos programas que ya me traen loco

Bueno para lo que planteo con los asteriscos es usar la funcion getch de conio.h para que asi no muestre las teclas digitadas, a continuación imprimis el caracter * o cualquier otro como para disfrazar el proceso --"que paresca encriptación tal vez? jej"-- (todo esto en un ciclo for con cada caracter).
Tambien te sugerí algunos cambios en el codigo (detalles menores) que bueno no creo tan necesario explicarlos.
Igualmente te felicito por el codigo esta bastante bueno. (fijate los detalles menores que haya obviado--> todos estamos aca para aprender :) ).

Código:
#include <stdio.h>
#include<conio.h>
#define N 4

int error (char cadena[N])
{
	int i;

	for (i=0; i<N; i++) 
	{	
		//CARACTERES ERRONEOS
		if ((cadena[i]>='0') && (cadena[i]<='9')) // toma un rango de 0 a 9
		{
			printf("La clave es numerica.\n");
			printf("Intentalo otra vez.\n");
			return 1;
		}
	}
	return 0;
}

int desordenados_ (char propuesta[N], char clave[N]) {
	int i, j, desordenados=0;
	for (i=0; i<N; i++)
		for (j=0; j<N; j++)
			if (clave[i]==propuesta[j] && i!=j)
				desordenados++;

			if (desordenados) 
				printf("Hay %d numeros desordenados en la clave.\n", desordenados++);
			//else printf("No hay numeros desordenados en la clave.\n");
			return desordenados;
}

int aciertos_ (char propuesta[N], char clave[N])
{
	int i, aciertos=0;

	for (i=0; i<N; i++)
		if (clave[i]==propuesta[i])
			aciertos++;

		if (aciertos)
			printf("Hay %d aciertos.\n", aciertos);
		else
			printf("No hay aciertos.\n");

		return aciertos;
}

int main() 
{
	char CLAVE[N+1], PROP[N+1], cnulo;
	int  aciertos, desordenados, i;
	
//	do { No hace falta

	printf("Escribe la clave que se ha de adivinar (4 digitos): ");

	for(i=0;i<N;i++)
	{
		//gets(CLAVE);
		CLAVE[i]=getch(); // ya que usas la conio.h
		printf("*");
	}
	CLAVE[i]='\0';

	cnulo=getch();// para corregir el error del
	getc(stdin);// caracter que queda...
		
		
//	}
	if(error(CLAVE));
		printf("\n\n");
	
	while (aciertos!=4) // Si o si hay que acertar? :) 
	{					//Le agregaria un contador para que despues de tantas veces salga
// no hace falta do {
			printf("\nEscribe tu propuesta: ");
			gets(PROP);
//		}
		if (error(PROP));//while
			desordenados=desordenados_(PROP, CLAVE);
		aciertos=aciertos_(PROP, CLAVE);
	}
	
	if (aciertos==N) // si cambias la constante el nro 4 no te sirve...
		printf("\nAcertaste!\n");
	return 0;
}
  #22 (permalink)  
Antiguo 20/12/2006, 16:45
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Gracias Aprendiz-DAO por lo de los asteriscos.
  #23 (permalink)  
Antiguo 20/12/2006, 17:03
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Cita:
Iniciado por Aprendiz-DAO Ver Mensaje
Bueno para lo que planteo con los asteriscos es usar la funcion getch de conio.h para que asi no muestre las teclas digitadas, a continuación imprimis el caracter * o cualquier otro como para disfrazar el proceso --"que paresca encriptación tal vez? jej"-- (todo esto en un ciclo for con cada caracter).
No, no y no. ¿Cuántas veces habrá que repetirlo?

conio.h NO existe en ANSI C.
  #24 (permalink)  
Antiguo 22/12/2006, 11:05
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 10 meses
Puntos: 28
Re: Dos programas que ya me traen loco

Por ahi he visto muchas personas que han portado la libreria conio.h a linux asi que no deberias tener mayores problemas por ello, ahora bien si la idea es mantenerse dentro de lo que dicta el estándar, no te sirve de nada...Eso el algo que deberias especificar en tu post, si tienes libertar de usar las librerias que quieras o las propias que incluya el compilador
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #25 (permalink)  
Antiguo 22/12/2006, 11:33
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Yo estoy dando un curso de Ansi C pero no me hanpuesto ninguna restricción en cuanto a las librerías. De hecho utilizamos conio.h habitualmente.
  #26 (permalink)  
Antiguo 22/12/2006, 12:28
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Cita:
Iniciado por _Lucifer_ Ver Mensaje
Por ahi he visto muchas personas que han portado la libreria conio.h a linux asi que no deberias tener mayores problemas por ello, ahora bien si la idea es mantenerse dentro de lo que dicta el estándar, no te sirve de nada...Eso el algo que deberias especificar en tu post, si tienes libertar de usar las librerias que quieras o las propias que incluya el compilador
Di que sí, contradícenos con bobadas.

conio.h es de Borland C (MS-DOS), y es inexistente en C.

Que haya "ports" a Windows o Linux, es irrelevante. Y en cualquier caso, para hacer lo que se necesita ya está la API de Windows y ncurses de Linux.

Última edición por MaxExtreme; 22/12/2006 a las 12:36
  #27 (permalink)  
Antiguo 22/12/2006, 12:29
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Cita:
Iniciado por Nevhazovat Ver Mensaje
Yo estoy dando un curso de Ansi C pero no me hanpuesto ninguna restricción en cuanto a las librerías. De hecho utilizamos conio.h habitualmente.
Si utilizáis conio.h, no es ANSI C.

Díselo a tus profesores que lo que dan no es ANSI C, y os están engañando.
  #28 (permalink)  
Antiguo 22/12/2006, 12:34
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Como sea.
Si aprendes a no usar conio.h y cosas de esas tu como programador tendras mas calidad en tus codigos ya que se aferran al estandar y cualquier programador y compilador los entendera sin mayor problemas.

Saludos
  #29 (permalink)  
Antiguo 22/12/2006, 12:36
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Bueno, yo solo soy un iniciado en C. Si no hago caso a mis profesores, no se a quien entonces.
  #30 (permalink)  
Antiguo 22/12/2006, 12:41
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Bueno. Si no confias en tus profesores ni en nosotros(no deberias si no quieres) usa libros de programacion buenos. Busca libros sobre el estandar ANSI/ISO C y mucho despues de C++.

Yo nunca tuve un maestro de programacion, todo lo que se fue leyendo y programando, siempre usando el estandar C.
Afortunadamente yo comence con un compilador de ANSI C por lo que conio.h y esas cosas no eran una opcion a usar.

Y ten cuidado con los tutoriales en internet porque generalmente estan hehcos por personas como tus profesores.
En mi caso solo el tutorial de C con clase fue el que realmente me sirvio.
Todos los demas me decian por todos lados que usara conio.h

Ahi le veras tu.

Saludos
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 13:31.