Proyecto para todos ( MINI - PROYECTOS )

Responder
Mensaje
Autor
WaRc3L
Mensajes: 199
Registrado: 12/06/2008 12:27 pm
Ubicación: en el registro de la CPU

#46 Mensaje por WaRc3L » 18/08/2008 12:14 pm

WaRc3L escribió: Buenas! espero que alguien este por aqui... incluido polly,

es sobre la funcion leer_opcion(int *opcion);

como puedo pedir el valor, si se pasa como parametro?, puedo pedir la opcion desde el menu, y despues pasarsela como parametro de leer_opcion y despues que la comprueve dicha funcion? esque si no lo hago asi, no se como puedo pedir el valor si esta como parametro.. Me explico:

Para poder pasar el parametro, necesito el valor no? y el cometido dice que tengo que pedir una opcion del menu.
Problema solucionado!
ToDos PoDeMoS CoMpaRTiR La Luz De La BoMBiTa!

Avatar de Usuario
v4r3t
Mensajes: 103
Registrado: 06/03/2007 12:00 am

#47 Mensaje por v4r3t » 18/08/2008 1:33 pm

¿Qué os parece hacer una función global para comprobar si el operando introducido es un número y no contiene otro carácter? En cada interfaz habría que comprobarlo, con lo cual no vamos a hacer todos lo mismo 4 veces, sería redundante.
-=v4r3t=-

WaRc3L
Mensajes: 199
Registrado: 12/06/2008 12:27 pm
Ubicación: en el registro de la CPU

#48 Mensaje por WaRc3L » 18/08/2008 2:35 pm

es una buena idea... pero por ejemplo en el caso de dividir, el segundo operando no tiene que ser 0, en cambio la de sumar, puede tener un 0 perfectamente, y no solo eso,ademas cadascuno tendria poquito trabajo por hacer, y uno tendria que comprovar la entrada de numeros...

Saludos!!
ToDos PoDeMoS CoMpaRTiR La Luz De La BoMBiTa!

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#49 Mensaje por polly » 18/08/2008 2:55 pm

Lo de comprobar 4 veces es redundante si, pero he tratado de dividir el programa en distintas funciones que lo hagan todo, y hacer lo menos posible en "main", no se si me explico. Para asi solo tener que juntar los codigos de la gente .
enrmarc

Avatar de Usuario
v4r3t
Mensajes: 103
Registrado: 06/03/2007 12:00 am

#50 Mensaje por v4r3t » 19/08/2008 8:59 am

Yo tengo una duda para comprobar si los operandos son válidos. En el scanf() si meto cualquier caracter que no sea un número, no lo pilla, es decir: si meto "34r/67" en el operando se almacena sólo 34, así que entonces no sé como comprobarlo, no sé si me entendéis.
-=v4r3t=-

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#51 Mensaje por polly » 19/08/2008 9:13 am

Yo tengo una duda para comprobar si los operandos son válidos. En el scanf() si meto cualquier caracter que no sea un número, no lo pilla, es decir: si meto "34r/67" en el operando se almacena sólo 34, así que entonces no sé como comprobarlo, no sé si me entendéis.
Creo que se podrian utilizar las funciones de ctype.h
http://c.conclase.net/librerias/libreria.php?lib=ctype
enrmarc

Avatar de Usuario
v4r3t
Mensajes: 103
Registrado: 06/03/2007 12:00 am

#52 Mensaje por v4r3t » 19/08/2008 9:16 am

pero esas funciones toman como argumento un char, y yo los operandos son double.
-=v4r3t=-

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#53 Mensaje por polly » 19/08/2008 1:00 pm

mm es verdad, no lo habia pensado, ahora mismo no se me ocurre una forma para solucionarlos, prueba preguntando en la seccion de C/C++ de este foro, haber si los que mas saben nos pueden ayudar xd


S2
enrmarc

Avatar de Usuario
v4r3t
Mensajes: 103
Registrado: 06/03/2007 12:00 am

#54 Mensaje por v4r3t » 19/08/2008 1:02 pm

Bueno, aquí está lo mío.

interfaz_suma

Código: Seleccionar todo

void interfaz_suma (double *operando1, double *operando2)
{
	printf("\n[+] 1er operando: ");
	scanf("%lf",operando1);
	printf("                  +");
	fflush(stdin);
	printf("\n[+] 2do operando: ");
	scanf("%lf",operando2);
}
suma

Código: Seleccionar todo

double suma(double operando1, double operando2)
{
	return operando1 + operando2;
}
Pero vamos, cualquier objeción, algo que se me haya pasado, comunicádmelo.
-=v4r3t=-

WaRc3L
Mensajes: 199
Registrado: 12/06/2008 12:27 pm
Ubicación: en el registro de la CPU

#55 Mensaje por WaRc3L » 19/08/2008 3:34 pm

polly escribió:mm es verdad, no lo habia pensado, ahora mismo no se me ocurre una forma para solucionarlos, prueba preguntando en la seccion de C/C++ de este foro, haber si los que mas saben nos pueden ayudar xd

Bueno!, una cosa... hay una funcion, que sirve para comprovar si los numeros son digitos, y lo que retorna es un 0 o 1 si es falso o verdadero ( o al reves ), y creo que la funcion acepta int y doubles en los parametros ( gracias a la libreria de polly ) se llama isdigit()

Saludos!
ToDos PoDeMoS CoMpaRTiR La Luz De La BoMBiTa!

WaRc3L
Mensajes: 199
Registrado: 12/06/2008 12:27 pm
Ubicación: en el registro de la CPU

#56 Mensaje por WaRc3L » 19/08/2008 3:40 pm

Bueno! veo que la gente va empezando dar el trabajo... voy a poner el mio!

menu:

Código: Seleccionar todo

void menu(void)
{
    printf("\t Que quiere hacer?\n\n");
    printf("\t 1.- Sumar\n");
    printf("\t 2.- Restar\n");
    printf("\t 3.- Multiplicar\n");
    printf("\t 4.- Dividir\n");
    printf("\t 5.- Salir\n\n");
    printf("\t Opcion: ");
}
leer_dato:

Código: Seleccionar todo

void leer_opcion(int *opcion)
{
    scanf("%d",opcion);

    if ( *opcion < 1 || *opcion > 5 )
    {
	printf("La opcion que escogio, no es correcta ( 1 - 5 )\n\n\a");
    }
    else
    {
      printf("\tOpcion Correcta\n\n");
    }
}
Si no es lo que esperavais... por favor comentadmelo, yo de momento no veo ningun fallo.

Saludos!, hos recuerdo que es mi primer programa en C (solo hacia servir C++)
ToDos PoDeMoS CoMpaRTiR La Luz De La BoMBiTa!

Avatar de Usuario
cheroky
Mensajes: 2571
Registrado: 22/09/2005 11:00 pm
Ubicación: Valladolid (España)

#57 Mensaje por cheroky » 19/08/2008 4:19 pm

v4r3t escribió:Yo tengo una duda para comprobar si los operandos son válidos. En el scanf() si meto cualquier caracter que no sea un número, no lo pilla, es decir: si meto "34r/67" en el operando se almacena sólo 34, así que entonces no sé como comprobarlo, no sé si me entendéis.
La forma mas segura y robusta es tomar la entrada como array de caracteres con la función fgets, procesarla (comprobar caracteres no validos) y hacer la conversión con la funcion strtof o strtod.


S2.
Imagen

Avatar de Usuario
v4r3t
Mensajes: 103
Registrado: 06/03/2007 12:00 am

#58 Mensaje por v4r3t » 19/08/2008 5:37 pm

Ok, de todas maneras me confundí diciendo que las funciones de ctype admitían argumentos tipo char, lo que admiten son int. Voy a probar lo que dice cheroky.
-=v4r3t=-

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#59 Mensaje por polly » 20/08/2008 5:20 am

WaRc3L la funcion menu esta bien, pero la leer_opcion tendria que repetirse si la opcion no es valida, es decir , pedir la opcion hasta que sea valida
enrmarc

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#60 Mensaje por polly » 20/08/2008 6:39 am

Mi parte:

Código: Seleccionar todo

void interfaz_resta (double *op1, double *op2)
{
		char operador1[16];
		int valido = 0;
		int i;

		while (!valido)
		{
				puts  ("Introduzca el primer operando: ");
				fgets (operador1, 16, stdin);
			
				for (i = 0; i < strlen(operador1) && !valido; i++)
				{
						valido = isdigit(operador1[i]);
				}
		}

		*op1 = atof (operador1);

		valido = 0;
	
		while (!valido)
		{
				puts  ("Introduzca el segundo operando: ");
				fgets (operador1, 16, stdin);
			
				for (i = 0; i < strlen(operador1) && !valido; i++)
				{
						valido = isdigit(operador1[i]);
				}
		}

		*op2 = atof (operador1);

				
}

Código: Seleccionar todo

double resta (double op1, double op2)
{
		return op1 - op2;
}
[/code]
enrmarc

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado