Funciones y arreglos Programacin Definicin una funcin es

  • Slides: 91
Download presentation
Funciones y arreglos Programación

Funciones y arreglos Programación

Definición una función es un bloque de código reconocido por un identificador que realiza

Definición una función es un bloque de código reconocido por un identificador que realiza un trabajo específico. Su propósito es dividir los programas en módulos manejables separados (divide y vencerás). El formato para la declaración de funciones es: tipo-devuelto nombre-de-función(lista-de-parámetros) { declaraciones e instrucciones }

Declaración de funciones Tradicionalmente en C se declaran como prototipos al inicio del programa.

Declaración de funciones Tradicionalmente en C se declaran como prototipos al inicio del programa. Después se declara la función main, y después se hace la declaración formal de las funciones. También pueden declararse las funciones al inicio del programa y después declarar la función main sin declarar prototipo.

Ejemplo de función Nombre de la función Prototipo de la función (puede omitirse) #include

Ejemplo de función Nombre de la función Prototipo de la función (puede omitirse) #include <stdio. h> int cuadrado( int ); // prototipo de la función Parámetro no necesita nombre int main() { // repite 10 veces, calcula e imprime el cuadrado de x for ( int x = 1; x <= 10; x++ ) Llamada a la función fprintf(“%d ”, cuadrado( x )); fprintf(“n”); return 0; Definición de la función Parámetro con nombre } // definición de la función cuadrado int cuadrado( int y ) //y es una copia del argumento de la función { return y * y; // devuelve el cuadrado de y como un int } // fin de la función cuadrado Valor que regresa la función

Mayor de 3 números No se especifica el prototipo Variable local double maximo( double

Mayor de 3 números No se especifica el prototipo Variable local 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 numero 1; double numero 2; double numero 3; printf("Introduzca tres numeros de punto flotante: “); scanf(“%d%d%d”, &numero 1, &numero 2, &numero 3); // numero 1, numero 2 y numero 3 son argumentos // de la función maximo printf("El maximo es: %fn“, maximo( numero 1, numero 2, numero 3 )); return 0; }

Ejemplos Función para calcular el área de una esfera: float area. Esfera(float radio){ float

Ejemplos Función para calcular el área de una esfera: float area. Esfera(float radio){ float PI = 3. 14159265358979; return 4*PI*radio; } parámetro Variables locales Función para calcular el área de un triángulo (usar math. h) float area. Triangulo(float a, float b, float c){ float s = (a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c)); parámetros }

Ejemplos de llamas a funciones #include <stdio. h> #include <conio. h> prototipo float area.

Ejemplos de llamas a funciones #include <stdio. h> #include <conio. h> prototipo float area. Esfera(float); main(){ float r; printf(“teclee el valor del radio: ”); scanf(“%f”, &r); printf(“el area de la esfera es %fn“, area. Esfera(r)); getch(); } float area. Esfera(float radio){ float PI = 3. 14159265358979; return 4*PI*radio; }

prototipo #include <stdio. h> #include <conio. h> #include <math. h> float area. Triangulo(float, float);

prototipo #include <stdio. h> #include <conio. h> #include <math. h> float area. Triangulo(float, float); main(){ float a, b, c; printf("teclee el valor de los lados del triangulo: “); scanf(“%f%f%f”, &a, &b, &c); printf("el area del triangulo es %fn“, area. Triangulo(a, b, c)); getch(); } float area. Triangulo(float a, float b, float c){ float s = (a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c)); }

Función para dibujar una línea de asteriscos void linea(int longitud){ for(int i=0; i< longitud;

Función para dibujar una línea de asteriscos void linea(int longitud){ for(int i=0; i< longitud; i++) printf(‘*’); printf(“n”); } Ejemplo: main(){ int i; for(i=1; i<10; i++) linea(i); getch(); } Variable local Función sin tipo (no regresa valor)

Tarea Escriba una función que acepte tres parámetros el primero representando horas, el segundo

Tarea Escriba una función que acepte tres parámetros el primero representando horas, el segundo minutos y el tercero segundos. La función debe regresar el tiempo en segundos al sumar las horas los minutos y los segundos. Utilice esta función para escribir una función main que lea dos tiempos en horas, minutos y segundos y calcule el tiempo transcurrido entre los tiempos leídos. Ejemplo: Teclee primer tiempo en hrs min seg: 4 15 23 Teclee segundo tiempo en hrs min seg: 2 17 12 El lapso de tiempo es: 7091 segundos

Modificador static El modificador static en una variable permite conservar una variable local en

Modificador static El modificador static en una variable permite conservar una variable local en una función en diferentes veces que la función es llamada. #include <stdio. h> #include <conio. h> void cuenta. Llamadas(){ static int n = 0; n ++; printf("llamada No %dn", n); } main(){ cuenta. Llamadas(); getch(); } Solo se ejecuta en la primera llamada

Parámetros por referencia Una función puede modificar los valores de los parámetros si estos

Parámetros por referencia Una función puede modificar los valores de los parámetros si estos se pasan por referencia. Los parámetros por referencia se especifican con la siguiente notación nombre-función(tipo *parámetro) Dentro de la función debe usarse el operador de indirección (*) para hacer referencia a los parámetros. Los parámetros por referencia se utilizan cuando la función regresa más de un valor.

Conversión a hrs, min, seg Como ejemplo de parámetros por referencia consideremos una función

Conversión a hrs, min, seg Como ejemplo de parámetros por referencia consideremos una función que convierta un tiempo en segundos a horas, minutos y segundos. Algoritmo segundos_A_horas, entrada segundos 1. Calcular número de horas 2. Restar horas a la cantidad segundos 3. Calcular número de minutos 4. Restar minutos a la cantidad segundos 5. Asignar segundos a parámetro de salida

función void segundos_A_horas(int seg, int *horas, int *minutos, int *segundos){ *horas = seg/3600; seg

función void segundos_A_horas(int seg, int *horas, int *minutos, int *segundos){ *horas = seg/3600; seg = seg – *horas*3600; Parámetros por referencia *minutos = seg/60; *segundos = seg – *minutos*60; Debe usar el operador de indirección } Debe usarse & main(){ int h, m, s; segundos_A_horas(53433, &h, &m, &s); printf("%d hrs %d min %d segn", h, m, s); getch(); }

Tarea Escriba una función que convierta un lapso de tiempo en días a años,

Tarea Escriba una función que convierta un lapso de tiempo en días a años, meses y días. Por ejemplo: 12546 días = 34 años 4 meses 16 días Suponga que los años son de 365 días y los meses de 30 días.

Generación de números aleatorios Para programas de juegos o de simulación existe la función

Generación de números aleatorios Para programas de juegos o de simulación existe la función rand() en la biblioteca stdlib. h para generar números aleatorios. rand() – genera un número aleatorio entre 0 y 32767. Ejemplos: rand() % 6 - genera números aleatorios entre 0 y 5 rand() % 6 +1 - genera números aleatorios entre 1 y 6 rand() % 2 - genera números aleatorios entre 0 y 1

Función para tirar un dado La siguiente función genera un valor aleatorio entre 1

Función para tirar un dado La siguiente función genera un valor aleatorio entre 1 y 6 que corresponde a tirar un dado. int dado(){ return rand()%6+1; } No lleva parámetro

Ejemplo de tirar dados #include <stdio. h> #include <conio. h> #include <stdlib. h>//contiene el

Ejemplo de tirar dados #include <stdio. h> #include <conio. h> #include <stdlib. h>//contiene el prototipo de la función rand int dado(){ return rand()%6+1; } int main(){ // ciclo de 20 repeticiones for ( int contador = 1; contador <= 20; contador++ ) { // recoge un número aleatorio entre 1 y 6 y lo imprime printf(“%10 d”, dado()); //si el contador es divisible por 5, comienza nueva línea if ( contador % 5 == 0 ) printf(“n”); } // fin de la estructura for getch(); return 0; // indica terminación exitosa } // fin de main

El programa anterior siempre genera la misma secuencia de valores. La función srand(semilla), permite

El programa anterior siempre genera la misma secuencia de valores. La función srand(semilla), permite establecer la semilla de los números aleatorios para generar diferentes secuencias aleatorias. El parámetro para la función srand en un valor de tipo unsigned.

Ejemplo de srand() #include <stdio. h> #include <conio. h> // contiene prototipos para las

Ejemplo de srand() #include <stdio. h> #include <conio. h> // contiene prototipos para las funciones srand y rand #include <stdlib. h> int main(){ unsigned semilla; printf("Introduzca semilla: “); scanf(“%d”, &semilla); srand( semilla ); // establece la semilla // ciclo de 10 repeticiones for ( int contador = 1; contador <= 10; contador++ ) { // toma un número aleatorio entre 1 y 6 y lo imprime printf(“%10 d” , ( 1 + rand() % 6 )); //si contador es divisible entre 5, inicia una nueva línea if ( contador % 5 == 0 ) printf(“n”); } // fin de for getch(); } // fin de main

Como generar semillas Para generar semillas se utiliza algún mecanismo que no dependa del

Como generar semillas Para generar semillas se utiliza algún mecanismo que no dependa del usuario y que permita siempre generar una secuencia diferente. Una posible solución es usar la hora actual como semilla. time(entero) – con argumento 0 regresa la hora actual en segundos. srand(time(0)) – inicia la semilla de los números aleatorios. La función time se encuentra en la biblioteca <time. h>.

Juego de dados (craps) Se lanzan dos dados. Si la suma de los puntos

Juego de dados (craps) Se lanzan dos dados. Si la suma de los puntos es 7 o 11 el jugador gana, si es 2, 3 o 12 el jugador pierde. Cualquier otro número se convierte en el número del jugador y sigue tirando. Si el jugador saca primero su número antes de sacar un 7, el jugador gana, sino pierde.

Algoritmo 1. Tirar dados 2. Si la suma es 7 o 11 3 Gana

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: 4. Sino, si la suma es 2, 3 o 12 5. pierde 6. sino, su numero es suma enum Status {CONTINUA, GANA, PIERDE}; 7. Mientras no gane o pierda 8. Tirar dados 9. Si suma = su numero 10. gana 11. Sino si suma = 7 12. pierde 13. Fin ciclo Status estado. Juego; Para las pruebas de los posibles resultados es conveniente usar una sentencia switch.

#include <stdio. h> // contiene los prototipos de las funciones srand y rand #include

#include <stdio. h> // contiene los prototipos de las funciones srand y rand #include <stdlib. h> #include <time. h>//contiene el prototipo de la función time int tira. Dados( void ); // prototipo de la función int main(){ //enumeración que represeta el estado del juego enum Status { CONTINUA, GANA, PIERDE }; int suma; int mi. Punto; Status estado. Juego; //puede contener CONTINUA, GANA o PIERDE //randomiza el generador de números aleatorios srand( time( 0 ) ); suma = tira. Dados(); // primer tiro de dados

// determine el estado del juego y la puntuación en base a la suma

// determine el estado del juego y la puntuación en base a la suma de puntos del dado switch ( suma ) { // gana en el primer tiro case 7: case 11: estado. Juego = GANA; break; // pierde en el primer tiro case 2: case 3: case 12: estado. Juego = PIERDE; break; // recuerda puntos default: estado. Juego = CONTINUA; mi. Punto = suma; printf( "El punto es %dn“, mi. Punto); break; // opcional } // fin de switch

while ( estado. Juego == CONTINUA ) { suma = tira. Dados(); // tira

while ( estado. Juego == CONTINUA ) { suma = tira. Dados(); // tira dados nuevamente // determina el estado del juego if ( suma == mi. Punto ) // gana por puntos estado. Juego = GANA; else if ( suma == 7 ) // pierde por obtener 7 estado. Juego = PIERDE; } // fin de while // despliega mensaje de ganador o perdedor if ( estado. Juego == GANA ) printf( "El jugador ganan“); else printf("El jugador pierden“); return 0; // indica terminación exitosa } // fin de main

int tira. Dados( void ) { int dado 1; int dado 2; int suma.

int tira. Dados( void ) { int dado 1; int dado 2; int suma. Trabajo; dado 1=1+rand() % 6; //obtiene valor aleatorio del dado 1 dado 2=1+rand() % 6; //obtiene valor aleatorio del dado 2 suma. Trabajo = dado 1 + dado 2; //suma dado 1 y dado 2 // despliega los resultados del tiro printf( "El jugador tiro %d+%d=%dn“, dado 1, dado 2, suma. Trabajo); return suma. Trabajo; // devuelve suma de los dados } // fin de la función tira. Dados

Tarea Escriba una función que genere 6 números aleatorios entre 1 y 56, asegúrese

Tarea Escriba una función que genere 6 números aleatorios entre 1 y 56, asegúrese de que todos sean diferentes. Pase los 6 parámetros por referencia.

Reglas de alcance Las variables tiene un alcance dentro del bloque en que son

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 <stdio. h> void uso. Local( void ); // prototipo de función void uso.

#include <stdio. h> void uso. Local( void ); // prototipo de función void uso. Static. Local( void ); // prototipo de función void uso. Global( void ); // prototipo de función int x = 1; // variable global int main() { int x = 5; // variable local a main printf("x local en el alcance externo de main es %dn“, x); { // inicia nuevo alcance int x = 7; printf("x local en el alcance interior de main es %dn“, x); } // finaliza nuevo alcance printf("x local en el alcance externo de main es %dn“, x); uso. Local(); // uso. Local tiene x local uso. Static. Local(); // uso. Static. Local tiene x static local uso. Global(); // uso. Global utiliza x global uso. Local(); // uso. Local reinicializa su x local uso. Static. Local(); // static local x retiene su valor previo uso. Global(); // x global retiene también su valor printf( "nx local en main es %dn“, x); return 0; // indica terminación exitosa } // fin de main

// uso. Local reinicializa la variable local x durante cada llamada void uso. Local(

// uso. Local reinicializa la variable local x durante cada llamada void uso. Local( void ){ int x = 25; // inicialia cada vez que se llama a uso. Local printf(“nx local es %d al entrar a uso. Localn“, x); ++x; printf("x local es %d al salir de uso. Localn“, x) ; } // fin de la función uso. Local //uso. Static. Local inicializa a la variable static local x sólo la // primera vez que se llama a la función; el valor de x se guarda // entre las llamadas a esta función void uso. Static. Local( void ){ // se inicializa la primera vez que se llama a uso. Static. Local. static int x = 50; printf(“nlocal static x es %d al entrar a uso. Static. Localn“, x); ++x; printf(“local static x es %d al salir de uso. Static. Localn“, x); } // fin de la función uso. Static. Local // uso. Global modifica la variable global x durante cada llamada void uso. Global( void ){ printf(“nx global es %d al entrar a uso. Globaln“, x); x *= 10; printf(“x global es %d al salir de uso. Globaln“, x); } // fin de la función uso. Global

Funciones recursivas Una función es recursiva si dentro del cuerpo de la función se

Funciones recursivas Una función es recursiva si dentro del cuerpo de la función se hace una llamada a si misma. Las funciones recursivas deben cumplir lo siguiente: 1. Debe existir un salida en la que no se haga la llamada recursiva 2. La llamada recursiva debe ser versión más simple que la llamada que la invocó.

Máximo Común Divisor Definición: Salida trivial 1. el gcd(x, y) = y si y<x

Máximo Común Divisor Definición: Salida trivial 1. el gcd(x, y) = y si y<x y el x mod y = 0 2. el gcd(x, y) = gcd(y, x) si x < y 3. el gcd(x, y) = gcd(y, x mod y) Llamadas recursivas int gcd(int x, int y){ if((y<=x)&&(x%y == 0)) return y; else if(x < y) return gcd(y, x); else return gcd(y, x % y); }

Versión no recursiva del gcd Algoritmo gcd no recursivo, entrada n 1 y n

Versión no recursiva del gcd Algoritmo gcd no recursivo, entrada n 1 y n 2 1. Si n 1<n 2 2. n = n 1 3. Sino 4. n = n 2 5. Mientras (n 1%n!=0 o n 2%n!=0) 6. n--; 7. Regresar n

Función gcd no recursiva en C int gcd(int n 1, int n 2){ int

Función gcd no recursiva en C int gcd(int n 1, int n 2){ int n; if(n 1<n 2) n = n 1; else n = n 2; while(n 1%n||n 2%n) n--; return n; }

Calculo recursivo del factorial Definición: Salida trivial 1. n! = 1 si n =

Calculo recursivo del factorial Definición: Salida trivial 1. n! = 1 si n = 0 2. n! = n*(n-1)! Llamada recursiva double fact(int n){ if(n==0) return 1; else return n*fact(n-1); }

Factorial no recursivo double fact(int n){ double f=1; for(int i=2; i<=n; i++) f *=i;

Factorial no recursivo double fact(int n){ double f=1; for(int i=2; i<=n; i++) f *=i; return f; }

Números de Fibonacci Los números de Fibonacci forman la secuencia: 0, 1, 1, 2,

Números de Fibonacci Los números de Fibonacci forman la secuencia: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … Es decir cada uno es la suma de los dos anteriores. Salida trivial Definición: 1. Fib(n) = n si n = 0 o 1 Llamada recursiva 2. Fib(n) = fib(n-1) + fib(n-2) int fib(int n){ if(n == 0 || n ==1 ) return n; else return fib(n-1)+fib(n-2); }

Solución no recursiva a los números de Fibonacci int fib(int n){ int a =

Solución no recursiva a los números de Fibonacci int fib(int n){ int a = 0; int b = 1; int c = a + b; for(int i=2, i<=n; i++){ c = a + b; a = b; b = c; } return c; }

Torres de Hanoi Se trata de mover los discos del primer pivote al tercero

Torres de Hanoi Se trata de mover los discos del primer pivote al tercero bajo las reglas: 1. Mover un disco a la vez 2. Colocar discos más pequeños sobre más grandes.

Solución

Solución

Algoritmo torres 1. si numero de discos igual a 1 2. mover el disco

Algoritmo torres 1. si numero de discos igual a 1 2. mover el disco 1 de origen a destino 3. sino 4. mover N-1 discos al pivote auxiliar usando el pivote destino como auxiliar 5. mover el disco N de origen a destino 6. mover N-1 discos al pivote destino usando el pivote fuente como auxiliar

Algoritmo en C void torres(int n, int origen, int destino, int auxiliar){ if(n ==

Algoritmo en C void torres(int n, int origen, int destino, int auxiliar){ if(n == 1) printf(“mover de %d a %dn”, origen, destino); else{ torres(n-1, origen, auxiliar, destino); printf(“mover de %d a %dn”, origen, destino); torres(n-1, auxiliar, destino, origen); } }

Tarea El algoritmo no recursivo de los números de Fibonacci puede escribirse utilizando solo

Tarea El algoritmo no recursivo de los números de Fibonacci puede escribirse utilizando solo dos variables locales. Encuentre la forma de hacerlo.

Quiz 2 ¿Cuales de las siguientes funciones son recursivas y de ellas cuales son

Quiz 2 ¿Cuales de las siguientes funciones son recursivas y de ellas cuales son correctas, es decir, en algún momento terminan? a) b) void a(int n){ if(n>0) a(n+1); if(n>0) a(n-1); printf(“%d”, n); } } c) c) void a(int n){ } if(n<0) a(n+1); if(n<0) b(n+1); printf(“%d”, n); }

Variables de tipo arreglo Un arreglo es una colección de elementos del mismo tipo

Variables de tipo arreglo Un arreglo es una colección de elementos del mismo tipo que se reconocen por un solo identificador. Para acceder a los elementos individuales de un arreglo se utiliza un subíndice que debe ser un número entero. Arreglo con nombre “a” a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 56 56 91 0 -3224 100 62 12 Número de la posición de cada elemento

Ejemplos int a[5]; a[0] = 4; a[1] = 0; a[2] = 5; a[3] =

Ejemplos int a[5]; a[0] = 4; a[1] = 0; a[2] = 5; a[3] = -2; a[4] = 8; también 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;

Ejemplo: Histograma int main() { const int tamano. Arreglo = 10; int n[tamano. Arreglo]

Ejemplo: Histograma int main() { const int tamano. Arreglo = 10; int n[tamano. Arreglo] = {19, 3, 15, 7, 11, 9, 13, 5, 17, 1}; printf("Elementot. Valort. Histograman“); //para cada elemento del arreglo n, muestra una barra //en el histograma for ( int i = 0; i < tamano. Arreglo; i++ ) { printf(“%dtt%dt”, i, n[ i ]); //despliega una barra for ( int j = 0; j < n[ i ]; j++ ) printf(“*”); printf(“n”); // inicia la siguiente línea de salida } // fin de la estructura for externa return 0; // indica terminación exitosa } // fin de main

Tarea Declare las variables de tipo arreglo que se piden: a) 12 elementos de

Tarea Declare las variables de tipo arreglo que se piden: a) 12 elementos de tipo entero b) 130 elementos de tipo doble precisión c) 56 elementos de tipo char Inicie un arreglo de 20 caracteres con las letras ‘h’, ‘o’, ‘l’, ‘a’. Inicie un arreglo de 20 enteros con números consecutivos de 120 en adelante. Inicie un arreglo de 50 números flotantes con valores recíprocos de los números de 1 a 50.

Ejemplo Programa para calcular el promedio y la desviación estándar de los elementos de

Ejemplo Programa para calcular el promedio y la desviación estándar de los elementos de un vector. La función main es la siguiente: #include <stdio. h> #include <conio. h> #include <math. h> double x[50]; //arreglo (vector) de 50 elementos, del 0 al 49 int max; main(){ saludo(); Leer. Datos(); resultados(); system("pause"); }

void linea(){ int i; for(i = 0; i<80; i++) printf("*"); printf("n"); } void saludo(){

void linea(){ int i; for(i = 0; i<80; i++) printf("*"); printf("n"); } void saludo(){ linea(); printf("t. PROMEDIO Y DESVIACION ESTANDAR DE N VALORESn"); linea(); }

void Leer. Datos(){//lee los elementos del arreglo int i=0; double num; do{ printf("Teclee un

void Leer. Datos(){//lee los elementos del arreglo int i=0; double num; do{ printf("Teclee un numero (-1 = terminar): "); scanf("%lf", &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 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(); printf("VALORES INTRODUCIDOSn"); for(i=0; i<max; i++){ printf("%8. 3 lf", x[i]);

void resultados(){ int i; linea(); printf("VALORES INTRODUCIDOSn"); for(i=0; i<max; i++){ printf("%8. 3 lf", x[i]); if((i+1)%8==0) printf("n"); } printf("n"); printf("El promedio es: %8. 3 lfn", promedio()); printf("La desviacion estandar es: %8. 3 fn", desviacion()); linea(); }

Quiz #3 Declare dos arreglos A de tipo entero y B de doble precisión

Quiz #3 Declare dos arreglos A de tipo entero y B de doble precisión cada uno con 100 elementos. Escriba sentencias para inicializar el arreglo A con números múltiplos de 5 comenzando en 5 hasta 500. Escriba sentencias para iniciar el arreglo B con los valores de la función seno de 0 a p/2 en 100 pasos iguales.

Paso de arreglos a funciones Para pasar un arreglo a una función debemos conocer

Paso de arreglos a funciones Para pasar un arreglo a una función debemos conocer su tamaño para poder saber cuantos elementos se van a procesar. Para esto declare la función con un parámetro extra pasar el número de elementos a la función

Ejemplo #include <stdio. h> #include <conio. h> double promedio(double a[], int tamanio){ double suma

Ejemplo #include <stdio. h> #include <conio. 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 a[]={3, 4. 5, 6. 5, 7, 5, 6, 8}; double b[]={5. 3, 6. 2, 7. 5, 6, 5, 4, 5, 7, 6, 9}; printf("Promedio de a es %6. 2 fn", promedio(a, 7)); printf("Promedio de b es %6. 2 fn", promedio(b, 10)); getch(); }

Impresión de un arreglo void imprime. Arreglo(double a[], int n){ int i; for(i =

Impresión de un arreglo void imprime. Arreglo(double a[], int n){ int i; for(i = 0; i< n; i++){ printf(“%8. 2 f”, a[i]); if((i+1)%8==0) printf("n"); }

Inversión de un arreglo void invierte. Arreglo(double a[], int n){ int i; double temp;

Inversión de un arreglo void invierte. Arreglo(double a[], int n){ int i; double temp; for(i = 0; i< n/2; i++){ temp = a[i]; a[i] = a[n-i-1]; a[n-i-1] = temp; } }

Búsqueda secuencial int busca(double x, double a[], int n){ int i; for(i = 0;

Búsqueda secuencial int busca(double x, double a[], int n){ int i; for(i = 0; i<n; i++) if(x==a[i]) return i; return -1; }

Ordenación void Burbuja(double a[], int tam){ for(int i = 0; i< tam - 1

Ordenación void Burbuja(double a[], int tam){ for(int i = 0; i< tam - 1 ; i++) for(int j = i; j< tam; j++) if(a[i]>a[j]){ double temp = a[i]; a[i]=a[j]; a[j]=temp; } }

Tarea Escriba una función main que utilice las funciones revisadas anteriormente. Defina un arreglo

Tarea Escriba una función main que utilice las funciones revisadas anteriormente. Defina un arreglo de doble precisión y lo despliegue, luego lo invierta y lo despliegue, después lo ordene y lo despliegue y finalmente que lea un valor de doble precisión y lo busque en el arreglo e informe si lo encontró o no. Prototipos: void imprime. Arreglo(double a[], int n); void invierte. Arreglo(double a[], int n); int busca(double x, double a[], int n); void Burbuja(double a[], int tam);

Arreglos de dos dimensiones Los arreglos de dos dimensiones se declaran de acuerdo al

Arreglos de dos dimensiones Los arreglos de dos dimensiones se declaran de acuerdo al esquema tipo variable[renglones][columnas]; Ejemplo int a [5][4]; a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3] a[4][0] a[4][1] a[4][2] a[4][3]

inicialización int a[5][4] = {{2, 3, 4, 2}, {2, 0, 6, 1}, {3, 5,

inicialización int a[5][4] = {{2, 3, 4, 2}, {2, 0, 6, 1}, {3, 5, 5, 0}, {2, 2, 1, 1}, {3, 2, 5, 6}}; o 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 4 2 2 0 6 1 3 5 5 0 2 2 1 1 3 2 5 6

inicialización (cont. ) int a[5][4] = {{2, 3}, {1}, {3, 5, 5, 0}, {2},

inicialización (cont. ) int a[5][4] = {{2, 3}, {1}, {3, 5, 5, 0}, {2}, {3}}; 2 3 0 0 1 0 0 0 3 5 5 0 2 0 0 0 3 0 0 0

ejemplo Debe especificarse void despliega. Arreglo( int a[][ 3 ] ){ for ( int

ejemplo Debe especificarse void despliega. Arreglo( 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 printf(“%4 d”, a[ i ][ j ]); print¨f(“n”); // inicia una nueva línea de salida } // fin de la estructura for externa } // fin de la función despliega. Arreglo int main(){ int arreglo 1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } }; int arreglo 2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 }; int arreglo 3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } }; printf( "Los valores del arreglo 1 por fila son: n“); despliega. Arreglo( arreglo 1 ); printf("Los valores del arreglo 2 por fila son: n“); despliega. Arreglo( arreglo 2 ); printf("Los valores del arreglo 3 por fila son: “); despliega. Arreglo( arreglo 3 ); return 0; // indica terminación exitosa } // fin de main

Otro ejemplo void imprime. Matriz(int a[][4], int r){ int i, j; for(i = 0;

Otro ejemplo void imprime. Matriz(int a[][4], int r){ int i, j; for(i = 0; i< r; i++){ for(j = 0; j< 4; j++) printf("%4 d", a[i][j]); printf("n"); } main(){ int a[5][4] = {{2, 3, 4, 2}, {2, 0, 6, 1}, {3, 5, 5, 0}, {2, 2, 1, 1}, {3, 2, 5, 6}}; int b[6][4] = {2, 3, 4, 2, 2, 0, 6, 1, 3, 5, 5, 0, 2, 2, 1, 1, 3, 2, 5, 6, 2, 2}; imprime. Matriz(a, 5); imprime. Matriz(b, 6); getch(); }

Leer matriz de Nx 4 Lee una matriz renglón por renglón. Debe tener 4

Leer matriz de Nx 4 Lee una matriz renglón por renglón. Debe tener 4 columnas. void leer. Matriz(int a[][4], int r){ int i, j; printf("Introduzca los elementos renglon x renglonn"); printf("Se leeran %d renglones de 4 elementos. n", r); for(i = 0; i< r; i++){ for(j = 0; j< 4; j++) scanf("%d", &a[i][j]); } }

Invertir fila de matriz Nx 4 void intercambia. Filas(int a[][4], int r){ int i,

Invertir fila de matriz Nx 4 void intercambia. Filas(int a[][4], int r){ int i, j, temp; for(i = 0; i< r/2; i++) for(j = 0; j< 4; j++){ temp = a[i][j]; a[i][j] = a[r-i-1][j]; a[r-i-1][j] = temp; } }

Tarea Declare una matriz de 3 x 5 e iníciela con los siguientes valores:

Tarea Declare una matriz de 3 x 5 e iníciela con los siguientes valores: 3 5 5 1 2 8 9 8 6 3 1 1 5 9 0

Quiz Diga que errores tienen las siguientes declaraciones: a) float x[4][3] = {{2, 4,

Quiz Diga que errores tienen las siguientes declaraciones: a) float x[4][3] = {{2, 4, 5}, {1, 2, 5, 6}, {2, 3}, {0}}; b) int y[5][]; c) double m 1[3][2]= {3, 4, 5, 6, 2, 1, 4}; d) int t[6] = {{2, 3, 4}, {1, 4, 7}};

Calificaciones de un grupo Un profesor califica haciendo cinco exámenes parciales los cuales cuentan

Calificaciones de un grupo Un profesor califica haciendo cinco exámenes parciales los cuales cuentan el 80% de la calificación final y un examen final que cuenta el otro 20%. main(){ float calificaciones[25][7]; int num. Alumnos; printf("Cuantos alumnos? "); scanf("%d", &num. Alumnos); leer. Calificaciones(calificaciones, num. Alumnos); procesa. Calificaciones(calificaciones, num. Alumnos); imprime(calificaciones, num. Alumnos); getch(); }

Leer calificaciones void leer. Calificaciones(float cal[][7], int n. Alumnos){ int i, j; for(i =

Leer calificaciones void leer. Calificaciones(float cal[][7], int n. Alumnos){ int i, j; for(i = 0; i<n. Alumnos; i++){ printf("Teclee calificaciones de alumno %in", i); for(j=0; j<6; j++){ scanf("%f", &cal[i][j]); } } }

Procesamiento void procesa. Calificaciones(float cal[][7], int n. Alumnos){ int i, j; float suma; for(i

Procesamiento void procesa. Calificaciones(float cal[][7], int n. Alumnos){ int i, j; float suma; for(i = 0; i<n. Alumnos; i++){ suma=0; for(j=0; j<5; j++) suma+=cal[i][j]; cal[i][6]=suma/5*0. 8+cal[i][5]*0. 2; } }

Impresión void imprime(float cal[][7], int n. Alumnos){ int i, j; printf("No. t 1t 2t

Impresión void imprime(float cal[][7], int n. Alumnos){ int i, j; printf("No. t 1t 2t 3t 4t 5t 6tfinaln", i); for(i = 0; i<n. Alumnos; i++){ printf("%d", i); for(j=0; j<7; j++){ printf("t%5. 1 f", cal[i][j]); } printf("n"); } }

Ejemplo de corrida Cuantos alumnos? 3 Teclee calificaciones de alumno 0 246786 Teclee calificaciones

Ejemplo de corrida Cuantos alumnos? 3 Teclee calificaciones de alumno 0 246786 Teclee calificaciones de alumno 1 667777 Teclee calificaciones de alumno 2 778888 No. 1 2 3 4 5 6 final 0 2. 0 4. 0 6. 0 7. 0 8. 0 6. 0 5. 5 1 6. 0 7. 0 6. 7 2 7. 0 8. 0 7. 7

Juego del gato El juego del gato consta de un tablero de 3 x

Juego del gato El juego del gato consta de un tablero de 3 x 3. El tablero se puede representar como un arreglo de enteros de 3 x 3. Usaremos el valor de 0 para representar una casilla vacía, 1 para representar las X’s y 2 para los 0’s. Haremos un juego donde juegue un jugador contra la máquina. Se elegirá aleatoriamente quien empieza.

Función main La función main solo inicia la semilla de aleatorios y lllama a

Función main La función main solo inicia la semilla de aleatorios y lllama a la función juega(). int tablero[3][3] = {0}; main(){ srand(time(0)); juega(); getch(); }

Función juega() void juega(){ int turno = rand()%2+1, jugada=0; dibuja. Tablero(); do{ tira(turno); dibuja.

Función juega() void juega(){ int turno = rand()%2+1, jugada=0; dibuja. Tablero(); do{ tira(turno); dibuja. Tablero(); turno = (turno==2? 1: 2); jugada++; }while(jugada<9); }

Función dibuja. Tablero() void dibuja. Tablero(){ int i, j; char c; printf(“n”); for(i=0; i<3;

Función dibuja. Tablero() void dibuja. Tablero(){ int i, j; char c; printf(“n”); 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; } printf(" %c “, c); if(j<2)printf("|“); } printf(“n”); if(i<2)printf("---+---nn“); } }

Función tira() void tira(int quien){ int x, y, Jugada. Valida=0; do{ if(quien==1){ x =

Función tira() void tira(int quien){ int x, y, Jugada. Valida=0; do{ if(quien==1){ x = rand()%3; y = rand()%3; } else{ printf("Tecle tirada (0. . 2, 0. . 2): “); scanf(“%d%d”, x, y); } if(x>=0&&x<=2&&y>=0&&y<=2){ Jugada. Valida = tablero[x][y]==0; } }while(!Jugada. Valida); if(quien==1) printf("Compu tira en %d, %dn“, x, y); tablero[x][y] = quien; }

Tarea Escriba una función que determine si en algún momento del juego existe un

Tarea Escriba una función que determine si en algún momento del juego existe un ganador en el gato.

Versión gráfica del gato Para utilizar una pantalla gráfica hay que usar la biblioteca

Versión gráfica del gato Para utilizar una pantalla gráfica hay que usar la biblioteca graphics. h. Usar initwindow(ancho, alto) para iniciar los gráficos. Dibujar: line – lineas, rectangle – rectangulo, circle – circulos, etc. Se puede leer los botones del mouse.

Función tira gráfica void tira(int quien){ int x, y, Jugada. Valida=0, x 1, y

Función tira gráfica void tira(int quien){ int x, y, Jugada. Valida=0, x 1, y 1; char c; do{ if(quien==1){ x = rand()%3; y = rand()%3; } else{ //espera a que se presione el boton izquierdo while(!ismouseclick(WM_LBUTTONDOWN)); //obtiene la coordenada del mouse getmouseclick(WM_LBUTTONDOWN, x 1, y 1); //0 a 49 =0, 50 a 99=1, 100 a 149=2 x = x 1/50; y = y 1/50; } if(x>=0&&x<=2&&y>=0&&y<=2){ Jugada. Valida = tablero[x][y]==0; } }while(!Jugada. Valida); tablero[x][y] = quien; if(quien==1) c='X'; else c='0'; //dibuja la jugada bgiout << c; outstreamxy(50*x+25, 50*y+25); }

Función dibuja. Tablero void dibuja. Tablero(){ line(50, 0, 50, 150); line(100, 0, 100, 150);

Función dibuja. Tablero void dibuja. Tablero(){ line(50, 0, 50, 150); line(100, 0, 100, 150); line(0, 50, 150, 50); line(0, 100, 150, 100); }

Función juega void juega(){ int turno = rand()%2+1, jugada=0; dibuja. Tablero(); do{ tira(turno); turno

Función juega void juega(){ int turno = rand()%2+1, jugada=0; dibuja. Tablero(); do{ tira(turno); turno = (turno==2? 1: 2); jugada++; }while(jugada<9); }

Función main(){ initwindow(150, 150); srand(time(0)); juega(); //espera una tecla getch(); }

Función main(){ initwindow(150, 150); srand(time(0)); juega(); //espera una tecla getch(); }

tarea #6 1. Escriba una función que intercambie las columnas de una matriz de

tarea #6 1. Escriba una función que intercambie las columnas de una matriz de Nx 4. 2. Escriba una función que inicie un arreglo bidimensional cuadrado de Nx. N con 1's en la diagonal principal y 0's en las demás posiciones. 3. Escriba una función que acepte como dato un arreglo cuadrado de enteros de Nx. N y calcule la suma de los elementos cada columna almacenando los resultados en un vector de N componentes.