<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Gilberto Ramírez]]></title><description><![CDATA[Soy un ingeniero de software con experiencia desarrollando aplicaciones web. Mi pila tecnológica es .NET, React, SQL. 
Me gusta escribir y compartir lo aprendid]]></description><link>https://programacionlogica.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1699849251653/UeabD7Z6M.png</url><title>Gilberto Ramírez</title><link>https://programacionlogica.com</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 07:29:18 GMT</lastBuildDate><atom:link href="https://programacionlogica.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Cómo Diseñar un Algoritmo para un Reloj Digital: Suma un Segundo y Mantén el Formato HH MM SS]]></title><description><![CDATA[¿Alguna vez has pensado en cómo programar un reloj digital en formato HH MM SS? En este artículo, diseñaremos un algoritmo para el caso básico de agregar un segundo a una hora dada. Analizaremos los casos que debes considerar para diseñar el algoritm...]]></description><link>https://programacionlogica.com/como-disenar-un-algoritmo-para-un-reloj-digital-suma-un-segundo-y-manten-el-formato-hh-mm-ss</link><guid isPermaLink="true">https://programacionlogica.com/como-disenar-un-algoritmo-para-un-reloj-digital-suma-un-segundo-y-manten-el-formato-hh-mm-ss</guid><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[Programación]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Sat, 10 Aug 2024 21:53:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ifVZHBYVx1A/upload/3b9017d36732127a4dabe56c1405eede.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>¿Alguna vez has pensado en cómo programar un reloj digital en formato HH MM SS? En este artículo, diseñaremos un algoritmo para el caso básico de agregar un segundo a una hora dada. Analizaremos los casos que debes considerar para diseñar el algoritmo y lo codificaremos en Python.</p>
<h2 id="heading-problema">Problema</h2>
<p>Diseña un algoritmo que calcule la hora dentro de un segundo. El reloj cuenta con horas, minutos y segundos (HH MM SS). Es un reloj digital y sigue el siguiente formato. Hora en formato 24 horas, 24 horas = 00; 60 minutos = 00; 60 segundos = 00. Así que las 00 00 00 equivale a las 12 pm en punto.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 09 05 30
Salida:  09 05 31
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 10 59 59
Salida:  11 00 00
</code></pre>
<p><em>Consejo: Antes de escribir código debes saber cómo se resuelve el problema. Piensa en cómo lo resuelves sin código. Haz el algoritmo paso a paso en un papel o en el editor de código. Luego compara tu solución con la del artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Piden calcular la hora del reloj agregando un segundo. Debo seguir el formato sugerido. Además, hay que tomar en cuenta los casos límite en los que puede caer el algoritmo para poder solucionar correctamente esta tarea.</p>
<ul>
<li><p>Horas: después de las 23 sigue 00.</p>
</li>
<li><p>Minutos: después de los 59 sigue 00.</p>
</li>
<li><p>Segundos: después de los 59 sigue 00.</p>
</li>
<li><p>Considerar el acarreo de una unidad de segundos a minutos, cuando los segundos dados coincidan con 59.</p>
</li>
<li><p>Considerar el acarreo de una unidad de minutos a horas, cuando los minutos dados coincidan con 59 y reciba el acarreo de una unidad procedente de los segundos.</p>
</li>
</ul>
<p>El acarreo es importante, porque recordemos que 60 segundos añaden un minuto; 60 minutos añaden 1 hora.</p>
<p>Ejemplo de caso normal:</p>
<p>01 10 11 - el siguiente segundo actualiza la hora a: 01 10 12.</p>
<p>Ejemplo de caso con acarreo:</p>
<p>03 59 59 - el siguiente segundo actualiza la hora a: 04 00 00.</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>La idea de solución es sencilla: sumar un segundo a la hora dada y considerar los casos especiales para que se muestre la hora en el formato indicado. Los casos especiales los manejamos con estructuras de condición.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<pre><code class="lang-plaintext"># variables:
horas, minutos, segundos, hh, mm, ss

iniciar
    sumar 1 a segundos
    si segundos = 60 entonces
        segundos ← 00
        sumar 1 a minutos
        si minutos = 60 entonces
            minutos ← 00
            sumar 1 a horas
            si horas = 24 entonces
                horas ← 00
            fin si
        fin si
    fin si

    imprimir(horas.formatedas, minutos.formateados, segundos.formateados)
fin
</code></pre>
<p>En las ramas condicionales hemos cubierto todas los escenarios. Al imprimir hemos inidicado que las horas, minutos y segundos van formateados. No lo hemos desarrollado. Eso lo haremos en el código.</p>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>entrada</td><td>salida</td></tr>
</thead>
<tbody>
<tr>
<td>09 05 30</td><td>09 05 31</td></tr>
<tr>
<td>10 59 59</td><td>11 00 00</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<p>Una vez que tenemos diseñado y probado el algortimos es hora de traducirlo a código. Manos al teclado!</p>
<pre><code class="lang-python"><span class="hljs-comment"># entrada</span>
horas = <span class="hljs-number">11</span>
minutos = <span class="hljs-number">59</span>
segundos = <span class="hljs-number">00</span>

<span class="hljs-comment"># algoritmo</span>
segundos += <span class="hljs-number">1</span>
<span class="hljs-keyword">if</span> segundos == <span class="hljs-number">60</span>:
    segundos = <span class="hljs-number">0</span>
    minutos += <span class="hljs-number">1</span>
    <span class="hljs-keyword">if</span> minutos == <span class="hljs-number">60</span>:
        minutos = <span class="hljs-number">0</span>
        horas += <span class="hljs-number">1</span>
        <span class="hljs-keyword">if</span> horas == <span class="hljs-number">24</span>:
            horas = <span class="hljs-number">0</span>

print(<span class="hljs-string">f"<span class="hljs-subst">{str(horas).zfill(<span class="hljs-number">2</span>)}</span> <span class="hljs-subst">{str(minutos).zfill(<span class="hljs-number">2</span>)}</span> <span class="hljs-subst">{str(segundos).zfill(<span class="hljs-number">2</span>)}</span>"</span>)
</code></pre>
<p>El método <code>str(numero)</code> convierte a tipo cadena un número.</p>
<p>El método <code>zfill</code> es un método interno de Python que sirve para para rellenar una cadena numérica con ceros a la izquierda hasta que alcance un ancho especificado por el argumento que recibe. Esto asegura que la representación en cadena del número tenga una longitud mínima. Por ejemplo, si la cadena es "0", entonces "00"; si "1", entonces "01"; si "20", entonces "20", ya no necesita relleno.</p>
<p>Fíjate que unimos el método <code>zfill</code> a <code>str(numero)</code>. Primero <code>str(numero)</code> convierte cadena el número. Luego, <code>zfill</code> formatea esta cadena. Por último, guardamos el resultado en la variable correspondiente.</p>
<p>Ejecuta el programa, o haz la comprobación en seco.</p>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(1) constante</p>
<p>Porque no recorremos una colección.</p>
<p>Espacio: O(1) constante</p>
<p>Porque no usamos estructura de datos extra.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>En resumen, en este artículo diseñamos y codificamos el algoritmo base de un reloj digital y cumplimos con el formato que se nos pidió. Pon atención en que, para resolverlo, listamos los casos límite o escenarios que podría tener. Con estructuras condicionales manejamos estos escenarios. Conocer estos escenarios es muy importante para tu programa o software para que tengan el comportamiento esperado. Al codificar, usamos el método <code>zfill</code> dePython que rellena una cadena de números con ceros a la izquierda.</p>
<p>Reto: Diseña el algoritmo y el programa en Python de un reloj para que funcione las 24 horas.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). <em>Fundamentos de programación.</em> Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[Descubre el Número Más Grande: Un Algoritmo Sencillo y Eficaz]]></title><description><![CDATA[Problema
Diseña un algoritmo que imprima el número más grande de tres números dados.
Ejemplo 1
Entrada: 1, 2, 3
Salida: 9

Ejemplo 2
Entrada: 10, 15, 8
Salida: 15

Consejo: Antes de escribir código debes entender cómo se resuelve el problema. Piensa ...]]></description><link>https://programacionlogica.com/descubre-el-numero-mas-grande-un-algoritmo-sencillo-y-eficaz</link><guid isPermaLink="true">https://programacionlogica.com/descubre-el-numero-mas-grande-un-algoritmo-sencillo-y-eficaz</guid><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[Programación]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Sun, 07 Jul 2024 04:34:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/Wpnoqo2plFA/upload/aafcfa7ed20d5342269a24fc31e090d9.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-problema">Problema</h2>
<p>Diseña un algoritmo que imprima el número más grande de tres números dados.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 1, 2, 3
Salida: 9
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 10, 15, 8
Salida: 15
</code></pre>
<p><em>Consejo: Antes de escribir código debes entender cómo se resuelve el problema. Piensa en cómo lo harías sin usar código. Realiza el algoritmo paso a paso en un papel o en el editor de código. Luego compara tu solución con la del artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Nos piden determinar cuál es el número más grande de tres números dados.</p>
<p>Pero, ¿qué pasa hay números iguales?</p>
<ul>
<li><p>Si los tres números son iguales, imprimir cualquiera.</p>
</li>
<li><p>Si dos números son iguales, imprimir cualquiera que cumpla la condición de ser mayor que el tercer número.</p>
</li>
</ul>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>La idea es simple, comparar los tres números entre sí para decidir el mayor.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p>Usamos variable <code>mayor</code> para guardar temporalmente el número más grande cada vez que hacemos una comparación. Al final, <code>mayor</code> tendrá el resultado.</p>
<pre><code class="lang-plaintext">A, B, C = 1, 2, 3
mayor = infinito negativo

si A &gt;= mayor entonces
    mayor ← A
fin si
si B &gt;= mayor entonces
    mayor ← B
fin si
si C &gt;= mayor entonces
    mayor ← C
fin si

print(mayor)
</code></pre>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>entrada</td><td>resultado</td></tr>
</thead>
<tbody>
<tr>
<td>1, 2, 3</td><td>3</td></tr>
<tr>
<td>10, 15, 8</td><td>15</td></tr>
<tr>
<td>4, 4, 4</td><td>4</td></tr>
<tr>
<td>4, 4, 5</td><td>5</td></tr>
<tr>
<td>-20, -5, -10</td><td>-5</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<pre><code class="lang-python">A, B, C = <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>
mayor = -float(<span class="hljs-string">'inf'</span>)

<span class="hljs-keyword">if</span> A &gt;= mayor:
    mayor = A
<span class="hljs-keyword">if</span> B &gt;= mayor:
    mayor = B
<span class="hljs-keyword">if</span> C &gt;= mayor:
    mayor = C

print(mayor)
</code></pre>
<p>Inicializamos <code>mayor</code> como infinito negativo. Esto representa el valor menor que puede tener un número en Python. Cualquier número diferente a infinito negativo es superior a este. Así podemos actualizar el valor de mayor en cada comparación.</p>
<p>Comparamos cada número contra la variable <code>mayor</code>. Actualizamos el valor de esta.</p>
<p>Al final, imprimimos <code>mayor</code>.</p>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(1) constante</p>
<p>Por que no hay una colección que recorrer.</p>
<p>Espacio: O(1) constante</p>
<p>Por que no hay una estructura de datos adicional.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>En conclusión, hemos diseñado un algoritmo sencillo y eficaz para determinar el número más grande entre tres números dados. A través de un análisis detallado y un diseño claro, hemos demostrado cómo comparar los números y actualizar una variable para encontrar el mayor. La implementación en código es directa y eficiente, con una complejidad constante tanto en tiempo como en espacio. Este enfoque no solo resuelve el problema de manera efectiva, sino que también es fácil de entender y aplicar en diversas situaciones.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[Descubre el día de la semana de cualquier fecha del mes]]></title><description><![CDATA[Imagina que quieres saber qué día de la semana es un día específico del mes, sabiendo que el primer día del mes es lunes. Este artículo te mostrará cómo resolver este problema y codificar la solución en Python..
Problema
Dado un día del mes, determin...]]></description><link>https://programacionlogica.com/descubre-el-dia-de-la-semana-de-cualquier-fecha-del-mes</link><guid isPermaLink="true">https://programacionlogica.com/descubre-el-dia-de-la-semana-de-cualquier-fecha-del-mes</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Sun, 23 Jun 2024 04:41:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/bwOAixLG0uc/upload/0bb567d1d0e67718c147a9bc00cded94.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Imagina que quieres saber qué día de la semana es un día específico del mes, sabiendo que el primer día del mes es lunes. Este artículo te mostrará cómo resolver este problema y codificar la solución en Python..</p>
<h2 id="heading-problema">Problema</h2>
<p>Dado un día del mes, determinar qué día de la semana es asumiendo que el primer día del mes es lunes.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 15
Salida: lunes
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 28
Salida: domingo
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 3
Entrada: 11
Salida: jueves
</code></pre>
<p><em>Consejo: Antes de escribir código debes saber cómo se resuelve el problema. Piensa en cómo lo resuelves sin código. Haz el algoritmo paso a paso en un papel o en el editor de código. Luego compara tu solución con la del artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>El problema nos pide saber qué día de la semana es a partir de un día del mes. El primer día del mes corresponde a lunes. En otras palabras, se nos pide hacer un mapeo del día del mes que nos dan al día de la semana correspondiente. Por ejemplo, si me dan el día 9 de mes la respuesta sería martes.</p>
<p>Vamos a explicarlo con pelotas y con 7 cajas para guardar las pelotas. Dentro de cada caja caben varias pelotas. Las reglas:</p>
<p>Sólo puedes poner una pelota en la caja a la vez. La siguiente pelota va en la siguiente caja. No puedes saltar de caja. Cuando terminas de recorrer las 7 cajas vuelves a poner la siguiente pelota en la primera caja.</p>
<p>Las pelotas representa el día dado. Supongamos que nos dan 9 pelotas, el día 9 del mes.</p>
<p>| Lun 🟢 | Mar 🔵 | Mié 🟡 | Jue 🟠 | Vie 🟣 | Sáb 🟤 | Dom🔴 |</p>
<p>| Lun 🟢 | Mar 🔵 | Mié | Jue | Vie | Sáb | Dom |</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>Como primer paso, tengo que encontrar una operación que me permita obtener del día del mes las 7 cajas o valores de forma constante.</p>
<p>Una primera idea, sería usar la división: 9 / 1 = 9; 9 / 2 = 4.5; y no avanzo con mi objetivo.</p>
<p>Otra idea es usar el resto o residuo de la división. ¿Por qué? Porque en este caso, la operación resto nos devuelve un número comprendido entre 0 y 7. Allí tenmos los 7 valores que necesitmamos. Por ejemplo, el residuo de 9 dividido 7 es 2.</p>
<p>Luego, el segundo paso es mapear estos 7 valores a los días de la semana.</p>
<p>Este es el mapeo:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>resto</td><td>día de la semana</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>domingo</td></tr>
<tr>
<td>1</td><td>lunes</td></tr>
<tr>
<td>2</td><td>martes</td></tr>
<tr>
<td>3</td><td>miércoles</td></tr>
<tr>
<td>4</td><td>jueves</td></tr>
<tr>
<td>5</td><td>viernes</td></tr>
<tr>
<td>6</td><td>sábado</td></tr>
</tbody>
</table>
</div><p>Si deciden cambiar el día de referencia, es decir, que el primer día de la semana sea jueves, entonces debemos ajustar el mapeo y listo. El valor 0 sería para miércoles, el jueves el 1, viernes 2, etc.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p>Para resolver este problema sigue estos pasos:</p>
<ol>
<li><p>Obtener el residuo del día del mes entre 7.</p>
</li>
<li><p>Mapear el resultado al día de la semana.</p>
</li>
<li><p>Imprimir el día de la semana.</p>
</li>
</ol>
<pre><code class="lang-plaintext">diaMes = x
residuo = diaMes Modulo 7
segun sea residuo:
'0' -&gt; diaSemana = domingo
'1' -&gt; diaSemana = lunes
'2' -&gt; diaSemana = martes
... 
imprimir(diaSemana)
</code></pre>
<p>La operación residuo también se conoce como módulo.</p>
<p>En el algoritmo estoy usando <code>según sea</code> que representa la estructura <code>switch</code> que existe en muchos lenguajes de programación.</p>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Día mes</td><td>Operación</td><td>Día semana</td></tr>
</thead>
<tbody>
<tr>
<td>15</td><td>15 mod 7 = 1</td><td>lunes</td></tr>
<tr>
<td>28</td><td>28 mod 7 = 0</td><td>domingo</td></tr>
<tr>
<td>11</td><td>11 mod 7 = 4</td><td>jueves</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<pre><code class="lang-python">dia_mes = <span class="hljs-number">2</span>

residuo = dia_mes % <span class="hljs-number">7</span>

<span class="hljs-keyword">if</span> residuo == <span class="hljs-number">1</span>:
    dia_semana = <span class="hljs-string">"lunes"</span>
<span class="hljs-keyword">elif</span> residuo == <span class="hljs-number">2</span>:
    dia_semana = <span class="hljs-string">"martes"</span>
<span class="hljs-keyword">elif</span> residuo == <span class="hljs-number">3</span>:
    dia_semana = <span class="hljs-string">"miércoles"</span>
<span class="hljs-keyword">elif</span> residuo == <span class="hljs-number">4</span>:
    dia_semana = <span class="hljs-string">"jueves"</span>
<span class="hljs-keyword">elif</span> residuo == <span class="hljs-number">5</span>:
    dia_semana = <span class="hljs-string">"viernes"</span>
<span class="hljs-keyword">elif</span> residuo == <span class="hljs-number">6</span>:
    dia_semana = <span class="hljs-string">"sábado"</span>
<span class="hljs-keyword">else</span>:
    dia_semana = <span class="hljs-string">"domingo"</span>

print(dia_semana)
</code></pre>
<p>El código mapea el valor del residuo de la división del día del mes por 7 e imprime como resultado el día de la semana.</p>
<p>Python no tiene la sentencia <code>switch</code>. Por eso usamos la estructura <code>if-elif-else</code>.</p>
<p>Existen otras formas de resolver el problema, por ejemplo, usando una lista con los días de la semana. Pero en esencia, el problema se resuelve de la misma forma. Usa el operador residuo de la división y el mapeo a los días de la semana usando esa lista.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">dia_de_la_semana</span>(<span class="hljs-params">dia_mes</span>):</span>
    dias_semana = [<span class="hljs-string">"domingo"</span>, <span class="hljs-string">"lunes"</span>, <span class="hljs-string">"martes"</span>, <span class="hljs-string">"miércoles"</span>, <span class="hljs-string">"jueves"</span>, <span class="hljs-string">"viernes"</span>, <span class="hljs-string">"sábado"</span>]
    <span class="hljs-keyword">return</span> dias_semana[dia_mes % <span class="hljs-number">7</span>]

<span class="hljs-comment"># Ejemplo de uso</span>
dia = <span class="hljs-number">15</span>
print(<span class="hljs-string">f"El día <span class="hljs-subst">{dia}</span> del mes es <span class="hljs-subst">{dia_de_la_semana(dia)}</span>"</span>)
</code></pre>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(1) constante</p>
<p>Porque no se recorre ninguna colección.</p>
<p>Espacio: O(1) constante</p>
<p>Porque no se utilizó una estructura de datos extra.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>En conclusión, hemos abordado el problema de determinar el día de la semana a partir de un día específico del mes, asumiendo que el primer día del mes es lunes. A través del análisis y diseño del algoritmo, hemos identificado que el uso del operador residuo de la división es una solución eficiente para mapear los días del mes a los días de la semana. La implementación en código demuestra que este enfoque es tanto simple como efectivo, con una complejidad constante en términos de tiempo y espacio. Este método puede ser fácilmente adaptado a diferentes días de referencia, lo que lo hace versátil y útil en diversas aplicaciones.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[Saber si un año es bisiesto o no]]></title><description><![CDATA[En este artículo, exploraremos, diseñaremos y codificaremos un algoritmo en Python para determinar si un año es bisiesto o no.
Problema
Saber si un año dado es bisiesto o no.
Ejemplo 1
Entrada: 1000
Salida: false

Ejemplo 2
Entrada: 2000
Salida: true...]]></description><link>https://programacionlogica.com/saber-si-un-ano-es-bisiesto-o-no</link><guid isPermaLink="true">https://programacionlogica.com/saber-si-un-ano-es-bisiesto-o-no</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Mon, 17 Jun 2024 03:53:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/GjAKNK4ocRc/upload/8f850611d658437c3b4d275bcda501b6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En este artículo, exploraremos, diseñaremos y codificaremos un algoritmo en Python para determinar si un año es bisiesto o no.</p>
<h2 id="heading-problema">Problema</h2>
<p>Saber si un año dado es bisiesto o no.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 1000
Salida: false
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 2000
Salida: true
</code></pre>
<p><em>Consejo: Antes de escribir código debes saber cómo se resuelve el problema. Piensa en cómo lo resuelves sin código. Haz el algoritmo paso a paso en un papel o en el editor de código. Luego compara tu solución con la del artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>El problema nos da un año y debemos definir si es una año bisiesto o no. La salida es true o false.</p>
<p>Un año es el tiempo que tarda la tierra en dar una vuelta al sol. Un año bisiesto es un año que tiene 366 días y no 365.</p>
<p>¿Cómo determinar si un año es bisiesto o no? Para entender mejor este tema, investiguemos qué nos dice Copilot de Microsoft Bing. Copilot nos dice que según el calendario gregoriano un año es bisiesto si cumple estas tres reglas:</p>
<ol>
<li><p>Ser divisible por 4</p>
</li>
<li><p>No ser divisible por 100</p>
</li>
<li><p>Pero si es divisible por 100, debe ser divisible por 400.</p>
</li>
</ol>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>La fórmula compacta que nos da Copilot es:</p>
<pre><code class="lang-plaintext">bisiesto = (año mod 4 = 0) Y (año mod 100 ≠ 0 O año mod 400 = 0)
</code></pre>
<p>Si el año es divisible entre 4 y no divisible entre 100, entonces es bisiesto. Pero ¿qué pasa con los años que son divisibles entre 100? Todavía pueden ser bisiestos si son divisibles entre 400.</p>
<p><code>año mod 4 = 0</code></p>
<p>si año es divisible entre 4</p>
<p><code>(año mod 100 ≠ 0 O año mod 400 = 0)</code></p>
<p>El operador lógico <code>O</code> maneja dos condiciones.</p>
<ul>
<li><p>Si no es divisible entre 100</p>
</li>
<li><p>Si es divisible entre 400</p>
</li>
</ul>
<p>Basta con que una sea verdadera para que la expresión sea verdadera.</p>
<p>El operador lógico <code>Y</code> une las dos partes de la fórmula. Ambas tienen que ser verdaderas para que la expresión sea verdadera.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p>Un primer acercamiento, siguiendo las reglas de los años bisiesto, sería:</p>
<pre><code class="lang-plaintext">bisiesto = false
si año es divisible por 4 entonces
    si año no es divisible por 100 entonces 
        bisiesto = true
    sino // si el año es divisible por 100
        si año es divisble por 400 entonces 
            bisiesto = true
fin si
imprimir(bisiesto)
</code></pre>
<p>Este pseudocódigo es entendible por sí solo, pero es verboso. La fórmula compacta nos dice lo mismo.</p>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>year</td><td>result</td></tr>
</thead>
<tbody>
<tr>
<td>1000</td><td>true Y (false O false) = true Y false = false</td></tr>
<tr>
<td>2000</td><td>true Y (false O true) = true Y true = true</td></tr>
<tr>
<td>1600</td><td>true Y (false O true) = true Y true = true</td></tr>
<tr>
<td>1900</td><td>true Y (false O false) = true Y false = false</td></tr>
<tr>
<td>2024</td><td>true Y (true O false) = true Y true = true</td></tr>
<tr>
<td>2005</td><td>false...</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<p>Codificamos aquí solo la fórmula compacta. Pasa a código el pseudocódigo que presentamos arriba y pruébalo.</p>
<pre><code class="lang-python">year = int(input(<span class="hljs-string">"Ingresa el año: "</span>))
bisiesto = (year % <span class="hljs-number">4</span> == <span class="hljs-number">0</span>) <span class="hljs-keyword">and</span> (year % <span class="hljs-number">100</span> != <span class="hljs-number">0</span> <span class="hljs-keyword">or</span> year % <span class="hljs-number">400</span> == <span class="hljs-number">0</span>)
print(bisiesto)
</code></pre>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(1) constante</p>
<p>Porque no recorremos una colección.</p>
<p>Espacio: O(1) constante</p>
<p>Porque no usamos estructura de datos extra.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>En conclusión, determinar si un año es bisiesto es una tarea sencilla cuando se conocen las reglas del calendario gregoriano. Presentamos dos algoritmos, uno más descriptivo en pseudocódigo; el otro, más compacto tipo fórmula. Además, explicamos cómo funciona una condición compuesta con los operadores lógicos <code>and</code> y <code>or</code>.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[Detectar si un número es decimal o entero]]></title><description><![CDATA[En este artículo, exploraremos, diseñaremos y codificaremos en Python un algoritmo para determinar si un número posee una parte decimal o si es un número entero.
Problema
Detecta si un número dado es decimal o entero.
Ejemplo 1
Entrada: 4
Salida: ent...]]></description><link>https://programacionlogica.com/detectar-si-un-numero-es-decimal-o-entero</link><guid isPermaLink="true">https://programacionlogica.com/detectar-si-un-numero-es-decimal-o-entero</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Mon, 27 May 2024 02:58:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/gdL-UZfnD3I/upload/c37db16b2e8b322455c0aefcf49aadcf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En este artículo, exploraremos, diseñaremos y codificaremos en Python un algoritmo para determinar si un número posee una parte decimal o si es un número entero.</p>
<h2 id="heading-problema">Problema</h2>
<p>Detecta si un número dado es decimal o entero.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 4
Salida: entero
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 3.1416
Salida: decimal
</code></pre>
<p><em>Consejo: Antes de escribir código debes saber cómo se resuelve el problema. Piensa en cómo lo resuelves sin código. Haz el algoritmo paso a paso en un papel o en el editor de código. Luego compara tu solución con la del artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Nos piden detectar si un número dado es decimal o entero.</p>
<p>Los números enteros incluyen los números naturales, sus opuestos negativos, y el cero. Es decir, números positivos, negativos y el cero. Por ejemplo, 1, -1, 0.</p>
<p>Los números decimales constan de una parte entera y de una fracción decimal. La parte entera y decimal se separa por una convención que puede ser un punto o una coma dependiendo del país. Entonces, un número decimal sería 1.5.</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>Se me ocurren tres ideas de solución.</p>
<p>A. Preguntar si el número contiene un punto o una coma, puesto que estos son los separadores de la parte entera de la parte decimal.</p>
<p>B. Truncar el número a la parte entera y preguntar si el número es igual al número truncado. Si es igual, es entero. Si es diferente, es decimal.</p>
<p>C. Usar el operador módulo para saber si el número tiene residuo. Si tiene residuo es decimal, de lo contrario, es entero.</p>
<p>Elegimos la opción B.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<pre><code class="lang-plaintext">1. Comparar el número contra el número truncado
    1.1 Si es igual entonces es entero,
    1.2 De lo contrario, es decimal
2. Guardar resultado
3. Imprimir resultado
</code></pre>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Entrada</td><td>Comparación</td><td>Resultado</td></tr>
</thead>
<tbody>
<tr>
<td>4</td><td>4 = 4</td><td>entero</td></tr>
<tr>
<td>3.1416</td><td>3.1416 = 3</td><td>decimal</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<p>Casi todos los lenguajes poseen ya una función para truncar un número. Solo tenemos que utilizarla. En el caso de Python hay varias opciones. Un par de ellas son:</p>
<ul>
<li><p>usar <code>int()</code>. Esto convierte el número a entero.</p>
</li>
<li><p>usar <code>math.trunc()</code> de la librería <code>math</code></p>
</li>
</ul>
<pre><code class="lang-python">numero = <span class="hljs-number">3.1416</span>
<span class="hljs-keyword">if</span> numero == int(numero):
    resultado = <span class="hljs-string">"entero"</span>
<span class="hljs-keyword">else</span>:
    resultado = <span class="hljs-string">"decimal"</span>
print(resultado)
</code></pre>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(1) constante</p>
<p>Es constante porque no hay una colección que recorrer.</p>
<p>Espacio: O(1) constante</p>
<p>Es constante porque no hay una estructura de datos adicional.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>En resumen, en este artículo analizamos y diseñamos un algoritmo para determinar si un número es entero o decimal. Tuvimos tres ideas de solución y seleccionamos una para desarrollar: comparar el número dado contra el número truncado. Aprendimos que para truncar un número en Python podemos usar el método <code>int()</code>. ¿Conoces otras formas de resolver este problema? ¡Coméntalas!</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[Escribir la suma de los diez primeros números pares]]></title><description><![CDATA[En este artículo, exploramos cómo calcular la suma de los primeros 10 números pares usando un algoritmo simple. Este ejercicio ayuda a comprender conceptos básicos de programación.
Problema
Calcula la suma de los diez primeros números pares. Genera e...]]></description><link>https://programacionlogica.com/escribir-la-suma-de-los-diez-primeros-numeros-pares</link><guid isPermaLink="true">https://programacionlogica.com/escribir-la-suma-de-los-diez-primeros-numeros-pares</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Sun, 26 May 2024 08:01:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cHhbULJbPwM/upload/9fc79fcd45d95cb8dbf6a91861883697.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En este artículo, exploramos cómo calcular la suma de los primeros 10 números pares usando un algoritmo simple. Este ejercicio ayuda a comprender conceptos básicos de programación.</p>
<h2 id="heading-problema">Problema</h2>
<p>Calcula la suma de los diez primeros números pares. Genera estos números, pero solo imprime el resultado de la suma.</p>
<pre><code class="lang-plaintext">Ejemplo 
Entrada: 2,4,6,8,10,12,14,16,18,20
Salida: 110
</code></pre>
<p><em>Consejo: Antes de escribir código debes saber cómo resolver el problema. Piensa en cómo lo resolverías sin código. Haz el algoritmo paso a paso en papel o en el editor de código. Luego, compara tu solución con la del artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Nos piden calcular la suma de los diez primeros números pares. Tenemos que saber cuáles son los números pares. Los números pares son aquellos números que son divisibles o múltiplos de 2. Por ejemplo, 8.</p>
<p>Los diez primeros números pares van del 2 al 20. Nos piden generarlos para hacer la suma.</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>Se me ocurren dos ideas de solución:</p>
<p>A. Recorrer cada número del 1 al 20 incluido y evaluar si es divisible entre 2. Si lo es, es par. Luego, hago una sumatoria con todos los pares.</p>
<p>B. Recorrer los números de dos en dos hasta llegar al 20 incluido. Eso asegura que son pares. Luego, hago la sumatoria.</p>
<p>Elijo la opción B, parece más sencilla.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<pre><code class="lang-plaintext">1. Inicializar una variable sumatoria en 0.
2. Usar un ciclo for que recorra los números desde 2 hasta 20, con un salto de 2 en 2.
3. En cada iteración, sumar el valor actual a sumatoria.
4. Imprimir el resultado final de sumatoria.
</code></pre>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>i</td><td>sumatoria</td></tr>
</thead>
<tbody>
<tr>
<td>2</td><td>0 + 2</td></tr>
<tr>
<td>4</td><td>2 + 4</td></tr>
<tr>
<td>...</td><td>...</td></tr>
<tr>
<td>20</td><td>110</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<p>Ahora vamos a implementar nuestro algoritmo en Python.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Suma 10 primeros números pares</span>
sumatoria = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">2</span>, <span class="hljs-number">21</span>, <span class="hljs-number">2</span>):
    sumatoria += i
print(sumatoria)
</code></pre>
<p>En el ciclo recorremos los primeros 10 números pares. Comenzamos en 2 y saltamos de dos en 2 hasta llegar al 20 incluido.</p>
<p><code>Range</code> genera una secuencia de números y tiene 3 parámetros:</p>
<ul>
<li><p><code>Inicio</code>: en 2.</p>
</li>
<li><p><code>Parada</code>: en 21, para que incluya el último número par, el 20. Este parámetro no es inclusivo. Si lo dejamos en 20, llegaría hasta el 19.</p>
</li>
<li><p><code>Paso</code>: de 2 en 2.</p>
</li>
</ul>
<p>En cada paso del ciclo hacemos la sumatoria del acumulado con el valor actual de i. Voilá.</p>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(n) lineal</p>
<p>Es lineal porque necesitamos recorrer la colección de números pares.</p>
<p>Espacio: O(1) constante</p>
<p>Es constante porque no generamos ninguna estructura de datos extra.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>En este artículo analizamos, diseñamos y codificamos en Python un algoritmo para calcular la suma de los diez primeros números pares. De dos ideas de solución escogimos una: recorrer los números de dos en dos hasta llegar al 20. Se te ocurre otra solución. Inténtala y comenta.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[006. Problema: Resolver ecuación de primer grado]]></title><description><![CDATA[Problema
Resuelve la ecuación de primer grado con los datos de entrada. Escribe el resultado, o si el resultado es indeterminado o imposible.
$$ax + b = 0$$Consejo: Antes de escribir código debemos saber cómo se resuelve el problema. Piensa en cómo l...]]></description><link>https://programacionlogica.com/006-problema-resolver-ecuacion-de-primer-grado</link><guid isPermaLink="true">https://programacionlogica.com/006-problema-resolver-ecuacion-de-primer-grado</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Wed, 06 Dec 2023 06:48:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/05A-kdOH6Hw/upload/bb6e50643419160656fa2cb2d3462510.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-problema">Problema</h2>
<p>Resuelve la ecuación de primer grado con los datos de entrada. Escribe el resultado, o si el resultado es indeterminado o imposible.</p>
<p>$$ax + b = 0$$</p><p><em>Consejo: Antes de escribir código debemos saber cómo se resuelve el problema. Piensa en cómo lo resuelves sin código. Haz el algoritmo paso a paso en un papel o en el editor de código. Luego compara tu solución con la del artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Nos piden resolver una ecuación de primer grado. Los valores conocidos -entrada- son a, b. Para resolver la ecuación tenemos que saber qué es y cómo se resuelven. De lo contrario, estamos atorados. Repasemos.</p>
<p><em>Ecuación de primer grado</em></p>
<ul>
<li><p>Una ecuación de primer grado es una igualdad matemática que tiene una o más incógnitas.</p>
</li>
<li><p>El grado de la ecuación lo recibe de la potencia a la que está elevada la incógnita. Por ejemplo, <code>x^2</code> es una ecuación de segundo grado.</p>
</li>
<li><p>El grado nos dice el número de soluciones que tiene la ecuación. Una ecuación de primer grado solo tiene una solución.</p>
</li>
</ul>
<p>La ecuación que nos pasan tiene la forma de <code>a * x + b = 0</code>. El cálculo consiste en:</p>
<ol>
<li><p>Agrupar los términos que llevan x en la primera parte de la ecuación (antes del signo <code>=</code>). Los que no, los pasamos a la segunda parte.</p>
</li>
<li><p>Despejar x.</p>
</li>
<li><p>Resolver la operación.</p>
</li>
</ol>
<blockquote>
<p>Recuerda que si pasamos un término de un lado a otro de la ecuación, se realizan operaciones opuestas. Si suman, pasan restando. Si multiplican, pasan dividiendo.</p>
</blockquote>
<p>Con eso resolvemos la ecuación. Pero, la solución puede caer en tres casos o escenarios diferentes. Los casos son:</p>
<ul>
<li><p>Si a es diferente de 0, resolvemos la operación.</p>
</li>
<li><p>Si a = 0 y b diferente de 0, la solución es imposible.</p>
</li>
<li><p>Si a = 0 y b = 0, la solución es indeterminada.</p>
</li>
</ul>
<p>El 0 es problemático porque la ecuación despejada termina siendo <code>0/0</code>, o <code>-b/0</code>.</p>
<p>Este problema nos da los casos o escenarios en los que puede caer el programa. En muchas ocasiones, estos casos no vienen dados. Debemos pensar en ellos y encontrarlos.</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>Usar un condicional compuesto para resolver el problema. En la primera rama, evaluamos el caso feliz, donde a diferente de 0. En la segunda rama, evaluamos los casos donde la solución es imposible o indeterminada.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p>Observamos que no nos piden resolver paso a paso la ecuación. Luego, el despeje de <code>x</code> lo podemos hacer manualmente.</p>
<p><em>Primer diseño</em></p>
<p><em>Pseudocódigo</em></p>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>a</td><td>b</td><td>resultado</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>3</td><td>imposible: -3/0</td></tr>
<tr>
<td>0</td><td>0</td><td>indeterminada: 0/0</td></tr>
<tr>
<td>2</td><td>4</td><td>-2</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">resolver_ecuacion</span>(<span class="hljs-params">a, b</span>):</span>
    <span class="hljs-keyword">if</span> a != <span class="hljs-number">0</span>:
        <span class="hljs-keyword">return</span> -b / a
    <span class="hljs-keyword">elif</span> a == <span class="hljs-number">0</span> <span class="hljs-keyword">and</span> b != <span class="hljs-number">0</span>:
        <span class="hljs-keyword">return</span> <span class="hljs-string">"imposible"</span>
    <span class="hljs-keyword">elif</span> a == <span class="hljs-number">0</span> <span class="hljs-keyword">and</span> b == <span class="hljs-number">0</span>:
        <span class="hljs-keyword">return</span> <span class="hljs-string">"indeterminada"</span>

<span class="hljs-comment"># Ejemplos de uso</span>
print(resolver_ecuacion(<span class="hljs-number">0</span>, <span class="hljs-number">3</span>))  <span class="hljs-comment"># imposible</span>
print(resolver_ecuacion(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>))  <span class="hljs-comment"># indeterminada</span>
print(resolver_ecuacion(<span class="hljs-number">2</span>, <span class="hljs-number">4</span>))  <span class="hljs-comment"># -2</span>
</code></pre>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(1) constante</p>
<p>No hay una colección de datos, es una entrada sola.</p>
<p>Espacio: O(1) constante</p>
<p>No hay una estructura de datos extra que ocupe espacio en memoria.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>Hemos analizado y resuelto una ecuación de primer grado considerando diferentes escenarios. La implementación en código refleja los casos posibles: solución única, solución imposible o solución indeterminada.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[005. Problema: Determinar si un número es decimal]]></title><description><![CDATA[Problema
Determina si un número es decimal. Pide al usuario un número. Devuelve verdadero si es decimal; de lo contrario, devuelve falso.
Ejemplo 1
Entrada: 3.1416
Salida: true

Ejemplo 2
Entrada: 80
Salida: false

Consejo: Antes de escribir código d...]]></description><link>https://programacionlogica.com/005-problema-determinar-si-un-numero-es-decimal</link><guid isPermaLink="true">https://programacionlogica.com/005-problema-determinar-si-un-numero-es-decimal</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Tue, 14 Nov 2023 02:43:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/4ApmfdVo32Q/upload/2786dbf3bb4881fa7ac6a674919c0c0b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-problema">Problema</h2>
<p>Determina si un número es decimal. Pide al usuario un número. Devuelve verdadero si es decimal; de lo contrario, devuelve falso.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 3.1416
Salida: true
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 80
Salida: false
</code></pre>
<p><em>Consejo: Antes de escribir código debes saber cómo se resuelve el problema a mano. Piensa en cómo lo resuelves sin código. Haz el algoritmo paso a paso en un papel o en el editor de código. Luego, compara con el artículo.</em></p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Debemos pedir un número al usuario, luego calcular si es decimal o no y devolver verdadero o falso según el caso.</p>
<p>Suponemos que la entrada de dato es correcta.</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>Se me ocurren dos ideas de solución.</p>
<ol>
<li><p>Comparar el número contra el número truncado a la parte entera. Si son iguales, es entero; de lo contrario, decimal.</p>
</li>
<li><p>Usar el operador módulo con 1. Si el resultado es diferente de 0, entonces es decimal.</p>
</li>
</ol>
<p>Elegí la primera porque trabajamos con el operador módulo en el problema anterior.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p><em>Primer diseño</em></p>
<pre><code class="lang-plaintext">1. Leer el número
2. Calcular si es decimal
3. Escribir el resultado
</code></pre>
<p><em>Refinamiento</em></p>
<pre><code class="lang-plaintext">1. Pedir el número
2. Leer el número
3. Truncar el número
4. Comparar el número contra el número truncado
5. Escribir el resultado
</code></pre>
<p><em>¿Cómo truncar un número?</em></p>
<p>Truncar un número es reducir el número de dígitos decimales.</p>
<p>La mayoría de lenguajes de programación tienen incorporada esta tarea. Suele llamarse <code>Truncar()</code>.</p>
<p>Las tareas que vienen implementadas por el lenguaje se llaman <em>funciones internas</em>. Nos facilitan la vida porque no tenemos que desarrollarlas.</p>
<p><em>Pseudocódigo</em></p>
<pre><code class="lang-plaintext"># variables
real: numero
cadena: entrada

inicio
    escribir("Ingresa un número (decimal o entero): ")
    leer(entrada)
    // convertir número a decimal
    si numero &lt;&gt; Truncar(numero)
        escribir(true)
    si no
        escribir(false)
    fin si
fin
</code></pre>
<p>Observa que en lugar de escribir una condición compuesta</p>
<pre><code class="lang-plaintext">si numero &lt;&gt; Truncar(numero)
    escribir(true)
si no
    escribir(false)
fin si
</code></pre>
<p>podemos mejorar nuestro código usando este patrón para ahorrarnos el <code>si no [else]</code></p>
<pre><code class="lang-plaintext">esDecimal ← false
si numero &lt;&gt; Truncar(numero)
    esDecimal ← true
fin si

escribir(esDecimal)
</code></pre>
<p>Pasos</p>
<ol>
<li><p>Declaramos una variable con el estado/acción que tendría el bloque <code>si no</code>: <code>esDecimal ← false</code>.</p>
</li>
<li><p>Eliminamos el bloque <code>si no</code>.</p>
</li>
<li><p>Dentro del bloque <code>si</code>, actualizamos el valor de <code>esDecimal</code> al estado que le corresponde: <code>esDecimal ← true</code>.</p>
</li>
</ol>
<p>El código es más compacto y legible. Además, separamos la salida del cálculo; la función <code>escribir()</code> quedó fuera del bloque <code>si</code>.</p>
<p><em>Refactorizar</em></p>
<p>Lo que acabamos de hacer se llama <em>refactorizar</em>. Refactorizar es reesctructurar el código sin cambiar su comportamiento. Esto sirve para mejorar la calidad, legibilidad y mantenibilidad del código.</p>
<p>Siempre que puedas, refactoriza tu código. Es una excelente práctica para mejorar. Casi siempre podemos encontrar elementos defectuosos, repetidos o innecesarios.</p>
<p>Al final, no te olvides de comprobar que el programa funciona. Recuerda que el mejor algoritmo o programa es el que funciona; no el que se ve más bonito.</p>
<blockquote>
<p>Refactorizar es reesctructurar el código sin cambiar su comportamiento.</p>
</blockquote>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>numero</td><td>Truncar(numero)</td><td>esDecimal</td></tr>
</thead>
<tbody>
<tr>
<td>3.14</td><td>3</td><td>verdadero</td></tr>
<tr>
<td>5</td><td>5</td><td>falso</td></tr>
</tbody>
</table>
</div><h2 id="heading-3-codificacion">3. Codificación</h2>
<p>En ocasiones hay que modificar el algoritmo para traducirlo al lenguaje de programación.</p>
<p><em>Convertir entrada a tipo numérico</em></p>
<p>En este caso, tenemos que hacer un paso extra, convertir la entrada del usuario a un tipo numérico. ¿Por qué? Porque, por defecto, las entradas de usuario son de tipo cadena, aunque sean números.</p>
<p><em>Tipos de datos numéricos</em></p>
<p>Hay lenguajes que tienen diferentes tipos de datos numéricos dependiendo de si son decimales o enteros, y de la longitud de datos que pueden guardar.</p>
<pre><code class="lang-python">entrada = input(<span class="hljs-string">"Ingresa un número -decimal o entero-: "</span>)
numero = float(entrada)

esDecimal = <span class="hljs-literal">False</span>
<span class="hljs-keyword">if</span> numero != int(numero):
    esDecimal = <span class="hljs-literal">True</span>

print(esDecimal)
</code></pre>
<p>Comentarios:</p>
<ul>
<li><p>La funcion <code>input()</code> sirve para leer una entrada de usuario. Puede recibir como argumento un mensaje para el usuario que se imprime en consola.</p>
</li>
<li><p>La función <code>float()</code> convierte una cadena o número entero a número decimal.</p>
</li>
<li><p>Convertimos la entrada a <code>float</code> para no perder datos. Si convertimos la entrada a entero, y el usuario ingresó un número decimal, perderíamos datos.</p>
</li>
<li><p>La funcion <code>int()</code> convierte una cadena a entero. Sirve también para truncar la parte decimal de un número.</p>
</li>
<li><p>En lugar de <code>int()</code>, también se puede usar la función <code>math.trunc()</code>.</p>
</li>
</ul>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(1) constante</p>
<p>No hay una colección de datos, es una entrada sola.</p>
<p>Espacio: O(1) constante</p>
<p>No hay una estructura de datos extra que ocupe espacio en memoria.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[004. Problema: Determinar si en un conjunto de números naturales...]]></title><description><![CDATA[Problema
Determina en un conjunto de 5 números naturales:

¿Cuántos son menores de 15?

¿Cuántos son mayores de 500?

¿Cuántos están comprendidos entre 25 y 50?


Ejemplo 1
Entrada: 2,1000,500,20,800
Salida:
    menores 15: 1
    mayores 500: 2
    e...]]></description><link>https://programacionlogica.com/004-problema-determinar-si-en-un-conjunto-de-numeros-naturales</link><guid isPermaLink="true">https://programacionlogica.com/004-problema-determinar-si-en-un-conjunto-de-numeros-naturales</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Mon, 13 Nov 2023 00:08:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cYRMl1HeuVo/upload/27e3cbef49568173d6d1f67bedaf624f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-problema">Problema</h2>
<p>Determina en un conjunto de 5 números naturales:</p>
<ol>
<li><p>¿Cuántos son menores de 15?</p>
</li>
<li><p>¿Cuántos son mayores de 500?</p>
</li>
<li><p>¿Cuántos están comprendidos entre 25 y 50?</p>
</li>
</ol>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 2,1000,500,20,800
Salida:
    menores 15: 1
    mayores 500: 2
    entre 25 y 50: 0
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 300, 45, 1, 600, 10
Salida:
    menores 15: 2
    mayores 500: 1
    entre 25 y 50: 1
</code></pre>
<p><em>Consejo: Antes de escribir código debes saber cómo se resuelve el problema</em> a mano. <em>Piensa en cómo lo resuelves. Haz el algoritmo</em> paso a paso <em>en un papel o en el editor de código</em>.</p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Nos dan una lista de 10 números enteros naturales. El cálculo es contar cuántos elementos cumplen cada una de las condiciones.</p>
<p>En el rango entre 25 y 50, el 50 está incluído.</p>
<p>Suponemos que los elementos de la entrada son válidos.</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>Recorrer cada elemento de la lista y preguntar si se cumplen las condiciones.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p><em>Primer diseño</em></p>
<pre><code class="lang-plaintext">1. Preguntar si el número es menor a A
2. Preguntar si el número es mayor a B
3. Preguntar si el número está entre C y D
</code></pre>
<p><em>Estructuras de decisión: condicionales</em></p>
<p>Estas estructuras nos permiten condicionar qué va a pasar o no en el algoritmo. Si la condición se cumple, se ejecuta una acción. Las condicionales imitan la decisiones humanas. Con ellas añadimos inteligencia al algoritmo, una capacidad de decisión.</p>
<p>Las condiciones se resuelven en verdadero o falso.</p>
<p>Hay 3 tipos de condiciones:</p>
<ul>
<li><em>Condicional simple</em>: Ejecuta una acción si la condición es verdadera.</li>
</ul>
<pre><code class="lang-plaintext">si condición
    acción 1
fin si
</code></pre>
<ul>
<li><em>Condicional doble o compuesta</em>: Ejecuta una acción si la condición es verdadera; otra ación, si es falsa.</li>
</ul>
<pre><code class="lang-plaintext">si condición
    acción 1
si no 
    acción 2
fin si
</code></pre>
<ul>
<li><em>Condicional múltiple</em>: Ejecuta diferentes acciones dependiendo de sus codiciones respectivas. Cada condición es una rama. El flujo se detiene cuando se cumple una condición; no se evalúan las restantes.</li>
</ul>
<pre><code class="lang-plaintext">si condición 1
    acción 1
pero si condición 2
    acción 2
pero si condición 3
    acción 3
por defecto
    acción 4
fin si
</code></pre>
<p>En este problema tenemos 3 condicionales simples porque cada condición es independiente.</p>
<p><em>Pseudocódigo</em></p>
<pre><code class="lang-plaintext"># variables
lista ← [entrada]
enteros contadorA = 0 
        contadorB = 0
        contadorC = 0
        A = 15
        B = 500
        C = 25
        D = 50

inicio
    para cada elemento en lista hacer
        si elemento &lt; A entonces
            contadorA++
        fin si
        si elemento &gt; B entonces
            contadorB++
        fin si
        si elemento &gt;= C Y elemento &lt;= D entonces
            contadorC++
        fin si
    fin para cada

    escribir('Menores a {A}: {contadorA}')
    escribir('Mayores a {B}: {contadorB}')
    escribir('Entre {C} y {D}: {contadorc}')
fin
</code></pre>
<p>Agregamos flexibilidad al algoritmo al colocar en constantes los valores de las condiciones. Así, podemos cambiar esos valores y el programa seguirá funcionando.</p>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>elemento</td><td>elemento &lt; 15</td><td>elemento &gt; 500</td><td>elemento &gt;= 25 Y elemento &lt;= 50</td></tr>
</thead>
<tbody>
<tr>
<td>2</td><td>contadorA = 1</td><td></td><td></td></tr>
<tr>
<td>1000</td><td></td><td>contadorB = 1</td><td></td></tr>
<tr>
<td>500</td><td></td><td></td><td></td></tr>
<tr>
<td>20</td><td></td><td></td><td></td></tr>
<tr>
<td>800</td><td></td><td>contadorB = 2</td></tr>
</tbody>
</table>
</div><p>Comprueba el algoritmo con la segunda entrada del problema.</p>
<h2 id="heading-3-codificacion">3. Codificación</h2>
<pre><code class="lang-python"><span class="hljs-comment"># entrada </span>
lista = lista = [<span class="hljs-number">2</span>,<span class="hljs-number">1000</span>,<span class="hljs-number">500</span>,<span class="hljs-number">20</span>,<span class="hljs-number">800</span>]
contador_a = <span class="hljs-number">0</span>
contador_b = <span class="hljs-number">0</span>
contador_c = <span class="hljs-number">0</span>
A = <span class="hljs-number">15</span>
B = <span class="hljs-number">500</span>
C = <span class="hljs-number">25</span>
D = <span class="hljs-number">50</span>

<span class="hljs-comment"># cálculo</span>
<span class="hljs-keyword">for</span> elemento <span class="hljs-keyword">in</span> lista:
    <span class="hljs-keyword">if</span> elemento &lt; A:
        contador_a += <span class="hljs-number">1</span>
    <span class="hljs-keyword">if</span> elemento &gt; B:
        contador_b += <span class="hljs-number">1</span>
    <span class="hljs-keyword">if</span> elemento &gt;= C <span class="hljs-keyword">and</span> elemento &lt;= D:
        contador_c += <span class="hljs-number">1</span>

<span class="hljs-comment"># salida</span>
print(<span class="hljs-string">f"Menores a <span class="hljs-subst">{A}</span>: <span class="hljs-subst">{contador_a}</span>"</span>)
print(<span class="hljs-string">f"Mayores a <span class="hljs-subst">{B}</span>: <span class="hljs-subst">{contador_b}</span>"</span>)
print(<span class="hljs-string">f"Entre <span class="hljs-subst">{C}</span> Y <span class="hljs-subst">{D}</span>: <span class="hljs-subst">{contador_c}</span>"</span>)
</code></pre>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(n)</p>
<p>Es lineal porque recorre una vez la lista para realizar el cálculo.</p>
<p>Espacio: O(1)</p>
<p>Es constante porque no utiliza una estructura de datos extra.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[003. Problema: Calcular pares e impares]]></title><description><![CDATA[Problema
Dados 10 números enteros:

Imprime la suma de los números pares.

Imprime cuántos números pares hay.

Imprime el promedio de los números impares.


Ejemplo 1
Entrada: 1,2,3,4,5,6,7,8,9,10
Salida: 
    suma pares: 30
    números pares: 5
    ...]]></description><link>https://programacionlogica.com/003-problema-calcular-pares-e-impares</link><guid isPermaLink="true">https://programacionlogica.com/003-problema-calcular-pares-e-impares</guid><category><![CDATA[Programación]]></category><category><![CDATA[algortimos]]></category><category><![CDATA[nivel básico]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Sun, 12 Nov 2023 01:18:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/JhevWHCbVyw/upload/f4fa974e6f6aeff0e416c741a8a7222b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-problema">Problema</h2>
<p>Dados 10 números enteros:</p>
<ol>
<li><p>Imprime la suma de los números pares.</p>
</li>
<li><p>Imprime cuántos números pares hay.</p>
</li>
<li><p>Imprime el promedio de los números impares.</p>
</li>
</ol>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: 1,2,3,4,5,6,7,8,9,10
Salida: 
    suma pares: 30
    números pares: 5
    promedio impares: 5
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: 11,12,13,14,15,16,17,18,19,20
Salida:
    suma pares: 80
    números pares: 5
    promedio impares: 15
</code></pre>
<p><em>Consejo</em></p>
<p>Antes de escribir código debes saber cómo se resuelve el problema a mano. Piensa en cómo lo resuelves. Haz el plan o algoritmo en un papel o en el editor de código.</p>
<h2 id="heading-1-analisis">1. Análisis</h2>
<p>Nos dan una lista de 10 números. Debemos hacer los 3 cálculos solicitados: suma de los pares, número de pares y promedio de los impares.</p>
<p>Suponemos que son naturales y que todos los elementos de la entrada son válidos.</p>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<p>Recorrer la lista y hacer los cálculos correspondientes.</p>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p><em>Primer diseño</em></p>
<pre><code class="lang-plaintext">1. Calcular suma de pares
2. Calcular número de pares
3. Calcular el promedio de los impares
</code></pre>
<p><em>Refinamiento</em></p>
<pre><code class="lang-plaintext">1. si par, entonces
2. guardar valor en un acumulador
3. aumentar el contador de pares
4. si impar, entonces
5. guardar valor en un acumulador
6. aumentar el contador de impares
7. repetir por cada elemento de la lista
8. calcular promedio
9. imprimir resultado: 
    suma pares, 
    cantidad pares, 
    promedio impares
</code></pre>
<p>En este problema, necesitamos saber calcular 3 cosas:</p>
<ul>
<li><p>¿Cómo calcular el promedio?</p>
</li>
<li><p>¿Cómo calcular si un número es par?</p>
</li>
<li><p>¿Cómo guardar valores acumulativamente en una variable?</p>
</li>
</ul>
<p><em>Calcular el promedio</em></p>
<p>El promedio es la suma de los elementos de un conjunto dividido entre el número de ellos.</p>
<pre><code class="lang-plaintext">(1+2+3+4+5+6+7+8+9+10) / 10
</code></pre>
<p><em>Calcular si un número es par con el operador módulo</em></p>
<p>El operardor módulo o resto es una operación que devuelve el resto de la división entre dos números. En otras palabras, es lo que sobra en la división cuando no es exacta. Por ejemplo, el resto de 5 / 2 es 1.</p>
<ul>
<li><p>División entera de 5 / 2 = 2</p>
</li>
<li><p>Módulo o resto de 5 / 2 = 1</p>
</li>
</ul>
<p>El operador módulo se suele usar para</p>
<ul>
<li><p>verificar si un número es divisible entre otro</p>
</li>
<li><p>obtener el último dígito de un número</p>
</li>
</ul>
<p>Representamos el operador módulo con <code>mod</code> o el símbolo <code>%</code>.</p>
<p>¿Cómo sabemos si un número es par? Aquí hacemos dos operaciones.</p>
<ul>
<li><p>Primero, calculamos el módulo <code>1 % 2</code>.</p>
</li>
<li><p>Luego, comparamos si el resultado es igual a 0.</p>
</li>
</ul>
<p>Expresamos las dos operaciones de forma abreviada así: <code>1 % 2 == 0</code>.</p>
<pre><code class="lang-python"><span class="hljs-number">1</span> % <span class="hljs-number">2</span>     <span class="hljs-comment">#  1</span>
<span class="hljs-number">1</span> == <span class="hljs-number">0</span>    <span class="hljs-comment"># falso</span>
</code></pre>
<p>1 módulo 2 es 1. 1 no es igual a 0. Por lo tanto, 1 no es par.</p>
<pre><code class="lang-python"><span class="hljs-number">2</span> % <span class="hljs-number">2</span>     <span class="hljs-comment"># 0</span>
<span class="hljs-number">0</span> == <span class="hljs-number">0</span>    <span class="hljs-comment"># verdadero</span>
</code></pre>
<p>2 módulo 2 es 0. 0 es igual a 0. Por lo tanto, 2 es par.</p>
<p><em>Variable acumuladora</em></p>
<p>Una variable acumuladora sirve para almacenar y actualizar valores. La diferencia con una variable normal es que agrega un nuevo valor al que ya tiene.</p>
<p>Generalmente, usamos las variables acumuladoras dentro de ciclos. Cada iteración del ciclo suma un nuevo valor.</p>
<p><em>Patron de código de variable acumuladora</em></p>
<blockquote>
<p>nombre ← valor inicial + valor actual</p>
</blockquote>
<p>El valor inicial suele ser 0 porque es un valor neutro.</p>
<p>Aquí utilizamos un par de variables acumuladoras; una para guardar la suma de los elementos pares, otra la de los impares.</p>
<p><em>Pseudocódigo</em></p>
<pre><code class="lang-plaintext"># variables
lista [entrada]
entero 
    SumaPares ← 0, SumaImpares ← 0, 
    ContadorPares ← 0, ContadorImpares ← 0

inicio
    por cada elemento en lista
        si elemento == par entonces (elemnto % 2 == 0)
            SumaPares ← SumaPares + elemento
            ContadorPares++
        fin si
        si no 
            SumaImpares ← SumaImpares + elemento
            ContadorImpares++
        fin si no
    fin por cada
    escribir('suma pares:', SumaPares)
    escribir('número pares:', ContadorPares)
    escribir('promedio impares:',SumaImpares/ContadorImpares)
fin
</code></pre>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>i</td><td>SumaPares</td><td>ContadorPares</td><td>SumaImpares</td><td>ContadorImpares</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>0</td><td>0</td><td>1</td><td>1</td></tr>
<tr>
<td>1</td><td>2</td><td>1</td><td></td><td></td></tr>
<tr>
<td>2</td><td></td><td></td><td>4</td><td>2</td></tr>
<tr>
<td>...</td><td></td><td></td><td></td><td></td></tr>
<tr>
<td>9</td><td>30</td><td>5</td><td>25</td><td>5</td></tr>
</tbody>
</table>
</div><p>Comprueba el algoritmo con la segunda entrada del problema.</p>
<h2 id="heading-3-codificacion">3. Codificación</h2>
<pre><code class="lang-python"><span class="hljs-comment"># entrada</span>
lista = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>,<span class="hljs-number">9</span>,<span class="hljs-number">10</span>]

sumaPares = <span class="hljs-number">0</span>
sumaImpares = <span class="hljs-number">0</span>
contadorPares = <span class="hljs-number">0</span>
contadorImpares = <span class="hljs-number">0</span>
promedioImpares = <span class="hljs-number">0</span>

<span class="hljs-comment"># cálculo</span>
<span class="hljs-keyword">for</span> elemento <span class="hljs-keyword">in</span> lista:
    <span class="hljs-keyword">if</span> elemento % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>:
      sumaPares = sumaPares + elemento
      contadorPares+=<span class="hljs-number">1</span>
    <span class="hljs-keyword">else</span>:
      sumaImpares = sumaImpares + elemento
      contadorImpares+=<span class="hljs-number">1</span>

promedioImpares = sumaImpares/contadorImpares

<span class="hljs-comment"># salida</span>
print(<span class="hljs-string">"Suma pares&gt; "</span>, sumaPares)
print(<span class="hljs-string">"Cantidad pares&gt; "</span>, contadorPares)
print(<span class="hljs-string">"Promedio impares&gt; "</span>, promedioImpares)
</code></pre>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(n)</p>
<p>Es lineal porque recorre una vez la lista para realizar el cálculo.</p>
<p>Espacio: O(1) constante</p>
<p>Es constante porque no utiliza una estructura de datos extra.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[002. Problema: Calcular los primeros multiplos de un número]]></title><description><![CDATA[Problema
Calcula los x primeros múltiplos de un número dado llamado base. x y base deben ser ingresados por teclado. Imprime el resultado.
Ejemplo 1
Entrada: x = 4, base = 4
Salida: 4, 8, 12, 16

Ejemplo 2
Entrada: x = 3, base = 5
Salida: 5, 10, 15

...]]></description><link>https://programacionlogica.com/002-problema-calcular-los-primeros-multiplos-de-un-numero</link><guid isPermaLink="true">https://programacionlogica.com/002-problema-calcular-los-primeros-multiplos-de-un-numero</guid><category><![CDATA[Programación]]></category><category><![CDATA[Ejercicios]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Sat, 30 Sep 2023 01:08:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cHhbULJbPwM/upload/fe9216fbfc3e2be2ba63fe0eea3a1b29.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-problema">Problema</h2>
<p>Calcula los <code>x</code> primeros múltiplos de un número dado llamado <code>base</code>. <code>x</code> y <code>base</code> deben ser ingresados por teclado. Imprime el resultado.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: x = 4, base = 4
Salida: 4, 8, 12, 16
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: x = 3, base = 5
Salida: 5, 10, 15
</code></pre>
<div data-node-type="callout">
<div data-node-type="callout-emoji">✏</div>
<div data-node-type="callout-text">Resuleve el problema solo. Escribe a mano o en tu editor de código tu solución. Compara tu solución con el artículo.</div>
</div>

<h2 id="heading-1-analisis">1. Análisis</h2>
<ul>
<li><p>Los múltiplos son números que son se obtienen al mutiplicar un número por otro. En palabras simples, nos piden calcular la tabla de multiplicar de un número base, del 1 hasta el número x.</p>
</li>
<li><p>Entrada son números enteros. Salida son números enteros.</p>
</li>
<li><p>Asumimos que el cálculo incluye el número x, y que todas las entradas son válidas.</p>
</li>
</ul>
<h2 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<ul>
<li><p>Usar un ciclo para resolver el problema porque la solución es repetir una multiplicación.</p>
</li>
<li><p>El problema no pide una estructura de datos.</p>
</li>
</ul>
<h3 id="heading-2-diseno">2. Diseño</h3>
<p><em>Primer diseño</em></p>
<pre><code class="lang-plaintext">1. Pedir al usuario x y base
2. Multiplicar 1 x base
2. Multiplicar 2 x base...
x. Multiplicar x x base
</code></pre>
<p><em>Refinamiento 1</em></p>
<pre><code class="lang-plaintext">1. Pedir x
2. Pedir base
3. Multiplicar base * i
4. Escribir resultado
5. Repetir hasta que i sea igual o menor a x
</code></pre>
<p><em>Refinamiento 2</em></p>
<pre><code class="lang-plaintext">1. Pedir x
leer x
Convertir x a entero
Guardar valor entero en x
2. Pedir base
leer base
Convertir base a entero
Guardar valor entero en base
4. Escribir base * i
5. Repetir hasta que i sea igual o menor a x
</code></pre>
<p>Los datos que ingresa el usuario, aunque sean números, son de tipo cadena. Debemos convertirlos a enteros para manejarlos como tal. Esto lo hacemos con una función interna del lenguaje de programación a la que llamamos, arbitrariamente, ConvertirEntero().</p>
<p>Inicializamos <code>i</code> en 1, porque el problema comienza en 1.</p>
<p><em>Pseudocódigo</em></p>
<pre><code class="lang-plaintext">Algoritmo Obtner múltiplos
# variables
enteros: x, base, i ← 1

inicio
    escribir("Escribe el número de multiplos: ")
    x ← ConvertirEntero(leer(x))
    escribir("Escribe la base: ")
    base ← ConvertirEntero(leer(base))

    mientras i &lt;= x hacer
        escribir(base * i)
        i++
    fin mientras
fin
</code></pre>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<p>Ejemplo 1</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>i</td><td>salida</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>4 * 1 = 4</td></tr>
<tr>
<td>2</td><td>4 * 2 = 8</td></tr>
<tr>
<td>3</td><td>4 * 3 = 12</td></tr>
<tr>
<td>4</td><td>4 * 4 = 16</td></tr>
</tbody>
</table>
</div><p>El programa se comporta de la forma deseada.</p>
<h2 id="heading-3-codificacion">3. Codificación</h2>
<p>He aquí la codificación en Python.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Programa Calcular los primeros x múltiplos</span>

print(<span class="hljs-string">"Escribe el número de múltiplos:"</span>, end=<span class="hljs-string">" "</span>)
x = input()
x = int(x)

print(<span class="hljs-string">"Escribe el número:"</span>, end=<span class="hljs-string">" "</span>)
base = input()
base = int(base)

i = <span class="hljs-number">1</span>
<span class="hljs-keyword">while</span> i &lt;= x:
    print(base * i)
    i+=<span class="hljs-number">1</span>
</code></pre>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(n) -lineal- porque depende el número de múltiplos <code>x</code>.</p>
<p>Espacio: O(1) -constante- porque no se necesita una estructura de datos adicional.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[001. Problema: Obtener el promedio de una lista de calificaciones]]></title><description><![CDATA[Problema
Dada una lista de calificaciones, calcula el promedio de un salón de clases. Las calificaciones son números enteros.
Ejemplo 1
Entrada: [10,9,9,8,5]
Salida: 8.2

Ejemplo 2
Entrada: [8,7,9,10,6]
Salida: 8


✏
Resuleve el problema solo. Escrib...]]></description><link>https://programacionlogica.com/001-problema-obtener-el-promedio-de-una-lista-de-calificaciones</link><guid isPermaLink="true">https://programacionlogica.com/001-problema-obtener-el-promedio-de-una-lista-de-calificaciones</guid><category><![CDATA[Programación]]></category><category><![CDATA[Ejercicios]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Fri, 29 Sep 2023 23:15:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/_zsL306fDck/upload/2c861f7a9667b3a9a36c9ad160544343.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-problema">Problema</h2>
<p>Dada una lista de calificaciones, calcula el promedio de un salón de clases. Las calificaciones son números enteros.</p>
<pre><code class="lang-plaintext">Ejemplo 1
Entrada: [10,9,9,8,5]
Salida: 8.2
</code></pre>
<pre><code class="lang-plaintext">Ejemplo 2
Entrada: [8,7,9,10,6]
Salida: 8
</code></pre>
<div data-node-type="callout">
<div data-node-type="callout-emoji">✏</div>
<div data-node-type="callout-text">Resuleve el problema solo. Escribe a mano o en tu editor de código tu solución. Compara tu solución con el artículo.</div>
</div>

<h2 id="heading-1-analisis">1. Análisis</h2>
<ul>
<li><p>Entrada es una lista de números enteros; la salida es un número decimal.</p>
</li>
<li><p>Piden calcular el promedio. El promedio es la suma de los datos divididos por el número de estos.</p>
</li>
<li><p>Asumimos que las calificaciones miden del 0 al 10, que la lista no puede estar vacía, y que todos los datos son correctos.</p>
</li>
</ul>
<h2 id="heading-2-diseno">2. Diseño</h2>
<h3 id="heading-1-idea-de-solucion">1. Idea de solución</h3>
<ul>
<li><p>Usar la función interna Suma(). Pero eso hace todo el trabajo. Por lo tanto, queda fuera.</p>
</li>
<li><p>Usar un ciclo para obtener el promedio. Elegimos esta.</p>
</li>
</ul>
<h3 id="heading-2-diseno-del-algoritmo">2. Diseño del algoritmo</h3>
<p>La técnica para resolver problemas de programación consiste en dividir el problema en problemas más simples.</p>
<p>Luego, refinamos el diseño para lograr pasos concretos hasta completar todos los pasos necesarios para resolver el problema.</p>
<p><em>El primer diseño</em></p>
<pre><code class="lang-plaintext">1. Sumar las calificaciones
2. Obtener el promedio
</code></pre>
<p><em>Primer refinamiento</em></p>
<pre><code class="lang-plaintext">1. Sumar las calificaciones
    1. Sumar una calificación con la siguiente
    2. Guardar el resultado de la suma
2. Repetir la suma hasta sumar todas las calificaciones
3. Dividir el resultado de la suma por la cantidad de calificaciones
4. Escribir el promedio
</code></pre>
<p><em>Segundo refinamiento</em></p>
<p>Inicializamos la variable <code>suma</code> en 0 para guardar el resultado de las sumas. 0 es un valor neutro. Al sumar 0 + un número, obtenemos el número.</p>
<p>Sumamos la calificación actual a <code>suma</code>. Esto porque visitamos una calificación de la lista de calificaciones a cada paso del ciclo. Al final, <code>suma</code> contendrá la suma de todas las calificaciones.</p>
<pre><code class="lang-plaintext">1. Sumar las calificaciones 
    1. Asignar 0 a suma
    2. Sumar la calificación actual a suma
    3. Guardar el resultado de la suma
2. Repetir la suma hasta sumar todas las calificaciones
3. Dividir el resultado de la suma por la cantidad de calificaciones 
4. Escribir el promedio
</code></pre>
<p><em>Tercer refinamiento</em></p>
<p>Organicemos las variables que usaremos:</p>
<ul>
<li><p>En la variable <code>tamaño</code> guardamos el número de elementos de la lista de calificaciones.</p>
</li>
<li><p>Asignamos 0 a <code>suma</code>.</p>
</li>
<li><p>Asignamos 0 a <code>i</code> que es la variable de control del ciclo.</p>
</li>
</ul>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Obtenemos el número de elementos de una lista o array con la función interna <code>Longitud</code>.</div>
</div>

<p>Usaremos un ciclo <code>mientras</code>. El ciclo se va a repetir mientras <code>i &lt; tamaño</code>.</p>
<p>En cada paso del ciclo se ejecuta:</p>
<ul>
<li><p><code>suma ← suma + calificaciones[i]</code></p>
</li>
<li><p><code>i++</code></p>
</li>
</ul>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Es muy importante no olvidar aumentar la variable de control <code>i</code>. De lo contrario, el ciclo caerá en un ciclo infinito. Esto porque <code>i</code> siempre va a ser 0. Por lo tanto, la condición de parada del ciclo <code>i &lt; tamaño</code> siempre evaluará <code>true</code>.</div>
</div>

<p>Ejecutemos en seco dos pasos del ciclo para ver qué estamos haciendo.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>i</td><td>suma</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>0 + 10 = 10</td></tr>
<tr>
<td>1</td><td>10 + 9 = 19 ...</td></tr>
</tbody>
</table>
</div><p><em>Diseño final en pseudocódigo</em></p>
<pre><code class="lang-plaintext">Algoritmo Promedio:

# Variables
array[n] enteros: calificaciones
real: suma ← 0
entero: i ← 0
        tamaño ← Longitud(calificaciones)

inicio
    mientras i &lt; tamaño hacer
        suma ← suma + calificaciones[i]
        i++
    fin mientras
    escribir(suma / tamaño)
fin
</code></pre>
<h3 id="heading-3-comprobacion-en-seco">3. Comprobación en seco</h3>
<p>Ejecutamos en seco el algoritmo para comprobarlo paso a paso.</p>
<p>Ejemplo 1</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>i</td><td>suma</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>10</td></tr>
<tr>
<td>1</td><td>19</td></tr>
<tr>
<td>2</td><td>28</td></tr>
<tr>
<td>3</td><td>36</td></tr>
<tr>
<td>4</td><td>41</td></tr>
</tbody>
</table>
</div><p>Promedio = 8.2</p>
<p>Al parecer, nuestro algoritmo es correcto. Hicimos un buen trabajo.</p>
<p>Ahora es tu turno. Ejecuta en seco el algoritmo con los datos del ejemplo 2.</p>
<h2 id="heading-3-codificacion">3. Codificación</h2>
<p>Una vez que tenemos el algoritmo, podemos traducirlo a cualquier lenguaje de programación. He aquí el algoritmo codificado en Python.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Programa Promedio</span>
<span class="hljs-comment"># variables</span>
calificaciones = [<span class="hljs-number">10</span>,<span class="hljs-number">9</span>,<span class="hljs-number">9</span>,<span class="hljs-number">8</span>,<span class="hljs-number">5</span>]
tamanio = len(calificaciones)
suma = <span class="hljs-number">0</span>

<span class="hljs-comment"># Obtener la suma de las calificaciones</span>
i = <span class="hljs-number">0</span>
<span class="hljs-keyword">while</span> i &lt; tamanio:
    suma = suma + calificaciones[i]
    i+=<span class="hljs-number">1</span> 

<span class="hljs-comment"># Salida</span>
print(suma/tamanio)
</code></pre>
<p>Comprueba el programa ejecutándolo. Si encuentras errores, es necesario depurar el programa. Depurar es estudiar el código para encontrar el error y solucionarlo.</p>
<h2 id="heading-4-complejidad">4. Complejidad</h2>
<p>Tiempo: O(n) (lineal) porque el algoritmo debe recorrer cada elemento de la lista.</p>
<p>Espacio: O(1) (constante) porque el algoritmo no utiliza una estructura de datos adicional.</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
]]></content:encoded></item><item><title><![CDATA[¿Cómo resolver problemas de programación?]]></title><description><![CDATA[Resumen
En breve, este es el marco de trabajo:

Asegúrate de entender bien el problema.

Diseña el algoritmo

Piensa en una idea que pueda resolverlo. Incluye una estructura de datos y una técnica que ayuden a la solución.

Diseña el algoritmo. Desar...]]></description><link>https://programacionlogica.com/como-resolver-problemas-de-programacion</link><guid isPermaLink="true">https://programacionlogica.com/como-resolver-problemas-de-programacion</guid><category><![CDATA[Programación]]></category><category><![CDATA[Diseño de algoritmos]]></category><dc:creator><![CDATA[Gilberto Ramirez]]></dc:creator><pubDate>Mon, 25 Sep 2023 03:26:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ieic5Tq8YMk/upload/a26cdef122a5c57237711dbdef17c8ab.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-resumen">Resumen</h2>
<p>En breve, este es el marco de trabajo:</p>
<ol>
<li><p>Asegúrate de entender bien el problema.</p>
</li>
<li><p>Diseña el algoritmo</p>
<ol>
<li><p>Piensa en una idea que pueda resolverlo. Incluye una estructura de datos y una técnica que ayuden a la solución.</p>
</li>
<li><p>Diseña el algoritmo. Desarrolla esa idea. Es un proceso de dividir el problema en problemas más simples. Luego, refina los pasos hasta tener pasos que se traduzcan en operacionese concretas. Los pasos deben estar completos.</p>
</li>
<li><p>Ejecuta en seco el algortimo.</p>
</li>
</ol>
</li>
<li><p>Codifica: Traduce a código el algoritmo, ejecútalo y comprueba el programa.</p>
</li>
</ol>
<h2 id="heading-introduccion">Introducción</h2>
<p>¿Cuántas veces vemos un problema de leetcode o de algún libro de fundamentos de programación y no sabemos cómo afrontarlo?</p>
<p>Cuando estudiaba en la universidad, acudí con un par de compañeros a algunas sesiones de <em>coding dojo</em> en una empresa de software de mi ciudad llamada Michelada.io. En estas sesiones se proponía un problema, había un tiempo de 30 minutos para resolverlo, al final se compartían las respuestas.</p>
<p>Uno de esos problemas fue convertir un número arábigo a número romano. Recuerdo que me quedé en blanco. No tenía ni idea de cómo comenzar. Mis amigos tuvieron éxito; otros no terminaron, pero tenían idea de cómo continuar.</p>
<p>Me sentí desanimado por este hecho. ¿Qué pasó? ¿Eso significaba que la programación no era para mí, o que debía renunciar a mi proyecto de ser ingeniero de software? Pues no.</p>
<p>No poder resolver un problema no significa que seamos tontos, o que no seamos aptos para programar. Significa que todavía no tenemos demasiada exposición a estos problemas, que necesitamos practicar para mejorar esta habilidad.</p>
<p><em>Acotar el problema</em></p>
<p>Estamos limitando los problemas a problemas de tipo LeetCode.</p>
<p>Generalmente, estos problemas se resuelven eligiendo las estructuras de datos apropiadas, diseñando un algoritmo y codificando la solución en tu lenguaje de programación favorito.</p>
<p>Es una realidad que los problemas de software reales son diferentes a estos ejercicios tipo LeetCode. Sin embargo, desde mi punto de vista, estos ejercicios ayudan a:</p>
<ul>
<li><p>Repasar estructuras de datos.</p>
</li>
<li><p>Diseñar algoritmos.</p>
</li>
<li><p>Apropiarnos de la sintaxis.</p>
</li>
<li><p>Probar en seco un programa.</p>
</li>
<li><p>Practicar para entrevistas técnicas.</p>
</li>
<li><p>Aumentar la confianza en nuestras habilidades.</p>
</li>
</ul>
<h2 id="heading-marco-de-trabajo">Marco de trabajo</h2>
<p>Este es el marco de trabajo:</p>
<ol>
<li><p>Analizar el problema.</p>
</li>
<li><p>Diseñar el algoritmo.</p>
</li>
<li><p>Codificar.</p>
</li>
</ol>
<p>Desarrollemos más estos tres pasos.</p>
<h3 id="heading-1-analizar-el-problema">1 Analizar el problema</h3>
<p>Aristóteles decía que un “error pequeño al inicio se convierte en un error mayor al final”. Si no entendemos el problema, sus partes y límites, no tiene sentido seguir adelante.</p>
<p>¿Qué analizamos aquí? Todo problema de programación se resume en tres partes:</p>
<ul>
<li><p>Entrada de datos.</p>
</li>
<li><p>Procesamiento de esos datos.</p>
</li>
<li><p>Salida de datos.</p>
</li>
</ul>
<p>Debemos entender cuáles son los datos de entrada, cuál es el resultado esperado (porque con ese comprobaremos si nuestro cálculo es correcto) y qué procesamiento vamos a dar a los datos.</p>
<p>Adicionalmente, debemos pensar en los límites o restricciones que tenga el problema. Por ejemplo, ¿los datos son enteros o decimales? ¿Son positivos o negativos? ¿Existen casos límites que exijan una atención especial?</p>
<p>Por último, debemos confirmar nuestras suposiciones. Un enunciado del problema puede ser ambiguo, no explicitar todo lo que debería, o podemos entender una palabra con otro significado al del problema.</p>
<p>El análisis nos dice <em>qué</em> debemos hacer.</p>
<h3 id="heading-2-disenar-el-algoritmo">2 Diseñar el algoritmo</h3>
<p>Programar es diseñar algoritmos para resolver un problema. Es la etapa creativa e intelectual y la más importante.</p>
<p>El algoritmo nos dice <em>cómo</em> se resuelve el problema.</p>
<p>Aterricemos unos pasos para diseñar el algoritmo:</p>
<ol>
<li><p>Idea de solución.</p>
</li>
<li><p>Diseño y refinamiento de pasos.</p>
</li>
<li><p>Comprobación en seco.</p>
</li>
</ol>
<p><em>Idea de solución</em></p>
<p>Después de entender el problema, debemos buscar un recurso, idea o técnica que ayude a resolverlo. Es una idea inicial, no está desarrollada.</p>
<p>La idea inlcuye una técnica de solución y, si es necesario, una estructura de datos.</p>
<p>Existen muchas formas de resolver un mismo problema, así que elige la idea que te parezca más fácil. Por ejemplo, para hallar el área de un triángulo hay varias fórmulas; pero la más común es (b x h) / 2.</p>
<p>¿De dónde sacamos esta idea? Puedes conocerla por aprendizaje o experiencia, deducirla por razonamiento, o pedir ayuda a chat GPT.</p>
<p><em>Diseño y refinamiento de pasos</em></p>
<p>Hasta ahora la idea es genérica y abstracta. Pero las computadoras entienden operaciones concretas. El problema no se resolverá si no hay instrucciones concretas y si no están completas.</p>
<ol>
<li><p>Divide y vencerás: Divide el problema en problemas más simples.</p>
</li>
<li><p>Refina los pasos: Refina o itera sobre tu diseño hasta que tengas pasos concretos.</p>
</li>
</ol>
<p>Escribe los pasos del algoritmo. Existen muchas formas de representar el algoritmo:</p>
<ul>
<li><p>Lenguaje natural.</p>
</li>
<li><p>Pseudocódigo.</p>
</li>
<li><p>Diagrama de flujo.</p>
</li>
<li><p>Diagrama Nassi-Schneiderman.</p>
</li>
<li><p>Fórmula matemática.</p>
</li>
</ul>
<p>Elige una, la que más se te facilite. Yo prefiero el pseudocódigo.</p>
<p><em>Ejecutar en seco</em></p>
<p>Ejecutar en seco sirve para probar manualmente el flujo de tu algoritmo. Es decir, seguimos los valores de las variables en cada paso del algoritmo.</p>
<p>¿Cómo hacemos esto? Haz una tabla con los valores que toman las variables en cada paso del algoritmo. Compara el resultado final con la salida.</p>
<p>Esto es un ejemplo de un algoritmo que saca el promedio de las notas de estudiantes con las notas [10,9,9,8,5]. Salida = 8.2.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>i</td><td>suma</td><td>promedio</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>10</td><td>0</td></tr>
<tr>
<td>1</td><td>19</td><td>0</td></tr>
<tr>
<td>2</td><td>28</td><td>0</td></tr>
<tr>
<td>3</td><td>36</td><td>0</td></tr>
<tr>
<td>4</td><td>41</td><td>8.2</td></tr>
</tbody>
</table>
</div><p>Al ejecutar el algoritmo en seco, comprobamos que el resultado es correcto.</p>
<h3 id="heading-3-codificar">3 Codificar</h3>
<p>Codificar es el último paso de este marco de trabajo. Codificar es traducir a código el algoritmo diseñado.</p>
<ol>
<li><p>Traduce el algoritmo. Revisa si tienes que ajustar el algoritmo a casos particulares del lenguaje de programación.</p>
</li>
<li><p>Ejecuta y comprueba el resultado. Si es el caso, depura el programa para corregir errores.</p>
</li>
<li><p>Analiza su complejidad de tiempo y espacio. Usamos la notación big O. Esto nos dice qué tan eficiente es un algoritmo.</p>
</li>
</ol>
<h2 id="heading-conclusion">Conclusión</h2>
<p>En este artículo expliqué un marco de trabajo para resolver problemas de programación tipo LeetCode.</p>
<p>Se resume en entender el problema, diseñar un algoritmo y codificarlo.</p>
<p>Programar es como redactar una novela. Codificar es como escribir (en el sentido de trazar letras o palabras) no te hace un escritor. Nuestro error es pensar que por saber sintaxis y conceptos de programación ya sabemos programar.</p>
<p>Sin embargo, programar es pensar en cómo resolver un problema usando herramientas computacionales. En otras palabras, es sobre todo diseñar algoritmos.</p>
<p>Un par consejos:</p>
<ul>
<li><p>Comienza practicando problemas fáciles, luego aumenta la dificultad.</p>
</li>
<li><p>Comienza escribiendo a mano el diseño del algoritmo, o en el editor de código si no quieres hacerlo a mano. No lo dejes el diseño en aire, es decir, hacerlo sólo mentalmente. Escribir nos da claridad y nos facilita traducirlo a código.</p>
</li>
</ul>
<p>En los siguientes artículos, resolveré problemas usando este marco de trabajo. Si te interesa, puedes suscribirte y seguirme. ¡Hasta la próxima!</p>
<h2 id="heading-bibliografia">Bibliografía</h2>
<p>Joyanes Aguilar, L. (2008). Fundamentos de programación. Madrid: McGraw-Hill.</p>
<p>Stepwise refinement. (s/f-b). Cornell.edu. Recuperado el 18 de noviembre de 2022, de <a target="_blank" href="https://www.cs.cornell.edu/courses/JavaAndDS/stepwise/stepwise.html">Stepwise refinement[1]</a></p>
<p>Stepwise refinement. (s/f-a). Uct.ac.za. Recuperado el 18 de noviembre de 2022, de <a target="_blank" href="https://www.cs.uct.ac.za/mit_notes/software/htmls/ch07s09.html">Stepwise refinement[2]</a></p>
]]></content:encoded></item></channel></rss>