Programación - 02 Programación Estructurada y Modular. 1DAM. Curso 2022-2023

Overview

Programación - 02 Programación Estructurada y Modular

Tema 02 Programación Estructurada y Modular. 1DAM. Curso 2022/2023.

imagen

Contenidos

  1. Tipos y Operaciones
  2. Constantes y Variables
  3. Algoritmos
  4. Programación Estructurada
  5. Programación Modular

Tipos y Operaciones

Los tipos de datos nos sirven para clasificar nuestra información de entrada y salida y trabajar con ellos. Un tipo lo define en base al valor que puede almacenar y las operaciones que se pueden realizar con él.

  • Tipos simples: Se llama tipo de dato a una clase concreta de objetos o valores: Números, Caracter, Lógicos, etc.
  • Tipos compuestos: arrays, listas, etc, que los veremos más adelante.
// Tipos de datos
// Tipos simples
// Números
var numero: Int = 1
var numero: Double = 1.0
var numero: Float = 1.0f
var numero: Long = 1L
var numero: Short = 1
var numero: Byte = 1
// Caracteres
var caracter: Char = 'a'
// Lógicos
var logico: Boolean = true
// Cadenas
var cadena: String = "Hola"
// Tipos compuestos
// Arrays
var array: Array<Int> = arrayOf(1, 2, 3)
var array: IntArray = intArrayOf(1, 2, 3)
var array: Array<String> = arrayOf("Hola", "Adiós")
var array: Array<Boolean> = arrayOf(true, false)
// Matrices
var matriz: Array<Array<Int>> = arrayOf(arrayOf(1, 2, 3), arrayOf(4, 5, 6))
var matriz: Array<IntArray> = arrayOf(intArrayOf(1, 2, 3), intArrayOf(4, 5, 6))

Lenguajes tipados y no tipados

  • Lenguajes tipados: Los lenguajes tipados son aquellos que requieren que el programador declare el tipo de dato que se va a utilizar en cada variable. En estos lenguajes, el compilador o intérprete comprueba que el tipo de dato de cada variable coincida con el tipo de dato que se ha declarado.
  • Lenguajes débilmente tipados y/o tipado dinámico: Los lenguajes debilmente tipados son aquellos que no requieren que el programador declare el tipo de dato que se va a utilizar en cada variable. El compilador o intérprete deduce el tipo de dato de cada variable en tiempo de ejecución.

Operaciones

  • Aritméticas: +, -, *, /, %, ++, --
  • Relacionales: ==, !=, >, <, >=, <=
  • Lógicas: &&, ||, !
  • Asignación: =, +=, -=, *=, /=, %=

Variables y constantes

A la hora de almacenar datos en memoria, debemos analizar cómo vamos a utilizarlos. Si vamos a modificarlos, debemos utilizar variables, si no, debemos utilizar constantes.

  • Constantes: Son valores que no cambian durante la ejecución del programa. Se declaran con la palabra reservada const/val. Son inmutables.
  • Variables: Son valores que cambian durante la ejecución del programa. Se declaran con la palabra reservada let/var. Son mutables.

Se debe aplicar código limpio y buenas prácticas de programación. para nombrarlas.

// Constantes
const val NUMERO_PI = 3.1416
val NUMERO_E = 2.7182
// Variables
var nombreAlumno = "José Luis"
var edadAlumno = 18

Algoritmo

Un algoritmo es una secuencia ordenada de pasos que conducen a la solución de un problema. Tienen tres características:

  • Son precisos en el orden de realización de los pasos.
  • Están bien definidos de forma que usando un algoritmo varias veces con los mismos datos, dé la misma solución.
  • Son finitos, deben acabarse en algún momento.

Los algoritmos deben representarse de forma independiente del lenguaje de programación que luego usaremos.

Usaremos ordinogramas o diagramas de flujo para representarlos y pseudocódigo

diagrama

pseudocodigo

Programación Estructurada

La programación estructurada es un paradigma de programación que se basa en la estructuración de los programas en tres elementos básicos:

  • Secuencia: Los programas se ejecutan secuencialmente, es decir, una instrucción tras otra.
  • Condicionales: Los programas pueden ejecutar una parte de código u otra dependiendo de una condición.
  • Bucles: Los programas pueden ejecutar una parte de código varias veces.

secuencia

Secuencias

Las secuencias son la base de la programación estructurada. Se ejecutan una tras otra, de arriba a abajo.

// Secuencia
println("Hola")
println("¿Cómo estás?")
// leemos el nombre
val nombre = readln()
println("Encantado de conocerte $nombre")

Condicionales

Los condicionales nos permiten ejecutar una parte de código u otra dependiendo de una condición.

Pueden ser:

  • Condicionales simples: Se ejecuta una parte de código u otra dependiendo de una condición (if). La parte de código que se ejecuta se llama rama verdadera y la otra rama falsa. La parte asociada a else es opcional.
// Condicionales simples
if (edadAlumno >= 18) {
    println("Eres mayor de edad")
} else {
    println("Eres menor de edad")
}
  • Condicionales múltiples: Pueden tener varios casos (if-else-if-else). Se ejecuta una parte de código u otra dependiendo de una condición.
// Condicionales múltiples
if (edadAlumno >= 18) {
    println("Eres mayor de edad")
} else if (edadAlumno >= 16) {
    println("Casi eres mayor de edad")
} else {
    println("Eres menor de edad")
}

Tambien podemos usar switch-case o when para simplificar el if else y evitar efecto Hoduken.

// Condicionales múltiples
when (edadAlumno) {
    18 -> println("Eres mayor de edad")
    16 -> println("Casi eres mayor de edad")
    else -> println("Eres menor de edad")
}

Bucles

Los bucles nos permiten ejecutar una parte de código varias veces. Existen varios tipos

  • Indefinidos: Se ejecutan hasta que se cumple una condición (while). Se ejecuta una parte de código mientras se cumpla una condición. Si queremos que se ejecute al menos una vez, debemos usar do-while. Es importante manejar correctamente las variables que se usan en la condición (banderas o flags) para evitar bucles infinitos.
```kotlin 
// Bucles indefinidos
// Ejemplo while
var i = 0
while (i < 10) {
    println(i)
    i++
}

// Ejemplo do-while
var i = 0
do {
    println(i)
    i++
} while (i < 10)

bucle

  • Definidos: Se ejecutan un número determinado de veces (for) en base a un paso de iteración. Si el paso es 1 no se suele indicar.
// Bucles definidos
// Ejemplo for
for (i in 0..10) {
    println(i)
}

// Con paso 2
for (i in 0..10 step 2) {
    println(i)
}

// descedente
for (i in 10 downTo 0) {
    println(i)
}

// Descedente con paso 3
for (i in 10 downTo 0 step 3) {
    println(i)
}

Comentarios

Los comentarios son fragmentos de código que no se ejecutan. Se usan para documentar el código y explicar lo que hace. Pueden ser de una línea o de varias.

// Comentarios
// Comentario de una línea

/*
Comentario de varias líneas
Para que los veas
*/

Programación Modular

La programación modular es un paradigma de programación que se basa en la modularización de los programas en funciones (y procedimientos). Las funciones son bloques de código que realizan una tarea concreta y devuelven un valor. Los procedimientos son bloques de código que realizan una tarea concreta pero no devuelven ningún valor. Las ventajas que ofrece la programación modular son:

  • Facilita la resolución del problema.
  • Aumenta la claridad y legibilidad de todo el programa.
  • Permite que varios programadores trabajen en el mismo proyecto.
  • Reduce el tiempo de desarrollo ya que se pueden reutilizar esos módulos en varios programas.
  • Aumenta la fiabilidad porque es más sencillo diseñar y depurar módulos y el mantenimiento en mas fácil.

La descomposición modular se basa en la técnica “Divide y Vencerás” (DAC o Divide And Conquer), esta técnica tiene dos pasos:

  • Identificación de los subproblemas y construcción de los módulos que lo resuelven.
  • Combinación de los módulos para resolver el problema original.

DAC

Funciones

Las funciones son bloques de código que realizan una tarea concreta y devuelven un valor.

// Funciones
fun suma(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    println(suma(2, 3))
}

Procedimientos

Los procedimientos son bloques de código que realizan una tarea concreta pero no devuelven ningún valor.

// Procedimientos
fun suma(a: Int, b: Int) {
    println(a + b)
}

fun main() {
    suma(2, 3)
}

Parámetros

Los parámetros son variables que se pasan a una función o procedimiento. Con ellos podemos modificar el comportamiento de la función o procedimiento y devolver un resultado diferente. Desde el lugar donde llamamos a la función se les asigna los valores a estos parámetros

// Parámetros son a y b
fun suma(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    // Los valores 2 y 3 se asignan a los parámetros a y b
    println(suma(2, 3))
}

Paso por valor, copia y paso por referencia

  • Paso por valor: Se crea una copia del valor del parámetro y se pasa a la función. Si se modifica el valor del parámetro dentro de la función, no se modifica el valor original. Es el modelo que hemos estado utilizando hasta ahora y significa que las variables del algoritmo principal que le pasamos al subalgoritmo, no pueden ser modificadas en su valor por dicho subalgoritmo.
// Paso por valor
fun suma(a: Int, b: Int): Int {
    a = a + 1
    return a + b
}
fun main() {
    var a = 2
    var b = 3
    println(suma(a, b))
    println(a) // El valor de a no ha cambiado, porque pasa por valor
}
  • Paso por referencia: Se pasa la dirección de memoria, por lo tanto si modificamos el parámetro dentro de la función, se modifica el valor original. El parámetro del subalgoritmo, es decir, las modificaciones que sufra el parámetro, se reflejan en la variable que usamos en la llamada. En pseudocódigo reflejaremos esta situación con la palabra “Ref”. En los lenguajes actuales los tipos de datos simples pasan siempre por valor y los tipos compuestos pueden pasar por referencia. El paso por referencia se usa sobre todo cuando el subalgoritmo tiene que devolver más de un valor o trabajamos con objetos o estructuras de almacenamiento o colecciones, donde no es necesario indicar el Ref (lo veremos más adelante).
// Paso por referencia, simulamos una llamada con Ref, que no existe en todos los lenguajes
fun suma(a: Ref(Int), b: Ref(Int)): Int {
    a = a + 1
    return a + b
}

fun sumElementosArrray(array: Array<Int>): Int {
    var suma = 0
    for (i in array) {
        suma += i
    }
    // Cambio un elemento del array
    array[0] = 100
    return suma
}

fun main() {
    var a = 2
    var b = 3
    println(suma(a, b))
    println(a) // El valor de a ha cambiado, porque pasa por referencia

    var array = arrayOf(1, 2, 3, 4, 5)
    println(sumElementosArrray(array))
    println(array[0]) // El valor del array ha cambiado, porque pasa por referencia
}

Paso por valor y paso por referencia

Ámbito de variables

El ámbito de una variable es el lugar donde se puede utilizar. Las variables pueden tener ámbito local o global. Las variables locales solo se pueden utilizar dentro de la función o procedimiento donde se han declarado. Las variables globales se pueden utilizar en cualquier parte del programa. Se deben intentar no abusar de las variables globales ya que pueden provocar errores en el programa.

// Ámbito de variables
fun suma(a: Int, b: Int): Int {
    var c = 0 // Variable local
    var d = 0 // Variable local
    return a + b
}

var c = 0 // Variable global
fun main() {
    var a = 2 // Variable local
    var b = 3 // Variable local
    println(suma(a, b))
    println(c) // La variable c es global y se puede utilizar en cualquier parte del programa
}

Paquete o módulo

Un paquete o módulo es un conjunto de funciones y procedimientos que realizan una tarea concreta. Por ejemplo, un paquete de funciones matemáticas, un paquete de funciones de entrada y salida, un paquete de funciones de gestión de arrays, etc. Usamos estos paquetes para agrupar funciones y procedimientos que realizan una tarea concreta y que podemos reutilizar en otros programas o en otras partes del mismo.

// Paquete o módulo
import kotlin.math.* // importamos el paquete kotlin.math

fun main() {
    println(sqrt(4.0))
}

Recursividad

La recursividad es una técnica que consiste en llamar a una función o procedimiento dentro de sí mismo. La función o procedimiento se llama a sí misma hasta que se cumple una condición que hace que la función o procedimiento deje de llamarse a sí misma (condición de parada o salida). Muchos problemas son mucho más sencillos de resolver con recursividad que con iteración. Por ejemplo, el cálculo de un factorial es mucho más sencillo de resolver con recursividad que con iteración.

// Recursividad factorial de un número
fun factorialRec(n: Int): Int {
    if (n == 0) {
        return 1
    } else {
        return n * factorialRec(n - 1)
    }
}

// Iteración factorial de un número
fun factorialIter(n: Int): Int {
    var factorial = 1
    for (i in 1..n) {
        factorial *= i
    }
    return factorial
}

fun main() {
    println(factorialRec(5))
    println(factorialIter(5))
}

Referencias

Recursos

Autor

Codificado con 💖 por José Luis González Sánchez

Twitter GitHub

Contacto

Cualquier cosa que necesites házmelo saber por si puedo ayudarte 💬 .

              

¿Un café?

joseluisgs




Licencia de uso

Este repositorio y todo su contenido está licenciado bajo licencia Creative Commons, si desea saber más, vea la LICENSE. Por favor si compartes, usas o modificas este proyecto cita a su autor, y usa las mismas condiciones para su uso docente, formativo o educativo y no comercial.

Licencia de Creative Commons
JoseLuisGS by José Luis González Sánchez is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
Creado a partir de la obra en https://github.com/joseluisgs.

You might also like...
Projeto das aulas da disciplina de Programação Móvel da turma do 06˚ Periodo do curso de Sistemas de Informação - IFAL - campus Arapiraca.

Programação Móvel - Sistemas de Informação Projeto das aulas da disciplina de Programação Móvel da turma do 06˚ periodo de SI - IFAL - campus Arapirac

OO Boot Camp reference implementation for Jordanian client in Kotlin in January 2022

oo_boot_camp_2022-01-24_kotlin Copyright (c) 2022 by Fred George May be used fre

Clean Android multi-module offline-first scalable app in 2022. Including Jetpack Compose, MVI, Kotlin coroutines/Flow, Kotlin serialization, Hilt and Room.

Android Kotlin starter project - 2022 edition Android starter project, described precisely in this article. Purpose To show good practices using Kotli

A project to show the best way to build an Android app on 2022 (by me).
A project to show the best way to build an Android app on 2022 (by me).

Hello Architecture I create this project to show what's for me the best way to build an Android app on 2022. Architecture I use this diagram as and id

📚  Sample Android Components Architecture on a modular word focused on the scalability, testability and maintainability written in Kotlin, following best practices using Jetpack.
📚 Sample Android Components Architecture on a modular word focused on the scalability, testability and maintainability written in Kotlin, following best practices using Jetpack.

Android Components Architecture in a Modular Word Android Components Architecture in a Modular Word is a sample project that presents modern, 2020 app

FunFacts is an example of Modular architecture
FunFacts is an example of Modular architecture

FunFacts FunFacts is an example of Modular architecture This Project is built using Kotlin,we will use in this App : Modular architecture Dependency I

A modular framework for building Discord bots in Kotlin using Kordex and Kord

Mik Bot A modular framework for building Discord bots in Kotlin using Kordex and Kord **If you are here for mikmusic, click here and there Deployment

Modular Android architecture which showcase Kotlin, MVVM, Navigation, Hilt, Coroutines, Jetpack compose, Retrofit, Unit test and Kotlin Gradle DSL.

SampleCompose Modular Android architecture which showcase Kotlin, MVVM, Navigation, Hilt, Coroutines, Jetpack compose, Retrofit, Unit test and Kotlin

Programación - 04 Programación Orientada a Objetos. 1DAM. Curso 2022-2023
Programación - 04 Programación Orientada a Objetos. 1DAM. Curso 2022-2023

Programación - 04 Programación Orientada a Objetos Tema 04 Programación Orientada a Objetos. 1DAM. Curso 2022/2023. Programación - 04 Programación Ori

Guía de supervivencia de Kotlin para 2º DAM. Curso 2022/2023
Guía de supervivencia de Kotlin para 2º DAM. Curso 2022/2023

Kotlin Supervivencia para 2º DAM Ejemplos de la supervivencia en Kotlin para 2º DAM. Curso 2022/2023. Kotlin Supervivencia para 2º DAM 1. Programación

Acceso a Datos - 03 Bases de Datos Relacionales. 2DAM. Curso 2022-2023
Acceso a Datos - 03 Bases de Datos Relacionales. 2DAM. Curso 2022-2023

Acceso a Datos - 03 Bases de Datos Relacionales Tema 03 Bases de Datos Relacionales. 2DAM. Curso 2022/2023. Contenidos Bases de datos Relacionales El

Prácticas en la cursada de programación orientada a objetos 2
Prácticas en la cursada de programación orientada a objetos 2

Países impostores Antes de empezar: algunos consejos El enunciado tiene mucha información, van a necesitar leerlo varias veces. La sugerencia es que l

Curso com conteúdo de algoritmos voltado a linguagem de programação Kotlin criado pela comunidade Kotlinautas

Curso de Algoritmos Kotlinautas Olá! Seja bem vindes ao curso de algoritmos da comunidade Kotlinautas. O objetivo desse curso é de oferecer um materia

Curso microservices kotlin micronaut
Curso microservices kotlin micronaut

Arquitetura de Microserviços Instruções Criando rede no docker: docker network create micronaut-net Criando imagem Postgresql no Docker: docker run -

Este é um projeto desenvolvido durante o curso de Desenvolvimento Android do professor Jamilton Damasceno na Udemy.

Pedra_Papel_Tesoura_App 📋 Índice Sobre Tecnologias utilizadas Preview 🖥 Preview 2021-10-16-18-42-09.mp4 📖 Sobre Este é um projeto desenvolvido dura

O projeto Calling-Therapies é um aplicativo em desenvolvimento para o Trabalho de Conclusão de Curso da faculdade.

Calling-Therapies 📔 Informações sobre o projeto O projeto Calling-Therapies é um aplicativo em desenvolvimento para o Trabalho de Conclusão de Curso

Primeiro aplicativo desenvolvido na linguagem kotlin, durante o Hackathon no curso de Android Kotlin da Cel.Lep em parceria com Estação Hack from Facebook
Primeiro aplicativo desenvolvido na linguagem kotlin, durante o Hackathon no curso de Android Kotlin da Cel.Lep em parceria com Estação Hack from Facebook

Tela Splash: Nome do aplicativo e uma imagem: Tela Main, principal tela do aplicativo: Um campo para o usuário informar a medida; Um spinner com os ti

Repositorio para el curso de Desarrollo Móvil 2021-15
Repositorio para el curso de Desarrollo Móvil 2021-15

Repositorio para el curso de Desarrollo Móvil 2021-15 Construir e instalar la aplicación Vinilos de forma local Clonar el repositorio Puede clonarlo a

Aqui você encontra os projetos Kotlin atualizados do curso do Professor Marco Maddo.

Fundamentos-da-Programacao-Kotlin-para-Leigos-IntelliJ Aqui você encontra os projetos Kotlin atualizados do curso do Professor Marco Maddo. Visite a p

Owner
José Luis González Sánchez
PhD Software Development Profe de DAM/DAW/ASIR @IESLuisVives Kotlin Certified Trainer by @JetBrains @GitHub Campus Advisor @GitKraken Ambassador 💻🎾🎸🍻
José Luis González Sánchez
Guía de supervivencia de Kotlin para 2º DAM. Curso 2022/2023

Kotlin Supervivencia para 2º DAM Ejemplos de la supervivencia en Kotlin para 2º DAM. Curso 2022/2023. Kotlin Supervivencia para 2º DAM 1. Programación

José Luis González Sánchez 27 Dec 28, 2022
Acceso a Datos - 03 Bases de Datos Relacionales. 2DAM. Curso 2022-2023

Acceso a Datos - 03 Bases de Datos Relacionales Tema 03 Bases de Datos Relacionales. 2DAM. Curso 2022/2023. Contenidos Bases de datos Relacionales El

José Luis González Sánchez 15 Jan 11, 2023
Prácticas en la cursada de programación orientada a objetos 2

Países impostores Antes de empezar: algunos consejos El enunciado tiene mucha información, van a necesitar leerlo varias veces. La sugerencia es que l

Esteban Barreto 0 Dec 7, 2021
Curso microservices kotlin micronaut

Arquitetura de Microserviços Instruções Criando rede no docker: docker network create micronaut-net Criando imagem Postgresql no Docker: docker run -

null 0 Oct 20, 2021
O projeto Calling-Therapies é um aplicativo em desenvolvimento para o Trabalho de Conclusão de Curso da faculdade.

Calling-Therapies ?? Informações sobre o projeto O projeto Calling-Therapies é um aplicativo em desenvolvimento para o Trabalho de Conclusão de Curso

Diego Silva 12 Mar 10, 2022
Repositorio para el curso de Desarrollo Móvil 2021-15

Repositorio para el curso de Desarrollo Móvil 2021-15 Construir e instalar la aplicación Vinilos de forma local Clonar el repositorio Puede clonarlo a

null 3 Dec 6, 2021
Curso dos fundamentos da linguagem Kotlin disponibilizado pela TreinaWeb

?? Kotlin Fundamentos ?? Curso dos fundamentos da linguagem Kotlin disponibilizado pela TreinaWeb Tecnologias Usadas Kotlin Executando Clone o projeto

Aryosvalldo Cleef de Souza 0 Dec 11, 2021
DogglersApp - Criação de um App para estudo de RecyclerView no Android Studio. Parte do curso Android Basics in Kotlin

Dogglers - Starter Code Starter code for the second independent project for Android Basics in Kotlin. Introduction This is the starter code for the Do

Gustavo Zanardi dos Reis 0 Jan 20, 2022
Repositorio com a finalidade de por em pratica todo o conhecimento das aulas do curso Kotlin e Spring do Zero ao avançado da udemy

kotlin-spring Repositorio com a finalidade de por em pratica todo o conhecimento das aulas do curso Kotlin e Spring do Zero ao avançado da udemy. Obse

Lucas Bastos Nascimento 2 Nov 29, 2022
Jugando con un Parking realizado como prueba de examen en JetBrains Academy, curso Kotlin Developer

Kotlin Parking Lot Proyecto de evaluación para el título de Kotlin Developer en Jetbrains Academy. Consiste en realizar un parking con las especificac

José Luis González Sánchez 1 Jan 10, 2022