20130520 Tema D: Control de flujo en C. Construcciones algortmicas. Sentencias. Sentencias if. Construccin else. Bucle while. Bucle for. Bucle do...while. Control de bucles: break y continue. Construccin switch. (2da clase de dos)
1 Estructura SI - Codificacin if (Exp. Log.){ [Accin 1a]; [Accin 2a]; ... [Accin n]; } else { [Accin 1b]; [Accin 2b]; ... [Accin m]; } Exp. Log. Accin 1a V F ... ... Accin 2a Accin n Accin 1b Accin 2b Accin m 2 Estructura Segn -Codificacin switch (Selector){ case 1: case 3: [accin 1a]; [accin 2a];
Accin 1a Accin 1b Accin 1c Accin 1d Accin 2a Accin 2b Accin 2c Accin 2d Accin m Accin n Accin o Accin p
3 Lxico auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while 65 % 4 Iterativa con control al inicio Exp. Log. A V F MIENTRAS Exp.Log. HACER
A;
FINMIENTRAS while (Exp.Log. ) A; while (Exp.Log. ) { A; B; } 5 Iterativas con control al final Exp. Log. A 0
REPETIR A; HASTAQUE Exp.Log. SEAF do A; while (Exp.Log. ); do { A; B; } while (Exp.Log. ); 6 Estructura iterativa controlada por contador Inicializacin; Condicin ; Modificacin for (Inicializacin; Condicin ; Modificacin) {
} 7 Problema O Como las vacas solucionan el problema de tomar agua cuando tienen sed?
O Ayuda: Las vacas tienen muy mala visin (vista)
8 Mtodo de aproximaciones sucesivas o de punto fijo O Calcular en forma aproximada la raz de la ecuacin f(x) = 0 O O calcular los ceros de la funcin f(x)
9 Solucin O Posible solucin: 1. Despeje mediante transformaciones de equivalencia la ecuacin f(x)=0 en la forma x = g(x) 2. Tome un valor particular de x=x 1 que usted considere es una solucin particular de la ecuacin, utilice dicho valor en la formula g(x) a fin de obtener una mejor aproximacin del valor buscado (x 2 ) 3. Proceda en forma similar para obtener x 3 , x 4 , etc. X 3 = g(x 2 ); x 4 = g (x 3 ); . ; x N = g(x N-1 ) Hasta que no se gane tanto por realizar otra aproximacin 10 Ejemplo O Calcular la raz de la ecuacin: Ecuacin Polinmica de grado 4 Teorema de Abel 11 Ecuacin Polinmica de grado 5 o superior Existe formula de resolvente Programa para separar races #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[ ] ) { float x, y; printf ("Tabla de valores\n" " X | Y \n" "========|==========\n"); for (x=-10;x<=10;x=x+0.5){ y = ((4*x-2)*x+5)*x-2; printf("%7.2f | %8.2f\n",x,y); } system("PAUSE"); return 0; } 12 Programa calculo de aprox. de races por el mtodo de punto fijo #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv [ ] ) { float x1, x2; int i; unsigned char flag; printf("Ingrese aproximacion inicial: "); scanf ("%f",&x1); i=1; flag = 1; while ((i<50) && flag) { x2=(((-4*x1+2)*x1+0)*x1+2) /5; printf ("%.7f\n", x2); if (fabs(x2-x1)<0.0000001) flag =0; x1=x2; i++; } if (flag == 0) printf("La raiz aproximada es: %12.7f\n", x1); else printf("No se obtuvo la raz buscada\n"); system("PAUSE"); return 0; } 13 Salidas 14 Casos especiales: Definicin del cero: El cero se representara con valores 0 en el exponente y en el mantisa. Ejemplo: 0 00000000 00000000000000000000000 = +0 1 00000000 00000000000000000000000 = -0
Infinitos: se ha convenido que cuando todos los bits del exponente estn a 1 y todos los del mantisa a 0, el valor es +/- infinito (segn el valor del signo). Ejemplo: 0 11111111 00000000000000000000000 = +Infinito 1 11111111 00000000000000000000000 = -Infinito Valores no-normalizados (denominados tambin "subnormales"). Se identifican porque todos los bits del exponente son 0 pero el significado presenta un valor distinto de cero (en caso contrario se tratara de un cero). Ejemplo: 1 00000000 00100010001001010101010
Valores no-numricos: Denominados NaN ("Not-a-number"). Se identifican por un exponente con todos sus valores a 1, y una mantisa distinta de cero. Ejemplo:
0 11111111 10000100000000000000000 1 11111111 00100010001001010101010 15 16 Esquema inicial 17 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { unsigned char x; unsigned char signo; int i; unsigned char exp; unsigned long mant; double parcial, total; printf ("Ingrese cada uno de los bits ledos" " de izquierda a derecha (0 o 1):\n"); printf ("\nIngrese el signo(0 o 1):\n"); do scanf("%ud",&signo); while ((signo!=0) && (signo!=1)); if (signo == 0) printf ("positivo\n"); else printf ("negativo\n");
printf ("\nIngrese el exponente(0 o 1):\n"); exp = 0; for (i=1; i <=8; i++){ printf("%d: ",i); do scanf("%ud",&x); while ((x!=0) && (x!=1)); exp = exp*2+x; } printf ("\nIngrese la Mantisa(0 o 1):\n"); mant = 0; for (i=1; i <=23; i++){ printf("%d: ",i); do scanf("%ud",&x); while (x!=0 && x!=1); mant = mant*2 + x; }
18 if (exp == 255){ if (mant == 0) { if (signo ==0) printf ("+ Infinito\n"); else printf ("- Infinito\n"); } else printf ("No Numerico\n");} else if (exp == 0){ if (mant==0) if (signo == 0) printf ("+0\n"); else printf ("-0\n"); else { /*Procesar subnormal*/ parcial = 0; for (i=1;i<=23;i++){ parcial = parcial*0.5+ (mant -mant/2*2); mant = mant/2;} total = parcial*pow(2,-127);
if (signo == 1) total = -1*total; printf ("\n%.7le\n",total);} } else { /*Procesar Normal*/ parcial = 0; for (i=1;i<=23;i++){ parcial = parcial*0.5 + (mant - mant/2*2); mant = mant/2;} parcial = parcial*0.5+ 1; total = parcial * pow(2,exp-127); if (signo == 1) total = -1*total; printf ("%.7le\n",total);}
system("PAUSE"); return 0; }
19 Pginas a consultar O http://www.h-schmidt.net/FloatApplet/IEEE754.html
O http://babbage.cs.qc.edu/IEEE-754/Decimal.html
O http://www.etsimo.uniovi.es/~antonio/uned/ieee754/ejemplos.html
O Revista Mercado Electrnico N 172: Matemtica de punto flotante 20 break y continue Los enunciados break y continue son utilizados para modificar el flujo de control dentro de un programa. El break utilizado dentro de las estructuras de control causa la inmediata salida de dicha estructura (ver estructura switch). El enunciado continue, dentro de las estructuras de repeticin, al ser ejecutado salta las instrucciones que siguen en el bloque y ejecuta la siguiente repeticin en el ciclo. 21 int num; num = 1; while (num <= 10){ if (num == 5) { break; }; printf(%d - , num); num = num + 1; }; El cdigo anterior imprime: 1 2 3 4 int num; num = 0; while (num <= 7){ num = num + 1; if (num == 5) { continue; }; printf(%d - , num); }; El cdigo anterior imprime: 1 2 3 4 6 7 - 8 Consultas 22 Tarea 1. Modificar la funcin g(x) y proba con ingresando el extremo superior o el inferior del intervalo de existencia de la raz. Nota: la funcin g(x) para una ecuacin dada en general no es nica 2. Tome otra ecuacin cualquiera, modifique el programa de separacin de races y el de punto fijo para obtener las races mencionadas. 3. Modifique el ltimo programa para que tambin muestre en hexadecimal el contenido almacenado en los 4 bytes 4. Implemente un programa que ingrese en hexadecimal los 4 bytes de datos y muestre el valor equivalente en decimal representado 23