Lo que hemos visto hasta el momento en los capítulos previos tiene sentido desde la perspectiva de un algoritmo donde su estructura se basa en conectar funciones y armar redes colaborativas de funciones a través de llamadas. En ningún momento, nuestros algoritmos han tomado decisiones de moverse hacia un lugar, o hacia otro lugar. Esto es, sectores específicos del algoritmo. Ahora trabajaremos un poco más al interior de las funciones y de los algoritmos que materializan.
Uno de los aspectos más poderosos de la computación es poder cambiar la ruta o dirección de los pasos de nuestros algoritmos dependiendo de ciertas condiciones que se puedan llegar a dar durante su ejecución. Las condiciones a las que se hace referencia no son otra cosa distinta que expresiones lógicas (vistas ya en el capítulo de expresiones), y que esta vez van a jugar un papel mucho más poderoso: permitir bifurcar el código por distintas rutas dependiendo de nuestras necesidades.
El hecho que una expresión condicional nos permita bifurcar nuestro código, ya nos habla sobre no tener solo funciones algorítmicas de una única ruta, sino que nuestras funciones podrán ser una red de caminos de lógica computacional tan simples o complejos como queramos.
En realidad, cuando se desarrolla software en la vida real, estos laberintos de caminos se simplifican precisamente con el uso de llamadas a otras funciones. Sin el uso de redes colabrativas de funciones, dicha complejidad podría ser inmanejable dentro de una única función.
Al interior de nuestras funciones es primordial tomar decisiones, ya que nuestros algoritmos obtienen capacidades muy interesantes. Entre ellas, bifurcar el código en múltiples caminos para más adelante unirse, crear un camino circular que puede activarse mientras una condición sea cierta y desactivarse cuando la condición ya no es cierta, hacer un bucle infinito que se rompe solo cuando se de una condición interna al ciclo, hacer bucles que recorren colecciones de datos de forma exhaustiva, entre otras posibilidades.
Hay bifurcaciones que son incondicionales (no dependen de una condición lógica): si tu código pasa por ahí, la transferencia siempre se da, como brincar en alguna parte del camino dentro de la función a algún otro lugar, romper un camino circular cerrado por condiciones, retomar un ciclo en su condición, o simplemente salir de una función en cualquier momento.
Todo esto les da a los algoritmos computacionales un poder inmenso que, en la práctica, se vuelve la razón de ser de por qué escribimos códigos para computadora. Nuestros pseudocódigos papercode pueden contar con todas estas posibilidades.
Esta forma de operar nuestros algoritmos, junto con la diversidad de estructuras de datos, son el verdadero sentido de la programación, y es tal vez uno de los aprendizajes que más se deben dominar.
Uno de los aspectos más poderosos de la computación es poder cambiar la ruta o dirección de los pasos de nuestros algoritmos dependiendo de ciertas condiciones que se puedan llegar a dar durante su ejecución. Las condiciones a las que se hace referencia no son otra cosa distinta que expresiones lógicas (vistas ya en el capítulo de expresiones), y que esta vez van a jugar un papel mucho más poderoso: permitir bifurcar el código por distintas rutas dependiendo de nuestras necesidades.
El hecho que una expresión condicional nos permita bifurcar nuestro código, ya nos habla sobre no tener solo funciones algorítmicas de una única ruta, sino que nuestras funciones podrán ser una red de caminos de lógica computacional tan simples o complejos como queramos.
En realidad, cuando se desarrolla software en la vida real, estos laberintos de caminos se simplifican precisamente con el uso de llamadas a otras funciones. Sin el uso de redes colabrativas de funciones, dicha complejidad podría ser inmanejable dentro de una única función.
Al interior de nuestras funciones es primordial tomar decisiones, ya que nuestros algoritmos obtienen capacidades muy interesantes. Entre ellas, bifurcar el código en múltiples caminos para más adelante unirse, crear un camino circular que puede activarse mientras una condición sea cierta y desactivarse cuando la condición ya no es cierta, hacer un bucle infinito que se rompe solo cuando se de una condición interna al ciclo, hacer bucles que recorren colecciones de datos de forma exhaustiva, entre otras posibilidades.
Hay bifurcaciones que son incondicionales (no dependen de una condición lógica): si tu código pasa por ahí, la transferencia siempre se da, como brincar en alguna parte del camino dentro de la función a algún otro lugar, romper un camino circular cerrado por condiciones, retomar un ciclo en su condición, o simplemente salir de una función en cualquier momento.
Todo esto les da a los algoritmos computacionales un poder inmenso que, en la práctica, se vuelve la razón de ser de por qué escribimos códigos para computadora. Nuestros pseudocódigos papercode pueden contar con todas estas posibilidades.
Esta forma de operar nuestros algoritmos, junto con la diversidad de estructuras de datos, son el verdadero sentido de la programación, y es tal vez uno de los aprendizajes que más se deben dominar.
Repaso de operadores relacionales y lógicos
Como vimos en el capítulo sobre expresiones, el resultado de una expresión lógica es un valor lógico verdadero o falso que, en nuestros pseudocódigos, los posibles valores serán .f. o .t., .false. o .true.
Solo existen dos posibles valores para una reducción de una expresión lógica, a menos que sea combinada con una expresión aritmética y obliguemos a una conversión que nos lleve a los valores uno o cero para los dos casos.
Reducimos a valores .f. o .t. con operadores relacionales como (=, ==, .EQ., .equal.), diferente (≠, !=, .NE., .diff. .different., .not equal.), menor que (< , .LT., .less than.), menor o igual que (≤, .LE., .less or equal.), mayor que (>, .GT., .greater than.), mayor o igual que (≥, .GE., .greater or equal.).
Los operadores lógicos en nuestras expresiones condicionales son la conjunción AND (en pseudocódigo, los operadores ∧, AND, &, &&), la disyunción OR (en pseudocódigo, los operadores ∨, OR, | , ||), la disyunción exclusiva XOR (en pseudocódigo, los operadores ⊕, ≢, ⊻ , XOR) y la negación not (operadores ¬, NOT, ~, !).
No se puede olvidar que el uso de paréntesis es útil para ajustar las prioridades de los operadores según se requiera dentro de una expresión lógica. Adicionalmente, las llamadas a funciones que devuelvan un valor se pueden involucrar en una expresión lógica.
Con todas estas herramientas a la mano, tendremos una gran cantidad de posibilidades para nuestras expresiones condicionales, y eso nos abrirá la posibilidad de un gran control sobre nuestras bifurcaciones.
Solo existen dos posibles valores para una reducción de una expresión lógica, a menos que sea combinada con una expresión aritmética y obliguemos a una conversión que nos lleve a los valores uno o cero para los dos casos.
Reducimos a valores .f. o .t. con operadores relacionales como (=, ==, .EQ., .equal.), diferente (≠, !=, .NE., .diff. .different., .not equal.), menor que (< , .LT., .less than.), menor o igual que (≤, .LE., .less or equal.), mayor que (>, .GT., .greater than.), mayor o igual que (≥, .GE., .greater or equal.).
Los operadores lógicos en nuestras expresiones condicionales son la conjunción AND (en pseudocódigo, los operadores ∧, AND, &, &&), la disyunción OR (en pseudocódigo, los operadores ∨, OR, | , ||), la disyunción exclusiva XOR (en pseudocódigo, los operadores ⊕, ≢, ⊻ , XOR) y la negación not (operadores ¬, NOT, ~, !).
No se puede olvidar que el uso de paréntesis es útil para ajustar las prioridades de los operadores según se requiera dentro de una expresión lógica. Adicionalmente, las llamadas a funciones que devuelvan un valor se pueden involucrar en una expresión lógica.
Con todas estas herramientas a la mano, tendremos una gran cantidad de posibilidades para nuestras expresiones condicionales, y eso nos abrirá la posibilidad de un gran control sobre nuestras bifurcaciones.
Cortocircuitos moderadores
Recordemos ahora el tema de los cortocircuitos como ya se presentó en la sección de expresiones lógicas con un breve resumen.
Si una conjunción lógica (AND) tiene su término izquierdo false (.f.), no es necesario revisar el derecho, pues automáticamente se sabe que el resultado es falso. Veamos lo contrario.
Si una conjunción lógica (AND) tiene su término izquierdo true (.t.), sí es necesario revisar el derecho, porque, de ser falso el derecho, la condición sería falsa. Dicho de otra forma, inmediatamente determinemos que la condición es verdadera, no importará revisar el resto.
Si una disyunción inclusiva lógica (OR) tiene su término izquierdo true (.t.), no es necesario revisar el derecho, pues automáticamente se sabe que el resultado es verdadero. También en este caso revisemos lo contrario. Si una disyunción inclusiva lógica (OR) tiene su término izquierdo falso (.f.), sí es necesario revisar el derecho, porque, de ser falso el derecho, la condición sería falsa.
Similar a como pasa con el AND, en el OR tan pronto determinemos que la condición es verdadera, no importará revisar el resto.
En el caso del XOR, la característica del cortocircuito no funcionará, debido a que XOR es verdadero cuando sus dos argumentos son diferentes. Por lo tanto, siempre deberán evaluarse las dos para determinar si la condición completa es verdadera. Esto no significa que no pueda ser usado como moderador.
Esta característica de muchísimos lenguajes de programación nos habilita a tener control sobre fragmentos de seudocódigo (o de código si estamos programando), cuando quiero que estos se ejecuten o no, dependiendo de alguna condición. puedan llevar a cabo construcciones que permitan ejecutar o no un bloque de código, según sea nuestro interés.
Esto es algo muy poderoso que pasa para muchos desapercibido, y muchos programadores usan estructuras de control especiales para lograr hacerlo. Otros programadores, de otro lado, encuentran algo confuso el mecanismo de cortocircuito, y prefieren hacerlo de la forma tradicional que aún no hemos visto.
Por ejemplo, suponga que la función atacar() se debe llevar a cabo si la variable llamada ángulo_correcto es verdadera. En este caso podemos usar
ángulo_correcto AND atacar()
Expliquemos el poder de esta construcción que puede llegar a utilizar en muchos lenguajes de programación. Cuando la variable ángulo_correcto sea verdadera (.t.), no habrá cortocircuito y por lo tanto la conjunción debe proceder a evaluar la izquierda, por lo que la acción de atacar() solo se da cuando se cumpla la condición de que tenemos un ángulo correcto.
Si quisiéramos usar la disyunción inclusiva para lograr el mismo objetivo, es posible que no sea tan intuitivo, pues tendríamos que escribir
(NOT ángulo_correcto) ∨ atacar()
¿Cuál usar? Se usa la más cómoda dependiendo de la situación. En el ejemplo del ataque a partir de un ángulo correcto, es mejor usar el AND. La segunda alternativa no es clara y es difícil de leer.
Si una conjunción lógica (AND) tiene su término izquierdo false (.f.), no es necesario revisar el derecho, pues automáticamente se sabe que el resultado es falso. Veamos lo contrario.
Si una conjunción lógica (AND) tiene su término izquierdo true (.t.), sí es necesario revisar el derecho, porque, de ser falso el derecho, la condición sería falsa. Dicho de otra forma, inmediatamente determinemos que la condición es verdadera, no importará revisar el resto.
Si una disyunción inclusiva lógica (OR) tiene su término izquierdo true (.t.), no es necesario revisar el derecho, pues automáticamente se sabe que el resultado es verdadero. También en este caso revisemos lo contrario. Si una disyunción inclusiva lógica (OR) tiene su término izquierdo falso (.f.), sí es necesario revisar el derecho, porque, de ser falso el derecho, la condición sería falsa.
Similar a como pasa con el AND, en el OR tan pronto determinemos que la condición es verdadera, no importará revisar el resto.
En el caso del XOR, la característica del cortocircuito no funcionará, debido a que XOR es verdadero cuando sus dos argumentos son diferentes. Por lo tanto, siempre deberán evaluarse las dos para determinar si la condición completa es verdadera. Esto no significa que no pueda ser usado como moderador.
Esta característica de muchísimos lenguajes de programación nos habilita a tener control sobre fragmentos de seudocódigo (o de código si estamos programando), cuando quiero que estos se ejecuten o no, dependiendo de alguna condición. puedan llevar a cabo construcciones que permitan ejecutar o no un bloque de código, según sea nuestro interés.
Esto es algo muy poderoso que pasa para muchos desapercibido, y muchos programadores usan estructuras de control especiales para lograr hacerlo. Otros programadores, de otro lado, encuentran algo confuso el mecanismo de cortocircuito, y prefieren hacerlo de la forma tradicional que aún no hemos visto.
Por ejemplo, suponga que la función atacar() se debe llevar a cabo si la variable llamada ángulo_correcto es verdadera. En este caso podemos usar
ángulo_correcto AND atacar()
Expliquemos el poder de esta construcción que puede llegar a utilizar en muchos lenguajes de programación. Cuando la variable ángulo_correcto sea verdadera (.t.), no habrá cortocircuito y por lo tanto la conjunción debe proceder a evaluar la izquierda, por lo que la acción de atacar() solo se da cuando se cumpla la condición de que tenemos un ángulo correcto.
Si quisiéramos usar la disyunción inclusiva para lograr el mismo objetivo, es posible que no sea tan intuitivo, pues tendríamos que escribir
(NOT ángulo_correcto) ∨ atacar()
¿Cuál usar? Se usa la más cómoda dependiendo de la situación. En el ejemplo del ataque a partir de un ángulo correcto, es mejor usar el AND. La segunda alternativa no es clara y es difícil de leer.
Cortocircuitos moderadores de fin de bloque
Algunas veces los cortocircuitos son útiles para terminar una función. Eso se logra si el último fragmento de la expresión booleana es la palabra return o ret.
β > 270 AND return 0
β > 180 AND return 1
...
Si estas fueran tres líneas dentro de una función, la variable β se compararía contra el valor 270, y si la condición es verdadera, se ejecuta la instrucción return 0 debido a la característica de cortocircuito del operador AND. Si la condición es falsa, se pasa a la siguiente línea y la variable β se compararía contra el valor 180.
De la misma manera, y si la condición es verdadera, se ejecuta la instrucción return 1 debido a la característica de cortocircuito del operador AND.
Si ninguna de las dos condiciones se da, el algoritmo sigue adelante.
Nota para programadores curiosos de Python que estén leyendo este párrafo:
expresiones lógicas con AND y OR usan cortocircuito en Python. Sin embargo, las expresiones lógicas cortocircuitadas con estructuras de control (como return), aún no son posibles en el lenguaje de programación Python.
β > 270 AND return 0
β > 180 AND return 1
...
Si estas fueran tres líneas dentro de una función, la variable β se compararía contra el valor 270, y si la condición es verdadera, se ejecuta la instrucción return 0 debido a la característica de cortocircuito del operador AND. Si la condición es falsa, se pasa a la siguiente línea y la variable β se compararía contra el valor 180.
De la misma manera, y si la condición es verdadera, se ejecuta la instrucción return 1 debido a la característica de cortocircuito del operador AND.
Si ninguna de las dos condiciones se da, el algoritmo sigue adelante.
Nota para programadores curiosos de Python que estén leyendo este párrafo:
expresiones lógicas con AND y OR usan cortocircuito en Python. Sin embargo, las expresiones lógicas cortocircuitadas con estructuras de control (como return), aún no son posibles en el lenguaje de programación Python.
EJEMPLO: Cuadrante
Construya una función en speudocódigo que, dado un ángulo entre 0 y 360 grados, determine el número del cuadrante en el plano cartesiano. R/ fx cuadrante in a::Natural out ::Natural begin 0 < a £ 90 && return 1 90 < a £ 180 && return 2 180 < a £ 270 && return 3 return 4 end |
BIFURCACIÓN NO ESTRUCTURADA
Una etiqueta de camino es una señalización especial dentro de nuestro algoritmo; la señal luego podría ser usada para ir a dicho lugar a través de una bifurcación.
Lo anterior quiere decir que se puede romper el flujo normal de un algoritmo, y cambiar su ruta, siendo entonces este mecanismo una forma de controlar el flujo del código de un algoritmo. Por ejemplo, podríamos volver líneas atrás, o ir líneas adelante dentro de una función de nuestros algoritmos, alterando así la ruta de ejecución. para repetir fragmentos de código, y salir de la función solo bajo ciertas condiciones, usando, por ejemplo, cortocircuitos de control.
Una forma de crear un ‘loop’ o ciclo infinito, es hacer una transferencia incondicional desde la última instrucción, a la primera posición del pseudocódigo. Hacer un ciclo infinito permite resolver muchos problemas, como por ejemplo esperar por un dato específico dese una fuente infinita de valores, como es el caso de un sensor. Del ciclo infinito se podrá salir luego con una transferencia condicionada, y así liberarse del ciclo.
La palabra para crear etiquetas en nuestros pseudocódigos será a través de las palabras spot, flag, label, o simplemente el caracter dos puntos ( : ), que en inglés se llama 'colon') y un nombre de etiqueta.
Cuando se desea ir a una etiqueta, simplemente se usa alguna de las palabras especiales de transferencia, goto, leap, o jump, junto con el nombre de la etiqueta a donde se quiere transferir el control del programa.
: | flag | spot | label | : aquí
…
…
jump | leap | goto aquí
Las transferencias han sido fuertemente criticadas por su tendencia a generar código espagueti (enredado y poco legible), y es algo que tiene sentido si solo usáramos etiquetas y transferencias para controlar toda la estructura de nuestro código. Sin embargo, bien manejado, es una estructura útil.
Las funciones y retornos de funciones, los if-then-else, y los ciclos de hoy en día como por ejemplo el while, son bifurcaciones en un formato estructurado que esconde la naturaleza misma de las transferencias, ya que se basan finalmente en bifurcaciones no estructuradas. Siempre que sea posible, y si se cuenta con bifurcaciones no estructuradas y estructuradas, se deben usar las estructuradas para evitar al máximo que el código se vuelva poco legible y difícil de mantener.
Por el momento, basta con tener a la mano esta herramienta de trasferencia incondicional que aclararemos con ejemplos, ya que se abre un infinito de posibilidades: todos los problemas del libro podrían ser resueltos usando los bifurcadores condicionales e incondicionales (no estructurados).
Se llama transferencia incondicional, si la transferencia no depende de alguna expresión booleana, y por lo tanto siempre se da. Es un hecho.
Se llama transferencia condicional, si depende de una expresión booleana y por lo tanto no siempre se da. En el contexto de una expresión booleana, se deberá tener muy claros los cortocircuitos con los operadores AND y OR.
Lo anterior quiere decir que se puede romper el flujo normal de un algoritmo, y cambiar su ruta, siendo entonces este mecanismo una forma de controlar el flujo del código de un algoritmo. Por ejemplo, podríamos volver líneas atrás, o ir líneas adelante dentro de una función de nuestros algoritmos, alterando así la ruta de ejecución. para repetir fragmentos de código, y salir de la función solo bajo ciertas condiciones, usando, por ejemplo, cortocircuitos de control.
Una forma de crear un ‘loop’ o ciclo infinito, es hacer una transferencia incondicional desde la última instrucción, a la primera posición del pseudocódigo. Hacer un ciclo infinito permite resolver muchos problemas, como por ejemplo esperar por un dato específico dese una fuente infinita de valores, como es el caso de un sensor. Del ciclo infinito se podrá salir luego con una transferencia condicionada, y así liberarse del ciclo.
La palabra para crear etiquetas en nuestros pseudocódigos será a través de las palabras spot, flag, label, o simplemente el caracter dos puntos ( : ), que en inglés se llama 'colon') y un nombre de etiqueta.
Cuando se desea ir a una etiqueta, simplemente se usa alguna de las palabras especiales de transferencia, goto, leap, o jump, junto con el nombre de la etiqueta a donde se quiere transferir el control del programa.
: | flag | spot | label | : aquí
…
…
jump | leap | goto aquí
Las transferencias han sido fuertemente criticadas por su tendencia a generar código espagueti (enredado y poco legible), y es algo que tiene sentido si solo usáramos etiquetas y transferencias para controlar toda la estructura de nuestro código. Sin embargo, bien manejado, es una estructura útil.
Las funciones y retornos de funciones, los if-then-else, y los ciclos de hoy en día como por ejemplo el while, son bifurcaciones en un formato estructurado que esconde la naturaleza misma de las transferencias, ya que se basan finalmente en bifurcaciones no estructuradas. Siempre que sea posible, y si se cuenta con bifurcaciones no estructuradas y estructuradas, se deben usar las estructuradas para evitar al máximo que el código se vuelva poco legible y difícil de mantener.
Por el momento, basta con tener a la mano esta herramienta de trasferencia incondicional que aclararemos con ejemplos, ya que se abre un infinito de posibilidades: todos los problemas del libro podrían ser resueltos usando los bifurcadores condicionales e incondicionales (no estructurados).
Se llama transferencia incondicional, si la transferencia no depende de alguna expresión booleana, y por lo tanto siempre se da. Es un hecho.
Se llama transferencia condicional, si depende de una expresión booleana y por lo tanto no siempre se da. En el contexto de una expresión booleana, se deberá tener muy claros los cortocircuitos con los operadores AND y OR.
EJEMPLO: Sumatoria de números del 1 al n
Determine la suma de los números entre el 1 y n dado como parámetro: Si n es 5, la suma a calcular es 1+2+3+4+5 = 15 Si n es 10, la suma a calcular es 1+2+3+4+5+6+7+8+9+10 = 55 R/ fx sumaprimeros in n::Natural (#0) out suma::Natural begin suma <- 0 (#1) x <- 1 (#2) flag chequeo (#3) x > n && jump finciclo (#4) condicional suma <- suma + x (#5) x <- x + 1 (#6) jump chequeo (#7) flag finciclo (#8) incondicional return suma (#9) endfx EXPLICACIÓN. Se recibe en el parámetro n, el tope de los números a sumar (#0). Se establece una variable suma en cero, donde llevaremos la suma que será el valor de retorno (#1). Luego creamos una variable x inicializada en el primer número de la suma, que es 1 según el enunciado (#2). Encontramos la etiqueta de chequeo y seguimos adelante. La etiqueta es solo una dirección por si queremos brincar allá (#3). Luego tenemos un cortocircuito para x > n. Si x es menor o igual a n, la condición AND es falsa y no se pasa a la derecha de la condición. Si la condición x > n es verdadera, se pasará al lado derecho y se ejecuta el jump finciclo (#4). En el caso que x > n sea falso, se sigue adelante. Luego se acumula el valor de x en la variable suma (#5). Se incremento x en 1 para generar al siguiente número (#6). A continuación, encontramos jump chequeo (#7), por lo que la secuencia normal del código se rompe, y vamos a label chequeo (#8), de modo que volvemos a hacer los pasos desde la condición x > n (#4). Debido a que x va incrementando, llegará el momento en que superará a n, y en ese momento la condición no se cumplirá, dando paso al lado izquierdo de la condición que es terminar el ciclo. Cuando se sale del ciclo, se devuelve el resultado de la suma de los n números (#9). Note que se estructuró un bucle (ciclo) condicionado a partir de instrucciones label y jump, populares aún en calculadoras, pero camuflados adecuadamente en patrones estructurados en varios lenguajes de programación actuales. |
Más adelante veremos cómo reemplazar el patrón label/jump con el ciclo while, o loop, que cumplen con el objetivo de hacer código cíclico, de hacerlo más legible y mantenible, y evitar así el código espagueti.
EJEMPLO: Sumatoria de pares entre el 1 y n
Determine la suma de los números pares entre 1 y n; n es dado como parámetro: /R Veamos ejemplos de sumatorias para entender qué se pide: Si n es 5, la suma a calcular es la de los pares 2 + 4 = 6 Si n es 10, la suma a calcular es la de los pares 2 + 4 + 6 + 8 + 10 = 30 Un algoritmo en pseudocódigo sería: fx sumaprimeros in n::Z+ out suma:Z+ begin suma <- 0 x <- 1 flag chequeo x > n && return suma x % 2 ≠ 0 AND jump contar suma <- suma + x flag contar x <- x + 1 jump chequeo endfx EXPLICACIÓN. Usamos una etiqueta antes de contar, y adicionamos una condición de números pares. Cuando la condición x % 2 ≠ 0 es cierta, significa que el número es impar y que no se puede sumar, y debido a que el cortocircuito en este caso permite pasar al lado derecho del AND (&&), se ejecuta el jump contar que nos lleva directamente a la etiqueta contar evitando acumular el número. Luego de contar volvemos con otra transferencia incondicional al chequeo, hasta que x supere a n, y la función retorne el valor de la suma. EJEMPLO: Suma pares e impares
Determine la suma de los números pares y de los impares entre el 1 y n dado como parámetro. La función devolverá las dos sumas. R/ Veamos un ejemplo primero, para entender: Si n es 5, la suma a calcular es 1+3+5=8 y 2+4 =6 Si n es 10, la suma a calcular es 1+3+5+7+9=25 y 2+4+6+8+10 = 30 Un algoritmo en pseudocódigo sería: fx sumaprimeros in n::Z+ valid: n > 0 out (sumapar::Z+, sumaimpar::Z+) begin sumapar <- 0 sumaimpar <- 0 x <- 1 flag chequeo x > n AND return (sumapar, sumaimpar) x % 2 ≠ 0 && jump impar sumapar <- sumapar + x jump contar flag impar sumaimpar <- sumimapar + x flag contar x <- x + 1 jump chequeo endfx |
El etiquetado y las transferencias incondicionales con goto pueden ser fácilmente reemplazados por patrones de control en los lenguajes de programación, orientados a dar claridad y evitar el código espagueti. Estos patrones de control los veremos en lo que sigue del texto.
EJEMPLO: Separación de positivos y negativos
Cree una función en pseudocódigo que use bifurcaciones no estructuradas, en la que se recibe un arreglo de números, y se crean dos nuevos arreglos, uno con los números positivos, y otro con los números negativos. La función devuelve los dos arreglos como una tupla, donde el primer elemento de la tupla es el arreglo de positivos. Por ejemplo, para [1.2, -7.8, 1.0, 1.5, 2.4, -127.2, -8.3], La función devuelve la tupla ([1.2, 1.0, 1.5, 2.4], [-7.8, -127.2, -8.3]) R/ fx separasignos in data::[]Number out neg::[]Number,pos::[]Number begin index <- 1 #para recorrer el arreglo data length <- |data| #determinar longitud del arreglo data flag chequeo index .LE. length ∨ jump fin #controlar final arreglo data[index] < 0 && jump negative #determinar signo aggregate(pos,data[index]) #adicionar positivos jump avanzar flag negativo aggregate(neg,data[index]) #adicionar negativos flag avanzar index <- index + 1 #avanzar el índice jump chequeo flag fin end |
TALLER: BIFURCACIÓN NO ESTRUCTURADA
- Función promedio.
Construya una función algorítmica con bifurcadores no estructurados, que reciba como parámetro un arreglo de números, y devuelva el promedio, que se define como la suma de todos los números, dividido la cantidad de números en el arreglo. - Función mayor.
Construya una función algorítmica con bifurcadores no estructurados, que reciba como parámetro un arreglo de números, y devuelva el mayor. - Contador de caracteres.
Construya una función en pseudocódigo usando bifurcaciones no estructuradas, que reciba como parámetro una string, y cuente, sin importar si son mayúsculas o minúsculas, cuente cuantas veces aparece cada una de las 27 letras del alfabeto español (incluye la ñ). Tip: use el código ASCII de las letras, y tenga en cuenta que las mayúsculas [‘A’, ‘Z’] van desde el 65 al 90, que las minúsculas [‘a’, ‘z’] van desde el 97 al 122, que la ‘Ñ’ es el código 209, y que la ‘ñ’es el código 241. - Suma de dígitos de un número.
Construya una función en pseudocódigo usando bifurcaciones no estructuradas, que reciba como parámetro un número y sume sus dígitos. Por ejemplo
para 483, la función devuelve 15
para 444, la función devuelve 12
para 339, la función devuelve 15 - Cuántos iguales.
Dados 3 números, construya una función algorítmica usando bifurcaciones no estructuradas, que determine cuántos de ellos tienen algún compañero igual. Por ejemplo
Para 4,8,3, la función devuelve 0
Para 4,4,4, la función devuelve 3
Para 3,3,9, la función devuelve 2 - Conjetura de Collatz.
Construya una función algorítmica que, dado un x, determine el tiempo de parada para la conjetura de Collantz, usando bifurcaciones condicionales no estructuradas.
Dicha función trabaja así:
Dado un número entero
-si el número es par, dividirlo por 2.
-si es impar, multiplicarlo por 3 y SUMARLE 1; y el resultado dividirlo por 2.
La conjetura de Collatz establece que, sin importar el número seleccionado x > 1, la función f(x) siempre llegará a 1, y el tiempo recursivo que tome en hacerlo, será el tiempo de parada de x.
(Cai & Ding, 2017) - N-esimo término de Fibonacci.
Elabore una función llamada fibonacci(), que use bifurcaciones no estructuradas para determinar el término enésimo de la secuencia de fibonacci. La semilla de la secuencia es 0,1, que son los dos primeros términos. Los números que siguen se generan sumando los dos números anteriores. Los primeros términos son
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Por ejemplo,
para x = 1, la función devuelve 1(se usa el segundo 1 para comenzar)
para x = 4, la función devuelve 5 (cuarto contando desde segundo 1)
para x = 5, la función devuelve 8
para x = 9, la función devuelve 55 - Suma hasta el n-esimo término de Fibonacci.
Elabore una función llamada fibonaccisuma(), que use bifurcaciones no estructuradas para determinar la suma de los números de la secuencia de Fibonacci, hasta el término enésimo. La semilla de la secuencia es 0,1, que son los dos primeros términos. Los números que siguen se generan sumando los dos números anteriores. Los primeros términos son
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Por ejemplo,
para x = 1, la función devuelve 1(se usa el segundo 1 para comenzar)
para x = 4, la función devuelve (1+1+2+3+5 = 12)
para x = 5, la función devuelve (1+1+2+3+5+8 = 20)
para x = 8, la función devuelve (1+1+2+3+5+8+13+21+34 = 88)
para x = 9, la función devuelve (1+1+2+3+5+8+13+21+34+55 = 143) - Suma de dígitos de términos Fibonacci hasta n-esimo término.
Elabore una función llamada fibonaccisumadigits(), que use bifurcaciones no estructuradas para determinar la suma de los dígitos de todos los números de la secuencia de Fibonacci, hasta el término enésimo. La semilla de la secuencia es 0,1, que son los dos primeros términos. Los números que siguen se generan sumando los dos números anteriores. Los primeros términos son
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Por ejemplo,
para x = 1, la función devuelve 1(se usa el segundo 1 para comenzar)
para x = 4, la función devuelve (1+1+2+3+5 = 12)
para x = 5, la función devuelve (1+1+2+3+5+8 = 20)
para x = 8, la función devuelve (1+1+2+3+5+8+(1+3)+(2+1)+(3+4) = 34)
BIFURCACIÓN ESTRUCTURADA
Al igual que en prácticamente todos los lenguajes, en nuestros seudocódigos papercode contaremos con estructuras de control que permitan bifurcar nuestros algoritmos en uno o varios caminos, de tal forma que la lógica del algoritmo siga alguna de las rutas tan pronto toque la condición de la estructura. Estas estructuras, por lo tanto, requieren obligatoriamente de condicionales.
Su existencia promueve que no se usen las transferencias no estructuradas, como el jump (leap, goto). De hecho, muchos lenguajes de programación las eliminan, mientras que otros dejan todos los tipos de bifurcación disponibles.
Las bifurcaciones condicionales, sean estas estructuradas o no, son una de las piezas más importantes de los algoritmos, pues con ellos podemos lograr una flexibilidad y expresividad asombrosa en nuestras soluciones.
Debido a que las bifurcaciones condicionales estructuradas también aumentan la complejidad de un algoritmo (muchísimo menos que las no estructuradas), debemos estar atentos para que nuestros códigos sean legibles y mantenibles. El abuso en el uso de estructuras muy anidadas también es indicio de que el algoritmo puede ser mejorado. Dicho de otro modo, en la medida en que aumente la complejidad de una función, se deberá pensar en revisar la función para determinar que no haga demasiadas cosas.
Las funciones deben encargarse de una sola actividad. Buscamos que no se viole el principio de responsabilidad única (PRU), que dice que una función debe encargarse de hacer una y solo una tarea.
Su existencia promueve que no se usen las transferencias no estructuradas, como el jump (leap, goto). De hecho, muchos lenguajes de programación las eliminan, mientras que otros dejan todos los tipos de bifurcación disponibles.
Las bifurcaciones condicionales, sean estas estructuradas o no, son una de las piezas más importantes de los algoritmos, pues con ellos podemos lograr una flexibilidad y expresividad asombrosa en nuestras soluciones.
Debido a que las bifurcaciones condicionales estructuradas también aumentan la complejidad de un algoritmo (muchísimo menos que las no estructuradas), debemos estar atentos para que nuestros códigos sean legibles y mantenibles. El abuso en el uso de estructuras muy anidadas también es indicio de que el algoritmo puede ser mejorado. Dicho de otro modo, en la medida en que aumente la complejidad de una función, se deberá pensar en revisar la función para determinar que no haga demasiadas cosas.
Las funciones deben encargarse de una sola actividad. Buscamos que no se viole el principio de responsabilidad única (PRU), que dice que una función debe encargarse de hacer una y solo una tarea.
Bifurcador if-then
La estructura if permite que tenga bloques de código que solo se ejecutan si la condición es verdadera. Esto es, el código está condicionado a que una expresión condicional decida si se ejecuta o no.
Normalmente, en los lenguajes de programación, un bifurcador comienza sintácticamente usando la palabra if, que identifica que sigue una condición lógica que debe ser evaluada. Cuando termina la condición, comienza el bloque de código condicionado.
El codigo condicionado termina cuando se encuentra el cierre el if, con la palabra end o endif. La forma en que se estructura if es la siguiente:
if cond [then][do]
[bloque]
end[if]
que en pseudocódigo, también se podrá escribir en una sola línea como:
if cond [then][do] [bloque] end[if]
La expresión condicional es cualquier tipo de expresión que finalmente devuelva un valor booleano .t. o .f., o un valor que al ser convertido a booleano exprese uno de esos dos valores.
Las palabras then y do son opcionales en pseudocódigo, y solo pretenden dar claridad a la lectura.
Cuando la expresión condicional es verdadera (.t.), el conjunto de instrucciones que se encuentra condicionado se ejecuta hasta encontrar el fin del bloque if.
Cuando la expresión condicional es falsa (.f.), el bloque no se ejecuta, y simplemente se salta desde la valoración directamente al end del if.
Normalmente, en los lenguajes de programación, un bifurcador comienza sintácticamente usando la palabra if, que identifica que sigue una condición lógica que debe ser evaluada. Cuando termina la condición, comienza el bloque de código condicionado.
El codigo condicionado termina cuando se encuentra el cierre el if, con la palabra end o endif. La forma en que se estructura if es la siguiente:
if cond [then][do]
[bloque]
end[if]
que en pseudocódigo, también se podrá escribir en una sola línea como:
if cond [then][do] [bloque] end[if]
La expresión condicional es cualquier tipo de expresión que finalmente devuelva un valor booleano .t. o .f., o un valor que al ser convertido a booleano exprese uno de esos dos valores.
Las palabras then y do son opcionales en pseudocódigo, y solo pretenden dar claridad a la lectura.
Cuando la expresión condicional es verdadera (.t.), el conjunto de instrucciones que se encuentra condicionado se ejecuta hasta encontrar el fin del bloque if.
Cuando la expresión condicional es falsa (.f.), el bloque no se ejecuta, y simplemente se salta desde la valoración directamente al end del if.
Bifurcador if-then-else
La estructura if permite ser acompañado de una sentencia else con un bloque de código. En ese caso, se agrega una nueva bifurcación para cuando la condición es falsa (.f.).
En general, la forma en que en los lenguajes de programación se da esta estructura, se puede expresar en algoritmos con la siguiente estrategia:
if cond [then][do]
[bloque A]
else [do]
[bloque B]
end
que, en pseudocódigo, también se podrá escribir en una sola línea como:
if cond [then][do][bloque A] else[do][bloque B] end[if]
La condición es cualquier tipo de expresión que finalmente devuelva un valor booleano .t. o .f., o un valor que al ser convertido a booleano exprese uno de esos dos valores.
Las palabra else identifica el comenzó del bloque alternativo, que se llevará a cabo si la condición es falsa (.f.).
En general, la forma en que en los lenguajes de programación se da esta estructura, se puede expresar en algoritmos con la siguiente estrategia:
if cond [then][do]
[bloque A]
else [do]
[bloque B]
end
que, en pseudocódigo, también se podrá escribir en una sola línea como:
if cond [then][do][bloque A] else[do][bloque B] end[if]
La condición es cualquier tipo de expresión que finalmente devuelva un valor booleano .t. o .f., o un valor que al ser convertido a booleano exprese uno de esos dos valores.
Las palabra else identifica el comenzó del bloque alternativo, que se llevará a cabo si la condición es falsa (.f.).
EJEMPLO: Función Techo.
La función techo de un número real, es un concepto matemático que calcula el número entero mayor o igual a un número real dado. Por ejemplo, techo(-1.8) = -1.0 techo(1.8) = 2.0 techo(-0.5) = 0.0 techo(0.5) = 1.0 Escriba una función techo. R/ function techo in x::R out t::R begin if x < 0 then do #1 t <- ::Z(x) #2 else do #3 t <- ::Z(x)+1 #4 endif #5 return t #6 end EXLICACIÓN. En este ejemplo, debemos devolver el entero mayor o igual al número x (el techo). Note que en el caso de que la condición del if x < 0 (#1) sea verdadera, el mayor entero del número negativo se consigue con solo extraer la parte entera (#2)(ver ejemplos). Pero si es falso que x < 0, se pasa al else (#3), lo que hace que se ejecute el bloque (#4), y el valor techo t es realmente la parte entera mas 1 (#4). Cuando se alcanza el end del if, se pasa a la siguiente instrucción para devolver el valor techo t, que es el resultado e la función. EJEMPLO: Año bisiesto.
Un año bisiesto se define como aquel que es divisible por 4, pero no lo es por 100, excepto si es divisible por 400. Los años 1900, 1400, 1500, 1700 no son bisiestos. Los años 1200, 1600, 2000 son bisiestos. Construya un seudocódigo para determinar si un año, dado como parámetro, es bisiesto. R/ function esbisiesto in x::N+ out bis::Bool begin bis <- .f. if x % 400 = 0 bis <- .t. else if (x % 4 = 0) ∧ (x % 100) ≠ 0 bis <- .t. endif endif return bis endfx EXPLICACIÓN. se establece la variable bis como falsa, y se busca las excepciones que definen el año x como bisiesto. La primera condición indaga si el año es divisible por 400, y en ese caso bis en verdadero. Si no es divisible por 400, se indaga si el año es divisible por 4, pero no lo es por 100. En caso afirmativo, es otra situación de bisiesto, y se establece bis a verdadero. Todas las demás rutas no son bisiesto. Al final, se devuelve la variable bis como el resultado de la función. Note que el tipo de la variable bis, concuerda con el tipo de la función esbisiesto, que también es ::Bool. EJEMPLO: Mayor de tres números sin usar operadores lógicos.
Elabore una función que determine el mayor valor de tres números dados. Para la solución, no use ninguno de los operadores lógicos OR o AND. R/ function mayor in a::R, b::R, c::R out mayor::R begin if a > b if a > c mayor <- a else mayor <- c endif else if b > c mayor <- b else mayor <- c endif endif return mayor end EXPLICACIÓN. Como se restringe el uso de operadores lógicos, debemos usar varias estructuras if anidadas. Las condiciones serán relaciones entre tres posibles valores a,b y c. Por ejemplo, si a > b, tendremos que hacer una nueva pregunta para establecer si a también es mayor que c, a través de un if anidado, y hacer la transitividad para establecer que a es el mayor. Pero el mayor entre a y b podría ser b, por lo que se entraría por el else del if más externo a un nuevo if anidado para determinar si b también es mayor que c, y, de ser así, b sería el mayor. Adicionalmente, las demás situaciones también tendrían que ser consideradas, como es el caso de las bifurcaciones else de los if anidados más internos. EJEMPLO: Mayor de tres números usando operadores lógicos.
Elabore una función que determine el mayor valor de tres números dados. Para la solución, use operadores lógicos. R/ fx mayor in a::R+, b::R+, c::R+ out valor::R+ begin if a ≥ b && a ≥ c valor <- a else if b ≥ c ∧ b ≥ a valor <- b else valor <- c endif endif return valor endfx Al contrario del ejemplo anterior en el que se restringe el uso de operadores lógicos, en este ejemplo el uso de operadores lógicos ayuda a simplificar la solución. Note que el primer if intenta establecer una posible relación de transitividad, que, de ser cierta, pone el valor a como el mayor valor. Si la condición no es cierta, el else nos deja en un nuevo if anidado que intenta establecer otra posible relación de transitividad que, de ser cierta, pone a b como el mayor número. De no darse esta segunda relación, es claro que ni a ni b son el mayor, por lo que lo será c. EJEMPLO: Cuadrante de disparo.
Un arma de disparo depende del número del cuadrante en el que aparezca el objetivo. Los valores de entrada son solamente los valores del punto (x,y). Escriba una función en pseudocódigo papercode que devuelva si el cuadrante es el 1, el 2, el 3, o el 4. R/ function cuadranteDisparo in x::R+ , y::R+ out c::N begin if x > 0 && y > 0 c <- 1 else if x < 0 && y > 0 c <- 2 else if x < 0 && y < 0 c <- 3 else c <- 4 end end end return c end EXPLICACIÓN. Para determinar el número del cuadrante, solo se debe conocer el signo de los valores x y y. Cada que un chequeo es falso porque no se da la condición, se busca una nueva combinación de signos para x y para y. Note que en el if más interno x < 0 && y < 0, de ser falso, no queda sino una única posibilidad, y es que x > 0 cuando y < 0, por lo que el punto estará obligatoriamente en el cuadrante 4. EJEMPLO: Tipo espectral de una estrella.
Dada la temperatura superficial de una estrella en grados Kelvin, determine el tipo espectral, con base en la siguiente distribución: tipo O: > 33.000 tipo B: 10.000 - 33.000 tipo A: 7.500 - 10.000 tipo F: 6.000 - 7.500 tipo G: 5.200 - 6.000 tipo K: 3.700 – 5.200 tipo M: < 3.700 R/ function tipoespectralestelar in t::Z+ out tipo::String begin if t < 3700 tipo <- 'M' else if t ≥ 3_700 && t < 5_200 tipo <- 'K' else if t ≥ 5_200 && t < 6_000 tipo <- 'G' else if t ≥ 6_000 && t < 7_500 tipo <- 'F' else if t ≥ 7_500 && t < 10_000 tipo <- 'A' else if t ≥ 10_000 && t < 33000 tipo <- 'B' else tipo <- 'O' end end end end end end return tipo endfx EXPLICACIÓN. Suponiendo que la temperatura de la estrella fuera, por ejemplo, 32000, el algoritmo empieza a hacer las valoraciones de los condicionales, y en aquellos if que no se cumpla la condición, pasará a su respectivo else, lo que lo lleva a un nuevo bloque de código, y bajará en cascada por los else hasta llegar al último if, en el que la condición t ≥ 10_000 && t < 33000 se da cierta. por consiguiente, se carga la variable tipo con el caracter 'B', y de allí se devolverá a través de los end de todos los if, hasta que finalmente la función devuelve el tipo. Note que si no se da ninguna condición, el else más interno se encarga de cubrir la condición faltante. |
Bifurcador if-then-elseif-...-else (suiche)
La estructura elseif es una estructuta de control que pretende simplificar la construcción de if anidados. Esta estructura cubre aquellos casos en los que se requieran múltiples if selectores, en los que lo importante es la bifurcación condicional then.
Por cada elseif que se adicione, se adiciona un nuevo bloque de bifurcación.
Esto permite de algún modo crear estructuras que reemplazan la de varios lenguajes conocida como ‘switch’.
La forma en que en pseudocódigo se estructura un elseif dentro de un if es la siguiente:
if condicional-1 [then][do]
[bloque-1]
elseif condicional-2 [then][do]
[bloque-2]
elseif condicional-3 [then][do]
[bloque-3]
...
elseif condicional-n [then][do]
[bloque-n]
[else][do]
[bloque-else]
end
Por cada elseif que se adicione, se adiciona un nuevo bloque de bifurcación.
Esto permite de algún modo crear estructuras que reemplazan la de varios lenguajes conocida como ‘switch’.
La forma en que en pseudocódigo se estructura un elseif dentro de un if es la siguiente:
if condicional-1 [then][do]
[bloque-1]
elseif condicional-2 [then][do]
[bloque-2]
elseif condicional-3 [then][do]
[bloque-3]
...
elseif condicional-n [then][do]
[bloque-n]
[else][do]
[bloque-else]
end
EJEMPLO: Lengua Anindilyakwa.
La lengua indígena australiana Anindilyakwa no tiene números. En su lugar usa palabras para expresar cantidades. Elabore una función que reciba una palabra Anindilyakwa de conteo, y devuelva el rango de enemigos esperado. 1 a 4 significa "pocos" 5 a 9 significa "varios" 10 a 19 significa "montón" 20 a 49 significa "muchos" 50 a 99 significa "horda" 100 a 249 significa "gallada" 250 a 499 significa "racimo" 500 a 999 significa "sorpresa" 1000 en adelante significa "legión" R/ fx equivalenci_anumero_anindilyakwa in palabra::String out rango::Tuple(Z,Z) begin if palabra .equal. "pocos" rango <- (1,4) elseif palabra .equal. "varios" rango <- (5,9) elseif palabra .equal. "montón" rango <- (10,19) elseif palabra .equal. "muchos" rango <- (20,49) elseif palabra .equal. "horda" rango <- (50,99) elseif palabra .equal. "gallada" rango <- (100,249) elseif palabra .equal. "racimo" rango <- (250,499) elseif palabra .equal. "sorpresa" rango <- (500,9999) elseif palabra .equal. "legión" rango <- (1000, .+infinito.) end return rango endfx EXPLICACIÓN. Esta técnica tiene la ventaja de simplificar el anidamiento de if. Sin embargo, tiene a desventaja de no contar sino con un solo else, que es la situación de excepción. Por lo tanto, esta estructura if es un patrón de selección. EJEMPLO: Cuadrante disparo
Este problema ya fue resuelto con un tipo de bifurcador de dos salidas, donde los if se anidaban. Resuelva el problema usando un bifurcador elseif de múltiple condicional. Un arma de disparo depende del número del cuadrante en el que aparezca el objetivo. Los valores de entrada son solamente los valores del punto (X,Y). Escriba una función en pseudocódigo papercode que devuelva si el cuadrante es el 1, el 2, el 3, o el 4. Para los if anidados, use estructuras elseif. R/ fx cuadranteDisparo in X::R+ , Y::R+ out cuadrante::N begin if X > 0 && Y > 0 cuadrante <- 1 elseif X < 0 AND Y > 0 cuadrante <- 2 elseif X < 0 AND Y < 0 cuadrante <- 3 else cuadrante <- 4 end return cuadrante endfx EJEMPLO: El dinero que me da el abuelo.
Todos los días mi abuelo me da algunos pesos y unas monedas de más para ir al colegio, y las uso para comprar algo de comer. El lunes me da P pesos, y todos los días hasta el viernes me regala un 10% del total del día anterior. Yo ahorro del total semanal un 20% del total percibido, si P el lunes está entre 15 y 20 pesos, y ahorro solo el 15% del total percibido, si P el lunes es menos de 15 pesos. A veces me el abuelo el lunes me regala P mayor a 20 pesos y en ese caso ahorro semanal el 30% del total percibido. Elabore una función que, dado P al comienzo de la semana, determine el total del ahorro de esa semana. R/ Análisis: Durante la semana, el abuelo me da Día lunes : P Día martes : 1.1 * P Día miércoles : 1.1 * 1.1 * P Día jueves : 1.1 * 1.1 * 1.1 * P Día viernes : 1.1 * 1.1 * 1.1 * 1.1 * P El viernes tengo P * 1.1 ^ 4 El total recibido corresponderá entonces a lo que acumulé hasta el viernes, según el análisis visto. Lo que sigue, es establecer el total ahorrado, que se saca conociendo P. function platica in P::R out totalahorrado::R begin if P > 20 ahorro = 0.3 elseif 15 ≤ P ≤ 20 ahorro = 0.2 else ahorro = 0.15 end acumuladoviernes <- P * 1.1 ^ 4 totalahorrado <- acumuladoviernes * ahorro return totalahorrado end |
TALLER: BIFURCACIÓN ESTRUCTURADA
- Función signum.
Construya una función algorítmica que represente la función signum, la cual, dado un valor numérico, devuelva 1 si el valor es positivo, -1 si el valor es negativo, o 0 (cero) si el valor es cero. - Función Heaviside.
Construya una función algorítmica que represente la función Heaviside, la cual, dado un valor numérico, devuelve 1 si el valor dado es mayor o igual a cero, y devuelve cero si x es menor que cero. - Paridad.
Dado un número n, determine si se trata de un número par, o de un número impar. Si es un número par, la función devuelve 2; pero si es impar, la función devuelve 1. En caso que el número sea cero(0), la función devuelve 0. - Número triangular. Un número triangular es aquel con el que se puede formar un triángulo equilátero (https://en.wikipedia.org/wiki/Triangular_number).
- Para calcular el enésimo número triangular, se puede usar la fórmula que se muestra en el enlace, por lo que sólo basta con multiplicar n(n+1) y dividir por 2. Construya un algoritmo que le permita determinar si un número entero positivo dado es o no es triangular. La función devuelve un valor .t. o .f..
- Siglo del año.
Dado un año, construya una función en pseudocódigo que devuelva el siglo. El primer siglo va desde el año 1 al año 100, el Segundo va desde el año 101 al 200, etc. Por ejemplo
Para el año 1905, el siglo es 20
Para el año 1700, el siglo es 17
("CodeSignal", 2020) - Discriminante cuadrática.
La solución a la ecuación cuadrática ax2 + bx + c = 0, donde a ≠ 0, está data por el radical que se presenta en el enlace. El discriminante ∆, es el término del radical. Se sabe que si a,b, y c son reales, se cumple que
(1) si ∆ < 0, entonces las dos raíces son números complejos conjugados.
(2) si ∆ > 0, entonces las dos raíces son números reales diferentes.
(3) si ∆ = 0, entonces las dos raíces son números reales iguales.
Construya una función algorítmica que reciba a,b y c, y entregue como salida 1,2, o 3, según sea el caso (Zwillinger, 2018, p73) - Intercambio de centro.
Construya una función en pseudocódigo que, dado un arreglo unidimensional, intercambie los elementos al centro si su longitud es par. Por ejemplo,
para [1,2,3,4,5,6,7], el resultado es [1,2,3,4,5,6,7]
para [1,2,3,4,5,6,7,8], el resultado es [1,2,3,5,4,6,7,8]
para [100,2,221,1204,51,8734], el resultado es [100,2,1204, 221,51,8734] - Hex2. Construya una función en pseudocódigo que, dado un valor decimal de exactamente dos cifras, devuelva su equivalente hexadecimal expresado como una string.
- Duo ordenado.
Dados 2 números a, b, construya una función que los devuelva ordenados, primero el menor, y luego el mayor.
Tripleta ordenada ascendente.
Dados 3 números, construya una función que devuelva los 3 números ordenados ascendentemente. - Numeración de pisos en edificios.
Muchos edificios enumeran los pisos de forma diferente: el primer piso es el 1 y no el 0, y algunas veces no hay piso 13 por superstición. Los pisos por debajo de cero (los pisos negativos), siempre son negativos sin modificaciones en todos los edificios.
Escriba una función en pseudocódigo que para un edificio donde el primer piso es el 1 y no hay piso 13, determine la respectiva numeración para un edificio cuyo piso base será 0, y sí tiene piso 13. - Por ejemplo:
para 1, la función devuelve 0
para 0, la función devuelve 0
para 5, la función devuelve 4
para 15, la función devuelve 13
para -3, la función devuelve -3
(Codewars - https://www.codewars.com/kata/574b3b1599d8f897470018f6) - Cuántos iguales.
Dados 3 números, construya una función algorítmica que determine cuántos son iguales. Por ejemplo
Para 4,8,3, la función devuelve 0
Para 4,4,4, la función devuelve 3
Para 3,3,9, la función devuelve 2
Distancia mínima durante pandemia.
Durante una reciente pandemia, se consideró que la distancia mínima entre 2 personas es de 2 metros. Dadas 3 distancias entre 4 personas, determinar si hay alguna que no cumpla la condición. - Torsión.
Dados dos números enteros τ y ε, construya una función algorítmica que determine τ - ε en el caso que χ divida exactamente a τ. En caso contrario, determine τ - 2γ si τ divide a ε exactamente.
Si se dan las dos condiciones anteriores, de forma simultánea, determine
3τ - γ^2.
Y si no se da ninguna de las anteriores determine τ + γ. - Zombie hambriento.
Un zombie se encuentra cerca a tres humanos dormidos de cerebro aparentemente nutritivo, pero decide comer el más cercano. Se cuenta con las posiciones coordenadas (x,y) en metros tanto del zombie Z, como de cada uno de los tres humanos H1, H2, H3. Construya un seudocódigo que determine el tiempo que le tomará llegar al humano que comerá. Se sabe que el zombie se mueve a una velocidad de v metros por segundo. Use un tipo de dato compuesto para los puntos coordenados. - Romano a decimal.
Elabore una función que reciba como parámetro una string que representa un número romano de entre los primeros 5 números romanos, y devuelva el correspondiente valor decimal. Por ejemplo, si el número es 3, devuelve la cadena “IV”. - Zombies al ataque.
Un zombie sin orejas y hambriento desea comer cerebro humano, y quiere atacar tres personas que se encuentra frente a él. Las 3 personas se encuentran a una distancia de p1, p2, p3 metros. Una linda zombie sin quijada y sin nariz, que se encuentra cerca, avistó el mismo grupo, y las 3 personas se encuentran a distancias q1, q2, q3 metros. Elabore un algoritmo que determine que persona, la uno, la dos o la tres, corre más peligro de ser descerebrado y comido. La persona que se encuentra en mayor peligro es aquella que se encuentra simultáneamente más cerca a los dos zombies, esto es, la suma de las distancias a los dos zombies es la menor. Se garantiza que solo hay una con el más alto riesgo. - Tipo de longitud de onda.
Elabore una función algorítmica que, dada una longitud de onda del espectro visible en nanómetros, determinar el color de luz que emite. La función devuelve el nombre del color dependiendo del rango:
violet 400–450 nm, blue 450–500 nm, green 500–570 nm, yellow 570–590 nm, orange 590–610 nm, red 610–700 nm (Duca, 2015)
Por debajo del violeta el algoritmo emite 'high', y por encima de todas ellas emite 'low'. - Rango de edades.
Una piñata para familias ociosas entrega a la entrada una insignia con el rango de la edad de cada persona. Construya una función que, dada la edad de una persona, determine la categoría del visitante a la piñata, así: categoría #1 hasta 7 años, categoría #2 más de 7 pero menos de 15, categoría #3 más de 15 pero menos de 28, categoría #4 más de 28 pero menos de 40, categoría #5 más de 40 pero menos de 65, categoría #6 más de 65 pero menos de 83, #7 más de 83. La función devuelve solo el número de la categoría. - Masa corporal.
Dada la masa en kilogramos y la estatura en metros de una persona, indicar si tiene sobrepeso, que se da cuando el índice de masa corporal IMC es igual o mayor a 25. El índice de masa corporal se relaciona con la masa y la estatura por la ecuación IMC = masa / estatura2 - Techo.
Función que, dado un número, devuelve el menor entero mayor o igual a dicho número. Ejemplo. el menor entero mayor que 5.7 es 6. El menor entero mayor que -5.7 es -5. El menor entero mayor que 18.1 es 19. El menor entero mayor que -167.89 es -167. - Piso.
Función que, dado un número, devuelve el mayor entero menor o igual a dicho número. Ejemplo. el mayor entero menor que 5.7 es 5. El mayor entero menor que -5.7 es -6. El mayor entero menor que 18.1 es 18. El mayor entero menor que -167.89 es -168. - Cociente.
El cociente de una división se define como el piso de la división de dos números enteros. Por ejemplo, el cociente de 11 dividido 2 es el piso de 5.5, o sea 5. elabore una función Cociente. - Residuo.
El residuo de dividir x sobre y se puede definir como x menos y multiplicado por el cociente de x dividido y. Por ejemplo, el residuo de 11 dividido 2 es igual a 11 - (2 * 5). elabore una función residuo. - Cuál cuadrante.
Función que reciba un punto como (x,y), y determine en qué cuadrante del plano cartesiano se encuentra. - Redondeo.
función que redondee un número real a su entero mayor más próximo (por encima) si su parte fracción es mayor o igual a 0.5, o redondee el número a su entero menor más próximo si su parte fracción es menor a 0.5. - Cercano a la media.
Función que determine la media aritmética de 3 números, y diga cuál es el número más cercano a dicha media. - El del medio.
Determine de entre 3 números dados, el número que numéricamente no es un extremo. Esto es, el número que numéricamente se encuentra entre los otros dos. Por ejemplo, si los datos son 4.7, 9.2, y 7.5, la respuesta es 7.5. - Cicloalcanos.
Dato el número de carbonos de un alcano cíclico entre 3 y 8, determine el nombre de la cadena molecular entre “But”, “Pent”, “Hex”, “Hept”, “Oct”. Adicione al final el sufijo “ano” y el prefijo “ciclo”, y devuelva el nombre. - La hora militar.
Dada una hora en formato militar, devolver si se trata de una hora 'pm' o 'am'. Ejemplo: 1980, devuelve 'pm'. 830 devuelve 'am'. - Intesidad en Decibeles.
Daño al oído humano por ruido se comienza a dar a partir de los 80 dBA (Decibeles). Se sabe que algunos ruidos tienen ciertos rangos, como las hojas moviéndose en el piso o el sonido de una habitación tranquila, cuyo nivel de ruido está entre los 10 a 20 dBA. Una conversación normal en una habitación, o el ruido que se genera en la calle generan unos 60 a 70 dBA. La música a buen volumen genera 80 dBA. Un tren pasando puede subir hasta 100 dbA, y una turbina de jet a 4 metros genera 130 dbA. Elabore una función que determine si hay potencial daño o no, dado un valor en decibeles. - Rendimiento Trimestral Aeróbico.
Un atleta tiene 4 medidas de pulsaciones por minuto que son promedios trimestrales del año. Esto es, tiene 4 valores de pulsaciones. Se considera que el rendimiento anual está en 'crecimiento', si todos de los cambios entre semestres consecutivos son positivos y no exceden el 5%. Se considera un rendimiento en 'decremento' si todos los cambios son negativos y no exceden un 5%. Se considera un rendimiento 'estable', si el primer y tercer cambio fueron positivos, y el segundo fue negativo, y los cambios no exceden el 5%. Cualquier otra situación se considera 'inestable'. Determinar el tipo de rendimiento. - Validar fecha.
Dado un año, mes y día, determine si se trata de una fecha válida: año positivo, mes entre 1 y 12, y día que sea compatible con el mes. - Tipo de triángulo.
Dados 3 lados de un triángulo, determinar qué tipo de triángulo es entre 'equilátero' (3 lados iguales), 'isósceles' (dos lados iguales), y 'escaleno' (todos los lados diferentes). - Par o impar.
Determinar si un número es par, o impar. - Comparando áreas.
Dados dos lados de cuadrados distintos, lado1 y lado2, determinar cuál cuadrado tiene el área más parecida (más cercana) a un circulo cuyo diámetro es el promedio de los dos lados entregados. La función entrega 1 o 2, dependiendo si fue el lado 1 o el lado 2. - Incremento salarial 2.
Se requiere una función que, dados tres salarios históricos, determine si el cambio salarial viene en incremento o en decremento. Por ejemplo, si los salarios históricos fueron 600, 700, y 800, el incremento salarial viene en decremento, ya que el porcentaje de aumento de 600 a 700 fue del 16.67%, mientras que de 700 a 800 fue del 14.29%. - La hora final #1.
Función que reciba una hora y minutos de tiempo inicial, y adicionalmente reciba otro dato de minutos, y sume dichos minutos al tiempo inicial. La función debe devolver dos datos: la hora y los minutos resultantes o tiempo final. Tenga en cuenta el posible cambio de día. - La hora final #2.
Función que reciba una hora y minutos de tiempo inicial, y adicionalmente reciba otros dos datos horas y minutos, y sume dicho tiempo al tiempo inicial. La función debe devolver dos datos: la hora y los minutos resultantes o tiempo final. Tenga en cuenta el posible cambio de día. - Reloj.
Función que reciba una hora y minutos de tiempo inicial, y una hora y minutos de tiempo final. La función debe devolver dos datos: la hora y los minutos que transcurrieron. Tenga en cuenta que el segundo par de datos entregado puede ser menor al primero, lo que significará que hubo cambio de día. Tenga en cuenta el posible cambio de día. - La campanada que no suena.
Dado un número de hora, y un número de minutos de un reloj antiguo de iglesia, determine si debe sonar la campanada de los 12 minutos (0, 12, 24, 36, 48 minutos). El reloj de la iglesia tiene unos piñones de campanada malos, en las horas divisibles por 3 en los minutos divisibles por 6, y en las horas divisibles por 4, en los minutos divisibles por 24. El algoritmo entonces recibe la hora y minuto, y devuelve verdadero si las campanas se escucharán, y falso si no se escucharán.
Ej: si el reloj dice 12:48, el algoritmo debe devolver falso
Ej: si el reloj dice 9:24, el algoritmo debe devolver falso
Ej: si el reloj dice 10:00, el algoritmo debe devolver verdadero
Ej: si el reloj dice 8:24, el algoritmo debe devolver falso
Ej: si el reloj dice 3:30, el algoritmo debe devolver falso - Cuadrante angular.
Dado un ángulo entre 0 y 360 grados, determine el número del cuadrante al que pertenece. Si el ángulo está entre 0 y 90, pertenece al cuadrante 1, más de 90 grados y hasta 180 cuadrante 2, y así sucesivamente. - Precio de venta según costo.
Dado el precio de costo de un artículo, determine el precio de venta si se quiere que la ganancia sobre el precio de costo sea del 20% cuando el precio de costo es menor a 10.000 pesos, 15% si el precio de costo está entre 10000 y 20000, y 10% si el precio de costo es mayor a 20000. - El ciego y las peras.
Un agricultor ciego que siembra pera ha desarrollado un gran sentido del tacto, e identifica el tipo de pera por su peso.
Si una pera pesa entre 50 y 70 gramos, es glabra.
Si la pera pesa entre 71 y 90 gramos, es oxyprion.
Si la pera pesa entre 80 y 100 gramos es comunnis.
Identificar las glabra es directo, pero tiene problemas identificando las oxyprion y las comunnis, porque si una pera pesa entre 80 y 90 gramos, existe la posibilidad que sea oxyprion o comunnis según se ve de las características de Peso.
Para finalmente identificarlas, el agricultor ciego revisa el mes de recolección. Si es diciembre, es oxyprion, y si es enero es comunnis.
Elabore un algoritmo que reciba el peso y el número del mes de recolección, e identifique el tipo de pera. - Tipo espectral de una estrella.
Dada una temperatura superficial de una estrella en grados Kelvin, determine el tipo espectral, con base en la siguiente distribución:
tipo O: > 33.000
tipo B: 10.000 - 33.000
tipo A: 7.000 - 10.000
tipo F: 6.000 - 7.500
tipo G: 5.200 - 6.000
tipo K: 3.700 – 5.200
tipo M: < 3.700 - Mini Calculadora.
Dados dos operandos, y un operador entre mas ( + ), menos ( - ), multiplicación ( * ) , y división ( / ), determinar el resultado de operar los operandos con dicho operador. - Conversión de grados.
Las letras 'K', 'C', 'F', que representan grados Kelvin, Celcus y Fahrenheit respectivamente. Elabore un algoritmo que reciba como parámetro dos variables que contienen dos de esas letras, y un número. La primera letra representa los grados actuales, y la segunda los grados a convertir. El algoritmo deberá convertir el número de grados dado. Por ejemplo, 30, 'K', 'C', significa que el algoritmo deberá convertir 30 grados Kelvin a Celcius. - Valor a pagar asalariado.
Calcule el valor a pagar a un empleado a partir del valor hora, la cantidad de horas, el tipo de hora y el día, si se sabe que los sábados hay un incremento diurno del 2%, y nocturno del 10%, y el domingo el incremento diurno es del 4% y nocturno del 15%. - Midiendo el frenado.
Cuando un carro frena abruptamente, dependiendo de la velocidad y las condiciones de la vía dejará una marca negra en el piso por el desgaste de las llantas. El tamaño de esta marca es medido por la policía en algunos países para determinar de manera burda, la velocidad a la que iba el conductor. La idea parte de conocer el coeficiente de fricción de la vía a partir de verificar si se trata de un piso mojado o seco, y si el material es alquitrán, concreto o grava. Los valores para un piso seco son 1.0, 0.8 y 0.2 respectivamente. Los valores para un piso mojado disminuyen el coeficiente a la mitad, esto es, 0.5, 0.4, y 0.1 respectivamente. La policía usa la Raiz Cuadrada de 30 * Coeficiente de fricción * la distancia en pies, para determinar la velocidad en millas por hora a la que se movía el conductor. Elabore una función que presente la velocidad en millas por hora y en kilómetros por hora, si se conoce si la vía estaba húmeda o seca, y se conoce el material de la vía. La distancia de la marca se mide siempre en pies. - Edad y síndrome de Down.
El riesgo de niños con síndrome de Down relacionado con la edad de la madre al nacimiento del niño puede correlacionarse. Se sabe que, para madres menores de 30 años, el riesgo de es 1 por cada 1500 nacimientos. Para madres entre los 30 y los 34 años, el riesgo de es 1 por cada 1000 nacimientos. Para madres entre los 35 y los 39 años, el riesgo de es 1 por cada 300 nacimientos. Para madres entre los 40 y los 44 años, el riesgo de es 1 por cada 100 nacimientos. Para madres mayores de 44 el riesgo de es 1 por cada 40 nacimientos. Se requiere un algoritmo que reciba el año de nacimiento de una madre, y el año en que ingresó al hospital, y se determine la probabilidad de que su hijo nazca síndrome de Down. - Día sin iva.
Un grupo terrorista desea aprovechar los días sin iva para comprar armamento durante los días de cuarentena por ataques del virus SARS-Cov-2. Construya una función que reciba una tupla f, con el mes inicial y el mes final de cuarentena, un dato d que es el día sin iva dentro de cualquier mes de promociones, y otra tupla m con el mes y el día en el que el campamento terrorista estará cerca a la ciudad. El grupo terrorista solo puede hacer compras si se encuentra cerca a la ciudad 3 días antes del día sin iva. Construya una función que determine si el grupo terrorista podrá hacer compras sin iva. - Traductor de Juego.
Se desea que un videojuego sea traducido a a lengua indígena australiana Anindilyakwa que no tiene números, y que en su lugar usan palabras para expresar el número de monstruos que están atacando. Elabore una función que reciba un número de monstruos y devuelva la palabra adecuada. 1 a 4 significa "pocos", 5 a 9 significa "varios" ,10 a 19 significa "montón" ,20 a 49 significa "muchos" ,50 a 99 significa "horda" ,100 a 249 significa "gallada" ,250 a 499 significa "racimo" ,500 a 999 significa "sorpresa" ,1000 en adelante significa "legión" - Valor por pagar llamada telefónica.
Construya una función algorítmica que, dado el tipo de marcación (7 o 9), y tipo de llamada (0=nacional, 1=internacional), y el número de minutos (exactos) de una llamada telefónica, determine el valor a pagar por una llamada telefónica.
El valor a pagar por una llamada telefónica se cobra usando los siguientes criterios:
-internac prefijo 7, 1 a 5 min, valor min $350 pesos
-internac prefijo 7, más de 5 min, valor min $300 pesos
-internac prefijo 9, de 1 a 5 min, valor min $330 pesos
-internac con prefijo 9, más de 5 min, valor min $280
-nacional con marcación 7, de 1 a 5 min, valor minuto $250
-nacional con marcación 7, más de 5 min, valor minuto $200
-nacional con marcación 9, de 1 a 5 min, valor minuto $230
-nacional con marcación 9, más de 5 min, valor minuto $180
-local de 1 a 5 min, valor minuto $100
-local más de 5 min, valor minuto $50
(Zapata Puerta, 2012) - Tarifas de servicios públicos.
Construya una función algorítmica que determine el costo total de los servicios públicos dados el consumo de agua en metros cúbicos, el consumo de energía en Kilovatios, el consumo gas en metros cúbicos, y el estrato de la vivienda. Se cuenta con la siguiente información tarifaria:
-Consumo agua tarifa estándar $35000.
-Consumo agua valor metro cúbico entre 1 y 12 m3, $4000/ m3.
-Consumo agua valor metro cúbico mayor a 12 m3, $5500/ m3.
-Descuento consumo de agua para estrato 1 y 2 es del 13%.
-Descuento consumo de agua para estrato 3 y 4 es del 7.8%.
-No hay descuentos para estratos 5 y 6.
-Consumo energía tarifa estándar $20000.
-Consumo energía por 1 a 150 Kw, $500/Kw.
-Consumo energía mayor a 150 Kw, $700/Kw.
-Descuento energía para estrato 1 y 2 es del 17%.
-Descuento para estrato 3 y 4 es del 5%.
-No hay descuentos para estratos 5 y 6.
-Consumo gas estándar $10500.
-Consumo gas valor metro cúbico entre 1 y 30 m3, $2000/ m3.
-Consumo gas valor metro cúbico mayor a 30 m3, $2500/ m3.
-Descuento consumo de gas para estrato 1 y 2 es del 30%.
-Descuento consumo de gas para estrato 3 y 4 es del 12%.
-No hay descuentos para estratos 5 y 6 es del 8%. - Envío de Mercancías.
Un almacén de la ciudad tiene un plan de tarifas, descuentos y promociones sobre el valor del envío de mercancía a sus clientes. Se cuenta con el valor de mercancía, el peso de la mercancía en kilogramos, el número del mes, el número del día del mes, y el tipo de pago, si es con tarjeta de almacén (0), efectivo (1),
Construya una función en pseudocódigo que determine el costo final facturado al cliente por el envío.
A continuación se dan las condiciones.
Costo envío:
-Peso menor o igual a 5 Kg, envío $30000
-Peso de más de 50 Kg y hasta 70 Kg, envío $50000
-Peso de más de 70 Kg y hasta 100 Kg, envío $70000
Porcentajes de descuento sobre el valor del envío:
-Valor mercancía menor a $300,000, 20%.
-Valor mercancía mayor a $300,000 y hasta $400,000, 32%.
-Valor mercancía mayor a $400,000 y hasta 1 millón, 35%.
-Valor mercancía mayor a 1 millón, 40%.
Promociones:
-Si el pago se hace con tarjeta del almacén, no se cobra la tarifa de envío.
-Si paga en efectivo y el valor de la mercancía es mayor a $500,000, no se cobra el envío.
-Si paga en efectivo y el valor de la mercancía es menor de $200,000, y es 14 de Septiembre, día de cumpleaños del almacén, se hace un descuento adicional del 50% sobre la tarifa de envío.
(idea de problema tomada del libro de Zapata Puerta, 2012) - Granos de Cosecha.
Los granos de distintas cosechas muy especiales se recogen en contenedores.
Los contenedores están codificados con números enteros de 5 dígitos, de tal modo que:
-Los granos que pesan en promedio 15 gramos se almacenan en contenedores cuyo código comienza en 10, 30 Y 87.
-Los granos que pesan en promedio 18 gramos se almacenan en contenedores cuyo código comienza con 35, 95, y 45.
-Los granos que pesan en promedio 20 gramos se almacenan en contenedores cuyo código comienza con 12, 31, y 71.
-Todos los demás códigos corresponden a contenedores destinados a almacenar tierra abonada.
El código del contenedor también especifica la especie del grano, de tal modo que:
-Los códigos terminados en 18,28 y 38 corresponden a la especie Alphus.
-Los códigos terminados en 32,56 y 78 corresponden a la especie Betus.
El tercer dígito de los códigos corresponde al semestre de recolección 1 o 2.
Se desea que el algoritmo ayude a la valoración del grano en contenedores que pasan por una banda que lee una string que representa el tipo de grano, y el peso del contenedor en kilogramos. Con esta información, se procede a calcular el valor de los contenedores, así:
-granos en promedio 15 gramos tienen un valor base de 10 centavos.
-granos en promedio 18 gramos tienen un valor base de 20 centavos.
-granos en promedio 20 gramos tienen un valor base de 30 centavos.
-granos del primer semestre tienen un recargo del 20% del valor base.
-granos del segundo semestre tienen un recargo del 23% del valor base.
-granos de la especie Alphus tienen un recargo del 3% del valor base.
-granos de la especie Betus tienen un recargo del 7%.
Elabore una función que reciba una cadena que representa el código de contenedor, y un valor numérico que representa el peso de contenedor en kilogramos, y calcule el valor total del contenedor. - En Cuál eje.
Función que reciba un punto como par (x,y), y determine si el punto pertenece al eje coordenado 'x', al 'y', o a ambos 'xy'. En caso de no encontrarse en ningún eje, la función devuelve un valor nulo ' '. - Más alejado del origen.
Función que reciba dos puntos P1 y P2 como pares (x,y), y determine cuál punto está más alejado del origen. - El punto especial.
Elabore una función que reciba como parámetro un punto en el plano cartesiano (x,y) y devuelva un valor como se expresa a continuación:
-Si el punto está en el primer cuadrante, la función deberá devolver el perímetro del círculo de radio (0,0)-(x,y)
-Si el punto está en el segundo cuadrante, la función deberá devolver el área del rectángulo que forma con los ejes cordenados.
-Si el punto está en el tercer cuadrante, la función deberá devolver la distancia del punto al origen (0,0).
-Si el punto está en el cuarto cuadrante, la función deberá devolver el área del triángulo que que forma con el origen y con el eje y. - Los puntos especiales #1.
Elabore una función que reciba como parámetro dos puntos en el plano cartesiano (x,y), (z,w) y devuelva un valor com se expresa a continuación:
-Si los puntos se encuentran en cuadrantes impares, sin importar cuales, determine el cuadrado de la magnitud de sus pendientes.
-Si los puntos se encuentran en cuadrantes pares, sin importar cuales, asuma que los puntos son el tamaño del radio de dos círculos con origen (0,0), y determine el porcentaje del área del círculo menor con respecto al área el círculo mayor.
-Si los puntos se encuentran un en un cuadrante impar y el otro en cuadrante par, determine la suma del área del triángulo que forman los dos puntos con el origen. - Los puntos especiales #2.
Elabore una función que reciba como parámetro dos puntos en el plano cartesiano (x,y), (z,w) y devuelva un valor como se expresa a continuación:
-Si los puntos se encuentran en el mismo cuadrante, determine si el punto más alejado forma un cuadrado con los ejes coordenados, y de hacerlo, determine si el punto menos alejado es el centro de un círculo inscrito dentro del cuadrado anterior. Si el punto más alejado no formaba un cuadrado, determine si el punto más cercano
está en el interior del rectángulo que el punto más alejando forma con los ejes coordenados. -Si los puntos no se encuentran en el mismo cuadrante, asuma que el punto más distante al origen forma un cuarto de rectángulo con los ejes (los otros tres cuartos son simetrías), y determine si el punto más cercano siendo el radio (0,0)-(x,y) de un círculo, es un circulo de área inferior a la del rectángulo. - Distribución de asientos.
Se tiene la información de distribución de un avión comercial que tiene varias áreas con asientos.
El área superior es para pasajeros con clase premium y business. La clase premium tiene dos filas de asientos y cada asiento está identificado de la letra A a la letra D con pasillos entre el primer y el segundo asiento, y entre el tercero y cuarto asiento de ambas filas.
Las filas 3 a 20 son para pasajeros de clase business. En la clase business hay seis asientos en cada fila y cada asiento está identificado de la letra A a la F. Los pasillos de la clase business están entre el segundo y tercer asiento, y entre el cuarto y el quinto asiento de todas las filas.
El área inferior es para pasajeros de clase económica, y sus filas están enumeradas de la 21 a la 65, y cada asiento está identificado con letras de la A a la K (the letter I is no se usa y se omite). En esta área para clase económica, los corredores están entre las sillas tercera y cuarta, y entre las sillas séptima y octava de cada fila.
Elabore un algoritmo que determine si un asiento está en la "ventana". si no es así, determine si el asiento está junto a un "pasillo", y de no ser ninguna de las dos anteriores, el algoritmo deberá decir "ninguno".
El algoritmo recibe como parámetro el número de la fila y la letra del asiento. Ejemplo. Si se pasa 3 y C, el algoritmo deberá decir "pasillo". Si se pasa 64 y A, el algoritmo deberá informar "ventana". Si se pasa 21 y F, el algoritmo deberá decir "ninguno". - Los matemáticos y el café.
Dos matemáticos a y b que paseaban en una finca cafetera deciden caminar por uno de los sembrados de café mientras piensan. A medida que caminan recogen algunos granos de café y los van depositando en una pequeña canasta que cada uno carga.
De un momento a otro uno de ellos propone poner más diversión al momento, pesando los granos para ver quién ha recogido más peso en granos. Quien haya recogido menos peso en grano preparará el café en la tarde.
Van a una pesa de precisión de la finca, y toman las medidas a1 y b1, que son los pesos la canasta con granos del matemático a, y la canasta con granos del matemático b respectivamente. Luego el segundo matemático deposita todos sus granos en la canasta del primer matemático hasta dejarla vacía, y de nuevo miden las dos canastas, y obtienen las medidas a2 y b2.
Finalmente, el primer matemático vacía todos los granos que estaban en su canasta hasta dejarla vacía en la segunda canasta y se hacen de nuevo mediciones de las dos canastas para obtener los nuevos pesos a3 y b3.
Elabore un algoritmo que permita identificar si es el primer matemático o el segundo quien prepara el café. - Buscar elemento en arreglo.
Use bifurcadores condicionales y no condicionales para buscar un elemento en un arreglo dado como parámetro. El elemento para buscar también se entrega como parámetro. La función devuelve la posición en la que fue encontrado el elemento. Si el elemento no existe, se devuelve la posición 0. - Sumatoria de enteros en un rango.
Dados dos números enteros, determine la sumatoria de todos los números en el rango. Use bifurcaciones condicionales y no condicionales para emular un ciclo. - Suma de números divisibles.
Dado un número entero inicial a, y un número entero final b, contar cuántos de esos números enteros son divisibles simultáneamente por tres números p, q, y r. Use bifurcaciones condicionales y no condicionales para emular un ciclo. - Factorial de n.
Determine el factorial de n. Use bifurcaciones condicionales y no condicionales para emular un ciclo. - Productoria.
Determine el producto de los números enteros en un rango [p,q]. Use bifurcaciones condicionales y no condicionales para emular un ciclo. - Contar caracteres.
Construya una función en pseudocódigo que, dada una cadena como entrada, y dato un caracter, determine cuántas veces se encuentra el caracter en la cadena. Use bifurcaciones condicionales y no condicionales para emular un ciclo.