Introducción a la programación (clave 115106, créditos 9) Profesor Dr. Georgii Khachaturov 2. Programas simples ...... (continuación del capitulo 2) 2.1.3. Operadores y algoritmos nuevos (clase 3): Temas a aprender: operador if…else; Implementaciones con ese operador: (i). Algoritmo de redondeo; (ii) programa de resolución de una ecuación cuadrática; Ciclo do…while; Implementaciones con ese operador: (i) algoritmo de búsqueda de "épsilon de la máquina"; (en clase) (ii) Tarea: escribir programa que suma los valores enteros de 1 hasta 100. Clase 4 2.1.4 : más de Ciclo do…while: sacar raíz cuadrada implementando el algoritmo de aproximaciones sucesivas a continuación: 1. Introducir de teclado valor de X para sacar su raíz; 2. Inicializar aproximación inicial Y0 a la raíz: Y0=X/2; 3. Aplicar la regla de aproximación Yi+1=(Yi+X/Yi)/2 tantas veces como sea necesario para que | Yi Yi+1|<0.000001 4. Imprimir último Yi como resultado del programa Aprender concepto de funciones: sintaxis, parámetros formales, valor que regresa, cuerpo de función, operador return, llamada de una función. Tarea: Modificar el programa anterior de la raíz cuadrática de tal manera que algunos sus partes estén implementados mediante funciones (valor absoluto, el paso iterativo, etc.) 2.2. (Clase 5). Temas a aprender: Arreglos arreglos unidimensionales y dos-dimensionales, representación en memoria de un arreglo dos-dimensional, declaración de arreglo, inicialización de valores de arreglo, acceso a elementos de arreglo, valores permitidos de máximo y mínimo de índice de un elamento de arreglo, ciclo tipo "for", sintaxis, y significado de cada parte construcción de elementos de arreglo por una regla sencilla mediante ciclo "for". 2.2.1(Clase 6) Temas a aprender: 1. Implementación del algoritmo de ordenación "Burbuja" mediante dos ciclos: "for" y "do…while" 2. Construcción y transformación algorítmica de las matrices mediante unas reglas simples tales como transposición de una matriz, o un giro por 90°. 3. Operador "switch" operador de la asignación condicionada, operadores ++, --, +=, /= y similares, operadores de comparición "==" y "!=" Consideramos otro ejemplo de un programa simple, dedicado transponer una matriz: /****** INTRODUCCION A COMPUTACION****/ // transponer matriz.c # include <stdio.h> main( ) {int i, j; double buf, matriz[5][5]; for (i=0; i<5; i++) for (j=0; j<5; j++) {matriz[i][j]=(i>j)?(double)j : 0; printf("i= %i j= %i matriz[ %i][ %i]= %f\n", i, j, i,j, matriz[i][j]); } for (i=0; i<5; i++) for (j=i; j<5; j++) { buf= matriz[i][j]; matriz[i][j]=matriz[j][i]; matriz[j][i]=buf; } printf("\n\n"); for (i=0; i<5; i++) for (j=0; j<5; j++) { printf("i= %i j= %i matriz[ %i][ %i]= %f\n", i, j, i,j, matriz[i][j]); } } Intorducimos en el texto los comentarios a las nuevas (para nosotros) construcciones del programa. /****** INTRODUCCION A COMPUTACION****/ // transponer matriz.c # include <stdio.h> main( ) { // La definición de dos varaibles enteros i y j: int i, j; // La definición de una varaible tipo "double" – // doble flotante - buf y de la matriz // del tamaño 5x5 con los elementos de tipo "double" double buf, matriz[5][5]; // inicia el operador de bucle // con sintaxis: // for ( inicialización ; // condición para continuar bucle ; // operaciones despues del cuerpo de bucle) // el operador "i++" es equivalente a i=i+1; (ver la descripción // más correcta de "i++;" y "++i;" en libros de C) for (i=0; i<5; i++) // el cuerpo del bucle anterior es otro bucle: for (j=0; j<5; j++) { //en el cuerpo del bucle interior se construyen // y imprimen los elementos de "matriz" //el siguiente operador tiene sintaxis // variable=(condición a verificar)? // expreción 1 : expreción 2; // Eso significa que variable obtiene valor de // expreción 1 o de expreción 2 si cumple o no // la condición a verificar, respectivamente. matriz[i][j]=(i>j)?(double)j : 0; // en contraste con "printf" del programa anterior // el siguiente imprime unas variables // la lista de variables a imprimir sale despues de las // comillas, mientras lugares para ellos en la impresión // se indica mediante el símbolo "%". Las letras "i" y "f" // después de cada "%" indican los formatos entero y // doble flotante de representación de las variables // a imprimir // Tarea: cambia el formato "f" a "i" y compara los // resultados del programa printf("i= %i j= %i matriz[ %i][ %i]= %f\n", i, j, i, j, matriz[i][j]); } // transposición de la matriz: for (i=0; i<5; i++) for (j=i; j<5; j++) //Tarea: Analiza que va a pasar si cambiar // el operador anterior al siguiente: // for (j=0; j<5; j++) { buf= matriz[i][j]; matriz[i][j]=matriz[j][i]; matriz[j][i]=buf; } // separar en impresión la matriz de entrada // de la de la salida: printf("\n\n"); // imprimir matriz transpuesta for (i=0; i<5; i++) for (j=0; j<5; j++) { printf("i= %i j= %i matriz[ %i][ %i]= %f\n", i, j, i,j, matriz[i][j]); } } Los resultados de esa programa están presentados a continuación: } printf("\n\n"); for (i=0; i<5; i++) for (j=0; j<5; j++) { printf("i= %i j= %i matriz[ %i][ %i]= %i\n", i, j, i,j, (int)matriz[i][j]); } } Abajo el mismo programa tiene unos modificaciones solo en los operadores "printf": /****** INTRODUCCION A COMPUTACION****/ // transponer matriz.c # include <stdio.h> main( ) {int i, j; double buf, matriz[5][5]; for (i=0; i<5; i++) for (j=0; j<5; j++) {matriz[i][j]=(i>j)?(double)j : 0; printf("i= %i j= %i matriz[ %i][ %i]= %i\n", i, j, i,j, (int) matriz[i][j]); } for (i=0; i<5; i++) for (j=i; j<5; j++) { buf= matriz[i][j]; matriz[i][j]=matriz[j][i]; matriz[j][i]=buf; Tarea: Acabas de conocer el operador "for". 1. Busca en libros y compara con "for" otros operadores de bucle: "while", "do... while" 2. Busca en libros como va a funcionar operador "for" con los campos de contol vacios: ..... for( ; ; ){...} ..... 3. ¿Como funciona operador ? ..... while(1) {} .... 4. Intenta encontrar las respuestas a las preguntas anteriores mediante el "Help" de RHIDE o de TurboC (claro, que hay que saber ingles para ese) 5. Modifica el programa "matriz.c" de tal manera que el efecto funcional no se cambia cuando tu usas solo el operador de bucle "while" en lugar del "for" Tarea. Escribe un programa que 1. Genera una matriz A del tamaño NxN con los elementos enteros iguales A[i][j]=i+j para i>N/2 y A[i][j]=|i-j| en el caso contrario, 2. Imprime la, 3. Hace rotación de sus datos por 90° contra dirección de reloj, 4. Y imprime la matriz de resultado. Tarea. En la tarea anterior, supongamos que N<10. Haz lo mismo bajo la especificación que los elementos de cada renglón de las matrices se imprimen en una sola línea. (Tienes 80 símbolos en cada línea de la ventana de comandos) (Pista: usar la secuencia de escape "\n" en printf solo después de impresión de un renglón completo...)