entonces el cuerpo de la función de esos dos conceptos ¿qué te parece a ti? ¿dónde encajaría? con el cuerpo el cuerpo de la función, sí no sé dentro de esos dos vocablos no sabes dónde meterlo el cuerpo va después del supongo que después de la cabecera ¿no? ¿no empezamos a meter? ¿o no? sí la cabeza el cuerpo no viene después de la cabeza entonces ¿qué? ¿entonces qué? sí, pero ahí ¿dónde? ahí el cuerpo de la función ¿qué es? especificación o implementación o realización el cuerpo supongo que será implementación claro es todo todo el desarrollo ¿vale? función otro vocablo importante el otro día ya os hablé de él ¿qué es una función pura? ¿alguien se acuerda de lo que dije el otro día? que devuelve algo hombre, no una función sea pura o impura devuelve algo si no devuelve nada malo entonces ya no es una función es un procedimiento o no es nada tiene que devolver algo pero para que sea pura ¿qué tiene que cumplir? no tiene que no le tienen que pasar argumentos por referencia o si le pasa argumentos por referencia no tiene que modificarlos internamente bueno técnicamente no se le puede pasar argumentos por bueno, no se le puede decir apuntar estas palabras transparencia tiene que tener transparencia referencial y ahora lo digamos a eso que dices tiene que tener lo digo porque os va que puede caer algo de esto transparencia referencial y sin efectos laterales o secundarios ojo eh sin efectos secundarios o laterales poned las dos palabras vosotros ¿qué es la transparencia referencial ahora? voy a ponerlo aquí ¿qué es la transparencia referencial? sin efectos secundarios o laterales sin efectos secundarios o laterales que es lo mismo es lo mismo efectos decir efectos secundarios es lo mismo que decir efectos laterales efectos del examen es lo mismo tiene la misma en las literaturas efectos sin efectos secundarios o efectos laterales lo digo porque depende del libro que leas te dice secundarios o laterales y creo que en vuestro texto dice las dos no estoy seguro pero creo que dice las dos ¿qué es transparencia? ¿qué significa tener transparencia referencial? bueno para tener transparencia referencial las reglas de oro son las reglas de oro son tres no utilizar variables externas a su programa si es una variable externa ¿qué es? una global o una referencia una global normalmente ¿vale? es decir no utilizar variables externas a su programa es decir variables globales es decir en una función una función estamos hablando de funciones no de procedimientos función pura eso es importante que lo señaléis estamos hablando de función pura luego diremos lo que es un procedimiento puro que tiene menos restricciones que una función para que sea pura no puedes cambiarle al que al que llama esa función no puedes no puedes cambiarle una variable que utilice en su programa porque daros cuenta estamos buscando una función pura quiere decir que es lo más independiente posible y lo más coherente posible también si es lo más independiente posible y tú ya le cambias resulta que tienes que crear en el programa una variable para que te la cambie la función aquí ya no es tan independiente ya depende de la variable que tienes que crear entonces por eso la transparencia referencial no puede usar variables externas o sea variables globales ¿vale? variables solo constantes globales si las puede utilizar ¿no? constantes globales en vez de una variable una constante global bueno normalmente tampoco es no es no no te dice nada en el tema de constantes variables no constantes si tú creas un bloque de constantes se supone que cualquiera eso tú haces un macro programa y a ti te toca hacer el módulo por ejemplo de funciones matemáticas lo normal es que esté definido haya como unas una tabla de constantes que se crean y que todo el mundo las use no es tan eso no es restrictivo ¿vale? sí que es restrictivo las variables porque las variables pueden cambiar de valor y en función de cambiar de valor puede ocurrir que el flujo del programa vaya en un sentido o en otro y que sea incontrolable por eso siempre hablamos de variables ¿vale? no emplear sentencias de lectura que es más de lo mismo no emplear sentencias de lectura es decir que es similar a lo anterior si tú haces una sentencia de lectura para adquirir un dato bueno poner entre paréntesis para para adquirir un dato procedente del exterior ponerlo entre paréntesis para matizar eso un poco es como es complementaria de la primera es decir si tú no puedes utilizar variables del exterior tampoco puedes utilizar datos que te vengan del exterior vía lectura ¿de acuerdo? es como emplear lo mismo que después la clave lo guardes en una variable local que en este caso tú puedes hacer una sentencia de lectura ¿no? tú puedes hacer una sentencia de lectura y guardarlo en una variable local de la función ¿no? pero ¿qué estás haciendo con eso? que la función es posible que cambie su naturaleza es decir el resultado que da en función de esa sentencia de lectura entonces por eso hay que evitar las sentencias de lectura en las funciones ¿vale? esos valores se los pasamos como parámetros a la función esos valores se los hay que pasarnos como parámetros a la función porque se busca lo más independencia posible no de que el tío tenga que meter dentro de tu función tal hay que pasarlo esa es la solución para que siga siendo función pura y claro la tercera es la pescadilla que se muerde la cola no llamar dentro de tu función o dentro dentro de tu función a otro subprograma que no tenga transparencia referencial porque si tú tú sabes que desde tu función tú puedes llamar a otra función o a otro procedimiento esos procedimientos también tienen que tener transparencia referencial entonces reglas de oro regla 1 no variables externas ahora la resumo yo ahora no variables externas no datos de lecturas dentro me entendéis ¿no? no datos de lecturas si queréis directas porque tú fuera lo que decía vuestro compañero tú adquieres los datos fuera de la función y se los pasas como un parámetro y ya está ¿vale? como argumento 3 no subprogramas y hablo de subprogramas no asociar subprogramas a funciones solo sino sin transparencia transferencial ¿vale? reglas de oro ¿y qué es sin efectos laterales? bueno lo primero vosotros ¿alguien ve qué es el fondo cuál es el fondo de tener transparencia referencial una función que garantiza la transparencia referencial dentro de esa función no se modifican otras partes del programa es decir que dentro de esa función como no puedes utilizar variables externas ni lecturas de datos que modifiques el comportamiento igual si tú le pasas eso si tú le pasas unos argumentos la función los mismos argumentos siempre te van a volver los mismos resultados eso es la eso te garantiza la transparencia referencial tú una función que muy tonta que suma dos números que no necesitas ni pasarle bueno puede ser tonta pero a lo mejor a alguien se le ocurre ya hacer la suma y pedir los datos de lectura dentro de la función eso ya no tiene transparencia referencial ¿qué es? que tú sin ningún pasar ningún argumento tienes un resultado que es incontrolable para ti sin embargo si tú le pasas dos argumentos y los argumentos son siempre los mismos el resultado siempre es el mismo eso es lo que te garantiza la transparencia referencial por eso hay que intentar buscar siempre la transparencia referencial ojo esto no es el padre nuestro es decir no hay no siempre se consigue la transparencia referencial que es idónea sí que es recomendable sí pero que no es que es una regla sin la cual el programa no funciona no ¿de acuerdo? es decir son recomendaciones no son reglas super exactas ni exactas ni siquiera es decir no siempre se puede cumplir pero cuanto más la cumpláis más robustas van a ser vuestras funciones una pregunta de examen la transparencia referencial en base a lo que vemos ahora después ya hablaremos de los efectos laterales ¿eh? ¿impide pasar argumentos por referencia? no si no se modifican esos o sí bueno si los pasas por referencia será porque se van a modificar si no no necesitas pasar por referencia los por ejemplo los arraes si se pasan por referencia ¿no? y no se pasan bueno pero la pregunta es yo paso a una función un argumento por referencia y ya pierdo la transparencia referencial y ahí tienes las tres reglas de oro de la transparencia referencial si ¿pierdes transparencia referencial? supongo que sí porque estás utilizando la variable externa o al menos la referencia o la variable externa no no la pierdes al pasarlo por argumento las reglas no, incumplen no incumplen cualquier argumento que pases tanto sea por valor como por referencia no incumple la transparencia referencial únicamente es por motivos de claridad se recomienda que las funciones cuanto menos argumentos por referencia pasen mejor entonces no estarías utilizando una variable externa no porque ahí está el tema del paso de argumentos no estás usando la variable externa estás cambiando la variable externa en en el porque cambia el argumento realmente es un puntero pero cambia de manera indirecta estás cambiando la variable externa no estás cambiando una sentencia vale porque tú le estás diciendo al señorín a tu compañero bueno se la estás pidiendo explícitamente claro por referencia entonces esa es esa es la matiz os lo comento porque es una pregunta de sampling y puede ser y puede ser que claro que os engañe el tema es decir si que cambias una variable externa pero resulta que la cambias de manera indirecta y le estás comunicando al que se la pasas que ojo que me la estás pasando por referencia que te la puedo cambiar eso es distinto únicamente si no ser si yo os dije el otro día que en las funciones hombre no es no es habitual pasar por referencia es únicamente por claridad vale recordar la claridad es una recomendación para un programador fino pero claro no es una cuestión de vida o muerte como si que es la corrección del programa vale un programa correcto y claro sería lo perfecto un programa correcto y no claro o menos claro puede tener un pase un programa claro pero incorrecto no tiene aplicación vale no sé si eso es de sentido común lo estáis viendo por sentido común que es así y lo último ya que se busca es la eficiencia mira la eficiencia dentro de unos órdenes para sumar los números no puede tardar 10 minutos algo está mal es decir eso ya para mí ya es incorrecto ya no es que vayas por eficiencia eficiencia hablamos de milisegundos vale cuando hablamos a nivel ya procesador los efectos dejarlos ahí los efectos laterales que volvemos a ellos vale sin efectos secundarios o laterales comparados ahora con procedimiento puro hablamos de función pura y ahora hablamos de procedimiento puro en el caso A porque también tiene que cumplir la transparencia referencial pero ponerle transparencia referencial asterisco ponerle transparencia referencial asterisco ¿y por qué le ponemos asterisco? porque fijaros tiene que cumplir que no se modifiquen variables externas entonces le voy a poner aquí un asterisco para que sepáis que para que sea también un procedimiento puro no se pueden modificar variables externas ¿de acuerdo? no se pueden modificar variables externas pero puede ser porque no devolvemos eso ¿eh? pero puede no ir porque no devolvemos ningún resultado en el procedimiento esto es la diferencia la 2 si la puede cumplir y sigue siendo pura y tampoco puede llamar a sus programas que no tengan transparencia referencial la 2 ojo es la única diferencia la 2 si lo permite un procedimiento puro ¿vale? porque realmente en un procedimiento puro es muy habitual ya que no devuelve nada que hagas muchos intercambios por pantalla con el operador que esté manejando el programa ¿de acuerdo? es la única diferencia en la transparencia referencial hay que evitar también los efectos secundarios ¿vale? yo creo que con esta tabla así yo creo que os vais a dar cuenta lo mismo la pregunta para que os hice antes para si se puede si yo le paso un procedimiento ¿vale? una variable un argumento por referencia ¿pierde la transparencia referencial? la misma contestación no y en este caso además es muy habitual es decir que aquí no es en una función por motivos de claridad y una función devuelve pues lo que tenga que devolver un array o un float ¿eh? no por claridad se recomienda no pasarlos sin embargo en procedimientos es muy habitual pasarlos ¿vale? en las funciones también aparte de no hacer lecturas directas tampoco se harían escrituras o de escrituras no si, de escrituras no dice nada de escrituras si porque puedes sacar una información por pantalla y tal o al disco si, si tu puedes devolver y para irlo a devolver puedes sacarlo si, si de escrituras no dice nada no, no porque una escritura no son datos que tu es información que tu das vale o que guardas en un lado si lo guardas en el en un fichero es decir eso no, no es importante lo que es importante es que sepa que la función tiene que ser lo más independiente posible no tiene que depender de que si uno mete algo tal la función devuelve algo y si tu le pasas unos argumentos la el objetivo de la función es tu le pasas los mismos argumentos y en vez de devolver el mismo resultado eso es puro si tu andas por ahí cambiando variables o metiendo cosas por lectura pues lo más probable es que afecte a la naturaleza de la función sin embargo en procedimientos es más se puede decir que es más benigno es decir si que se permite intercambios de lectura escritura sin ningún problema vale porque la el procedimiento es para eso es un procedimiento en el que es bastante normal bueno pasarle por referencia es muy habitual pasarle argumentos por referencia es muy habitual y después intercambio de información con el usuario muy habitual porque los procedimientos hay veces que son procedimientos de alarma que están que están continuamente pues analizando datos de una alarma entonces bueno pues tienes a lo mejor que intercambiar flujo de información entonces los procedimientos no pueden nunca acotar el tema de las lecturas vale si el cambio de variables externas eh porque para eso tienes el paso por referencia vale y si que bueno no llamar a otros procedimientos o funciones que no tengan transparencia referencial vale desarrollo por refinamiento sucesivos vamos a volver ahora a otro concepto desarrollo por refinamiento usando abstracción es decir que es usando abstracción una vez más que es usar abstracción esconderse usar subprogramas vale de momento abstracción para vosotros es subprogramas asociarlo a subprogramas y ya tener en mente que los subprogramas no van a estar en vuestro mismo programa van a estar en una librería vale llevarlo ya asociado bueno pues hay tres técnicas de desarrollo por refinamiento sucesivos eh y, ya comentamos vamos viendo los ventajas y inconvenientes de cada una de ellas una es un desarrollo que se llama ascendente dos descendente y desarrollo para reutilización vale esos tres desarrollos hay que elegir uno en función de la naturaleza del del desarrollador le viene mejor uno u otro después también puede ser que haya matices depende del programa ¿no? es un poco como queréis organizar el trabajo vale ¿qué es el desarrollo descendente? ir de más a menos se puede decir el desarrollo descendente empezamos por el descendente no sé por qué empecé empezaríamos en una primera etapa especificamos lo general que es especificar lo general los cuerpos los cuerpos grandes cajas negras ¿vale? que después vamos a desarrollo ¿vale? al desarrollo ya se puede decir primero hacemos especificaciones generales luego vamos al desarrollo ya de detalle a la ingeniería de detalle ¿vale? yo es la técnica que empleo ¿vale? os lo comento porque parece que haces el esquema y a partir del esquema luego ya empiezas a hacer los desarrollos haces el esquema y distribuyes trabajo bueno pues tú te vas a encargar de la parte de los librerías matemáticas tú te vas a encargar de la parte del análisis del PLC de los datos del PLC tú te vas a encargar ya de lo que es el cuerpo del programa el que estructura el programa de los menús y tal de los datos de los interfaces ¿vale? es decir empiezas la especificación general y luego cada uno va desarrollando ya el detalle ese es el descendente vas de más a menos ¿de más detalle? perdón vamos vas de una especificación general allá a los detalles mayores el ascendente primero haces los detalles ¿vale? y después construyes la especificación general parece menos para un proyecto de trabajo de un grupo de trabajo parece menos que sea moda peor ¿no? pero sin embargo si es un programa el que bueno pues hay una imaginaos que hay un departamento que hace que se dedica a hacer módulos matemáticos a mantener módulos matemáticos ¿no? y luego hay otro departamento que se dedica al análisis de las entradas y salidas digitales y analógicas de un PLC de los PLCs y luego resulta que sale un proyecto en otro departamento sobre todo esto pues se emplea quizá en compañías que estén más compartimentadas ¿no? hay un sale un proyecto y hay que hacer pues hay que realizar un programa para analizar las temperaturas pues de unos secaderos entonces esa esos van a tirar ya de desarrollos de detalle que ya están realizados librerías matemáticas que ya están análisis de datos del PLC que ya están entonces van a construir el programa general ya tirando del desarrollo que ya está realizado ¿veis en qué tipo de proyecto puede encajar este desarrollo ascendente? ¿vale? ascendente quiere decir voy primero tengo los detalles ya construidos y voy a después hago el módulo general que tira de esos detalles ¿veis un poco la diferencia? sin embargo cuando yo hago un proyecto de nuevo un proyecto nuevo que es lo que estáis ahora os dais cuenta por otros programas que vais a hacer ahora incluso programas que hacéis a nivel particular o entre dos personas lo lógico es que hagáis un desarrollo descendente el que hagáis la especificación general tú me hagas esta parte yo hago esta otra y después ya luego ya ensamblamos ¿vale? pero veis que hacéis primero el esqueleto y después y vais después al detalle no tenéis ya los detalles y luego en el esqueleto tiráis de esos detalles no sé si me entendéis la diferencia tenéis el esqueleto y metéis los órganos o tenéis los órganos y montáis el esqueleto que yo ya os digo empleo el descendente también los tipos en la naturaleza del proyecto invita a eso y después en la naturaleza de las personas es más más esquemático más organizado este ¿vale? ¿tú me entiendes? sí reutilización ¿qué es la reutilización? poder utilizar antes del programa claro, ¿vale? las librerías los subprogramas que yo haga que sean lo más aprovechable posible para el mayor número de programas ¿vale? es compatible con cualquiera de las otras ¿vale? lo que pasa que ya se enfoca de esa manera reutilización subprogramas lo más aprovechables es decir que ya podéis llegar a una empresa y lanzarme decirme el tipo de desarrollo que queréis que haga y lanzarme lo que queréis que haga que yo tal bueno pues hazme un diseño de reutilización pues tú te olvidas de ascendente o descendente tú dices los subprogramas los más aprovechables y luego el desarrollo como salga o dije no, no tú hazme un desarrollo descendente esqueleto y a partir de ahí distribuimos trabajo entre el grupo de personas que somos ¿vale? ¿qué implica la reutilización? claro tiene una ventaja voy a poner ventaja el campo de aplicación de esos módulos que tú hagas campo de aplicación máximo hombre un programa que no utiliza librerías matemáticas tú haces un módulo de librerías matemáticas no va a aprovecharlo pero en todos los que utilicemos librerías matemáticas van a utilizarlo ¿cuál es el inconveniente? coste de desarrollo el coste de desarrollo aumenta lógicamente si tú tienes que hacerlo tú date cuenta para hacerlo ya lo primero tienes que intentar hacer las funciones que hagas lo más puras posibles eso implica que tienes que pensar ya no se puede andar ahí cogiendo variables globales no se pueden dar lecturas hay que a lo mejor pasar más argumentos ¿vale? como por claridad tampoco cuanto menos pase por referencia mejor ya a lo mejor hay que hacer otros entonces es coste de desarrollo ¿no? a veces es más costoso el desarrollo de una pero bueno hay que verlo si tú lo vas a utilizar una vez tú si tú vas a hacer unos subprogramas muy particulares que va a ser para un proyecto determinado entonces tú no vas a crear un diseño para reutilización ¿vale? eso lo vas a obviar eso ya es si vas a hacer un módulo de librerías matemáticas muy generales lógicamente tú tienes que emplear un diseño de reutilización ¿vale? no sé si me explico con los conceptos son muy importantes ¿eh? son conceptualmente son cosas que aunque es teoría esto en la práctica hay que emplearlo es decir no podéis hacer un programa un programa no se escribe es decir como una traducción no podéis decir yo tengo este párrafo y lo voy a traducir voy a empezar por la letra 1 o 2 que tampoco porque tú la traducción hay que también saber en qué contexto lo traduces tampoco ni tan siquiera podría valer eso bueno te podría valer por no ser como un autómata que va que lo que ve por ahí aparecer las letras que va a aparecer por ahí en el display que como un autómata que lo esté que lo esté fusilando la letra que aparece en el trayecto la formación no es eso la formación es contexto general desarrollo primero análisis análisis previo análisis ascendente descendente o para reutilización uno de los análisis importantes previo y luego y luego ya desarrollo de eso que has analizado pero este coste de desarrollo será más costoso el inicial pero en el longo plazo será más claro ventaja campo de aplicación máximo si tú lo vas a emplear una vez pues hombre a lo mejor el coste de desarrollo pero si lo haces una vez no utiliza no usa reutilización efectivamente ya ni tan siquiera a lo mejor te interesa hacer un módulo independiente a lo mejor ni te interesa pero tú hacer un módulo independiente ya lo ves hacer un módulo independiente de sus programas ya significa un coste si o no claro si lo utilizas una vez no te interesa si lo utilizas un millón de veces lógicamente es lo que dices tú si tú pones en una balanza pues claro si lo utilizas un millón de veces el inconveniente vamos el inconveniente es como poner una pluma al lado de un peso de un millón de kilos ¿te das cuenta? es análisis previo análisis previo del problema ¿qué problema es? ¿qué ambición tiene? ¿qué qué qué me va a dar? ¿qué necesito? ¿en qué? hay que pensar un poco más allá ¿lo puedo utilizar en un futuro? ¿no lo puedo utilizar en un futuro? claro son decisiones que hay que tomar de partida eso ya cuando lleves 15 días de desarrollo son 15 días que ya que has perdido si no has tomado si por casualidad has tomado la decisión correcta bueno has cogido el camino correcto por casualidad tengo tres caminos y no sé cuál coger bueno, cojo este bueno, me ha salido bien me ha salido mal pues todo lo que recorreste en esos 15 días tienes que desrecorrerlo y volver a recorrerlo en el otro por eso hay que perder algo algo de tiempo y eso también en el examen hacer un análisis previo y luego ponte a desarrollar si he tomado el examen una cosa mínima es decir una cosa mínima que lo vais a tenéis que ver en minutos pero hay que perder esos minutos es decir no es como entrar con un toro al capote según uno salga a la plaza al capote ya no pienso ni vamos nada hay que pensar un poco unos minutos respirar aunque tengas el día forroñoso respirar profundo está bien se aclaran ideas pero tampoco hace falta que estés ahí respirando que parece que te va a dar algo tranquilamente respirar estar tranquilos y después relajarse un poco pensar cinco minutos tampoco hace falta estar mirando van cuatro tengo que pensar un minuto más no cuando estén las cosas claras que suelen salir claras con ese procedimiento suelen estar claras rápido ya te coges análisis bueno voy a ver lo que me pide aquí me pide que tengo que hacer tengo que coger y hacer este tengo que coger leerme por pantalla estos datos meterlo un array ese array tengo que hacer ordenarlo y tal vale entonces ya voy a crear un procedimiento para leerme los datos luego voy a hacer un procedimiento para cargarlo en el array y luego voy a hacer un procedimiento para darle el procedimiento que es de ordenar los datos en el array voy a crear tres procedimientos los voy a meter en un módulo que tengo aquí de un módulo de funciones y voy a hacer después un programa principal que me va llamando a su programa la voy a incluir y ya está eso ahí lo anotáis en una pequeña en un pequeño esquemilla y a desarrollar y después ya lo desarrolláis eso ya vale puntos dice coño el tío no tiene claro aquí lo que va a hacer que luego nos da tiempo a hacer todo el código y os quedo ahí tal pues posiblemente sea mínimo lo que es decir lo que os va a descontar eso bueno ¿qué ventajas tiene el hacer esto? ya las intuís ya os lo he dicho ¿no? vamos a poner aquí una serie de ventajas que no me escribí la ley supongo será por el ventajas reutilización claridad más ventajas organización de operaciones con niveles de detalle similares evitar repeticiones eficiencia de memoria incluso seguimos os sigo diciendo más ventajas ¿eh? vale una parte es la reutilización de claridad lógico organización mucho más organizado todo eficiencia de memoria memoria ¿eh? eficiencia de memoria ¿cuál es el inconveniente que veis aquí? en general estoy hablando en general del desarrollo utilizando técnicas de refinamiento ¿veis algún inconveniente? si optas mal ¿eh? si haces una mala opción pues no hay inconvenientes para esto ya hombre igual que cualquier desarrollo tú no suponiendo que lo haces bien siempre hablamos en positivo suponiendo que esto lo haces bien ¿tiene algún inconveniente o no lo veis ninguno? ¿no lo veis ninguno? nada hay uno la eficiencia en ejecución cuando vosotros tenéis un desarrollo secuencial es mucho la eficiencia en cuanto a ejecución es un poco más lenta que cuando tienes módulos que tienes que ir ¿vale? que tienes que ir llamando es decir cuando tú llamas una función tiene que ir a llamarlo a un módulo que está linkado con el tuyo pero ¿vale? entonces es lo único por supuesto acordaros que la eficiencia está en el tercer escalón y en ejecución todo todavía más bajo que en memoria porque sin memoria puedes tener ciertas limitaciones en algunas condiciones por sobre todo un array cuando trabajáis con un array tenéis que tener cuidado cuando trabajáis con un array estático porque los arrays estáticos son muy cabrones y con arrays dinámicos de punteros también son muy cabrones si no sabéis que ¿vale? que no dejéis mucha basura porque todavía son más cabrones es decir si sabéis manejarlos es estupendo pero si no lo sabéis manejar todavía son más cabrones entonces la eficiencia en memoria puede llegar en un momento dado que es interesante pero la eficiencia en ejecución con las máquinas de hoy en día no se nota es que hablamos de lo que tarda hoy en día el procesador en coger en ir a otra parte de la memoria donde tienes linkado un módulo y eso es mínimo eso en el momento de compilar varía ya pero tarda esto sería una optimización ya del compilador sí, sí hay compiladores que eso lo optimizan también es que hoy en día con los compiladores que hay con los computadores que hay el inconveniente por eso es minudencia es mirar tienes una vigorra de la hostia y estás mirando la paja que puedas tener ahí una mota y coño tengo ahí una mota que casi ni me doy cuenta es decir no no es ahora mismo no es el objetivo el desarrollo descendente en inglés se llama top down lo digo para si vais a trabajar en una empresa británica os dicen me tienes que hacer un desarrollo top down ese es el desarrollo descendente y el y el ascendente es al revés down top estoy leyéndome un poco vuestro libro o libro de tal por si hubiera desarrollo para reutilización sí, nada ya os lo comento ahí desarrollo ascendente y bueno y por último robustez aspectos de robustez tres aspectos de la robustez robustez de un programa también muy importante para todos ¿qué es la robustez de un programa? un programa prueba de bombas ¿no? sí un aspecto muy importante claro y un aspecto muy importante de la robustez es como trates las excepciones los arrojos ¿vale? eso es muy importante en un programa pero bueno de todas maneras el tratamiento de excepciones es una cosa que se suele hacer ya al final ¿vale? se suele hacer un lazo un loop ¿vale? un lazo loop ya veremos lo que es eso y en ese lazo se tratan todas las excepciones posibles las más posibles no todas pero las más probables ¿eh? es muy difícil que un programa trate todas las excepciones bueno el aspecto robustez número uno es mantener la operatividad ¿vale? primero aspecto es operatividad ante suministros erróneos ante datos erróneos ¿vale? ¿cómo se hace esto? bueno esto se evita mediante empleo de filtros emplear filtros por ejemplo si tú le tienes que pasar a un a una función un dato de tipo char no dejes que le pasen un dato de tipo íntegra ¿vale? introduzcame introduzca usted el dato el carácter el carácter a pasar y te y te introduce un íntegro ¿vale? entonces le sacas un mensaje no este dato está tal ¿quiere usted continuar? si continúa le vuelves a preguntar introduzca el dato y si no te sales con un simple if ¿vale? y un bucle for lo puedes hacer bueno un bucle for un bucle while porque no sabes cuándo va a meter el dato bien entonces la operatividad ante datos erróreos emplear filtros luego programar la defensiva programación a la defensiva ¿qué es esto a la defensiva? es decir defensa ultranza ¿no? va relacionado con los filtros de arriba ¿vale? la procedencia defensiva si el dato es admisible ¿vale? si el dato es admisible resultados iguales ¿vale? si yo voy a sumar dos números y me pasa los dos números o menos pasa bien siempre que los números sean iguales los resultados tienen que ser iguales ¿vale? eso se hace con pruebas ¿vale? se hace con pruebas pruebas además en lazos en lazo como caja negra ¿vale? lazo cerrado se llama caja negra lazo cerrado es decir le vas metiendo muchas muchos mucho le vas metiendo mucha traya muchos datos al programa y vas viendo como se comporta repites los datos y ves que te devuelve el mismo resultado eso se llama la prueba defensiva ¿vale? dato admisible y si el dato es erróneo avisar yo podría avisar y apartado de arriba apartado A ¿vale? avisar y no dejar continuar los filtros de arriba ¿vale? es decir si el dato es admisible pruebas bombardeo a meter datos y que me devuelva siempre los mismos resultados en caso de datos iguales ¿vale? bombardeo ahí a pruebas en caja cerrada ya digo no hay que hacer solo las pruebas en caja abierta que es cuando el código haces pruebas de robustez al código eso va relacionado más con la ISO con la ISO de calidad del código de software del desarrollo de software ¿vale? dato erróneo avisar y no continúas no continúas hasta que no me metas el dato bien es que no te dejo continuar de ninguna de las maneras si quieres salir eso sí filtros relacionado con lo de arriba y luego otro aspecto de robustez también es como trates la red las excepciones hay veces que pues mirad una excepción típica es memory out range fuera de memoria ¿vale? memoria fuera de memoria de rango ¿vale? esa es una excepción ocurrió pues porque la memoria se os colasó y eso bueno pues no es un dato erróneo es porque bueno pues había muchos datos el array tenía que mover muchísimas datos tenéis un array de cien mil datos pero a lo mejor el diseño tenía que haber sido en fragmentos de array más pequeños y luego intentar una vez que tuviera estado ordenado intentar ordenarlos entre ellos ¿no? pero bueno en principio son datos no está tan controlado como puede ser una introducción de un dato erróneo o tal ¿no? bueno pues el tratamiento de las excepciones como trates también es un aspecto de robustez esa auto memory pues sostiene tenéis que localizarlo y localizar la excepción y hacer un lazo para poder decir en vez de que te eches del programa siempre es más bonito que te deshaga un mensaje usted se ha desbordado la memoria e intente tal y dar incluso alguna solución si la pudiera haber ¿vale? entonces bueno pues habría que detectar la situación de error y los códigos de error ¿vale? y la corrección si es posible ¿vale? la detección esto implica una detección del error de la situación del error o de la excepción esto sería a un nivel normalmente se hace a un nivel subprograma más una corrección del error y esto ya se hace más bien cuando sabes del lazo ¿vale? a nivel programa ¿vale? el programa principal bueno pues esto es lo que hay que saber ¿vale? en la página fijaros tenéis la palabra through en la página 214 os lo digo porque es una cosa el through excepción ¿eh? through ¿vale? es un identificador una palabra clave que utiliza el c para detectar y lanzar un tratamiento de una excepción ¿vale? si fijaros lo que dice ahí si localiza un error 1 lánzame el tratamiento que le voy a llamar excepción 1 lánzame un lánzame la ese ese tratamiento ¿de acuerdo? ¿no ves? fíjate si k fijaros el factorial robusto ¿vale? si n es menor que 0 through 0 después hace aquí desde k igual a 2 hasta menor que n si f es mayor que íntegra el máximo dividido entre k lánzame through k si no me vas calculando parece que esto calcula el factorial ¿vale? de un número calcula el factorial de un número y lo único que detecta pues una una posible excepción si en la página 215 señalar mirar como como fijaros como fijaros como trata a nivel código ¿eh? en c más menos como permite tratar las excepciones ya os digo que esto no es habitual en este curso no es objetivo de este curso pero si que lo conozcáis ¿vale? por si os cae si os cae en la parte de de teoría las sentencias try try catch ¿eh? try catch dentro del try ahí metéis el código normal el algoritmo del problema la operación robusta con su argumento es el algoritmo del problema de la continuación y en catch es donde tú metes el código que quieres tratar de la excepción ¿de acuerdo? lo que tú eh lo que tú quieres que tú lo lanzas después con la sentencia through cuando parte la la excepción tú le dices through 0 y va a llamar ¿eh? va a llamar al tratamiento que tú tengas con el código 0 de esa excepción ¿vale? el valor del código que tú le pases por ejemplo si tú le pasas 0 tú dentro del catch tienes que tener el tratamiento de una excepción que tú has llamado con el código 0 ¿vale? y entonces en esa excepción vas a decirle usted ha desbordado la pila por favor introduzca un array con menos datos a ordenar por poner un ejemplo no sé si me explico lo que hace lo que las sentencias esas ¿eh? tenéis la try que es el bloque de sentencias para ejecución normal y que vais a tener y que vais a controlar las excepciones y cats para tratar las propias excepciones en sí ¿vale? bueno vamos a hacer antes sí vamos a antes de hacer de seguir con los tipos de datos vamos a hacer el cuestionario número 2 ¿vale? ¿lo habéis hecho? yo me lo he recibido todavía ¿todavía no lo has recibido? pero si te lo mandé el otro día por correo bueno no, no me llegó tu correo otra vez no me ha llegado ¿lo tendrás bien apuntado? sí, sí te lo fui a buscar donde lo han hecho todos los correos pues no me ha llegado ningún correo esta semana no me ha llegado ninguno pidiéndome las cuestiones tú puedes entrar en la UNED de todas maneras en el foro de Pofrada puedes entrar ya ya está abierto ¿no? ah, sí pero no sé si ya está abierto sí sí, sí lo puedes coger ahí el resto ya el resto las tenéis ¿no? era interesante por el tema de agilizar porque aunque solo sea por los títulos por las empezamos coge coge si es sola hoja con tu compañero no, yo tengo las soluciones solo las soluciones bueno bueno pues ponernos dos a dos o a ver después de la palabra clave ese paréntesis if siempre hay una condición porque es un bucle es un bucle que tiene que llevar una condición ahí vale de un subprograma que devuelve siempre los mismos resultados ¿qué se puede decir? que es pro gusto creo que hay duda porque depende si sí, sí pues jolín ya de un programa que devuelve siempre los mismos resultados ya ya deduces todo esto eres un lumbreras de la leche yo no deduzco de un problema que trate bien las excepciones porque devuelva siempre los mismos resultados o que haya programado la defensiva a lo mejor devuelve siempre los mismos resultados pero ¿qué condiciones? si devuelve siempre los mismos resultados a lo mejor no hace nada el programa ¿qué se puede decir? de un programa que devuelve siempre los mismos resultados como no te diga algo más para hacer esto para decir que un programa no es justo hay que analizarlo hay que hacer las pruebas hay que hacer las pruebas de hay que hacer las pruebas de estas que os dije en caja en caja negra hay que mirar a ver cómo tratan las excepciones hay que mirar a ver cómo hace cómo trata si tiene filtros claro entonces con eso no dice nada que devuelva siempre los mismos resultados no entonces ¿qué? ¿qué se puede decir? nada no se puede decir nada ni que sea eficiente porque no sabe si es eficiente o no devuelve siempre los mismos resultados no puedes decir nada ¿qué vas a decir? ¿y qué es funcional? pues a lo mejor un programa que devuelve siempre los mismos resultados igual no hace nada porque realmente un programa un subprograma devuelve siempre los mismos resultados tú fíjate hombre si es un procedimiento va pero si dice que devuelve ya hablas de que es una función una función que devuelve siempre los mismos resultados funcional no parece mucho bueno siguiente la ingeniería del software aporta fundamentalmente a la programación modelos abstractos de cómputo más sofisticadas ¿qué es? es lo que he puesto en casa yo también yo creo que sí por lo de las abstracciones los modelos abstractos y tal ya pero eso de que más sofisticados yo es que lo supuse vamos a decir más sofisticado que ir de arriba a abajo no pero realmente pero realmente lo que la ingeniería del software lo que intenta es sobre todo ¿eh? no es hacer las cosas muy sofisticadas y infumables ahí es todo lo contrario intenta siempre organizar para facilitar entonces es lo que estamos hablando acordaros las técnicas del grupo yo hago el esqueleto ¿vale? desarrollo descendente y ahora del esqueleto mira tú te vas a encargar de esta parte tú te encargas de esto eso es la el fundamento de la ingeniería del software que no es lo mismo que el desarrollo plan plan piedra eso el plan piedra es ¡ala! nos metemos todos a la vez y a ver que sale sí podemos decir modelos abstractos vamos a usar abstracción vamos a intentar usar todos los programas y tal lo más sofisticados posibles ¿no? lo más reutilizables posibles ¿vale? pero no es sofisticado eso es más organizado sobre todo organizado he de decir técnicas organizativas para desarrollar grandes programas ¿eh? con la mejor con la de la manera más eficiente posible eficiencia en cuanto a gente quiero decir es decir más eficiente es decir aprovechando la la gente el esfuerzo de la gente es decir aprovechando el esfuerzo de la gente de la manera que el programa salga lo más robusto y lo más organizado posible ¿vale? es decir siempre es la técnica organizativa la ingeniería siempre es organizar las cosas bueno la 4 sin comentarios ordenar los conceptos claridad eficiencia y corrección debe ser ¿cuántas veces lo he dicho? menos de lo menos 45 claridad eficiencia y corrección ¿cómo los ordenarías? claridad eficiencia y corrección claridad corrección eficiencia no pues no voy a tener que repetirlo otras 45 veces más como siempre la corrección es que la claridad sin corrección es decir para mí las dos son muy importantes la eficiencia menos está un para mí son muy importantes las dos a la hora de corregir un problema o corregir o tener en cuenta no un problema que se lee en dos líneas pero luego cuando andas a desarrollos a gran escala no ser claros es que es imposible así es imposible mantenerlos mantener un programa que no sea claro pero claro si es claro pero no es correcto y es más importante la corrección realmente es más importante la corrección si uno bueno uno es un desastre luego siendo un poco claro en el programa pero le funciona todo pues se le puede claro se le puede aguantar más que a uno que es muy claro que comenta incluso hace un libro del programa y luego no funciona es decir corrección claridad eficiencia y eficiencia primero siempre mejor que sea eficiente en memoria no tanto eficiencia en ejecución dado el siguiente fragmento de código este tema de los tres de metodología conceptualmente el más importante es este claro porque ya vamos ahondando en cosas for int y aquí a continuación sigo aquí otro anidado estos se llaman lazos anidados ¿vale? lazos bucles que están dentro de otros bucles ¿esto lo hizo alguien? ¿sales tú a hacerlo? bueno entonces no que habrá que hacer algo habrá que hacer ¿de qué cuantas veces imprime? sí pero bueno razonarlo un poco ¿no? razonarlo un poco si habrá aquí y aquí imprime en función del número de en función del número de veces que se ejecuta hola acordaros que barra n es el número que significa salto de línea ¿vale? y cierra los dos bucles anidados a ver ¿cuántas veces es estereotipo por ejemplo que se imprime hola? a mí ninguna ¿a ti ninguna? no ¿a ti? yo puse una tú una ¿no? ¿puedes razonarlo? porque tú pusiste ninguna no, yo no puse ninguna yo te digo que no ninguna porque no sé lo que da así que no lo puse ¿por qué dices que te da una? porque lo hice y me pareció que daba eso vamos a ir razonándolo empieza contador uno empieza a valer menos uno ¿y cómo vale menos que uno? ¿cómo vale menos que uno? le suma uno bueno no, no, no bueno vamos a ver no, no le suma hasta que no vuelva entonces entra en el segundo lazo con contador igual a menos uno entonces íntegre cuenta desde uno hasta que contador sea menor o igual ahí falta un punto y coma que me comí si os descuentas ¿vale? fíjate que como contador ya es menor ¿es menor o igual que menos uno contador dos? no, no eso se la salta claro se la salta porque contador dos es mayor entonces se la salta y entonces aquí incrementa y aquí también contador dos también debería incrementar bueno no incrementaría en ese caso porque como ya directamente se sale efectivamente no entra en el bucle no entra en el lazo contador uno pasaría a valer cero lo mismo contador dos desde uno como ya esto es mayor que cero se salta se salta también y vuelve a incrementar el contador uno entonces contador uno ahora vale uno y aquí ya lo tiene que se va a ejecutar este lazo contador dos va desde uno aquí sí hasta uno imprime ola y aquí sí se incrementa y ya vuelve a superar con lo que ya sale este lazo y como ya también se sale del otro una vez correcto una vez se ejecuta ese lazo es decir bien dado el siguiente fragmento del código bueno voy a aprovechar aquí es lo mismo pero aquí pone diez aquí pone diez a ver si más cosas cambian también se incrementa eso y esto sigue igual ala cuántas veces te dio a ti esto la vez cincuenta y cinco veces me cago en dios vamos todo el examen si lo hacemos como el otro y cómo lo has sacado porque se va ejecutando desde el menos uno cuando vale menos uno nada no se ejecuta cuando vale el cero no se ejecuta como antes tampoco se ejecuta pero cuando llega a uno sí se ejecuta y cuando llega a uno abajo se ejecuta una vez claro cuando llega a dos abajo se ejecuta una vez cuando llega a tres tres veces ¿qué hiciste? diez factorial claro no diez factorial no diez más nueve más ocho más siete más seis más cinco más cuatro más tres más dos más una que son cincuenta y cinco bien razonado en menos de un minuto se deduce hay que tener muy claro cómo funcionan los lazos for cincuenta y cinco veces ni cincuenta y tres que no sale por ningún lado ni hay ni hay un error de tipos no hay ningún error de tipos son todos tipos compatibles ¿eh? interiores veis que no aparece nada por ahí incompatible ni una vez solo ¿abazo porque se ha dado dos veces? ¿porque añade ahí dos? ¿dos incrementa abajo? ¿es? esto porque hombre el lazo tiene que acabar y entonces cada vez es que esta parte que es el contador esto es importante porque si no nunca un lazo un lazo iterativo tiene que terminarse es una de las cuestiones importantes que tiene un lazo tienes que asegurar que termina y termina porque aquí se va incrementando hasta alcanzar ¿eh? hasta que esto alcance un valor mayor que contador uno porque mientras que sea menor se está ejecutando esta es la condición de terminación mientras que esto es media menor o igual que contador uno se va ejecutando pues es lo que dicen cuando mientras que contador uno sea cero menos uno y cero no se ejecuta nunca ¿por qué? ¿por qué no se ejecuta nunca? porque esto ya es mayor que esto entonces ya acaba la primera sin embargo cuando vale uno ya se ejecuta una vez este empieza a contar desde uno la primera vez va desde uno hasta uno se ejecuta una vez cuando contador uno en este lazo da una vuelta contador uno se incrementa dos entonces cuando contador uno vale dos este se ejecuta dos veces que es uno para contador dos una y otro cuando contador dos vale dos y la siguiente vez ya nada porque ya supera el valor de contador uno y esto es clave porque es el que dice cómo va de cada vez que se ejecuta el bucle qué va a hacer la variable contador cómo va evolucionando claro es decir es un lazo que la primera vez que se ejecuta que es cuando contador uno vale uno se ejecuta una vez la segunda vez que se ejecuta como contador uno vale dos se ejecuta dos veces es el lazo interno estos son como lazos admirados entonces cada vez que el de arriba se incrementa este se puede ejecutar cero una dos o mil veces depende un poco de lo que en este caso de la en este caso depende del contador uno de la variable contador uno vale en la práctica la verificación garantiza que en el programa no hay ningún error si se hace mediante ensayos del programa aumenta la complejidad del programa garantiza la eficiencia del programa yo puse la b tú habías puesto alguna la b si es eso se hace mediante ensayos del programa la verificación ensayos del programa dado el siguiente fragmento de código a ver dado ese pequeño fragmento de código es correcto sin tener el se lo dijimos el otro día en una de las preguntas que os dejé planteadas acerta y no os dice nada tampoco en manual de estilo que no lleve si hay otros lenguajes de compilación tipo modulados que si no le pones el s te echa fuera entonces dice después de su ejecución n n contiene que valor ¿por qué? porque n es cero n es menor que dos así que aumenta condición después del if siempre va a aumentar la condición n es menor que dos entra en el if ¿y qué hace? n se incrementa se incrementa y como no es un bucle iterativo ya sale del lazo y vale correcto uno para imprimir una lista de caracteres utilizando printf ¿qué emplearemos? ¿qué tipo de lazo haríais? imaginaos que tenéis que hacer vosotros vuestra función printf mi printf que no es la que está en el stdio ¿qué utilizaríais? para hacer printf de una lista de caracteres ¿qué es una lista de caracteres? unas cuantos caracteres una fila de caracteres que van uno detrás de otro ¿qué emplearíais? selección ordenación búsqueda o iteración iteración claro y si además sé el número de caracteres de la lista ¿qué tipo de? un for y si no sé el número de caracteres de la lista un while o un do while un do while el que más rares me dé lo lógico es poner mientras que no llegue a final de ristra ¿que sabéis que es el carácter? barra cero ¿vale? barra invertida cero ¿cuál de las siguientes sentencias es de iteración? bueno esta es de chinchinamo ¿cuál de las tres sentencias es de iteración? y felse while beginning o a igual a b ya me gustaría que os pusieran esta sin comentarios a igual a b y ya está ya hemos acabado el dos en el tres ya empiezan las dificultades tipos de datos ¿cómo vamos de tiempo? vale vamos a empezar con definición de tipos de datos tiene un calor de la leche bueno vamos a dar ya datos más avanzados y que nos van a nos van ya a abrir la persiana para que para empezar a hacer ya desarrollos ejemplos de programas ¿vale? vamos a dar ya ahora una serie de datos que se llaman enumerados muy recomendables igual que las constantes son muy recomendables para la hora de clarificar en el uso del programa pues datos que usa repetitivamente y que posiblemente te acuerdes o no o no puedas unificar a lo largo del desarrollo de ese programa los tipos enumerados son muy recomendables por claridad del programa por claridad por ejemplo los días de la semana tú puedes decir bueno pues para mí los días de la semana son del 1 al 7 ¿vale? y te puedes crear como una especie de código morse que tendrías que pasar conjuntamente tus programas es decir yo cuando ponga del 1 al 7 significa días de la semana cuando ponga o también más complicado cuando ponga el ristra de 1 de 2 de 3 de 4 de 5 estos son días si pongo M1 o M12 son meses si pongo Y1 o 2 tal son 1990 1991 son años y pasas un código mnemotécnico con lo que todo el mundo que quiera usar tus programas tendría o tendría que hacer una carrera dentro de la carrera tendría que hacer una asignatura que es código morse para los programas de este hombre bueno pues los tipos enumerados te facilitan eso porque son como esos códigos metidos dentro de tu programa entonces los tipos enumerados bueno lo primero la palabra clave type def que hasta ahora no la hemos utilizado porque todos los tipos que son predefinidos los que hemos presentado ahora mismo son los tipos predefinidos no sabéis crear tipos propios bueno pues ahora vamos a una palabra clave igual que la de la de include hay otra palabra que tenéis que definir también al principio cuando te hacéis la cabecera del programa vosotros tenéis el main los includes el principal y una de las cosas son los type def los tipos que vas a emplear eso es de la primera parte que tenéis que hacer constantes tipos de datos que vas a emplear antes de definir una variable de ese tipo lógicamente lo lógico es que te clares los tipos y las variables los declares al principio luego los tipos que vas a emplear tienes que estar tipos definidos por el usuario type def tipo definido tienes que definirlos antes de las variables que vayas a utilizar de ese tipo y por ser ordenado tendrás una sección que sea declaración de tipos de datos palabra clave type def luego no declares ninguna variable que se llame type def ¿cómo se llamaría eso? fenómeno redefinición bueno pues dentro de dentro de los tipos de datos fijaros él le dice vamos a definir un tipo de dato entero que sea de tipo int bueno otro tipo de datos carácter que sea de tipo char o un tipo de datos real estoy en la página 221 que sea flow vale entonces él define define tres tipos de datos que ya no los necesitarías definir realmente es un ejemplo un ejemplo tonto porque tú ya tienes los tipos enteros los char y los flow pero él define entero carácter real para ampliar tres tipos de datos equivalentes al ínteger char y real pero para y flow perdón para hablar en castellano para poner las referencias en castellano ¿te das cuenta? bueno tipo numerado bueno fijaros que es tan fácil definir un tipo numerado como poner eso en la sección que corresponde del programa yo defino un tipo de dato en un palabras claras ambas y ahora yo le doy un identificador que ese sí que no es ¿eh? ese es un identificador mío que yo diga día semana ¿vale? estos son identificadores predefinidos tipe D en un defino un tipo de datos numerado que es día de la semana y entre paréntesis empiezas a enumerar los códigos esos morse que por otra manera los tendría que aprender tendrías que pasar tú un un libro para que te los aprendieras ¿no? entonces dices bueno pues yo para ser claro voy a poner voy a llamar pues así lunes martes etc. ¿vale? hasta el final y ya tengo un tipo de datos con los que puedo trabajar ¿vale? ahí tenéis más ejemplos tipo de mes tipo estado civil tipo color tipo frutas tipo orientación tipo piezas hay una cosa bueno la 35 definir el tipo de datos y después cuando declaremos la variable la declaramos de ese tipo ¿vale? yo después iré a la declaración de variables y diré día semana pongo mi semana ¿vale? esto es correcto declaro una variable en la parte de declaración de variables ¿cómo se como se decía la como se hacía la declaración de variables la sección de declaración de variables ¿vale? con el tipo, el identificador y luego sumerías el valor claro, bueno pues aquí mi semana del tipo día-semana y el tipo día-semana está definido antes ¿vale? eso es la fórmula que cumple el manual de estilo que os propone el equipo docente y que tenéis que cumplir que no lo digo porque sé que hay gente que a veces que viene con otros lenguajes de programación o conoce ya el C++ y que esto se lo salta entonces hace la declaración todo en la misma línea y eso no es válido ¿vale? insisto que hay casos en los que casi es mejor partir de cero así no tienes vicios para declarar, para inicializar mi semana para inicializar mi semana pues mi semana tú le dices igual día-semana si tú quieres inicializar mi semana con el conjunto vacío es decir, día-semana, ninguno conjunto vacío esa es la manera de inicializar un tipo de datos enumerado hace referencia al nombre del tipo y le pones entre paréntesis abierto y cerrado ¿vale? y así se puede decir que de alguna manera borro mi semana si yo quiero poner lunes pues nada más tengo que poner lunes es decir, tú puedes asignarle cualquiera de los valores de esta secuencia de valores que tú has puesto aquí lo que no puedes es asignarle porque te dará un error y entonces entramos ya en que para que sea robusto tienes que evitar estos errores ¿vale? tendrás que hacer un filtraje cuando tú le asignes aquí un valor tiene que ser de los que esté aquí si no está aquí te va a dar un error ¿vale? en compilación te dará un error ya en compilación si tú declaras un tipo de datos por ejemplo días de la semana declaras una variable mi semana y después yo le declaro en vez de lunes le pongo lunes le pongo monday pues si lo has escrito tú directamente igual sí pero si es por entrada de datos del usuario no, digo escribiéndolo directamente supongo que sí que te dará ya ¿no? porque si es hombre si es por entrada de datos tienes que tener en cuenta que cuando tengáis siempre una sentencia de lectura siempre tienes que hacer ahí un algo tienes que hacer un filtro eso es claro ya si es que tú que te equivocas al escribir yo digo que te equivoques tú al escribir porque ahí el filtro es que tú tienes que revisar luego lo que escribes lógicamente hay poco filtro ahí si tú escribes mal el código ¿qué te parece? os lo dejo planteado ¿vale? ¿cómo que no? vamos a ver yo tengo ahí una tipo de numerado de una una serie de valores que puede tomar cualquier variable que yo utilice de tipo enumerado es algo así como un íntegro tú imagínate que los íntegros en una máquina tienen un valor de 1 o de bueno en positivo o negativo desde menos x a más x imagínate que yo le quiero asignar un valor que no está en ese rango por ejemplo le pongo x más 1 siendo x el máximo rango de enteros que que es la capacidad de índice de la máquina ni más ni menos un error lo va a dar ya sea en compilación o en ejecución te va a dar un overflow si vamos a ver en cuanto que llegue ahí ya sea pero te va a dar en compilación ya te va a decir el compilador es la pregunta ¿te da el compilador que hay ahí una que un error antes de que ejecutes? no sé si analizar hasta ese punto yo sé bueno os lo dejo planteado son cosas para que vosotros probéis en casa el compilador a ver que para que sepáis en qué momento se ayuda el compilador y en qué no ¿vale? por supuesto vosotros podéis estos mira estos tipos enumerados entran dentro de los de lo que llamamos tipos ordinales ¿vale? tipos ordinales ¿por qué es? porque mantienen un orden los char son tipos ordinales porque mantienen un orden el código arci del char te marca el orden los enteros por supuesto son tipos ordinales porque mantienen un orden mantienen un orden cualquier tipo cualquiera de los cualquiera de las cuestiones de operadores que hemos que se aplican de comparación con ordinales se pueden aplicar a estos es decir ¿el martes es mayor que el lunes? sí ¿por qué el martes es mayor que el lunes? parece que una cosa tonta el dos es mayor que el uno la B es mayor que la A ¿por qué el B la letra B es mayor que la A? porque tiene un asti superior al asti del A ¿por qué el martes es mayor que el lunes? porque internamente él asigna desde cero en adelante un orden a todo lo que tú escribes aquí ¿cuándo lo decimos aquí? ¿eh? el orden que le pongas ahí el orden es este no, no el orden que lo pongas ahí es lo que asigna él él asigna al primero un cero al segundo un uno entonces cualquiera el orden de predecesión es este entonces tú puedes poner esta comparación tú puedes poner y mi semana es mayor o igual que el lunes eso lo puedes poner gracias a esto ¿y sería ya directamente el lunes o no tendrías que bueno, no sí, sí es que yo directamente el lunes yo tengo la la idea de la anotación de puntos de objetos y no tendrías que poner día, semana punto lunes no, ¿verdad? te lo recogen ¿no? sí, sí te lo tienen que recoger ¿no? es un identificador que tú utilizas ahí y que el identificador tiene que asociarlo a que es uno de los de los ordinales que a la que hace referencia es día, semana eso te lo tienes que reconocer entonces no podrías declarar una variable que fuese lunes por ejemplo no redefinición tendrías una redefinición ahí las redefiniciones hay que evitarlas en lo posible porque son errores vale, vale esa es una una redefinición en un identificador que tú has utilizado hay otras redefiniciones todavía peores que son redefiniciones con con identificadores de de palabras empleadas por el compilador como tippedef como el un es decir las redefiniciones no lo que dice vuestro compañero es yo tengo un identificador que identifica uno de los objetos de los días de la semana que es el lunes ¿vale? de ese tipo numerado y ahora cojo y defino una variable de tipo íntegro que se llama también lunes es una redefinición ¿que te traga? te traga pero no sabes lo que te va a hacer entonces ¿qué quiero? que al final no puede ser al final es un entero es lo segundo que coja si tú después haces cualquier asignación te va a dar un error porque ojo los tipos para que se hagan asignaciones tienen que ser tipos compatibles de forma y manera que si yo creo día, semana, uno va a ser distinto de día, semana y aunque tenga imagínate que yo creo uno que sea día, semana un tipo de dato que sea día, semana que sea lunes día, semana que sea lunes, martes miércoles, jueves y viernes y otro día, semana uno o día, semana o día festivo que sea sábado y domingo yo podría hacer asignación dejando dos variables una de día, semana y otra de día, festivo yo podría hacer una asignación de una variable del tipo día, semana a otra de día, festivo no porque no son tipos compatibles y el manual de estilo aunque lo pueda tragar el compilador en un momento determinado porque el compilador es muy listo y sabe lo que quieres ¿eh? el manual de estilo te lo impide tienen que ser tipos compatibles totalmente compatibles compatibles quiere decir que están tecladas del mismo tipo si no, no es compatible fíjate que el compilador te traga íntegra cuando los quieres meter en reales y sin embargo te obliga el manual de estilo a hacer la transformación tú poner o flow o poner íntegra ¿vale? ojo con eso ahí tenés ejemplos fíjate eso que me preguntabas en la página 223 tienes cantidad de ejemplos si el mes es mayor o igual que julio haz esto mientras que el día de la semana sea menor que sábado haz esto si el color del coche es igual a rojo define varios son buenos ejemplos la verdad que y oye ¿y por qué y por qué esta y por qué esta sentencia? fijaros que curioso la página 223 ¿por qué esta? ¿qué significa esto? íntegre diciembre bueno pone diciembre íntegre diciembre once ¿qué significa eso? ¿eso es correcto? sí en este tipo de abdominal está surgiendo el valor numérico de diciembre en la posición se suponiendo suponiendo que tú defines los meses empezando por enero ¿vale? íntegre diciembre es equivalente a once ¿eso qué? ¿eso equivalente qué es? es equivalente no es una asignación podría ser podría hacerse esta asignación diciembre igual a once ¿no sería tipo de la respuesta? sí puede ser pero depende de lo que quieras no porque no es un estáis cambiando no no se puede se podría poner se podría poner lo siguiente mis meses igual a once se podría poner así mis meses ¿qué sería? el tipo de dato definido con todos los sí, mis meses es una variable que defino del tipo meses que va de enero a diciembre sí porque te guardaría dentro de la variable mis meses diciembre el valor referido en diciembre ¿no? ¿y? sí, si se puede serían equivalentes en este caso los dos pero el tipo no es el mismo ¿no? pero para asignar eso tengo que ponerle bueno delante ah, sí vale para poder hacer esto tendría que poner meses y aquí le digo meses entonces yo le estoy metiendo a mis meses el mes once que es diciembre ¿vale? y también podría poner ínteger eh mi mes mis meses es meses once es decir estoy en diciembre si quisiera restarle uno a la actual podría poner ínteger mis meses menos uno es decir mirad a ver familia familiarizaros con eso porque esto es importante manejarlo bien este tipo yo digo meses tengo que decir que yo voy a meter meses puedo decir en mes mis meses con la transformación a ínteger porque le voy a restar menos uno eso también vale mis meses si yo estoy en el mes diciembre o sea el mes once ahora voy a pasar al mes diez ¿vale? esto me va a devolver el mes diez mes diez o sea noviembre entonces estoy metiendo en la variable mis meses el mes de noviembre me vais cogiendo vais entendiendo la vais entendiendo las operaciones lógicas aquí con esto de eh es un tipo de dato ojo que es restrictivo no tiene no tiene tantas operaciones y tenéis que cuando lo uséis tenéis que eh admitir las reglas que hay para usarlo no luego vamos a ver otros tipos de datos que quizá permita mucha más mucho más juego eh ojo ojo también con una cosa eh vosotros imaginaros que en vez de menos uno yo pongo más uno te pasas y ¿qué pasa? si me paso de diciembre ¿no es rotativo esto? te daría un un error ¿no? ¿o no es rotativo? es decir si me paso ¿no vuelvo otra vez automáticamente al principio? no sé entonces cuando lo dice usted dice que se define automáticamente rotativa yo creo que no es lo que hay la única definición es la que hice no hay no le puedo decir de ninguna manera en una cláusula que sea rotativa ¿no? si lo haces porque es automático cuando te pasas te pasas intuitivamente vosotros veis que eso cruje porque si tú estás en el mes once que es ¿sabes qué número? de cero a once si llega a once pasa doce y el doce es all range lo mismo que los enteros all range seguramente en tiempo de compilación no te da nada casi seguramente ya os digo que no os va a dar nada pero cuando llegue el momento en el que le metéis diciembre y le sumáis uno por error ¿cómo lo resolveríais? confirmados si el mes es diciembre no le puedo sumar si el mes es enero no le puedo restar o control de secciones detecto que sección me da cuando haga esto trae catch y a la voy a la parte catch que es la que hago un loop para meterme en la sección que sea está chequeando la sección y en la sección que sea el código de sección que me devuelva hago una acción ¿veis un poco problema la programación? ponemos en la página 224 al final decidme qué es eso que está ahí vamos a analizar eso que hay ahí venga y ya lo dejamos aquí para el próximo día porque tú tenías también algo de prisa ¿no? yo sí no, no, no no me he llevado ah vale prácticamente el tema 9 lo dejamos lo dejamos liquidado y pero bueno tengo que me he quedado de vectores y eso te quiero dar un poco más a ver ¿qué me decís? venga en un minuto os dejo un minuto pensar y me lo dice el primero que primero ¿eso qué es? ¿qué es eso que hay ahí? ¿qué es eso? un programa principal o es una función que devuelve un tipo día es decir una función puede devolver un tipo numerado cualquiera de los tipos que yo voy a presentaros tanto los predefinidos que ya os he presentado como los que voy a presentar una función los puede devolver no tenéis que tener ningún tipo de eh de estigmatización por por usar cualquier tipo de datos en que devuelva una una función ¿qué me decís? le pasa un tipo día que sería un un elemento de la numeración de los días sí tipo día hoy martes venga vale y el número de vueltas que quieres darle no el número de días más allá que le quieres dar y le digo 10 días mejor va porque claro porque al hacerla el módulo de claro ves ves el truco ves para que no se pase si tú quieres que sea rotativo cuando hagas ponerle el módulo te devuelve el resto te das cuenta el resto la diferencia eh la diferencia entonces si tú le dices 10 días más allá él te va a decir te va a devolver te va a dar las vueltas necesarias eh que es el cociente y te va a devolver el diferencial si dices 10 días más allá ¿qué va a hacer? de martes a martes son 7 días más 3 más te va a devolver el viernes ¿de acuerdo? y es correcto todo ahora está definido de tipo ítem el ojo eh claro pero haces la conversión claro y luego haces la conversión a tipo día luego es perfectamente correcto perfectamente correcto ese código tipo predefinido boleán el tipo predefinido boleán está predefinido porque no tenéis que definirlo vosotros pero es un tipo enumerado es un tipo enumerado cuyos valores son false y true y fíjate ahí lo tenéis la definición la predefinición que tiene en el compilador tipe de enu bol false y true false por eso cuando vosotros comparáis con 0 es igual que comparar con falso porque ocupa la posición 0 y comparar con true es comparar con 1 ¿de acuerdo? veis ahí los operadores que podéis operar los comparadores lógicos lógicamente son perfectamente compatibles con el boleán si no no tendría ninguna utilidad ¿de acuerdo? y luego os dicen aquí fijaros algunas funciones predefinidas en c que que os devuelve que sean funciones que devuelven boleán ¿de acuerdo? ¿sabéis cómo se llaman las funciones que devuelven un boleán? es decir un 0 o un 1 por cultura ¿sabéis cómo se llaman? funciones predicados ¿vale? la librería en las que están estas funciones la tenéis ahí es la ctype.h librería ctype.h y lo dejo aquí porque no voy a decir la parte que me queda es muy importante también y no quiero agobiaros me queda arrays y registros aparte de arrays y registros ya tenéis todas las herramientas en la mano para programar en este curso hay una ampliación de estructuras de control que os voy a comentar también el próximo día y las estructuras de datos con lo que hemos visto amigos ya tenéis ahora sí que ya no con lo que hemos visto y lo que vamos a ver el próximo día ya no tenéis perdón ya tenéis que estar programando todos los días un programa nos queda después un tipo de datos que voy a dejar para el final como os dije que es el puntero y variantes dinámicas ya os lo comenté que ese tipo de dato como es un tipo de dato que no tenéis que emplear este año sí para no, no tenéis que emplearlo pero sí que tenéis que conocerlo tenéis que conocerlo porque sabes que os cae mucho en la parte de cuestiones normalmente siempre dos o tres cuestiones son de punteros sobre todo cuando te los quitan o sea