1 UNIDAD 1 : INTRODUCCIÓN. 1.1 CONCEPTOS ELEMENTALES. Hardware y Software. 1. INFORMÁTICA : Definición 1: Ciencia encargada del estudio y desarrollo de crear máquinas, transmitir y tratar la información. y métodos para Definición 2: Es la ciencia que estudia el tratamiento automático y racional de la información. Integra por lo tanto, las máquinas, los métodos de trabajo y las aplicaciones. 2. ELEMENTOS DE LA INFORMÁTICA: La informática involucra tres elementos, las computadoras, los programas y los sistemas de información. 3. PILARES BÁSICOS DE LA INFORMÁTICA: Los tres componentes básicos de la informática son Hardware (componentes físicos), Software (componentes lógicos) y el elemento Humano. 4. DATO : Representación de una realidad. 5. INFORMACIÓN: Mensaje válido para un receptor. 6. BIT: Unidad mínima de información. ( 0 ó 1 ). 7. BYTE: Conjunto de bits relacionados. ( 8 bit ). 8. LENGUAJE: Conjunto de símbolos y reglas que permiten, unidos en mensajes válidos, dar un significado a cada mensaje. 9. LENGUAJE DE PROGRAMACIÓN: Permite expresar programas que en último término serán realizados por la máquina. Deben ser lenguajes no ambiguos y cada construcción del lenguaje tiene un sentido único. 10. ALGORITMO: Secuencia de operaciones o pasos lógicos, bien definidos que ejecutados un número finito de veces permiten resolver un problema. Luego, un algoritmo debe ser efectivo, finito y bien definido (claro y sin ambiguedades). 11. INSTRUCCIÓN: Conjunto de caracteres que específica una operación a realizar. 12. REGISTRO: Colección de datos relacionados, pertenecientes a una entidad lógica. 13. SOFTWARE: Conjunto de programas. Aspectos lógicos o algorítmicos de un sistema computacional. 14. HARDWARE: Componentes físicos, discretos y reproducibles a partir de un patrón de un sistema computacional.(ej. CPU, memoria, dispositivos I/O, etc.). 15. PROGRAMA: Es un conjunto de comandos o sentencias ( instrucciones ) que representan un algoritmo en un lenguaje de programación determinado. 16. ARCHIVO: Es un conjunto de datos relacionados mediante una determinada característica o propiedad. Laura Setti Duque 2 17. MEMORIA: Conjunto de registros, capaces de almacenar un valor. En ellos se almacenan el programa y los datos. 18. PROCESADOR: Dispositivo físico capaz de ejecutar las instrucciones de un programa almacenado en memoria. Puede también efectuar lectura/escritura desde y hacia memoria y/o dispositivos de entrada/salida tales como unidades de discos, cintas, impresoras, etc. 19. SISTEMA OPERATIVO: Conjunto de programas cuya función es administrar eficientemente los recursos tales como procesador (CPU), memoria, dispositivos de entrada/salida, etc. de un sistema computacional. Entre las funciones que debe cumplir están las siguientes: - Compartir los recursos entre los distintos usuarios. Proteger al sistema de accesos no autorizados. Asignar recursos a los usuarios en la cantidad adecuada y a tiempo. Recobrar al sistema en forma ordenada de los posibles errores. Laura Setti Duque 3 UNIDAD 2: SISTEMAS DE NUMERACIÓN. 2.1 SISTEMAS NUMÉRICOS. 2.1.1 Definición. Se define como sistema de numeración, el conjunto de símbolos utilizados para la representación de cantidades, así como las reglas que rigen dicha representación. 2.1.2 Distinción. Un sistema de numeración se distingue fundamentalmente por su base, que es el número de símbolos que utiliza y que, además, se caracteriza por ser el coeficiente que determina cuál es el valor de cada símbolo dependiendo de su posición. 2.1.3 Sistemas posicionales. Los sistemas de numeración actuales son sistemas posicionales, en los que el valor relativo que representa cada símbolo o cifra depende de su valor absoluto y de la posición relativa que representa cada símbolo o cifra con respecto a la coma decimal, íntimamente ligada al valor de la base del sistema de numeración utilizado. Ejemplo: Sistema Binario, Base 2, Símbolos: 0, 1. Sistema Octal, Base 8, Símbolos: 0,1,2,3,4,5,6,7. Sistema Decimal, Base 10, Símbolos: 0,1,2,3,4,5,6,7,8,9. Sistema Hexadecimal Base 16, Símbolos:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 2.1.4 Sistema decimal. Desde hace muchos años, el hombre ha utilizado como sistema para contar el denominado decimal, que derivó del sistema numérico indoárabico; posiblemente adoptado por contar con diez dedos de las manos. Utiliza como base el 10, que corresponde al número de símbolos que comprende para la representación de cantidades estos símbolos (también denominados dígitos) son: 0,1,2,3,4,5,6,7,8,9. Ejemplo: La representación de las cantidad 2998 es: 2998 = 2 * 103 + 9 * 102 + 9 * 101 + 8 * 100 Laura Setti Duque 4 2.1.5 Teorema fundamental de la numeración. Se trata de un teorema que relaciona una cantidad expresada en cualquier sistema de numeración con la misma cantidad expresada en el sistema decimal. Supongamos una cantidad expresada en un sistema cuya base es B y representamos por cada X cada uno de los dígitos que contiene dicha cantidad, donde el subíndice indica la posición del dígito con respecto a la coma decimal, posición que hacia la izquierda de la coma se numera desde 0 en adelante y de 1 en 1, y hacia la derecha se numera desde -1 y con incremento -1. El teorema Fundamental de la Numeración dice que el valor decimal de una cantidad expresada en otro sistema de numeración, viene dado por la fórmula: . . . + X 4 * B 4 + X3 * B 3 + X2 * B 2 + X 1 * B 1 + X0 * B 0 + + X-1 * B-1 + X-2 * B-2 + X-3 * B-3 + . . . 2.1.6 Sistema binario. Es el sistema de numeración que utiliza internamente el hardware de las computadoras actuales. Se basa en la representación de cantidades utilizando los dígitos 1 y 0. Por tanto, su base es 2 (número de dígitos del sistema). Cada dígito de un número representado en este sistema se denomina bit (contracción de bynary y digit). Se suelen utilizar con nombre propio determinados conjuntos de dígitos en binario: Cuatro bits se denominan cuarteto (Ejemplo: 1001). Ocho bits octeto o byte (Ejemplo: 10010110). Al conjunto de 1.024 bytes se le llama kilobyte. 1.024 kilobytes forman el llamado megabyte. 1.024 megabytes se denomina gigabyte. 1.024 gigabytes se denomina terabyte. Por tanto, es posible establecer las siguientes igualdades relacionadas al dígito binario (bit): 1 cuarteto 1 byte 1 kilo byte 1 Mega byte 1 Giga byte 1 Tera byte = 4 bits = 8 bits. = 1.024 * 8 bits = 8.192 bits. = 1.024 * 1.024 * 8 = 8.388.608 bits. 3 = 1.024 * 8 = 8.589.934.592 bits. = 1.0244 * 8 bits. Laura Setti Duque 5 2.2 ALGORITMOS DE TRANSFORMACIÓN. 2.2.1 De base B a base 10. La pregunta aquí es la siguiente: ¿Qué número entero decimal representa al número XXX entero en B?. Entonces diremos transforme un número representado en base B a base 10, para tal efecto se utiliza el Teorema Fundamental de la Numeración. Ejemplo: 1) 2) 101101( 2 ) ( )( 10 ) 101101( 2 ) = 1*20 + 0*21 + 1*22 + 1*23 + 0*24 + 1*25 3431( 8 ) 3431( 8 ) = 1 +0 = 45 ( 10 ) 3A3B( 16 ) + 24 + 256 + 1536 (10) ( )( 10 ) = 11*160 + 3*161 + 10*162 + 3*163 = 11 = 14907 Laura Setti Duque + 0 + 32 = 1*80 + 3*81 + 4*82 + 3*83 = 1817 3A3B( 16 ) + 8 ( )( 10 ) = 1 3) + 4 + 48 (10) + 2560 + 12288 6 2.2.2 De base 10 a base B. La pregunta aquí es la siguiente: ¿Qué número entero en una base B cualquiera representa al número XXX entero decimal?. Entonces diremos transforme un número representado en base 10 a base B, para tal efecto se utiliza el Algoritmo de la división. Este método consiste en dividir el número decimal por la base B, el resultado de la división entera (cuociente) se divide nuevamente por la base B, y así sucesivamente hasta obtener cuociente 0. El número decimal resulta de escribir los restos de cada una de las divisiones, en orden inverso al que fueron obtenidos. Ejemplo: 1) 2) 3) 23( 10 ) ( )( 2 ) 23 : 2 = 11 1 Resto 11 : 2 = 5 1 5:2=2 1 2:2=1 0 1:2=0 1 97( 10 ) ( )( 12 ) 97 : 12 = 8 1 Resto 8 : 12 = 0 8 26( 10 ) El número en base 2 es: 10111 El número equivalente en base 12 es 81. ( )( 16 ) 26 : 16 = 1 10=A Resto 1 : 16 = 0 Laura Setti Duque 1 El número equivalente en base 16 es 1A. 7 2.2.3 Ejercicios propuestos. Aplique algoritmos de transformación para números enteros y fraccionarios. 1. (132)10 2. (14561)10 a ( ) 4, ( ) 8 , ( ) 32, ( ) 18 3. (987132)10 a ( )3 , ( )4 , ( )8 , ( )16 , ( )17 4. (2785)10 a ( )5 , ( )4 , ( )8 , ( )16 , ( )7 5. (1342)7 a ( )2 , ( )5 , ( )8 , ( )16 , ( )10 6. (3285)9 a ( )2 , ( )4 , ( )8 , ( )16 , ( )10 7. (ABC)16 a ( )10 , ( )4 , ( )8 , ( )11 , ( )7 8. (101111111)15 a ( )2 , ( )10 , ( )8 , ( )16 , ( )3 9. (11011111)2 10. (23132)4 11. (532)8 12. (142. 25)10 13. (14561. 75)10 14. (9832.125)10 15. (2785.134)10 16. (1342.32)7 a ( )2 , ( )5 , ( )8 , ( )16 , ( )10 17. (3285.85)9 a ( )2 , ( )4 , ( )8 , ( )16 , ( )10 18. (ABC.C)16 a ( )10 , ( )4 , ( )8 , ( )11 , ( )7 19. (101111111.11)15 a ( )2 , ( )10 , ( )8 , ( )16 , ( )3 20. (11011111.110011)2 a ( )12 , ( )4 , ( )8 , ( )16 , ( )10 21. (2332.25)4 Laura Setti Duque a ( )2 , ( )4 , ( )8 , ( )16 , ( )7 a ( )12 , ( )4 , ( )8 , ( )16 , ( )10 a ( )2 , ( )6 , ( )10 , ( )16 , ( )8 a ( )2 , ( )4 , ( )10 , ( )16 , ( )7 a ( )2 , ( )4 , ( )8 , ( )16 , ( )7 a ( ) 4, ( ) 8 , ( ) 32, ( ) 18 a ( )3 , ( )4 , ( )8 , ( )16 , ( )17 a ( )5 , ( )4 , ( )8 , ( )16 , ( )7 a ( )2 , ( )6 , ( )10 , ( )16 , ( )8 8 2.3 OPERACIONES NUMÉRICAS. Ejercicios propuestos. Realice las operaciones en las bases indicadas, pasando por la base 10 o base 2 según corresponda. 1. (27)8 * (52)16 = (?)2 2. (32)5 : (21)3 = (?)5 3. (100000)2 + (11000)2 = (?)2 4. (110100)2 + (?)2 = (100110)2 5. (78)3 * (?)4 = (2021)5 6. (250)8 + (?)3 = (2043)5 7. (A07)16 * (1111)9 = (?)2 8. (51)8 * (?)2 = (1111)9 - (2460)7 = (1357)11 9. (?)13 10. (460)18 - (?)4 = (ABC)16 11. (?)8 - (28A0)16 = (10010110)2 12. (123)8 + (123)4 = (?)16 13. (123.456)8 + (123.456)16 = (?)4 * (?)4 = (15CAE)16 * (325)8 = (12222122)4 14. 15. (405)8 (?)16 16. (46)7 * (X)2 = (1212)4 17. (X)16 : (101)2 = (36)8 18. (101)2 + (X)8 = (101)4 19. (351234)7 + (34521)7 = ( 20. (ABCGI)20 + (123B)20 = ( )20 21. (461)32 * (X)2 = (1212)4 22. (X)16 : (101)2 = (36)32 23. (1011011)2 - (X)2 = (101)2 24. (351234)7 * (X)7 = (AB4DI)5 Laura Setti Duque )7 9 25. (ABCGI)20 + (123B)20 = ( )20 26. (46)7 - (X)2 = (112)4 27. (X)1 * (101)2 = (32)8 28. (10111111)2 * (234)8 = ( )2 29. (334)5 + (4521)7 = ( 30. (ABCGI)19 + (123B)20 = ( )16 31. (416)7 * (X)2 = (12)3 32. (101)16 : (101)2 = ( )8 33. (101)2 + (X)8 = (101)4 34. (351234)8 - (34521)8 = ( 35. (AB12)20 + (123B)20 = ( )20 36. (24)(?) = (14)10 37. (21)(?) = (00100001)2 6 38. (0.7)(?) = 39. (0.3A)(?) = (0.0001101010)2 40. (5.5)(?) (5.625)10 = Laura Setti Duque (0.875)10 )7 )4 10 2.4 REPRESENTACIÓN INTERNA DE LOS DATOS. Tanto para los datos numéricos como para los datos literales, la representación será en base a números binarios, ya que internamente no existe otra simbología. 2.4.1 Datos numéricos. Los números se representan en formatos binarios para enteros y reales. Se pueden mencionar los siguientes formatos en bytes: 2 BYTES Punto Fijo, “Enteros Cortos”. Rango: -32768 . . 32767. 4 BYTES Punto Fijo, “Enteros Largos”. Rango: -231 . . 231 - 1 Punto Flotante, “Reales Simples”. 8 BYTES Punto Flotante, “Reales Dobles”. Un número entero entonces se representa por su equivalente binario, y los enteros negativos por su complemento dos. El formato punto fijo para 4 bytes es el siguiente: 1 BIT DE SIGNO 0 : POSITIVO 1 : NEGATIVO 31 BIT NÚMERO BINARIO En este caso se utilizan sólo 31 bits para representar al número, cualquier número que utilice más de 31 bits para su equivalente binario, no podrá representarse (overflow). Ejemplo: Para el número 1026. 0 0000000000000000000010000000010 Para representar un número real en 4 bytes, el formato punto flotante es el siguiente: 1 BIT DE SIGNO 0 : POSITIVO 1 : NEGATIVO Laura Setti Duque 23 BIT MANTISA 8 BIT EXPONENTE 11 Todos los números reales se representan internamente en este formato, para el caso 32 bits se utiliza un bit para el signo, 23 bits para los dígitos significativos del número (mantisa) y los 8 restantes para el exponente; el punto fraccionario no se almacena. Para poder almacenar exponentes negativos se introduce el concepto de CARACTERÍSTICA, que es un número arbitrario conocido que se suma al exponente y se calcula como: Característica = cantidad de números posibles de almacenar en n bit = 2n 2 2 Ejemplo: Para el número 492,17 Su equivalente binario es: 111101100.001010111000010100011110....... desplazando el punto decimal a la izquierda, y considerando los primeros 23 dígitos de izquierda a derecha del número binario, se obtiene: .111101100001010111000010100011110 E 9 mantisa exponente Conversión del exponente: + Característica Exponente 10000000 00001001 10001001 137 Representación punto flotante. 0 128 (28/2 = 256/2) + 9 11110110000101011100001 10001001 Para números con signo negativo se representan de la misma forma que los con signo positivo, cambiando el bit se signo. Otra forma de representar negativos es cambiando además del bit de signo, la mantisa por complemento dos. Laura Setti Duque 12 2.4.2 Datos alfanuméricos. Muchos conjuntos de caracteres (o alfabetos) han sido diseñados con el correr de los años para utilizarse en las computadoras. Dos de los conjuntos de caracteres más populares y completos son los conocidos como EBCDIC (Extended Binary Coded Decimal Interchange Code) y ASCII (American Standard Code for Information Interchange). EBCDIC es un sistema de codificación de caracteres que se utiliza fundamentalmente en la serie de computadoras IBM/360-370. ASCII fue desarrollado originalmente como un código estándar para la industria de las computadoras. Los conjuntos de caracteres que tienen estos dos tipos de codificación son los siguientes. CONJUNTO DE CARACTERES ASCII: 1. El alfabeto inglés, tanto en letras minúsculas como mayúsculas { a, b, c, ..., z, A, B, C, ..., Z}. 2. Los caracteres numéricos decimales: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. 3. Operaciones y caracteres especiales {+, -, *, /, >, <, =, , espacio, !, “, #, $, %, &, ‘, (, ), , , ; , : , ?, @, [, ], , , 4. , {, }, ~ }. Caracteres de control como DEL (Eliminar o borrar), ESC (Aborta proceso), END(Fin de línea), etc. Para propósito de comparación se tiene que ’A’ < ’B’ < ’C’ < ... < ’Y’ < ’Z’. Algunos códigos (representación binaria) de caracteres: Caracteres 0 1 2 . . 9 . A B C ASCII (8 bit) 00110000 00110001 00110010 . . 01011001 . 01000001 01000010 01000011 Laura Setti Duque Decimal 48 49 50 . . 57 . 65 66 67 13 UNIDAD 3. INTRODUCCIÓN AL LENGUAJE C CAPITULO 5: ALGORITMOS. CONCEPTOS FUNDAMENTALES. TEMA 1: DEFINICIÓN. Antes de trabajar con algoritmos es importante clarificar el significado que se le da a estos: La palabra algoritmo significa “método de resolución de un problema en un número finito de pasos”. Algoritmo no significa la resolución de un problema particular para unos datos particulares, sino la resolución de todos los problemas del mismo tipo. Un algoritmo es la descripción exacta y sin ambiguedades de la secuencia de pasos elementales a aplicar para, a partir de los datos del problema, encontrar la solución buscada. Para que un algoritmo sea completo deberá contemplar todas las alternativas lógicas posibles que las distintas combinaciones de valores de los datos puedan presentar. Un algoritmo es un método general de resolución de todos los problemas del mismo tipo. Entre los distintos tipos de algoritmos se encuentran: Los diagramas de flujo que utilizan símbolos gráficos para su resolución, seudocódigo que describe un algoritmo utilizando una mezcla de frases en lenguaje común, instrucciones de lenguaje de programación y palabras clave que definen las estructuras básicas. Este método es el que trabajaremos en este curso y es el que presenta todas las ventajas a las características de los algoritmos, técnica que es utilizada en todos los lenguajes estructurados como: Pascal, C, Dbase, Cobol, etc. Codificaremos los algoritmos escritos en seudocódigo a lenguaje C para que puedan ser ejecutados por el computador. Laura Setti Duque 14 TEMA 2: TIPOS DE DATOS. Para el trabajo con algoritmos y programas es muy importante tener claro que tipo de elementos se van a manejar en las sentencias ejecutables, que son parte del proceso y que corresponden a las acciones que van a afectar a los datos. Estos son principalmente: Variables, Constantes y Tipos de datos. 5.2.1 Datos. Los tipos de datos estándar se pueden dividir básicamente en dos grupos: datos numéricos y datos alfanuméricos. Numéricos: Se refiere principalmente a números enteros y reales. (Int, long, float, double) Alfanuméricos: Se refiere al conjunto de uno o más caracteres alfanuméricos. (char, y cadena de char). 5.2.2 Tipos y tamaños de datos en C. Los lenguajes de programación utilizan palabras reservadas que designan tipos de datos, en particular en C se manejan como estándar los siguientes. Char : Se utiliza para almacenar un carácter. Int: Se utiliza para almacenar un entero en el rango –32768 a 32767. Float: Se utiliza para almacenar un número real en precisión simple con 6 dígitos significativos. Double: Se utiliza para almacenar un número real en precisión doble con 15 dígitos significativos. Long y short: Son calificadores para enteros, y se refieren a diferentes tamaños de los números: long int , short int. También se puede omitir la palabra int. TEMA 3: OPERADORES. Son todos los símbolos que sirven de enlace entre cada uno de los argumentos que intervienen en una operación, y se utilizan para construir expresiones. Operadores Relacionales: Se utilizan en expresiones lógicas. Expresiones que al ser evaluadas producen un valor de verdad (valor distinto de 0) o falsedad (valor igual a 0). Estos son: < (menor), == (igualdad), > (mayor), <= (menor igual), >= (mayor igual), != (distinto). Ejemplo: Con números y cadenas: 1. ‘A’ < ‘B’ 2. ‘aaaa’ > ‘AAAA V 3. 2 < 12 V 4. ‘2’ < ‘12’ F V Operadores Aritméticos: Se utilizan en expresiones aritméticas, estos son: + (adición), - (sustracción), * (multiplicación), / (división), % (módulo). Laura Setti Duque 15 Operadores lógicos: Combinan sus operandos de acuerdo al álgebra de boole, y son: || (OR), && (AND), ! (NOT). La prioridad para estos operadores es: !, &&, ||. Operadores de asignación: Se utilizan para asignar el valor de una expresión a una variable, estos son: =, +=, - =, *=,%=. Combinan la asignación con una operación aritmética. Operadores de incremento y decremento: Solo son aplicables a variables y no a expresiones. Se pueden emplear como sufijos y prefijos en las variables. Incremento en 1: ++. Aumenta en una unidad a su operando. Decremento en 1: --. Disminuye en una unidad a su operando. Ejemplo: ++n : Incrementa n antes de usar su valor. n++ : Incrementa n después de que se ha empleado su valor. Si n es 5 entonces: x=n++ ; pone un 5 en x, pero x=++n; pone un 6 en x. En ambos casos el valor final de n es 6. Paréntesis( ): Se utiliza para anidar expresiones. Orden de evaluación de los operadores: En orden descendente, para igual prioridad se evalúa de izquierda a derecha. Paréntesis. Productos y divisiones. Sumas y restas. Relacionales. Lógicos. Laura Setti Duque 16 TEMA 4: VARIABLES. Son objetos básicos que se manipulan en un programa. Se considera variable a una zona de memoria referenciada por un nombre, donde se puede almacenar el valor de un dato o de una expresión, que puede ser cambiado cuando se desee. El nombre de una variable puede ser elegido por el usuario. El computador asigna a cada variable una dirección de memoria. Las variables pueden almacenar distintos tipos de información (numérica, alfanumérica). Para ser utilizadas en un programa estas deben ser definidas, asignándole un nombre, y el tipo de la información que van a almacenar. TEMA 5: CONSTANTES. Son objetos básicos que se manipulan en un programa. Se considera constante a una zona de memoria referenciada por un nombre, donde se puede almacenar el valor de un dato, que no puede ser cambiado. El tipo de la constante es de acuerdo al valor que almacena, que puede ser numérico o alfanumérico. CAPITULO 6: ESTRUCTURA DE UN PROGRAMA EN C. TEMA 1: DESCRIPCIÓN DE UN PROGRAMA EN C. Los programas escritos en C normalmente constan de una gran cantidad de pequeñas funciones en lugar de pocas y grandes. En la estructura general de un programa escrito en lenguaje C se encuentran los siguientes elementos: Comentarios opcionales, que describen la naturaleza del programa y/o algunas instrucciones. Directivas del preprocesador que comienzan con #. Inclusión de bibliotecas que permiten el uso de un conjunto de funciones predefinidas. Una sección de declaraciones, que identifica los objetos usados en el programa. Aquí se incluyen tipos de datos globales, definición de constantes y de variables globales. Una sección de definición de funciones. Definición de la función main, que es donde se específican las acciones que se ejecutarán, y desde donde se ejerce el control principal del programa . TEMA 2: FORMATO BASICO. Directivas de preprocesador (comienzan con #) [Declaración de tipos globales] /*opcional*/ [Declaración de variables globales] /*opcional*/ [Definición de funciones] /*opcional*/ Definición de función main() /* Inicio de sentencias función main*/ { [Sentencias para el control principal del programa] } /*Fin de sentencias función main*/ Laura Setti Duque 17 Ejemplo: #include <stdio.h> /*Definición de biblioteca estándar*/ #define Largo 100 /*Definición de la constante entera largo*/ int n; /* Definición de la variable global entera n*/ main() /* Definición de la función main*/ { int n, k; /* Definición de las variables locales enteras n y k*/ k=10; n=k*10; return(0); } Laura Setti Duque 18 UNIDAD 4: ESTRUCTURAS BÁSICAS DE CONTROL, Secuenciales, selectivas e iterativas. La programación estructura es una técnica de programación que utiliza estructuras de control previamente definidas, estas estructuras se clasifican en cuatro formas básicas para las sentencias (instrucciones): secuenciales, selectivas, iterativas y de subprogramas. CAPITULO 7: LENGUAJE C, SECUENCIA. TEMA 1: SECUENCIA, Sintáxis. Si se tiene un conjunto de acciones {S1, S2, ...., Sn} cuyos índices señalan el orden en que se ejecutan, entonces determinan una secuencia. Las típicas sentencias secuenciales son de lectura de variables, asignación de expresiones y salida de resultados. Formato: Inicio S1: Inicio S2: Ejecutar sentencia A S3: Ejecutar sentencia B A B S4 : Ejecutar sentencia C . C . Sn: Parar Parar Consideremos el siguiente algoritmo: S1: Inicio S2: Introducir a y b S3: Calcular a*b s4: Mostrar resultado S5: Parar En un algoritmo o programa secuencial estructurado, no se puede ejecutar por ejemplo la sentencia 4 sin haber realizado las anteriores (1,2,3). No está permitido devolverse, es decir no pueden existir saltos incondicionales. En el ejemplo se presenta un algoritmo más bien narrativo que seudocódigo. Los formatos que utilizaremos para sentencias secuenciales son los siguientes: Laura Setti Duque 19 TEMA 2: LECTURA DE VARIABLES. Permite el ingreso de uno o más datos, a una o más variables desde el teclado o desde un archivo. Formato: Leer(V1, v2,v3,..,Vn) { primer valor ingresado se almacena en la variable V1, segundo valor ingresado se almacena en la variable V2,....., en la variable Vn se almacena el enésimo valor} o Leer(V1) Leer(V2) Leer(Vn) . . Leer(Vn) TEMA 3: ASIGNACIÓN DE EXPRESIONES. Permite almacenar en una variable el valor de una expresión. La variable y la expresión debe ser del mismo tipo, o el tipo de la variable contener al de la expresión. Ejemplo: Una variable real puede contener a un valor entero, o una variable cadena puede contener a un valor carácter. Formato: Variable <Expresión> Salida de resultados: Permite imprimir por pantalla, impresora o salida a un archivo, una o más expresiones de tipo numérica o alfanumérica. Formato: Escribir(Exp1, Exp2, Exp3 ,.., Expn) { el primer valor que se imprime es el de la expresión Exp1, segundo valor que se imprime es el de la expresión Exp2,....., y así sucesivamente} o Escribir(Exp1) Escribir(Exp2) Escribir(Exp3) . . Escribir(Expn) TEMA 4: LENGUAJE C, SECUENCIA APLICACIONES. Laura Setti Duque 20 Ejercicios resueltos. 1. Escribir un algoritmo en seudocódigo y programa que lea dos números enteros, calcule la suma, la diferencia y el producto de ese par de números, y finalmente imprima sus resultados. Algoritmo en seudocódigo: Inicio Leer (A,B) Suma A+B Resta A -B Producto A *B Escribir(Suma, Resta, Producto) Fin Programa en C. #include <stdio..h> #include <conio.h> main() { int A,B,Suma,Resta,Producto; printf("Ingrese dos números enteros \n"); scanf("%d",&A); scanf("%d",&B); Suma=A+B; Resta=A-B; Producto=A*B; printf("La suma es: %d \n",Suma); printf("La resta es: %d \n",Resta); printf("El producto es: %d \n",Producto); getche(); } Laura Setti Duque 21 2. Escribir un algoritmo en seudocódigo y programa que ingrese el costo de un artículo, calcule el I.V.A. y el precio de venta. Finalmente imprima precio de costo, I.V.A. y el precio de venta. Algoritmo en seudocódigo: Inicio Leer (Pcosto) Iva Pcosto*0.18 Pventa Pcosto + Iva Escribir(‘ Precio de costo =’, Pcosto) Escribir(‘ I.V.A. =’, Iva) Escribir(‘ Precio de Venta =’, PVenta) Fin Programa en C. #include <stdio.h> #include <conio.h> float Pcosto,Iva,Pventa,suma; main() { printf("Ingrese precio de costo \n"); scanf("\n %f",&Pcosto); Iva=(Pcosto*0.18); Pventa=(Pcosto+Iva); printf("\n I.V.A. = %f",Iva); printf("\n Precio de Venta= %f",Pventa); getche(); } 3. Escribir un algoritmo en seudocódigo y programa que ingrese un número real e imprima el número truncado y redondeado. Algoritmo en seudocódigo: Inicio Leer (Num) Escribir(Truncado(Num)) Escribir(Redondeado(Num)) Fin Laura Setti Duque 22 Programa en C. #include <stdio.h> #include <conio.h> #include <math. h> main() { double num; printf("Ingrese un número cualquiera"); scanf ("%lf",&num); printf("El número truncado es: %ld",int(num)); printf("El número redondeado es: %lf",ceil(num)); getche(); } 4. Escribir un algoritmo en seudocódigo y programa que calcule e imprima el promedio de cuatro números reales. Algoritmo en seudocódigo: Inicio Leer (A,B,C,D) Suma A+B+C+D Promedio Suma/4 Escribir( A, B, C, D) Escribir(‘ Su promedio es:’,Promedio) Fin Programa en C. #include <stdio.h> #include <conio.h> main() { float A, B, C, D, Suma, Promedio; printf("Ingrese 4 números cualquiera \n"); scanf("%f",&A); scanf("%f",&B); scanf("%f",&C); scanf("%f",&D); Suma = A + B + C + D; Promedio= Suma/4; printf("\n Su promedio es: %f", Promedio); getche(); } Laura Setti Duque 23 TEMA 5: LENGUAJE C, secuencia. Aplicaciones. Ejercicios Propuestos. 1. Ingresar una temperatura real que está en grados Farenheit y convertirla a grados Celsius. Imprimir ambos valores. Cº = (Fº -32) *5/9 2. Se ingresa una longitud expresada en pies y otra en pulgadas, determinar su equivalente métrico tanto en metros como en centímetros. 1 pie = 12 pulgadas 1 pulgada = 2.54 cm. 1 metro 3. = 100 cm. La lechería despacha al supermercado N cartones de mantequilla de C Kg. cada uno. La mantequilla está envasada en paquetes de E Kg.. Calcular cuántos paquetes se despacharon y cuántos paquetes contiene cada cartón. 4. Se tiene una habitación de L metros de largo y A de ancho. Calcular el perímetro de la habitación. Si está se llena con cajas de C cm2 . Determinar el número de cajas que puede contener la habitación. 5. Se tiene un jarro que puede contener hasta N litros. Calcular el número de vasos de agua de X cc. que llenarían el jarro. 6. Un tren salió a las hh:mm y llegó puntualmente, h horas y m minutos después a su destino. Determinar la hora de llegada. 7. Si la fecha de nacimiento de una persona se lee en el formato ddmmaa. Determinar su edad a la fecha actual y emitir un mensaje si está de cumpleaños. 8. Un tren salió de Santiago a las H1 hrs. y viajó a una velocidad de X1 kms/hora y otro tren salió de Puerto Montt a las H2 hrs. y viaja a una velocidad de X2 kms./hora. ¿ A qué hora y en que kilómetro se encuentran los dos trenes suponiendo que la distancia entre las dos ciudades es de T kms. ? 9. Transforme un número N entero de cuatro dígitos de base B (2..9) a base 10. 10. Invierta el orden de los dígitos de un número entero de 4 dígitos. 11. Tres Empresas de Transporte de pasajeros han enviado a licitación al Ministerio de Transporte y Urbanismo el valor del pasaje que empezará a regir a partir del segundo semestre de 1999. El personal encargado de realizar el estudio ha perdido el valor enviado por la tercera empresa (Z), pero aún Laura Setti Duque 24 mantienen los precios de las otras dos (X, Y), y además recuerdan que el valor perdido (Z) se podía calcular de la tercera parte del valor de la primera empresa (X), más las tres cuartas partes del valor de la segunda (Y). Se pide: a) Determinar e imprimir el valor del pasaje (Z) de la tercera empresa. b) Se piensa que en diez años más el valor del pasaje de cada empresa (X, Y,Z) aumentará al doble. Determine e imprima el valor del pasaje para cada empresa en ese tiempo. 12. Ana María tiene A años, y su amigo Miguel tiene B años, ambos desean saludar a su amigo en común Mario, pero no recuerdan exactamente cuántos años cumple, sólo recuerdan que se calculaba de la mitad de la edad de Ana María, más un tercio de la edad de Miguel. Se pide: a) Determinar e imprimir la edad actual de Mario. b) Determinar e imprimir la edad que tendrán los tres amigos en 10 años más. 13. Para una persona que opta por un subsidio habitacional se necesita determinar su puntaje de postulación. Los antecedentes necesarios para el cálculo son: valor de la UF al momento de postular, años de antigüedad, total de dinero ahorrado en pesos, número de cargas familiares, cantidad de UF pactada y sueldo líquido. El puntaje se obtiene como: a) Por cada UF ahorrada se contabiliza 1 punto. b) Por cada carga familiar incluida la persona 10 puntos. c) Por cada año de antigüedad 4 puntos. d) Por cada Uf que exceda lo pactado ½ punto. Determine e imprima el puntaje obtenido para la postulación. 14. Los antecedentes personales y académicos de los alumnos que ingresaron al DUOCUC el primer semestre de 2001, están almacenados en C carpetas donde cada carpeta contiene X fichas (una por alumno), cada ficha contiene a lo más D datos. Cada dato corresponde a una palabra de un byte. Determinar e imprimir cuántos discos se necesitan para almacenar el total de la información de los alumnos, sabiendo que cada disco tiene una capacidad de Z kilobytes. Laura Setti Duque 25 CAPTIULO 8: LENGUAJE C, selección simple y compuesta. TEMA 1: DEFINICIÓN. Las instrucciones condicionales o tomas de decisión permiten realizar acciones alternativas, por lo tanto, la ejecución de una línea o grupos de líneas de un algoritmo o programa depende de si cumplen o no una o varias condiciones. Una condición corresponde al valor de una expresión lógica. TEMA 2:TOMA DE DECISIÓN. a) Alternativa Simple: Involucra una alternativa de acción y su estructura en seudocódigo es: Si <CONDICIÓN> entonces <ACCIÓN> Finsi que corresponde a la proposición If de C: If <CONDICIÓN> BLOQUE; CONDICIÓN: Es una expresión de tipo lógica. BLOQUE: Es un conjunto de instrucciones encerradas entre llaves { } Ejemplo: Si (Buen_tiempo) entonces Paseo ‘ bajar a la playa’ Finsi b) Alternativa Compuesta: Involucra dos alternativas de acción y la estructura en seudocódigo es: Si <CONDICIÓN> entonces <ACCIÓN1> Sino <ACCIÓN2> Finsi Laura Setti Duque 26 que corresponde a la proposición if/else en C: If <CONDICIÓN> BLOQUE1; else BLOQUE2; Si el valor de la condición es verdadero, la acción que sigue a entonces es ejecutada, si es falso se ejecuta la acción que sigue a sino. Ejemplo 1. Inicio Escribir(‘Ingrese un número’) Leer(Numero) Si (Numero>=0) entonces Total Raiz2(Numero) Sino Total Cuadrado(Numero) Finsi Escribir(‘ El total es:’, Total) Fin Ejemplo 2. Inicio Escribir(‘Ingrese medida del lado del cuadrado’) Leer(Lado) Si (Lado >0) entonces Area Cuadrado(Lado) Perimetro 4*Lado sino Lado 0 Escribir (‘ Lado negativo o nulo, no hay mediciones’) Finsi Fin Ejercicio: Codifique los algoritmos de los ejemplos 1 y 2 a lenguaje C. Laura Setti Duque 27 CAPITULO 8: SENTENCIAS CONDICIONALES ANIDADAS. TEMA 1: DEFINICIÓN. Las sentencias que siguen a entonces y/o a sino, pueden ser a su vez otras sentencias selectivas, y si este es el caso, estamos en presencia de una estructura condicional anidada. TEMA 2: EJEMPLOS. Ejemplo 1: main() { int numero; char nombre; char Tipo_carac; printf(" Ingrese tipo de dato a leer “dígito o letra \n"); scanf("%c",&Tipo_carac); if (Tipo_carac == ‘d’) scanf("%d",&numero); else if (Tipo_carac == ‘l’) scanf("%c",&nombre); else printf("Errorrrrrr"); } Ejemplo 2: Dado tres números distintos , determinar el mayor. Inicio Escribir(‘ Ingrese tres números’) Leer(A,B,C) Si (A > B) entonces Si (B > C) entonces Mayor A Sino Mayor C Finsi Sino Si (A > C) entonces Mayor B Sino Mayor C Finsi Finsi Escribir(‘ El mayor es:’, Mayor) Fin Laura Setti Duque 28 En C queda de la siguiente forma: #include <stdio.h> #include <conio.h> main() { float a,b,c,mayor; printf("Ingrese tres numeros \n"); scanf("%f",&a); scanf("%f",&b); scanf("%f",&c); if (a > b) if (a > c) mayor = a; else mayor = b; else if (b > c) mayor = b; else mayor = c; printf("\n El mayor es: %f", mayor); getche(); } Ejemplo 3. Determinar e imprimir las raíces de una ecuación cuadrática de la forma ax2 + bx + c = 0. Análisis: Entradas: Los coeficientes (a, b, c). Salidas : Las raíces (x1, x2). Proceso : Calculo de las raíces. Caso a: Si a=0 y b=0, no existe ecuación. Caso b: Si a=0 y b<>0, se convierte en una ecuación lineal y la solución única es : -c/b. Caso c: Si a<>0 y b<>0, entones se aplica la fórmula X = -b ± √ b2 - 4ac 2a en este caso los valores de las raíces va a depender del discriminante dis=b 2 - 4ac, para dis= 0 dos raíces reales e iguales, para dis>0 dos raíces reales y distintas, y para dis<0 dos raíces complejas. Laura Setti Duque 29 Algoritmo: Inicio Escribir(‘Ingrese los coeficientes de la ecuación cuadrática’) Leer(a,b,c) Si (a=0) y (b=0) entonces Escribir(‘ No existe ecuación’) Sino Si (a=0) entonces Escribir(‘ La única raíz es:’, -c/b) Sino Dis cuadrado(b) - (4*a*c) Re -b/(2*a) Im raíz2(absoluto(Dis))/(2*a) Si (Dis=0) entonces Escribir(‘ Las raíces son reales e iguales y son:’, Re, Re) Sino Si (Dis > 0) entonces Escribir(‘ Las raíces son reales y distintas y son:’) Escribir(‘X1 =’, Re + Im, ‘X2 =’, Re - Im) Sino Escribir(‘ Las raíces son complejas y son:’) Escribir(‘X1 =’, Re ,’+’, Im, ‘X2 =’, Re,’ -‘, Im) Finsi Finsi Finsi Finsi Fin Código en C: #include <stdio.h> #include <conio.h> main() { float a, b, c, dis, re, im; printf("Ingrese los coeficientes de la ecuación cuadrática \n") ; scanf("%f",&a); scanf("%f",&b); scanf("%f",&c); if ((a==0) && (b==0)) printf("No existe ecuación \n"); else if (a==0) printf("La única raíz es: %f", -c/b); else { dis = (b*b) - (4*a*c) ; re = -b/(2*a) ; Laura Setti Duque 30 im = sqrt( abs(dis) ) /(2*a); if (dis==0) printf("\n Las raíces son reales e iguales y son:%f %f", re, re); else if (dis > 0) { printf("\n Las raíces son reales y distintas y son:"); printf("x1 =%f ,x2 =%f ", re+ im,re-im) ; } { printf("Las raíces son complejas y son:"); printf("x1 =%f + %f ,x2 =%f - %f", re, im,re,im); } } getche(); } Ejercicio: Determine las salidas del programa para las entradas: a=0, b=0, c=7 ; a=0, b=10, c=2 ; a=2, b=3, c=0 ; a=1, b=5, c=6 ; a=1, b=1, c=1 Laura Setti Duque 31 CAPITULO 10: SENTENCIA SWITCH DE C. TEMA 1: DEFINICIÓN. La sentencia Switch de C es similar a un conjunto de sentencias If anidadas. Si el valor de expresión selectora coincide con uno de los valores de la lista de constantes, el bloque de instrucciones asociado con la lista se ejecutará, sino coincide con ninguna, la sentencia Switch no se realizará y la ejecución continuará con la siguiente sentencia del programa. Formato: Switch (Expresión_selectora) Instrucciones; Expresión_selectora: Es una expresión escalar. Puede ser de tipo entero o caracter. No podrá ser una expresión de tipo real o cadena Una instrucción switch puede incluir varios grupos de instrucciones y cada instrucción se identifica con una o varias etiquetas (distintas opciones o valores). Forma 1: Switch (Expresión_selectora) Case expresión: Bloque; Forma 2: Switch (Expresión_selectora) Case expresión 1: Case expresión 2: . . Case expresión n: Bloque; TEMA 2: EJEMPLOS. Ejemplo 1: Switch (indicador) { case –1: y = fabs(x); break; Laura Setti Duque 32 case 0: y = sqrt(x); break; case 1: y = x; break; case 2: case 3: y = 2*(x-1); break; default: y=0; } La instrucción break se utiliza para terminar la ejecución de ciclos o salir de una instrucción. Ejemplo 2: Determinar el largo de un mes cualquiera. main() { int yy,mm,lar; printf(“Ingrese mes”); scanf(“%d”,&mm); . . . Switch ( mm) { Case 1: Case 3 Case 5: Case 7: Case 8: Case 10: Case 12: lar=31; break; Case 4: Case 6: Case 9: Case 11: lar=30; break; Case 2: printf(“Ingrese año”); scanf(“%d”,&yy); If ((yy%4= = 0) && (yy % 100!= 0 ) ) lar= 29; Else lar= 28; break; } Laura Setti Duque 33 TEMA 3: SELECCIÓN . Aplicaciones. Escriba un algoritmo en seudocódigo y su correspondiente programa en C para cada enunciado. 1. Resolver un sistema de ecuaciones con dos incógnitas utilizando la regla de cramer, verificar condición. 2. Determine si un número n entero positivo ingresado por teclado es par o impar, envíe el mensaje adecuado. 3. Determine el valor a pagar por el envío de un telegrama, sabiendo que por cantidad de palabras menor 0 igual a 50 se pagan $500 y que por cada palabra en exceso se agregan $5. 4. Determine el valor a pagar por el envío de un encomienda, sabiendo que por peso menor 0 igual a 5 kilos se pagan $2000 y que por cada gramo de exceso se agregan $500. 5. Determine si una fecha ingresada por teclado es válida. La fecha se lee en formato ddmmaaaa. 6. Determinar la edad de una persona dada su fecha de nacimiento y fecha actual. Imprima la edad en años, meses y días. Si está de cumpleaños envíe un mensaje. Utilice formato ddmmaaaa para las fechas. 7. Determine la estación del año para un día y mes ingresado por teclado. 8. Determine el signo del horóscopo para el día y mes de nacimiento de una persona ingresados por teclado. 9. Transforme si es posible un número entero en base 16 de 4 dígitos a las bases 2,4,8 y 10. El número en base 16 puede ser leído como cadena. 10. Dados tres números distintos, determinar el mayor de ellos. 11. Dados tres números distintos, determinar el menor de ellos. 12. Imprimir de mayor a menor tres números distintos. 13. Imprimir de mayor a menor tres números distintos. 14. Calcular e imprimir las raíces de una ecuación cuadrática de la forma: ax2 + bx + c = 0 15. Determine si un medicamento está vencido a la fecha actual. Las fechas se ingresan en formato ddmmaaaa. Laura Setti Duque 34 16. Se pide calcular el peaje a pagar por un vehículo. Este peaje determina según tipo, año y kilometraje del vehículo, de acuerdo a la siguiente tabla: Tipo Moto Cargo según año <= 1985 $200 > 1985 $300 Cargo según kilometraje.$ / kms. $30 Auto <= 1985 $500 > 1985 $650 $50 Furgón <= 1985 $550 > 1985 $700 $60 Bus <= 1985 $600 > 1985 $750 $70 camión <= 1985 $650 > 1985 $800 $80 17. Dadas 10 monedas iguales, una de las cuales es más liviana que las demás, determinar cual de ellas es con el mínimo de sentencias Si. 18. Un número entero es divisible por seis si es divisible por dos y por tres a la vez. Un entero es divisible por tres si la suma de sus dígitos es múltiplo de 3. Verifique mediante este método si un número N entero de 4 dígitos es o no divisible por seis. 19. Verifique que el ingreso de una fecha en que se realizó una bienal de arte en el centro cultural Expresiones está correcta. Se sabe que los eventos se empezaron a realizar a partir del año 1971, y de ahí en adelante cada dos años, en los meses de setiembre y diciembre alternadamente, la primera se realizó en setiembre. La fecha se ingresa en formato ddmmaa. Verifique día, mes y año. 20. Escribir un programa que acepte un año escrito en cifras arábicas y lo visualice en números romanos, dentro del rango 1000 a 2000. 21. Determinar la cantidad de días de un mes conociendo el número del mes y el número del año. Laura Setti Duque 35 22. Un análisis de control de calidad de un proceso de fabricación de productos ha determinado como defectuosos las piezas con códigos en el siguiente rango: 146-156, 700-799,y 888-911. Determine si un artículo con un número de serie determinado es defectuoso correcto. 23. Dadas dos letras minúsculas del alfabeto determinar: a) cuántas letras las separan, b) escribir la letra o las dos letras centrales del intervalo que determinan en mayúsculas. 24. Dado un año determinar a qué siglo pertenece. 25. Dado los nombres y edades de tres personas, imprima el nombre de la persona con menor edad. Laura Setti Duque 36 CAPITULO 11: LENGUAJE C. Iteración TEMA 1: DEFINICIÓN. A menudo es necesario repetir un mismo conjunto de instrucciones bajo una <CONDICIÓN>, durante la ejecución de un programa. La situación anterior corresponde a un proceso iterativo (o repetitivo). La estructura iterativa debe contener instrucciones que incidan en el valor de verdad de la <CONDICiÓN> para poder abandonarla en algún momento. TEMA 2: SENTENCIA MIENTRAS. La primera sentencia iterativa que analizaremos es la llamada Mientras (Mientras/Haga/Fin Mientras). Formato: Seudocódigo: Mientras <CONDICIÓN> Haga <ACCIÓN> Fin Mientras Al encontrar la estructura se evalúa la <CONDICIÓN>, sólo si es verdadera se ejecuta la sentencia Mientras, se continúa dentro de la estructura mientras se cumpla la condición. El ciclo Mientras de repite cada vez que la condición es verdadera y termina cuando la condición es falsa, continuando con la siguiente sentencia del programa. Lenguaje C: while <CONDICIÓN> BLOQUE; Ejemplo: . . . Escribir(‘ Ingresar edad’) Leer( Edad) Mientras ( edad < 0 ) Haga Escribir(‘ ERROR, edad negativa’) Leer( Edad) Fin Mientras . . . Laura Setti Duque 37 En Lenguaje C: main() { int edad; printf("Ingresar edad \n") ; scanf("%d",&edad); while (edad < 0) { printf("ERROR,\n"); scanf("%d",&edad) ; } } TEMA 3: SENTENCIA Hacer/Mientras. Una segunda sentencia iterativa es la denominada Hacer/Mientras. Formato: Seudocódigo: Hacer BLOQUE Mientras <CONDICIÓN> Se ingresa a la estructura incondicionalmente, esto implica que la acción contenida en el Hacer/Mientras se ejecuta al menos una vez. A continuación se evalúa la <CONDICIÓN>, si es falsa se termina el ciclo, en caso contrario, se repite todo el ciclo desde la primera instrucción contenida en él. Lenguaje C: do BLOQUE; while <CONDICIÓN>; Para esta forma se ejecuta por lo menos una vez el bloque de instrucciones, y luego se evalúa la condición. Cada vez que sea verdadera la condición se ejecuta nuevamente el bloque de instrucciones. Laura Setti Duque 38 Ejemplo: . . . Hacer Escribir(‘ Ingresar tres números’) Leer(N1,N2,N3) S N1 + N2 + N3 P S/3 Escribir(‘ El promedio de los tres números es:’, P) Escribir(‘ Otros tres S/N?’) Leer(Resp) Mientras (Resp = ‘S’) . . . En Lenguaje C: #include <stdio. h> #include <ctype. h> main() { float n1,n2,n3,suma,prom; char resp; do { printf("Ingresar tres números \n"); scanf("%f",&n1); scanf("%f",&n2); scanf("%f",&n3); suma = n1 + n2 + n3 ; prom = suma/3 ; printf("\n El promedio de los tres números es: %f", prom); printf("\n desea seguir usando el programa s/n?") ; fflush(stdin); scanf("%c",&resp); } while ( (toupper(resp) ==’S’); } Laura Setti Duque 39 TEMA 4: SENTENCIA Para/Fin para. La última sentencia iterativa que revisaremos es la estructura PARA. Esta estructura incluye tres expresiones, la primera permite la inicialización de variables, la segunda condiciona la ejecución del ciclo, y la tercera modifica la/s variables inicializadas en la primera expresión. Formato: Seudocódigo: Para (expresión1, expresión2, expresión3) BLOQUE Fin Para Expresión1 : Es una expresión de asignación. Expresión2: Representa una condición que debe ser satisfecha para que continúe la ejecución del bloque de instrucciones contenido en el ciclo. Expresión3: Se utiliza para modificar el valor de la variable inicialmente asignado en la expresión1. Lenguaje C: for (expresión1; expresión2; expresión3) BLOQUE; Para las expresiones indicadas en el Fo r, C permite incluir más de una en cada caso. Es decir más de una asignación, más de una condición, más de una modificación de variables dependiendo de la situación a resolver. Ejemplo: Segmento que imprime la tabla de multiplicar de un entero N. . . . Escribir(‘ Ingrese un número’) Leer(N) Para (I=1,I< 12,I=I+1) Escribir(N,’ * ‘, I, ‘ = ‘, N*I) Fin Para . . . Lenguaje C main() { int n; int i; printf("Ingrese un número \n"); scanf("%d",&n); for (i=1; i<=12; i++) printf("%d * %d = %d",n,i,n*i); getch(); } Laura Setti Duque 40 CAPITULO 12: LENGUJAE C. Iteración, Aplicaciones TEMA 1: EJERCICIOS RESUELTOS. 1. Determinar si un número entero positivo es primo. Un número es primo si sólo es divisible por 1 y si mismo. Inicio Escribir(‘ Ingrese un entero positivo’) Leer(N) Sw 0 I 2 Hacer Si (Resto(N / I) = 0) entonces Sw 1 Escribir(N,‘ No es un número primo’) Fin si I I+1 Mientras ( I<= Entero(N/2) ) y ( Sw = 0) Si (Sw = 0) entonces Escribir(N, ‘ Es un número primo’) Fin si Fin 2. Determine el total a pagar por la compra de N productos adquiridos en un supermercado. Inicio Escribir(‘ Ingrese total de artículos’) Leer(N) Total 0 Para (I=1,I<= N,I=I+1) Escribir(‘ Ingrese valor del artículo’) Leer(Valor) Escribir(‘ Ingrese total de unidades a comprar’) Leer(Unidades) Total Total + (Valor * Unidades) Fin Para Escribir( ‘ El total a pagar es:’, Total) Fin 3. Calcule e imprima el valor de ab, b entero. Inicio Escribir(‘ Ingrese base y exponente entero’) Leer(a,b) P 1 Si ( b < 0) entonces b -b a 1/a Fin si Para (I=1,I<= b,I=I+1) P P*a Fin Para Escribir(a,’ elevado a’, b,’ es :’, P) Laura Setti Duque 41 Fin Ejercicio: Codifique a lenguaje C los ejercicios 1, 2 y 3. 4. Programa que imprime cada carácter con su correspondiente código ascii. main() { int i; for (i=1;i<=255;i++) { printf("%c,%d\n", (char)(i),i); } getch(); } TEMA 2: EJERCICIOS PROPUESTOS. Diseñe un algoritmo en seudolenguaje y su correspondiente programa en lenguaje C para cada uno de los siguientes problemas. 1. Imprimir los números enteros de 0 a 100. 2. Imprimir los números enteros de 100 a 0. 3. Imprimir los números pares 0 a 100. 4. Imprimir la suma de los primeros 100 números naturales. 5. Imprimir los números impares hasta 100 y contarlos. 6. Imprimir los números impares desde 100 hasta 1 y calcular la suma. 7. Imprimir los números naturales desde 1 hasta un número ingresado por teclado. 8. Imprimir y contar los múltiplos de 3 desde 1 hasta 100. 9. Calcular la suma de los números impares entre 0 y 100. 10. Imprimir, contar y sumar los múltiplos de 2 hasta un número introducido por teclado. 11. Introducir un número por teclado menor de 500. Imprimir, sumar y contar los números que están separados entre si 8 posiciones, desde ese número al 500. 12. Contar e imprimir los múltiplos de 5 que hay entre 1 y 500. 13. Calcular la suma de los cuadrados de los números pares entre 0 y 100. 14. Introducir un número por teclado menos de 100. Imprimir la suma de los cuadrados de los números que están separados entre sí cuatro posiciones. Laura Setti Duque 42 15. Imprimir y contar los números que hay del 1 al 100, excepto los múltiplos de 5, entregar la suma de los múltiplos de 5. 16. Introducir una serie de números. Sumar los múltiplos de 8, determinar cuál es el mayor y cuántos números se han introducido. 17. Imprimir 10 veces la serie de números de 1 a 10. 18. Imprimir y contar los números que son múltiplos de 2 o 3 que hay entre 1 y 100. 19. Imprimir y contar los números que son múltiplos de 2 y 3 que hay entre 1 y 100. 20. Introducir tantos números como queramos. Decir sin son mayores o menores que un número que previamente introducimos por teclado. 21. Imprimir, contar y sumar los múltiplos de 2 de la serie de números que hay entre dos números ingresados por teclado, tal que el segundo sea mayor o igual al primero. 22. Dado un número ingresado por teclado imprimir su tabla de multiplicar. 23. Determinar la suma de N números. 24. Determinar el promedio de N números. 25. Determinar la multiplicación de dos números enteros mediante sumas sucesivas. 26. Determinar la división de dos números enteros mediante restas sucesivas. 27. Determinar el resto de la división entera entre dos números enteros, mediante restas sucesivas. 28. Determinar la cantidad de dígitos de un número entero positivo. 29. Contar las veces que se repite un dígito d cualquiera en un número entero positivo. 30. Determinar si un número N entero positivo es primo. 31. Determinar e imprimir los primeros N términos de la serie fibonacci. 32. Determinar e imprimir los primeros N términos primos de la serie fibonacci. 33. Calcular el factorial de un número entero positivo. 34. Invertir los dígitos de un número entero positivo. 35. Determinar si un número entero positivo es palíndromo. 36. Identificar si la suma de los dígitos de un número entero positivo es par o impar. 37. Se ingresan los datos de N personas, estos son nombre, edad, estado civil y n o de cargas familiares. Se pide determinar e imprimir: la edad promedio de las personas, la mayor y menor edad, cantidad de solteros con cargas familiares y cantidad de casados con más de una carga familiar. 38. Simplificar la fracción N/M, con N y M enteros positivos. Laura Setti Duque 43 39. 40. Determinar e imprimir el valor de la serie 1 + ½ + 1/3 + ¼ + 1/5 + ... + 1/N. Determinar e imprimir el valor de la serie 1 + ½! + 1/3! + ¼! + 1/5! + ... + 1/N! . 41. Determinar si M es divisor de N mediante restas sucesivas. 42. Determinar e imprimir los valores de la función F(x) = x3 - x2 + 1 para valores de x entre 1 y N enteros. 43. Determinar e imprimir los valores de la serie : x - x2/2! + x3/3! - x4/4! + x5/5! - ... + xN/N! 44. Calcule e imprima el valor de ab, a:real y b:entero. 45. Averigue mediante restas sucesivas si un número n es par o impar. 46. Imprima los N primeros números primos. 47. Imprima la suma de los N primeros números primos. 48. Determine todos los factores primos que componen un entero N. 49. Imprima un mensaje que indique la cantidad de dígitos de un número n es par o impar. 50. Determine los N primeros números perfectos. 51. Imprimir cada valor y obtener la suma de los N primeros términos de la serie: 1, 12, 123, 1234, . . . 52. Se ingresan N números desde el teclado, calcular e imprimir el promedio de los datos positivos, y el promedio de los datos negativos (considere al cero como positivo). 53. Se ingresan N números enteros positivos, imprima aquellos cuyos últimos k dígitos sean divisibles por 7. 54. Determinar e imprimir la suma de los dígitos pares de un número entero positivo N. 55. Valide el dígito verificador de un rut ingresado por teclado. 56. Se ingresan para N matrimonios los siguientes datos: años de matrimonio de cada pareja y edad de cada integrante de la pareja. Se desea conocer el promedio de edad de todos los matrimonios con más de X años de casados. 57. Se lee un número N entero positivo y se desea imprimir los dígitos pares de este. Ejemplo: Si N= 1876543, se imprimen los dígitos 4, 6 y 8. 58. Se ingresan los datos de N pasajeros de un viaje en autobús con dirección al sur de Chile, por cada pasajero se lee la información de: Número de asiento, destino y edad. Se pide crear un programa en lenguaje C que determine e imprima: a) La edad promedio de los pasajeros. b) Número de pasajeros que viajan a Puerto Varas. 59. Calcular la suma de los términos de la serie ½ + 2/22 + 3/23 + . . . + n/2n Laura Setti Duque 44 60. Determinar de cuántas maneras posibles un número entero positivo N puede descomponerse en la suma de enteros positivos. 61. Dado el siguiente algoritmo en seudo lenguaje responda las preguntas para N = 11339778. Realice la traza. 1.Cuál es el valor de la variable P ? 2.Cuál es el valor final para las variables S, I y N ? 4.Cuál es la salida del algoritmo ? Inicio Escribir(’Ingrese valor’) Leer(N) S 0 I 2 Hacer Si (I=8) entonces I 2 Fin si S S + ( ( N % 10 ) * I ) I I+1 N N / 10 Mientras (N> 0) P 11 - (S % 11) Si (P>0) y (P<=9) entonces Escribir(P) Sino Si (P = 10) entonces Escribir(’K’) Sino Escribir(’0’) Fin si Finsi Fin 62. Visualizar en pantalla una figura similar a la siguiente: # ## ### #### ##### 63. Multiplique dos números enteros mediante el algoritmo de la multiplicación rusa. Este algoritmo multiplica por 2 el multiplicando y divide por 2 el multiplicador hasta que el multiplicador toma el valor 1. Después suma todos los multiplicadores correspondientes a multiplicadores impares. Dicha suma es el resultado del producto de los dos números. Ejemplo: 37 * 12 = 444 ( multiplicador :37, multiplicando:12) 37 12 18 24 9 48 4 96 2 192 1 384 producto = 12 + 48 + 384 = 444 Laura Setti Duque 45 UNIDAD 5: SUBPROGRAMAS. CAPITULO 13: CONCEPTO DE SUBPROGRAMA. TEMA 1: DEFINICIÓN. Un subprograma es una parte de un programa que ejecuta una tarea específica, incluida dentro de la más general que realiza este último. TEMA 2: Relación con el programa principal. Cada vez que se necesita un subprograma, se le llama desde algún punto del programa principal, y el control es transferido al subprograma. Cuando termina la ejecución del subprograma, el control vuelve al punto del programa principal desde el que se efectúo la llamada. Un mismo subprograma puede ser llamado desde distintos puntos del programa principal, un ejemplo de esto son las pantallas de presentación de menús. Un subprograma puede también ser llamado desde otro subprograma. En este caso el subprograma llamador se comporta como el programa principal de la situación descrita anteriormente. Un subprograma puede también llamarse a sí mismo, lo que se conoce como recursión. TEMA 2: FUNCIONES EN C En el contexto de C se entenderá como subprograma una función. Las funciones en C responden a las mismas características de un subprograma. Se utilizan para dar a los programas una estructura jerárquica. Una función puede o no devolver (retornar) un valor de tipo simple (entero, real, carácter) alfanumérico. En la función se debe indicar el tipo de dato que devuelve. TEMA 3: ESTRUCTURA GENERAL DE UN PROGRAMA EN C,CON FUNCIONES. Librerias Definciones de variables y constantes globales funciones Main() { Definciones de variables y constantes locales Instrucciones locales Llamada a las funciones } Laura Setti Duque 46 TEMA 4:TIPOS DE VARIABLES. La posibilidad de cada función declare sus variables genera dos tipos de ellas: las globales y las locales. a) Variables locales: Son aquellas que se declaran dentro de una función y tienen las característica de existir sólo dentro de ella, durante su ejecución. b) Variables globales: Son aquellas variables que tienen validez en todo el programa y sus funciones salvo que en uno de estos últimos exista una variables local con el mismo nombre. TEMA 5: ESTRUCTURA DE UNA FUNCIÓN. Formato: [Tipo devuelto] nombre ([parámetros]) { definición de variables instrucciones [return(valor)] } Una función si no lleva tipo devuelto no debe llevar return. Invocación: Una función es tratada como un valor, así que puede ser invocada como componente de una expresión, en una asignación a una variable o en una sentencia de salida. Para llamar a la función se debe tener en cuenta lo siguiente: a) Si la función no tiene tipo devuelto: Nombrefunción(pérámetros); b) Si la función tiene tipo devuelto: Variable=nombrefunción(parámetros); La variable debe ser del mismo tipo que el tipo devuelto TEMA 6: PARAMETROS. Cuando se necesita que una función maneje datos creados en alguna zona del programa principal, o que los datos generados en una función deban utilizarse en el resto del programa, será necesario recurrir a los parámetros. a) Parámetros: Son canales de comunicación para pasar datos entre programas y funciones en ambos sentidos. Los parámetros van asociados a variables, constantes y expresiones. Los parámetros deben coincidir en tipo, número y orden, tanto en la declaración de la función, como en su llamada. b) Parámetro por valor: Se identifica en la cabeza de la función, en paréntesis a continuación del identificador del subprograma, indicando las lista de ellos separados por una coma (,) y su tipo. Puede ser invocado por una expresión, una constante o variable. Las modificaciones que sufra este tipo de parámetro sólo son válidas dentro de la función en que se declaró. Estos parámetros de utilizan para recibir datos de entrada (parámetros de entrada) desde otro lugar del programa, del tal manera que si éstos datos se modifican mantienen su valor original a la salida de la función. c) Parámetro Variable o por referencia. Se reconoce en la cabecera de la función porque le antecede al identificador del parámetro un * . Puede ser invocado sólo por una variables. Las modificaciones que Laura Setti Duque 47 sufra este tipo de parámetro serán válidas para el resto del programa, es decir modifica su valor inicial al final de la ejecución de la función. Estos parámetros se utilizan para generan resultados en la función y enviarlos al exterior sin usar return. Se utilizan como parámetros de salida y de entrada/salida. En la llamada de la función se debe mandar el parámetro antecedido por un &. CAPITULO 14: TIPOS DE FUNCIONES TEMA 1: FUNCIONES SIN TIPO DEVUELTO. Estructura para este caso: Void NombreFunción([parámetros]) { definición de variables instrucciones } Ejemplo 1 : void Imprime_Pares(int num) { int i; for (i=1;i<=num/2;i++) printf("%d",2* i); } void Imprime_Pares(int); main() { int n; printf("Ingrese numero entero positivo \n"); scanf("%d",&n); Imprime_Pares(n); getch(); } Ejemplo 2: void Imprime_Tabla(int num) { int i; for (i=1;i<=12;i++) printf("%d * %d = %d",num,i,num*i); } void Imprime_Tabla(int); main() { int n; printf("Ingrese numero entero positivo \n"); scanf("%d",&n); Imprime_Tabla(n); getch(); } Laura Setti Duque 48 TEMA 2: FUNCIONES CON TIPO DEVUELTO. Estructura para este caso: tipo NombreFunción([parámetros]) { definición de variables instrucciones return(expresion) } Ejemplo 1: int minimo(int, int); main( ) { int a,b,c; printf(“Ingrese dos números enteros”); scanf(“%d%d”,&a,&b); c= minimo(a,b); /*Invocación a la función Minimo asignando el valor a C*/ printf(“El menor entre %d y %d es %d”,a,b,c); } int minimo(int x, int y) /*Función que retorna el menor de dos números enteros*/ { int m; If (x<y) m= x; Else m= y; Return(m); } Ejemplo 2: float potencial(float,float); main() { float a,b; printf("Ingrese base positiva y exponente \n"); scanf("%f",&a); scanf("%f",&b); printf("%5.1f elevado %5.1f es: %5.1f ",a,b,potenciak(a,b)); getch(); } float potencial(float a,float b) { return pow(a,b); } Laura Setti Duque 49 TEMA 3: FUNCIONES. Ejercicios resueltos. 1. Se recibe un número entero positivo n, y se retorna en x el número n invertido. int Invierte(int n) { int x=0; do { x=((x*10)+(n%10)); n=n/10; } while(n>0); return(x); } 2. Determinar el área y el perímetro de un círculo de radio R. #define pi 3.141516 float a,p; /*variables globales*/ void circulo(float r) { a= pi*r*r; p= 2*pi*r; } 3. Determinar la suma de los dígitos pares de N entero positivo, y el producto de los dígitos impares. Int sum,prod; /*variables globales*/ void prodsum(int n) { int d; sum=0; prod=1; do { d= (n%10); if ((d%2)==0) sum=sum+d; else prod=prod*d; n=n / 10; } while(n!=0); } Laura Setti Duque 50 4. Se ingresan los datos de N personas, la información por persona es edad y nombre. Se pide determinar el nombre de la persona con mayor edad y el de menor edad, como también el promedio de las edades. #include <string. h> Typedef Char cadena[30]; float Est(int N,cadena NMax,cadena NMin) { int i,Edad,Min,Max; cadena Nom; float Prom=0; Min=200; Max=-1; for(i=1;i<=N;i++) { printf("Ingrese Nombre %d",i); fflush(stdin); scanf("%s",Nom); printf("Ingrese Edad %d",i); scanf("%d",&Edad); if(Edad> Max) { Max=Edad; Strcpy(Nmax,Nom); } else if (Edad<Min) { Min=Edad; Strcpy(Nmin,Nom); } Prom=Prom+Edad; } return (Prom/N); } 5. Se recibe un número x entero positivo, y se retorna la cantidad de dígitos de x. int sumadig(int x) { int s=0; do { s=s+1; x=x/10; } while(x!=0); return (s); } Laura Setti Duque 51 6. Determinar cuántos lanzamientos de una moneda ocurren hasta que aparezcan tres caras consecutivas. #include <stdlib. h> Int caras(void) /* 0 : Cara, 1: Sello*/ { int T,M,C; Randomize(); T=0; Do { T++; M=Rand()%2; C=0; Printf(“%d”,M); /*Se imprime el lanzamiento*/ While ((M=0) && (C<3)) { C++; M=Rand()%2; T++; Printf(“%d”,M); } } While (C!=3); Return(T-1); } 7. Determinar el factorial de un número N entero positivo. int fac(int n) { int f,i; f=1; for(i=2;i<=n;i++) f=f*i; return( f); } 8. Determinar el e-nésimo término de la serie fibonacci: 1, 1, 2, 3, 5, 8, 13, ..... int fib(int n) { int f1=0,f2=1, f3; if (n==1) f3=0; else If (n==2) f3=1; else for (i=3; i<=n; i++) { f3= f1 + f2; f1= f2; f2= f3; } return (f3); } Laura Setti Duque 52 9. Ingreso de nota entre 1 y 7. float validanota(void) { float nota; do { printf("Ingrese nota entre 1 y 7 \n"); scanf("%f",&nota); } while ((nota < 1)||(nota > 7)); printf("Nota correcta"); return(nota); } 10. Validación de la lectura de la variables resp. #include <ctype. h> char validaresp(void) { char resp; do { printf("Desea seguir s/n \n"); fflush(stdin); scanf("%c",&resp); } while((toupper(resp)!=’S’)&&(toupper(resp)!=’N’)); return(resp); } 11. Validación de un número entero positivo. #include <stdlib. h> Typedef Char cadena[8]; long validanum(void) { long n; cadena s; do { printf("Ingrese numero entero positivo \n"); fflush(stdin); scanf("%s",&s); n=atol(s); } while (n<0 ); return(n); } Laura Setti Duque 53 TEMA 4: FUNCIONES. Ejercicios propuestos. Desarrolle una función para cada caso. 1. Genere e imprima los elementos de la serie: 1, -1, ½, -1/3, ¼, -1/5,....... 2. Los números de las claves de dos cajas fuertes están mezcladas en un número entero llamado clave maestra. Determine ambas claves, la primera clave se construye con los dígitos impares de la clave maestra y la segunda con los pares. Ejemplo: Clave maestra = 12345, Clave1= 135, Clave2=24. 3. Se recibe como parámetro una cadena de caracteres. Se pide imprimir el primer carácter, luego los dos primeros, luego los tres primeros y así sucesivamente hasta imprimir la cadena completa. Ejemplo: Para la cadena ‘HOLA’, el procedimiento imprime ‘H’ ‘HO’ ‘HOL’ ‘HOLA’ 4. Mezcle ordenadamente dos números enteros A y B en un tercer número C que contenga el total de dígitos de ambos números. A y B tienen sus dígitos ordenados ascendentemente de derecha a izquierda, el número C debe quedar ordenado de igual forma. Ejemplo: A = 7321, B = 87543 se obtiene C = 877543321 5. Determinar el mayor y menor elemento de N datos ingresados por teclado. 6. Escriba el operador BASEB, que recibe un número entero en base 10 e imprime su equivalente número entero en una base base b (2..9). 7. Determinar el N-ésimo término de la serie fibonacci. 8. Cuente el número de dígitos que tiene un número N entero. 9. Escriba el operador BDIEZ, que recibe un número entero en base b y lo transforma a base diez. Puede utilizar la función POT(a,b), que retorna a elevado a b. 10. Diseñe el operador DIGITO(N,K), que retorna el k-ésimo dígito de la derecha del entero positivo N. 11. Determine el factorial de un número N entero positivo. 12. Se recibe un valor entero positivo y se retorna el número de dígitos cinco (5) que posee. 13. Determinar la suma de los n primeros términos de la serie: 4 + x2/3 - x4/5 + x6/7 - x8/9..... evaluada en un valor x real. 14. Determinar cuántos dígitos distintos tiene un número entero positivo cualquiera. Laura Setti Duque 54 15. Se tiene la función mayor3(a,b,c), que retorna el mayor de tres enteros . Se pide crear la función mayor5(a,b,c,d,e) que retorna el mayor de cinco números enteros, usando mayor3. No puede usar sentencias selectivas ni iterativas. 16. Determine usando una función booleana si una palabra s es palíndroma. 17. Sumar los n primeros números enteros positivos. 18. Determinar si un número entero positivo es par utilizando restas sucesivas. No utilice los operadores / y% Laura Setti Duque 55 UNIDAD 6: TIPO DE DATO CADENA. CAPITULO 15: LENGUAJE C. Cadenas. TEMA 1: DEFINICIÓN. Una cadena o string es una lista o secuencia de caracteres que se tratan como una unidad. Las expresiones se identifican por estar delimitadas entre comillas dobles. Los caracteres individuales en lenguaje C tienen valores enteros, por lo tanto no es necesario su conversión a entero. Ejemplo: “Hola a todos” “Buenos días” “1028” “- 542.75” a) Longitud: La longitud de una cadena es el número de caracteres encerrados entre doble comillas. b) Cadena nula o vacía. Una cadena se denomina nula si no tiene ningún carácter. Su representación es ‘\0’. c) Cadena blanca. Contiene sólo caracteres blanco. d) Representación de caracteres. Según código Ascii. 0 - 31 : Caracteres de control. 32 : Espacio en blanco. 33 - 47 : Símbolos. 48 - 57 : Dígitos. 58 - 64 : Símbolos. 65 - 90 : Letras mayúsculas. 91 - 96 : Símbolos. 97 - 122 : Letras minúsculas. 123 - 254 : Símbolos. Laura Setti Duque 56 TEMA 2: OPERACIONES CON CADENAS. Concatenación: Consiste en añadir una cadena a otra. En lenguaje C se utiliza la función strcat. Para usar esta función es necesario incluir la biblioteca <string.h>. Ejemplo: Strcat(“Hola”, “ a todos ”) = “Hola a todos ” TEMA 3: COMPARACIÓN DE CADENAS. Las cadenas de caracteres se comparan de acuerdo a sus códigos ASCII. Cuando se comparan dos cadenas, éstas se comparan de acuerdo al valor numérico del código ASCII de sus caracteres de izquierda a derecha. Ejemplo: 1) “Antonio” < “Bartolomé” 2) “‘No” 3) “Marga” < “Margarita” 4) “AAA” 5) “400” < “45” 6) “A” < “a” < “Noo” < “AAAA” Para comparar dos cadenas en lenguaje C se utiliza la función strcmp(s1,s2) que devuelve 0 si las cadenas son idénticas, devuelve un valor menor que 0 si la primera cadena es menor que la segunda, y devuelve un valor mayor a cero si la primera cadena es mayor que la segunda. Para utilizar esta función es necesario incluir la biblioteca <string.h> Entonces según el ejemplo: 1) Strcmp(“Antonio”, “Bartolomé”) < 0 2) Strcmp(“No”, “Noo”) <0 3) Strcmp(“Marga”, “Margarita”) < 0 4) Strcmp(“AAA”, “AAAA”)< 0 5) Strcmp(“400”, “45”) < 0 6) Strcmp(“A”, “a”) < 0 Laura Setti Duque 57 TEMA 4: ALGUNOS OPERADORES DE CONVERSIÓN EN C. Para utilizar estas funciones se necesita incluir la biblioteca <string.h> Strlen(S): Proporciona la longitud de la cadena S. Esta función retorna un valor entero. Strlwr(S): Convierte a minúsculas las letras de una cadena S. Strupr(S): Convierte a mayúsculas las letras de una cadena S. Strcpy(S1,S2): Copia la cadena s2 en s1. Laura Setti Duque 58 CAPITULO 16: TIPO DE DATO CADENA. APLICACIONES. TEMA 1: TRATAMIENTO DE UNA CADENA EN C. En lenguaje C una cadena se maneja como un arreglo de caracteres que termina con el carácter ‘\0’. Se tiene acceso a una cadena mediante un apuntador al primer carácter de la cadena. El valor de una cadena es la dirección de su primer carácter. Al declarar un arreglo de caracteres que contenga una cadena, el arreglo debe ser lo suficientemente grande para almacenar la cadena y su carácter de terminación NULL. Si una cadena resulta más larga que el arreglo de caracteres en la cual debe almacenarse, los caracteres que excedan del final del arreglo sobreescribirán datos en memoria a continuación del mismo. Los siguientes subprogramas utilizan las cadenas como una estructura de arreglo lineal, es decir que cada carácter se ubica en una posición determinada de la cadena, de esta manera si S es la cadena S[0] es el primer carácter de S, S[1] el segundo, y así sucesivamente hasta S[strlen(S)] que corresponde al último carácter de S de izquierda a derecha. Declaración de tipo de datos para una cadena de tamaño 200: Typedef Char cadena [200]; Luego se puede definir la variable S como: Cadena S; /*entonces S puede almacenar hasta 199 caracteres */ Laura Setti Duque 59 TEMA 2: EJERCICIOS RESUELTOS. 1. IZQ(cadena, n, CadIzq) : devuelve en CadIzq los n primeros caracteres de una expresión de cadena contando desde la izquierda. Si n es mayor o igual a la longitud de la cadena se obtiene toda la cadena. Si n es 0 devuelve la cadena nula. #include <string. h> Typedef Char string[100]; void IZQ( string cadena,int n,string CadIzq) { int i=0; do { CadIzq[i]=cadena[i]; i++; while((i<strlen(cadena))&&(i<n)); cadIzq[i]=’\0’; } 2. Separa(cadena,S1,S2): Devuelve dos cadenas S1 y S2 una con los caracteres de orden par de cadena y la otra con los caracteres de orden impar. #include <string. h> Typedef Char string[100]; void Separa(string cadena,string S1,string S2) { int i,j=0,k=0; for(i=0;i<strlen(cadena);i++) if (cadena[i]%2==0) { S1[j]=cadena[i]; J++; } else { S2[k]=cadena[i]; k++; } S1[j]=’\0’; S2[k]=’\0’; } Laura Setti Duque 60 3. Digitos(cadena): Determina si cadena contiene sólo caracteres dígitos. Retorna true si cumple la condición y false en otro caso. #include <string.h> Typedef Char string[100]; int Digitos(string cadena) { int i=0; int R; R=0; Do { if ((cadena[i]<0)||(cadena[i]>9)) R=1; else i++; } while ((i<strlen(cadena))&& (R==0)); return(R); } 4. Pali(Pal) : Función booleana que determina si la cadena Pal es palindrómica, es decir si se lee exactamente igual de izquierda a derecha, como de derecha a izquierda. #include <string. h> Typedef Char string[100]; int Pali(string Pal) { int i,f; i=0; f=strlen(Pal)-1; do { i=i+1; f:=f-1; } while ((pal[i]==pal[f])&&(i<f)); return (i>=f); } Laura Setti Duque 61 TEMA 3: EJERCICIOS PROPUESTOS. 1. Min(cadena): Devuelve el número de letras minúsculas que contiene la cadena. 2. Der(cadena,n): Devuelve el número indicado de caracteres comenzando por la derecha. Si n es mayor que la longitud de la expresión de cadena se devuelve la expresión. Si n es 0 se devuelve la cadena nula. 3. Suste(cadena_e,cadena_u): Sustituye todas las letras e de la cadena_e por letras u en la cadena_u. 4. Invierte(cadena,inversa): retorna en la cadena inversa de cadena. 5. Pos(cadena1,cadena2): Devuelve la posición de la cadena2 en la cadena1. Si no la encuentra devuelve 0, sino devuelve la posición del primer carácter de la cadena2 en la cadena1. 6. Mayus_Minus(cadena): Sustituye mayúsculas por minúsculas en la cadena. 7. Copiar(cadena1, inicio, n, cadena2): Compone la cadena2 con n caracteres de la cadena1 desde la posición inicio. Si inicio es mayor que la longitud de cadena1 se retorna en cadena2 la cadena nula. Controle final de cadena1. Laura Setti Duque 62 UNIDAD 6. TIPOS ESTRUCTURADOS ARREGLOS. CAPITULO 17: TIPO DE DATO ARREGLO. TEMA 1: DEFINICION. Un arreglo es una colección finita de elementos homogéneos y ordenados, es decir es una estructura formada por elementos del mismo tipo. Cada elemento es almacenado en una celda en el sentido gráfico y en direcciones consecutivas de memoria, donde cada celda tiene asociado un índice, que al estar ordenados se puede hablar de primer, i-ésimo o último elemento. Un arreglo es un tipo de variable estructurada, es decir puede almacenar más de un dato a la vez a diferencia de las variables simples. TEMA 2: REPRESENTACIÓN. Un arreglo se representa por el nombre de la variable. Un elemento del arreglo se representa por el nombre de la variable, seguido del (de los) índice (es) encerrado (s) en paréntesis (en C paréntesis cuadrado), donde cada índice representa la posición dentro del arreglo. Ejemplo: A= 0 1 2 d Z m En este caso: A[2] = m i . . . v . . . n-2 n-1 f a A[i] = v A[n-1]=a Para los distintos tipos de arreglos: a) Nombre_arreglo[índice] : Arreglo unidimensional (vector, lista). b) Nombre_arreglo[índice][índice2] : Arreglo bidimensional (matriz, tabla de doble entrada). c) Nombre_arreglo[índice1][índice2][índice3,.....] : Arreglo multidimensional. Laura Setti Duque 63 TEMA 3: ARREGLOS UNIDIMENSIONALES. Declarativa: Definición de vectores. #define max <valor>; /*max es el máximo número de casillas para el arreglo*/ Typedef <tipo base> elemento; /* es el tipo de datos que va a contener el arreglo*/ Typedef elemento Vector [max]; /* tipo vector */ /*definición de variables de tipo vector*/ vector A1,. ., Aj, . . , An ; Ejemplo: #define max 100; /*max es el máximo número de casillas para el arreglo*/ Typedef int elemento; /* es el tipo de datos que va a contener el arreglo*/ Typedef elemento Vector [max]; /* tipo vector */ vector A1,. ., Aj, . . , An ; /*variables de tipo vector de 100 casillas, numeradas desde la 0 hasta la 99 y que pueden almacenar hasta 100 enteros*/ TEMA 4: USO DE EXPRESIONES. Todos los elementos de tipo base de un arreglo unidimensional (vector), pueden ser usados en cualquier expresión compatible con su tipo. Ejemplos: 1. suma= suma + a[i]; 2. a[i]= 678; 3. a[10]=a[10]*f; 4. Existe=a[j]=e; 5. a[i]=a[b[1]]; 6. scanf(“%d%d”,&a[i],&b[j]); 7. printf(“%3.4f”,a[k]); Laura Setti Duque 64 TEMA 5: ARREGLOS UNIDIMENSIONALES. Ejercicios resueltos. Se usará la siguiente declaración de tipo de datos para los ejercicios resueltos. Typedef Int vector[100]; 1. Ingresar los elementos a un vector A de tamaño N. void Ingresa(vector A,int N) { int i; for(i=0;i<N;i++) { printf("Ingrese elemento"); scanf("%d",&A[i]); } } 2. Imprimir los elementos de un vector V de tamaño N. void ImpVec(vector V,int N) { int i; for(i=0;i<n;i++) printf("%d",V[i]); } 3. Utilice un vector para calcular el e-nésimo término de la serie fibonacci. int Fib(int N) { int A[50]; A[0]=1; A[1]=1; for(i=2;i<N;i++) A[i]=A[i-1]+A[i-2]; return (A[N-1]); } 4. Obtener el promedio de los elementos ubicados en las posiciones impares de un vector V de tamaño N. Laura Setti Duque 65 float PosImp(vector V,int N) { int i,P,j=0; i=0; do { j++; P=P+V[i]; i=i+2; } while(i<N); return (P/j); } Laura Setti Duque 66 TEMA 6: ARREGLOS UNIDIMENSIONALES. Ejercicos Propuestos. Escriba un subprograma para cada caso. 1. Imprimir los elementos de un vector. 2. Invertir los elementos de un vector. 3. Determinar la suma de los elementos de un vector. 4. Realice la función SUMAPRIM(A,N), que suma los elementos primos del vector A de largo N. Utilice para ello la función PRIMO(M), que retorna 1 si M es primo y 0 en otro caso. 5. Determine el mayor y el menor elemento de un vector. 6. Escriba un subprograma PROMPAR(A, n, B), que retorna en el vector B, los promedios parciales de los elementos del arreglo A de largo n. Por ejemplo: A= 2 6 1 3 3 B= 2 4 3 3 ....... 5 ........ 7. Encontrar la posición de un elemento e en un vector V . 8. Contar en un vector los números iguales a x. 9. Determinar la cantidad de valores mayores que X, en un vector A de N elementos reales. Laura Setti Duque 67 CAPITULO 18: ARREGLOS BIDIMENSIONALES. TEMA 1:DECLARATIVA. Definición de matrices. #define max1 <valo1> #define max2<valor2> Typedef <tipo base > Elemento; Typedef Elemento Matriz [max1][max2] ; matriz A1,. ., Aj, . . , An ; Ejemplo: #define max1 10; /*filas*/ #define max2 5; /*columnas*/ Typedef float Elemento; Typedef Elemento matriz[max1][max2] ; matriz A1,. ., Aj, . . , An ; /*variables de tipo Matriz de 50 (10*5) casillas, filas numeradas desde 0 hasta 9*/ /* columnas numeradas desde 0 a 4 y que pueden almacenar hasta 50 reales*/ TEMA 2: USO DE EXPRESIONES. Todos los elementos de tipo base de un arreglo bidimensional (vector), pueden ser usados en cualquier expresión, indicado el nombre de la variable matriz seguido de la posición fila, posición columna en paréntesis cuadrado. Ejemplos: 1. suma= suma + a[i][,j]; 2. a[i][ j ]= 1678; 3. a[1][0]=a[1,0]*f; 4. Existe=a[ j ][5]=e; 5. a[i][ j ]=a[b[1][,j], b[2][3] ]; 6. scanf(“%f”,&a[i][k], &b[j][k]); 7. printf(“%4.5f”,a[k][i]); Laura Setti Duque 68 TEMA 3: ARREGLOS BIDIMENSIONALES. Ejercicios resueltos. Para los ejercicios resueltos se usará la siguiente declarativa de tipo de datos. Typedef Int matriz[30][30] 1. Ingresar por filas los elementos a una matriz A de orden NxM. Ingreso(matriz A,int N,int M) { int i,j; for(i=0;i<N;i++) for(j=0;j<M;j++) scanf("%d",A[i][j]); } 2. Determinar si un elemento e se encuentra en la fila i de una matriz A de orden NxM. int buscar(matriz a,int e,int m,int i) { int j=0; while ((j<m)&&(e!=a[i][j])) { j=j+1; } return (j<m); } 3. Imprime por filas los elementos de una matriz X de orden NxN. void ImpMatriz(matriz X,int N) { int i, j; for (i=0;i<N;i++) { for (j=0;j<N;j++) printf("%d",X[i][j]); printf(); } } Laura Setti Duque 69 TEMA 4: ARREGLOS BIDIMENSIONALES. Ejercicios propuestos. Escriba un subprograma para cada caso. 1. Diseñe una función que indique si una matriz de orden NxN es simétrica. Una matriz es simétrica si se cumple que A[i] [ j ] = A[ j ] [i] para todo i,j=1..N. 2 Dada una matriz A de orden nxm, realizar un subprograma que genere una matriz C de orden hx2, con todas las posiciones ( i , j ) en que se encuentra un elemento x dado, si no lo encuentra retorne C=[ 0 0]). Los índices de fila y columna deben quedar en la primera y segunda columna de C respectivamente. Por ejemplo: A= 4 3 7 4 5 4 1 2 2 C= 1 2 3 X=4 3. Escriba un subprograma que determine si A y B dos matrices de NxM son una espejo de la otra. 4. Diseñe una función que determine el elemento más cercano al promedio de una matriz M. 5. Determinar si una matriz cuadrada M es diagonal dominante. Una matriz es diagonal dominante si se n cumple que: fila i abs(A[ i] [j]) < abs(A[i] [ i]) con i j. i=1 6. Sumar los elementos de la triangular superior de una matriz cuadrada M, sin incluir la diagonal principal. 7. Encontrar el elemento mayor de la fila i de una matriz M. 8. Dada una matriz M, en que sus elementos son pares ordenados de la forma: (x, y). a) Obtener el par de mayor y menor promedio. b) Generar un par (x1, y1), en que x1 corresponde a la suma de todos los x, y la suma de todos los y en y1. c) Almacenar en un vector todos los x mayores de cada fila, y en otro vector los elementos y menores de cada columna. M = 1 2 3 1 3 4 9. 1 4 0 0 1 -1 4 Dada una matriz de orden N, determine el cuociente entre la suma de los elementos de la diagonal principal y la suma de los elementos de la diagonal secundaria. Laura Setti Duque 70 10. Diseñe un subprograma que permita buscar y contar la cantidad de veces que se encontró un elemento e, en una columna j de una matriz A de orden NxM. 11. Se pide crear un operador que determine si un elemento e se encuentra en la diagonal secundaria de una matriz A de orden N. Para ello utilice los operadores PosFila(A,N,M,e) y PosColumna(A,N,M,e), el primero retorna la fila en que se encuentra el elemento e, y el segundo la posición columna en que se ubica e, en la matriz A de orden NxM. 12. 12. Dada una matriz A de orden NxM que contiene caracteres. Cree un vector V que contenga los caracteres de A y agregue después de cada carácter vocal una casilla con una letra p y otra casilla con dicha vocal. Confeccione un subprograma que reciba la matriz A, retorne el vector V y la cantidad de elementos de V. Ejemplo: Matriz A A L A R M A Vector V resultante A 13. P A L A P A R M A P A Se tiene almacenada en una matriz llamada Nac el número de nacimientos mensuales (1..12) de la última década (1987 - 1997), donde cada fila i almacena la información de nacimiento durante un año. Es decir Nac[i,j] representa la cantidad de nacimientos en el mes j del año i. Se pide: a) Cree una función que retorne el año en que hubo más nacimientos. b) Diseñar un operador que determine en que mes del año i hubo menos nacimientos. c) Cree una función que determine si fue febrero el mes con más alto promedio de nacimientos en la última década. Retorne True si cumple febrero la condición y false en caso contrario. 14. Cree un subprograma que reciba una matriz A de orden N que contiene en cada casilla un carácter, y retorne un vector V con los elementos de A, en el siguiente orden: primero los elementos de la diagonal principal de A, luego los de la diagonal secundaria, y a continuación el resto de los elementos. El vector no debe contener dos veces el dato de una casilla. 1 1 Laura Setti Duque Laura Setti Duque