20 octubre 2006

Simplificando un problema con funciones.



Simplificación de un problema.

En el problema del 12 de octubre en donde teniamos que evaluar la edad y dependiendo la edad le corresponderia pagar un descuento. Utilizaremos este código para ejemplificar el uso de Funciones.
...
if (edad >=5 && edad <= 14)
{
cat1 = cat1 + (boleto*.35F);
pago = boleto - (boleto*.35F);
Console.WriteLine ("Total a pagar: {0}",pago);
}
...


Vemos que esta porción de código se tiene que repetir por cada categoría. Vamos a modularizar este código de tal forma que lo podamos reutilizar para cada caso.

static float evaluaredad (float porciento, float acumulador,int vboleto)

{float pago;
acumulador=acumulador+(vboleto*porciento);
pago= vboleto-(vboleto*porciento);
Console.WriteLine("total a pagar:{0}",pago);
return acumulador;
}

Este código queda posicionado dentro de la clase principal, de tal forma que lo podamos reutilizar las veces requeridas.
La función regresa un valor y recibe 3 valores. Regresa el el valor del acumulador despues de haber sumado el descuento dado al cliente. Recibe 3 parametros, el descuento aplicado segun la categoria, el valor actual del acumulador dentro de la funcion principal y el valor del boleto.

using System;

namespace kungfuciones
{

class Class1
{
static float evaluaredad (float porciento, float acumulador,int vboleto)
{float pago;
acumulador=acumulador+(vboleto*porciento);
pago= vboleto-(vboleto*porciento);
Console.WriteLine("total a pagar:{0}",pago);
return acumulador;
}


[STAThread]
static void Main(string[] args)
{
string opc;
int edad;
float cat1=0,cat2=0,cat3=0,cat4=0,cat5=0;
do
{
Console.WriteLine("dame la edad");
edad=int.Parse(Console.ReadLine());

if (edad>=5&&amp;amp;amp;edad<=14) cat1=evaluaredad(.35F,cat1,200); if (edad>=15&&edad<=19) cat2=evaluaredad(.25F,cat2,200); if (edad>=20&&edad<=45) cat3=evaluaredad(.10F,cat3,200); if (edad>=46&&edad<=65) cat4=evaluaredad(.25F,cat4,200); if (edad>65)
cat5=evaluaredad(.35F,cat5,200);
Console.WriteLine("hay mas clientes?si/no");
opc=Console.ReadLine();
}while ( opc=="si");
Console.WriteLine("en la categoria 1 se ahorraron los clientes {0}",cat1);
Console.WriteLine("en la categoria 2 se ahorraron los clientes {0}",cat2);
Console.WriteLine("en la categoria 3 se ahorraron los clientes {0}",cat3);
Console.WriteLine("en la categoria 4 se ahorraron los clientes {0}",cat4);
Console.WriteLine("en la categoria 5 se ahorraron los clientes {0}",cat5);
Console.ReadLine();


}
}
}

Este seria el resultado final en donde despues de evaluar cada caso de cada categoría mandamos llamar la funcion la cual hara el descuento y regresara el valor acumulado.

*Este programa fue contribución de nuestro compañero Luis Garcia, Gracias por su contribución

19 octubre 2006

Video Turorial Funciones

1.- Funcion que no regresa ni recibe valor
2.- Funcion que no regresa pero recibe valor


Problemas con Funciones

  1. Escribir una funcion que realicen una entrada controlada de datos de forma que sólo admita valores enteros positivos.
  2. Escribir una función que tenga como parámetro un número entero y que devuelva 1 si el valor de número es par y 0 si es impar. Construir un programa que pruebe dicha funcíón.
  3. Escribir una función que tenga como parámetro número entero y devuelva si número es primo o no lo es. Construir un programa que pruebe dicha funcion.
  4. Escribir una función que permita elevar un número en coma flotante a una potencia entera, esto es, que resuelva la fórmula y = xn. Construir un programa que pruebe dicha función.
  5. Escribir una función en C que reciba cuatro valores reales representado las coordenadas de dos puntos en el plano (x, y) y devuelva la distancia existente entre los dos puntos.
  6. Escribir una función que devuelva el menor de tres números reales.
  7. Escribir una función que reciba tres números reales y los devuelva ordenados de mayor a menor.
  8. Dado un numero N que filtraremos a que sea positivo, escribir un programa que nos diga cuál es el numero primo más cercano a él por debajo. Hacer este programa usando la función primo construida (problema no. 3).
  9. Dado un numero N leído por teclado encontrar el numero P primo mas cercano a él por exceso. Hacer este programa usando la función primo construida.
  10. Genera un programa que simule un juego de adivinanzas de números del sgte. modo:
• Se genera un número al azar entre 1 y 15(función random)
• El jugador da al programa el número a comprobar y el programa contesta “te pasas” ó “no llegas” según el número esté por encima ó por debajo del numero clave.
• El número máximo de intentos es 7.

Tipos de Funciones o Modulos en C#

En esta sección vamos a ver los 4 tipos principales de Funciones.
  1. Funcion que no recibe y no regresa valor
  2. Funcion que recibe y no regresa valor
  3. Funcion que no recibe y regresa valor
  4. Funcion que recibe y regresa valor
Nuestras Funciones o Modulos las declararemos dentro de la clase Principal (Class1).

class Class1
{
static void Mifuncion()
{
//Elementos de la funcion
}
static void Main()
{
//elementos de la funcion principal
}
}

Ejemplos de los 4 tipos de Funcion


using System;

namespace Ej_Funciones
{
///
/// Summary description for Class1.
///

class Class1
{

//Funcion que no recibe ni regresa valor
static void Mensaje ()
{
for (int x = 0; x<10;x++)
Console.WriteLine (" {0} Hello World",x+1);
}
//Funcion que recibe pero no regresa
static void RecibeMensaje (string msj, int altura, int largo)
{ int area; area = altura*largo;
//Console.WriteLine ("Datos recibidos: "+msj+ " "+area.ToString());
Console.WriteLine ("Datos recibidos: {0} {1}",msj,area);
}
//Funcion que no recibe pero que si regresa variables
static int Regresavalor ()
{ int valorregresado = 100;
Console.WriteLine ("En mi funcion El valor que voy a regresar es una variable del tipo int: {0}",valorregresado);
return valorregresado;
}
//Funcion que recibe y regresa valor
static float Multiplica (float x, float y)
{ float producto;
producto = x*y;
return producto;
}


[STAThread]
static void Main(string[] args)
{
string msjPrin;
int altura = 10, largo =4;
int valorRecibido;
// Mando llamar la funcion que no recibe ni regresa valor
Mensaje ();
Console.WriteLine ("Escribe el Mensaje: ");

// Capturo la variable msjPrin la cual voy a enviar a la funcion para que la imprima en pantalla
msjPrin = Console.ReadLine ();
RecibeMensaje (msjPrin,altura, largo);

//Aqui mando llamar la funcion que regresa valor pero no recibe.
valorRecibido=Regresavalor ();
Console.WriteLine ("en la func principal: Este es el valor que recibo: {0}", valorRecibido);

// Este ejemplo nos permite ver que la funcion que llamamos realiza una operacion a traves de dos valores que le enviamos del tipo float. La funcion realiza una multiplicacion y nos resgresa el resultado y en nuestra funcion principal la mandamos imprimir.
float x, y;
Console.WriteLine ("Dame el primer valor:");
x= float.Parse (Console.ReadLine ());

Console.WriteLine ("Dame el segundo valor:");
y= float.Parse (Console.ReadLine ());

Console.WriteLine ("El producto de la multiplicacion es la siguiente {0}", Multiplica (x,y));
Console.ReadLine ();

}
}
}
Notas: Es importante aclarar que las variables que declaremos dentro de nuestras funciones son independientes de las variables declaradas dentro de la funcion principal main( ). Quiere decir que la vida de las variables solo existiran mientras se esten ejecutando las funciones.

18 octubre 2006

Funciones

Introducción

Una de las formas más adecuadas de resolver un problema de programación consiste en descomponerlo en subproblemas. A cada uno de ellos se le asocia una función que lo resuelve, de tal modo que la solución del problema se obtiene por medio de llamadas a funciones. A su vez, cada función puede descomponerse en subfunciones que realicen tareas más elementales, intentando conseguir que cada función realice una y sólo una tarea.


En Lenguaje C# una función se define de la siguiente forma:

tipo NombreFunción (parámetros formales)
{
...
cuerpo de la función
...
}

Al manejar funciones en C debemos tener en cuenta que a una función sólo se puede acceder por medio de una llamada. Nunca se puede saltar de una función a otra mediante una sentencia goto. Tampoco está permitido declarar una función dentro de otra.

En C, a diferencia de otros lenguajes, como Pascal, no existe distinción entre funciones y procedimientos. Por ello, una función puede estar o no dentro de una expresión. Si la función devuelve un valor, son válidas sentencias del tipo:

a = b * funcion (c, d);

Pero también podemos encontrar funciones solas en una línea de programa,

funcion (a, b, c);

incluso aunque la función devuelva algún valor. En ese caso la función realizaría la tarea encomendada y el valor devuelto se perdería. Esto no provoca ningún error.

Por último, hemos de tener en cuenta que, aunque una función puede formar parte de una expresión compleja, nunca se le puede asignar un valor. Por tanto, es incorrecto escribir sentencias como

funcion () = variable;

que sería tan improcedente como escribir

5 = variable;

El único método para que una función reciba valores es por medio de los parámetros formales.


Argumentos de funciones

Los parámetros formales son variables locales que se crean al comenzar la función y se destruyen al salir de ella. Al hacer una llamada a la función los parámetros formales deben coincidir en tipo y en número con las variables utilizadas en la llamada, a las que denominaremos argumentos de la función. Si no coinciden, puede no detectarse el error. Esto se evita usando los llamados prototipos de funciones que estudiaremos más adelante, en este capítulo.

Los argumentos de una función pueden ser:

• valores (llamadas por valor)
• direcciones (llamadas por referencia)

Llamadas por valor

En las llamadas por valor se hace una copia del valor del argumento en el parámetro formal. La función opera internamente con estos últimos. Como las variables locales a una función (y los parámetros formales lo son) se crean al entrar a la función y se destruyen al salir de ella, cualquier cambio realizado por la función en los parámetros formales no tiene ningún efecto sobre los argumentos. Aclaremos esto con un ejemplo.

static void intercambia (int x, int y)
{
int aux;

aux = x;
x = y;
y = aux;
}



void main ()
{
int a = 3, b = 4;

intercambia (a, b);
printf ("\nValor de a: %d - Valor de b: %d", a, b);
}





17 octubre 2006

Que se tomó en cuenta en la evaluación del 1er Parcial.

* Para la evaluación de los parciales se toma en cuenta lo siguiente:

20% tareas
10% participacion
70% examen
___________
100% Final

En el examen se tomó en cuenta:
1.- La lógica del programa
2.- Relizar los debidos Contadores y acumuladores
3.- Ciclos
4.- Condiciones de salida y restriccion de edad
5.- Mostrar toda la información al final del programa


Nota * AL PRINCIPIO DEL CURSO SE ESTABLECIO.

16 octubre 2006

Resultados 1er. Parcial

Los que quieran los resultados favor de enviar correo a
dgallo@uabc.mx
O si estan a favor de publicarlos por este medio, envien sus correos.