Documente Academic
Documente Profesional
Documente Cultură
Computacin
Definicin
una funcin es un bloque de cdigo reconocido por un identificador que realiza un trabajo especfico.
Su propsito es dividir los programas en mdulos manejables separados (divide y vencers). El formato para la declaracin de funciones es:
tipo-devuelto nombre-de-funcin(lista-de-parmetros) { declaraciones e instrucciones }
Declaracin de funciones
Tradicionalmente en C se declaran como prototipos al inicio del programa. Despus se declara la funcin main, y despus se hace la declaracin formal de las funciones.
Tambin pueden declararse las funciones al inicio del programa y despus declarar la funcin main sin declarar prototipo.
Ejemplo de funcin
Nombre de la funcin
int main() { // repite 10 veces, calcula e imprime el cuadrado de x for ( int x = 1; x <= 10; x++ ) Llamada a la funcin cout << cuadrado( x ) << " "; cout << endl; return 0; Definicin de la funcin Parmetro con nombre } // definicin de la funcin cuadrado int cuadrado( int y ) //y es una copia del argumento de la funcin { return y * y; // devuelve el cuadrado de y como un int
Mayor de 3 nmeros
No se especifica el prototipo
double maximo( double x, double y, double z ) { double max = x; // asume que x es el mayor if ( y > max ) // si y es mayor, max = y; // asigna y a max if ( z > max ) // si z es mayor, max = z; // asigna z a max return max; // max es el mayor } int main() { double numero1; double numero2; double numero3; cout << "Introduzca tres numeros de punto flotante: "; cin >> numero1 >> numero2 >> numero3; // numero1, numero2 y numero3 son argumentos // de la funcin maximo cout << "El maximo es: " << maximo( numero1, numero2, numero3 ) << endl; return 0; }
Variable local
Ejemplos
Funcin para calcular el rea de una esfera:
float areaEsfera(float radio){ float PI = 3.14159265358979; return 4*PI*radio*radio; }
parmetro
Variables locales
Funcin para calcular el rea de un tringulo (usar math.h) float areaTriangulo(float a, float b, float c){ float s = (a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c)); parmetros }
prototipo
main(){
float r; cout << teclee el valor del radio: ; cin >> r; cout << el area de la esfera es << areaEsfera(r)<<endl; system(pause); } float areaEsfera(float radio){ float PI = 3.14159265358979; return 4*PI*radio*radio; }
prototipo
#include <iostream.h> #include <math.h> float areaTriangulo(float,float,float); main(){ float a,b,c; cout << "teclee el valor de los lados del triangulo: "; cin >> a >> b >> c; cout << "el area del triangulo es "<< areaTriangulo(a,b,c)<<endl; system("pause"); } float areaTriangulo(float a, float b, float c){ float s = (a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c)); }
Variable local
Tarea
Escriba una funcin que calcule el volumen de una caja con lados a, b y c.
Escriba dos programas para probar su funcin, uno que defina el prototipo de la funcin, la funcin main y despus defina la funcin y otro que defina la funcin antes de la funcin main sin usar el prototipo.
Tarea casera
En los siguientes problemas haga 2 versiones de los programas, una con prototipos y otra sin prototipos.
Escriba una funcin que calcule el rea de un cilindro. Los parmetros deben ser el radio y la altura del cilindro. Haga un programa que lea el radio y la altura del cilindro y calcule el rea utilizando la funcin definida.
Escriba una funcin que calcule la raz cbica de un nmero real. Utilice la funcin pow de la biblioteca math.h. Haga un programa para desplegar una tabla con las races cuadradas y cbicas de los nmeros de 1 a 20 para probar su funcin.
Ejemplos:
rand() % 6 - genera nmeros aleatorios entre 0 y 5 rand() % 6 +1 - genera nmeros aleatorios entre 1 y 6
return rand()%6+1;
}
No lleva parmetro
El programa anterior siempre genera la misma secuencia de valores. La funcin srand(semilla), permite establecer la semilla de los nmeros aleatorios para generar diferentes secuencias aleatorias.
Ejemplo de srand()
#include <iostream.h> #include <iomanip.h> // contiene prototipos para las funciones srand y rand #include <stdlib.h> int main(){ unsigned semilla; cout << "Introduzca semilla: "; cin >> semilla; srand( semilla ); // establece la semilla // ciclo de 10 repeticiones for ( int contador = 1; contador <= 10; contador++ ) { // toma un nmero aleatorio entre 1 y 6 y lo imprime cout << setw( 10 ) << ( 1 + rand() % 6 ); //si contador es divisible entre 5, inicia una nueva lnea if ( contador % 5 == 0 ) cout << endl; } // fin de for return 0; // indica terminacin exitosa } // fin de main
Algoritmo
1. Tirar dados 2. Si la suma es 7 o 11 3 Gana El jugador esta en uno de tres posibles estados: gana, pierde, continua. Podemos definir un nuevo tipo para registrar el estado mediante la sentencia: enum Status {CONTINUA, GANA, PIERDE};
8.
9. 10.
Tirar dados
Si suma = su numero gana
Status estadoJuego;
Para las pruebas de los posibles resultados es conveniente usar una sentencia switch.
#include <iostream.h> // contiene los prototipos de las funciones srand y rand #include <stdlib.h> #include <ctime>//contiene el prototipo de la funcin time int tiraDados( void ); int main(){ //enumeracin que represeta el estado del juego enum Status { CONTINUA, GANA, PIERDE }; int suma; int miPunto; Status estadoJuego;//puede contener CONTINUA, GANA o PIERDE //randomiza el generador de nmeros aleatorios srand( time( 0 ) ); suma = tiraDados(); // primer tiro de dados // prototipo de la funcin
// determine el estado del juego y la puntuacin en base a la suma de puntos del dado switch ( suma ) { // gana en el primer tiro case 7: case 11: estadoJuego = GANA; break; // pierde en el primer tiro case 2: case 3: case 12: estadoJuego = PIERDE; break; // recuerda puntos default: estadoJuego = CONTINUA; miPunto = suma; cout << "El punto es " << miPunto << endl; break; // opcional } // fin de switch
while ( estadoJuego == CONTINUA ) { suma = tiraDados(); // tira dados nuevamente // determina el estado del juego if ( suma == miPunto ) // gana por puntos estadoJuego = GANA; else if ( suma == 7 ) // pierde por obtener 7 estadoJuego = PIERDE; } // fin de while
// despliega mensaje de ganador o perdedor if ( estadoJuego == GANA ) cout << "El jugador gana" << endl; else cout << "El jugador pierde" << endl; return 0; // indica terminacin exitosa } // fin de main
int tiraDados( void ) { int dado1; int dado2; int sumaTrabajo; dado1=1+rand() % 6;//obtiene valor aleatorio del dado1 dado2=1+rand() % 6;//obtiene valor aleatorio del dado2 sumaTrabajo = dado1 + dado2;//suma dado1 y dado2 // despliega los resultados del tiro cout << "El jugador tiro " << dado1 << " + " << dado2 << " = " << sumaTrabajo << endl; return sumaTrabajo;// devuelve suma de los dados } // fin de la funcin tiraDados
Tarea
Escriba una funcin que genere nmeros aleatorios entre dos lmites cualesquiera. Los lmites deben ser los parmetros de la funcin.
Escriba un programa que utilice la funcin anterior y genere 10 nmeros aleatorios entre 30 y 50, 10 nmeros aleatorios entre 100 y1000 y 10 nmeros aleatorios entre -45 y -10. Asegrese que el programa genere siempre nmeros aleatorios distintos.
Reglas de alcance
Las variables tiene un alcance dentro del bloque en que son declaradas.
Esto permite que las variables dentro de funciones tengan el mismo nombre que las variables fuera de ellas.
#include <iostream.h> void usoLocal( void ); // prototipo de funcin void usoStaticLocal( void ); // prototipo de funcin void usoGlobal( void ); // prototipo de funcin int x = 1; // variable global int main() { int x = 5; // variable local a main cout << "x local en el alcance externo de main es " << x << endl; { // inicia nuevo alcance int x = 7; cout << "x local en el alcance interior de main es " << x << endl; } // finaliza nuevo alcance cout << "x local en el alcance externo de main es " << x << endl; usoLocal(); // usoLocal tiene x local usoStaticLocal(); // usoStaticLocal tiene x static local usoGlobal(); // usoGlobal utiliza x global usoLocal(); // usoLocal reinicializa su x local usoStaticLocal(); // static local x retiene su valor previo usoGlobal(); // x global retiene tambin su valor cout << "\nx local en main es " << x << endl; return 0; // indica terminacin exitosa } // fin de main
// usoLocal reinicializa la variable local x durante cada llamada void usoLocal( void ){ int x = 25; // inicialia cada vez que se llama a usoLocal cout<<endl<< "x local es "<<x<<" al entrar a usoLocal"<<endl; ++x; cout <<"x local es " << x<< " al salir de usoLocal" << endl; } // fin de la funcin usoLocal //usoStaticLocal inicializa a la variable static local x slo la // primera vez que se llama a la funcin; el valor de x se guarda // entre las llamadas a esta funcin void usoStaticLocal( void ){ // se inicializa la primera vez que se llama a usoStaticLocal. static int x = 50; cout<<endl<<"local static x es "<<x<<" al entrar a usoStaticLocal" << endl; ++x; cout<<"local static x es "<<x<<" al salir de usoStaticLocal"<<endl; } // fin de la funcin usoStaticLocal // usoGlobal modifica la variable global x durante cada llamada void usoGlobal( void ){ cout<<endl<< "x global es "<<x<< " al entrar a usoGlobal" << endl; x *= 10; cout<<"x global es "<<x<< " al salir de usoGlobal" << endl; } // fin de la funcin usoGlobal
56 56 91 0 -3224 100 62 12
int a[5]; a[0] = 4; a[1] = 0; a[2] = 5; a[3] = -2; a[4] = 8; tambin se puede int a[] = {4, 0, 5, -2, 8}; double m[8] = {3, 4, 6, 1}// m[4] a m[7] son cero
int x[100], i; for(i = 0; i<100 ; i++) x[i] = 2*i + 1; int x[100], i; for(i = 0; i<100 ; i++) x[i] = rand()%50 + 25; int x[100], i; for(i = 0; i<100 ; i++) if(i%2==0) x[i] = 3*i; else x[i] = 4*i;
Ejemplos
int x[30], i; x[0] = 1;x[1] = 1; for(i = 2; i<30 ; i++) x[i] = x[i-1]+x[i-2]; 1,1,2,3,5,8,13,21,34,.. char v[]={a,e,i,o,u}; char c[]={b,c,d,f,g,h,j,k,l,m,n,p ,q,r,s,t,v,w,x,y,z}; cout << c[5] << v[3] << c[8] << v[0] << endl;
int i; float x[20],y[20]; for(i=0; i<20;i++) x[i] = i+1; for(i=0; i<20;i++) y[j]=2*x[i]+1;
Ejemplo: Histograma
int main() { const int tamanoArreglo = 10; int n[tamanoArreglo] = {19,3,15,7,11,9,13,5,17,1}; cout << "Elemento" << setw( 13 ) << "Valor" << setw( 17 ) << "Histograma" << endl; //para cada elemento del arreglo n, muestra una barra //en el histograma for ( int i = 0; i < tamanoArreglo; i++ ) { cout << setw( 7 ) << i << setw( 13 ) << n[ i ] << setw( 9 ); //despliega una barra for ( int j = 0; j < n[ i ]; j++ ) cout << '*'; cout << endl; // inicia la siguiente lnea de salida } // fin de la estructura for externa return 0; // indica terminacin exitosa } // fin de main
Tarea
Cul es la salida del siguiente programa?
#include <iostream.h> int m; void a(int x){ cout << x << enld; m += x; x = 10; cout << m << enld; } main(){ int x = 6; cout << x << endl; m = 5; a(x); cout << x << endl; cout << m << endl; }
Ejemplo
Programa para calcular el promedio y la desviacin estndar de los elementos de un vector.
La funcin main es la siguiente:
void linea(){ int i; for(i = 0; i<80; i++) cout << '*'; cout << endl; } void saludo(){ linea(); cout << "\tPROMEDIO Y DESVIACION ESTANDAR DE N VALORES" << endl; linea(); }
void LeerDatos(){//lee los elementos del arreglo int i=0; double num; do{ cout << "Teclee un numero (-1 = terminar):"; cin >> num; if(num>0){ x[i] = num; i++; } }while(num>0); max = i; }
double promedio(){ int i; double suma=0; for(i=0;i<max;i++) suma +=x[i]; return suma/max; } double desviacion(){ int i; double suma=0,prom; prom=promedio(); for(i=0;i<max;i++) suma +=(x[i]-prom)*(x[i]-prom); return sqrt(suma/(max-1)); }
void resultados(){ int i; linea(); cout << "VALORES INTRODUCIDOS"<<endl; for(i=0;i<max;i++){ cout << setw(8) << x[i]; if(i%8==0&&i>0) cout << endl; } cout << endl; cout << "El promedio es: " << promedio() << endl; cout << "La desviacion estandar es: " << desviacion() << endl; linea(); }
tipo variable[renglones][columnas];
Ejemplo int a [5][4];
a[0][0] a[1][0] a[2][0] a[3][0] a[4][0] a[0][1] a[1][1] a[2][1] a[3][1] a[4][1] a[0][2] a[1][2] a[2][2] a[3][2] a[4][2] a[0][3] a[1][3] a[2][3] a[3][3] a[4][3]
inicializacin
int a[5][4] = {{2,3,4,2},{2,0,6,1},
{3,5,5,0},{2,2,1,1},{3,2,5,6}};
2
3 2 3
0
5 2 2
6
5 1 5
1
0 1 6
inicializacin (cont.)
int a[5][4] = {{2,3},{1},
{3,5,5,0},{2},{3}};
1
3 2 3
0
5 0 0
0
5 0 0
0
0 0 0
ejemplo
Debe especificarse
void despliegaArreglo( int a[][ 3 ] ){ for ( int i = 0; i < 2; i++ ) {// for para cada fila for ( int j = 0; j < 3; j++ )//despliega los valores de columnas cout << a[ i ][ j ] << ' '; cout << endl; // inicia una nueva lnea de salida } // fin de la estructura for externa } // fin de la funcin despliegaArreglo int main(){ int arreglo1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } }; int arreglo2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 }; int arreglo3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } }; cout << "Los valores del arreglo1 por fila son:" << endl; despliegaArreglo( arreglo1 ); cout << "Los valores del arreglo2 por fila son:" << endl; despliegaArreglo( arreglo2 ); cout << "Los valores del arreglo3 por fila son:" << endl; despliegaArreglo( arreglo3 ); return 0; // indica terminacin exitosa } // fin de main
Funcin main
La funcin main solo inicia la semilla de aleatorios y lllama a la funcin juega(). int tablero[3][3] = {0}; main(){ srand(time(0)); juega(); system("pause"); }
Funcin tira()
void tira(int quien){ int x,y,JugadaValida=0; do{ if(quien==1){ x = rand()%3; y = rand()%3; } else{ cout << "Tecle tirada (0..2, 0..2):"; cin >> x >> y; } if(x>=0&&x<=2&&y>=0&&y<=2){ JugadaValida = tablero[x][y]==0; } }while(!JugadaValida); if(quien==1) cout <<"Compu tira en " << x << ", " << y << endl; tablero[x][y] = quien; }
Funcin dibujaTablero()
void dibujaTablero(){ int i,j; char c; cout << endl; for(i=0;i<3;i++){ for(j=0;j<3;j++){ switch(tablero[i][j]){ case 0:c = ' ';break; case 1:c = 'X';break; case 2:c = '0';break; } cout << " " << c << " "; if(j<2)cout << "|"; } cout << endl; if(i<2)cout <<"---+---+---\n\n"; } }
Funcin juega()
void juega(){ int turno = rand()%2+1,jugada=0; dibujaTablero(); do{ tira(turno); dibujaTablero(); turno = (turno==2?1:2); jugada++; }while(jugada<9); }
Tarea
Escriba una funcin que determine si en algn momento del juego existe un ganador en el gato.
Funcin dibujaTablero
void dibujaTablero(){ line(50,0,50,150); line(100,0,100,150); line(0,50,150,50); line(0,100,150,100); }
Funcin juega
void juega(){ int turno = rand()%2+1,jugada=0; dibujaTablero(); do{ tira(turno); turno = (turno==2?1:2); jugada++; }while(jugada<9); }
Funcin main
main(){ initwindow(150,150); srand(time(0)); juega(); //espera una tecla getch(); }
Para esto declare la funcin con un parmetro extra para pasar el nmero de elementos a la funcin
Ejemplo
#include <iostream.h>
double promedio(double a[], int tamanio){ double suma = 0; for(int i=0; i<tamanio; i++) suma += a[i]; return suma/tamanio; } int main(){ double x[] = {3.5, 6.3, 4.5, 7.5, 5.4}; double y[] = {2,3,4,3,4.5,2,3.5,4.2}; cout <<"Promedio x : "<< promedio(x,5) << endl; cout <<"Promedio y : "<< promedio(y,8) << endl; system("pause"); return 0; }
Ordenacin
La operacin de ordenacin es de las ms comunes en computacin.
#include <iostream.h> int main(){ int b[20] = {1,2,3,2,4,3,5,6,3,7,8,9,4,5, 3,5,3,4,5,6}; for(int i =0; i<20; i++) cout << b[i] << " "; cout << endl; Burbuja(b,20); for(int i =0; i<20; i++) cout << b[i] << " "; cout << endl; system("pause");; return 0; }
void Burbuja(int a[],int tam){ for(int i = 0; i< tam - 1 ; i++) for(int j = i; j< tam;j++) if(a[i]>a[j]){ int temp = a[i]; a[i]=a[j]; a[j]=temp; } }
Bsqueda
Otra operacin importante es la bsqueda del valor de un elemento dentro de un arreglo.
int BusquedaLineal(int a[],int b,int tam){ for(int i = 0; i< tam; i++) if(a[i]==b) return n; return -1; }
void leer(double &a, double &b, double &c){ cout << "Tecle coeficientes a,b,c: "; cin >> a >> b >> c; }
int main(){ double a,b,c,x1,x2; int caso; leer(a,b,c); calcularRaices(a,b,c,x1,x2,caso); imprime(x1,x2,caso); system(pause); }
Funcin factorial
El factorial se defino por: N! = 1*2*3* ... *(N-1)*N
double fact(int N){ double f =1; for(int i=2; i<=N; i++) f *= i; return f; }