Iniciación a la Programación

@acmupm

¡Apuntaros!

@acmupm

https://forms.gle/YsPJHht7ihCH1F8P8

Índice

1. ¿Qué es programar?

2. Tipos y variables.

3. Operadores aritméticos.

4. Lógica y condicionales.

5. Funciones. Recursión.

6. Listas indexadas: Arrays.

7. Manejo de Strings.

8. Control de flujo: for, while y switch.

@acmupm

¿Qué es programar?

@acmupm

Paradigmas de la programación

@acmupm

@acmupm

@acmupm

Java

@acmupm

Compilado / Interpretado

@acmupm

@acmupm

Tipos y variables

  • Tipos
boolean, byte, short,
char, int, long,
float, double,
int[], char[]
  • Variables
y
int x = 5;
String y = "acm";
x
\texttt{5}
\texttt{"acm"}

@acmupm

Tipos y variables

  • Ámbito de las variables
{
    int a = 0;
    {
        int b = 0;
        {
            int c = 0;
            int d = 0;
        } // c y d deja de ser accesible

        {
            int c = 0;
        } // c deja de ser accesible

    } // b deja de ser accesible

} // a deja de ser accesible
int i = 0;
while (...) {
    int a = i++;
    int b;
    if (a > 5) {
       b = a * 6;
    } else {
       int c = a * 2;
       b = c - 3;
    } // c deja de ser accesible

} // b deja de ser accesible

@acmupm

Operadores aritméticos

Importante: en las operaciones entre números de diferentes tipos, Java siempre devuelve el resultado como el tipo más grande.

\texttt{byte ⊕ byte = byte}
\texttt{byte ⊕ int = int}
\texttt{float ⊕ int = float}
\texttt{double ⊕ long = double}

@acmupm

Operadores aritméticos

  • Operadores binarios.
Operador Forma Ejemplo
Suma a + b 9 + 1 = 10
Resta a - b 6 - 9 = -3
Multiplicación a * b 7 * 3 = 21
División a / b 10 / 5 = 2
10 / 4 = 2
10 / 4.0 = 2.5
Resto a % b 10 % 4 = 2

x += y es lo mismo que hacer x = x + y

Funciona con todos los operadores de esta tabla

@acmupm

Operadores aritméticos

  • Operadores unarios.
Operador Forma Ejemplo
Valor negado -a -(1 + 5) = -6
Preincremento ++a


 
Postincremento a++


 
int x = 5;
int b = 1;
b = ++x;

//b = 6;
//x = 6;
int x = 5;
int b = 1;
b = x++;

//b = 5;
//x = 6;

@acmupm

Lógica

  • Operaciones básicas:
A B Q
0 0 0
0 1 0
1 0 0
1 1 1

Operación AND (Y)

A Q
0 1
1 0

Operación NOT (negación)

A

Q

@acmupm

Lógica

  • Operaciones básicas:
A B C
0 0 0
0 1 1
1 0 1
1 1 0

Operación XOr (Ó exclusiva)

A B Q
0 0 0
0 1 1
1 0 1
1 1 1

Operación OR (Ó)

@acmupm

Lógica

  • Lógica aplicada a Java:
\texttt{true}
\texttt{false}

1 =>

0 =>

}

Valores booleanos

Operación Forma Ejemplo
AND a && b true && false = false
OR a || b true || false = true
XOr a ^ b true ^ true = false
NOT !a !false = true

It's funny because it's true!

@acmupm

Lógica

  • Lógica aplicada a Java:
Operación Forma Ejemplo
Igualdad a == b 6 == 6 = true
Mayor a > b 3 > 5 = false
Mayor o igual a >= b 1 >= 1 = true
Menor a < b 5 < 1 = false
Menor o igual a <= b 1 <= 5 = true

Estos operadores solo se pueden usar entre números, no entre booleanos!!

@acmupm

Lógica

Ejemplos:

boolean entre(int minimo, int maximo, int numero) {
    return numero > minimo && numero < maximo;
}
boolean esMultiplo(int numero, int posibleMultiplo) {
    return posibleMultiplo % numero == 0;
}
boolean esPar(int numero) {
    return esMultiplo(2, numero);
}

@acmupm

Lógica

  • Bloques condicionales:
if (<valor booleano>) {
    //<Código si el valor es true.>
} else {
    // <Código si el valor es false.>
}
  • ó bien:
if (<valor booleano 1>) {
    //Código si el valor 1 es true.
} else if (<valor booleano 2>) {
    // Código si el valor 2 es true.
}
...
} else if (<valor booleano n>) {
    // Código si el valor n es true.
} else {
    // Código si todos los valores son false.
}

@acmupm

Lógica

if (true) {
    System.out.println("Verdadero!");
} else {
    System.out.println("Nope!");
}

(Este if es un pelín estúpido porque la condición siempre se cumple)

Ejemplos con bloques condicionales:

if (x > 1) {
    //Hacer algo si x es mayor que uno.
} else {
    //Hacer otra cosa si x es menor o igual que 1.
}
if (x == 1 && y > 1) {
    //Hacer algo si x es igual a 1 e y mayor que 1.
} else if (x > 1 && y < 2) {
    //Hacer algo si x es mayor que 1 e y sea menor que 2.
}

@acmupm

Funciones

  • Funciones:
g:\{\space\space\space\space\space\space,\space\space\space\space\space\}\rightarrow
f:\space\space\space\space\space\space\rightarrow
\cos: \mathbb{R}\rightarrow\mathbb{R}
double cos(double alpha);
int f(int x);
double g(int a, double b);

@acmupm

Funciones

  • Funciones en Java:
<tipo de salida> <nombre> ([<tipo param1> <nombre param1>][, <tipo param2> <nombre param2>]...) {
    //Código
    //...
    return valor_de_salida;
}
int succ(int num) {
    return num + 1;
}

double max(double a, double b) {
    return (a + b + Math.abs(a - b)) / 2;
}

double parabola(double a, double b, double c, double x) {
    return a * x * x + b * x + c;
}

@acmupm

Funciones

  • Más ejemplos de funciones:
double abs(double n) {
    if (n > 0) {
        return n;
    } else {
        return -n;
    }
}
String graduacion(double nota) {
    if (nota == 0) {
        return "Subnormal";
    } else if (nota < 5) {
        return "Suspenso";
    } else if (nota < 7) {
        return "Aprobado";
    } else if (nota < 9) {
        return "Notable"
    } else {
        return "Puto amo";
    }
}

@acmupm

Funciones

  • Función recursiva

Aquella que se llama a sí misma para devolver un valor

@acmupm

Funciones

  • Función recursiva

Un ejemplo de función recursiva es el factorial:

x!= \begin{cases} 1 & \text{if}\ x = 1 \\ x * (x - 1)! & \text{otherwise} \end{cases}
6!=6*5*4*3*2*1
1!
2!=2*1!
3!=3*2!
4!=4*3!
5!=5*4!
6!=6*5!

@acmupm

Funciones

  • Función recursiva
int factorial(int x) {
    if (x == 1) {
        return 1;
    } else {
        return x * factorial(x - 1); 
    }
}

@acmupm

Listas indexadas: Arrays

Una array es una lista de elementos del mismo tipo:

  • Tiene un tamaño fijo.
  • Los elementos pueden estar repetidos.
[\space\space\space\space,\space\space\space\space,\space\space\space\space,\space\space\space\space]

0

1

2

3

Longitud: 4

Los índices de las arrays en Java comienzan en 0!!

(Por tanto, van de 0 hasta su longitud - 1)

[1, 6, 3, 45, 12, 9, 0]

Longitud: 7

0

1

2

3

4

5

6

@acmupm

Listas indexadas: Arrays

  • Creación de arrays:
new tipo[tamaño]; //Crea una array del tipo y tamaño dados.
new tipo[] {e1, e2, ..., en} //Crea una array del tipo dado y con los elementos dados.
//Crea una array de enteros de 10 elementos, y la guarda en la variable x
//Todos los elementos están a 0.
int[] x = new int[10];

//Crea una array de floats de tamaño 4, con los elementos: [1, 6, 9, 123]
//y la guarda en la variable y.
float[] y = new float[] {1.1f, 6.4f, 9.2f, 123.0f};

//Lo mismo que lo de arriba.
float[] z = {1.1f, 6.4f, 9.2f, 123.0f};

@acmupm

Listas indexadas: Arrays

  • Conocer el tamaño de una array:
//Devuelve un int que indica el tamaño de la array.
<array>.length;
int[] array = new int[10];

//Guarda en 'count' el valor 10.
int count = array.length;

@acmupm

Listas indexadas: Arrays

  • Acceso y modificación de elementos de una array:
//Obtener un elemento de la array
<array>[<índice>];

//Establecer un elemento de la array
<array>[<índice>] = <valor>;
//Crea una nueva array.
int[] array = new int[5];
array[0] = 6;
array[1] = 1;
array[4] = -8;

//Imprime el elemento 0 en la
//consola.
System.out.println(array[0]);
Índice Valor
0 6
1 1
2 0
3 0
4 -8

Los índices de las arrays en Java comienzan en 0!!

(Por tanto, van de 0 hasta su longitud - 1)

Listas indexadas: Arrays

Ejemplo de uso de arrays:

int sumar(int[] numeros, int longitud) {
    if (longitud == 0) {
        return 0;
    } else {
        return numeros[longitud - 1] + sumar(numeros, longitud - 1);
    }
}
int[] numeros = {1, 5, 1, 3};

//Devuelve 10
sumar(numeros, numeros.length);

Utilizamos un algoritmo recursivo para acceder a los elementos de la array y sumarlos (lo común en Java es usar bucles, pero aún no los hemos visto :P)

@acmupm

Manejo de Strings

Un String es una cadena de carácteres, invariable y con un tamaño fijo.

Internamente un String es una array de carácteres, con métodos para poder trabajar con ellos más fácilmente.

String s = "Acm Mola :P";
System.out.println(s);

@acmupm

Manejo de Strings

  • Funciones útiles:
Definición Descripción Ejemplo
int length(); Devuelve la longitud del String. "gato".length() => 4
char charAt(int index); Devuelve el carácter en la posición dada. "gato".charAt(3) => 'o'
String toUpperCase() Devuelve un nuevo String con los carácteres del actual en mayúscula. "acm".substring(1) => "cm"
String toLowerCase() Devuelve un nuevo String con los carácteres del actual en minúscula. "Informática".substring(3, 6) => "for"
boolean startsWith(String other); Devuelve true si el string actual empieza por el dado. False de lo contrario. "naranja".startsWith("nara") => true
"naranja".startsWith("NAra") => false
boolean endsWith(String other); Devuelve true si el string actual termina por el dado. False de lo contrario. "naranja".endsWith("anja") => true

@acmupm

Manejo de Strings

  • Operador "+" con Strings:

Java permite usar el operador "+" entre Strings y entre un String y otro tipo. El resultado son ambos valores concatenados.

String x = "A" + "CM"; //x = "ACM"
x = x + 4;             //x = "ACM4"
x = x + "EVAH";        //x = "ACM4EVAH"

@acmupm

Manejo de Strings

  • Igualdad entre Strings:

Podemos comparar dos strings usando el método .equals(String) que hemos dicho antes. Los strings en Java NO se deben comparar con ==

String a = "ACM";      // a = "ACM";
String b = "A" + "CM"; // b = "ACM";

a == b;                // Devuelve false (CUIDADO!)
a.equals(b);           // Devuelve true (que es lo correcto)

@acmupm

Manejo de Strings

Ejemplos con Strings:

String notaString(int nota) {
    return "Tu nota es de: " + nota;
}
String siglasNombre(String nombre, String apellido1, String apellido2) {
    String siglas = "";

    //x += y es lo mismo que hacer x = x + y !
    if (nombre.length() > 0) {
        siglas += nombre.charAt(0);
    }

    if (apellido1.length() > 0) {
        siglas += apellido1.charAt(0);
    }

    if (apellido2.length() > 0) {
        siglas += apellido2.charAt(0);
    }

    return siglas;
}

@acmupm

Control de flujo

  • Bucles while:
while (<valor booleano>) {
    // Código a ejecutar.
}

En este tipo de bucle while, la condición se comprueba antes de ejecutar el código de dentro. Por tanto, el código de dentro puede no ejecutarse.

do {
    // Código a ejecutar.
} while (<valor booleano>)

En este tipo de bucle while, la condición se comprueba después de ejecutar el código de dentro. Por tanto, el código de dentro se ejecuta como mínimo una vez.

  • Bucles do...while:

@acmupm

Control de flujo

  • Bucles while vs. do...while:

While

Do...while

@acmupm

Control de flujo

Ejemplos con bucles while:

int sumar(int[] sumandos) {
    int actual = 0;
    int suma = 0;
    while (actual < sumandos.length) {
        suma += sumandos[actual];
    }
    return suma;
}
int buscar(char caracter, char[] array) {
    int ubicacion = -1;
    int i = 0;
    while (i < array.length && ubicacion == -1) {
        if (array[i] == caracter) {
            ubicacion = i;
        }
        i++;
    }
    return ubicacion;
}

@acmupm

Control de flujo

  • Bucles for:
for ([inicio]; [condición de parada]; [post]) {
    //Código
}
  • Inicio: sentencia que se ejecuta antes de comenzar el bucle por primera vez.
  • Condición de parada: valor booleano que determina si el bucle debe continuar. Se comprueba cada vez antes de entrar en el bucle.
  • Post: sentencia que se ejecuta después de cada ejecución del bucle.

@acmupm

Control de flujo

  • Bucles for:

@acmupm

Control de flujo

  • Bucle for típico:
for (int i = 0; i < 5; i++) {
    // Código
}

@acmupm

Control de flujo

  • Bucle while como bucle for:
for (int i = 0; i < 5; i++) {
    // Código
}
int i = 0;

while (i < 5) {
    // Código
    i++;
}

.... es equivalente a ....

@acmupm

Control de flujo

Ejemplo de bucles for:

int sumar(int[] sumandos) {
    int suma = 0;
    for (int i = 0; i < sumandos.length; i++) {
        suma += sumandos[i];
    }
    return suma;
}
int buscar(char caracter, char[] array) {
    int ubicacion = -1;
    for (int i = 0; i < array.length 
       && ubicacion == -1; i++) {
        if (array[i] == caracter) {
            ubicacion = i;
        }
    }
    return ubicacion;
}

@acmupm

Control de flujo

  • Bloques switch:
switch (valor) {
    case <caso_1>:
        // Código
        [break;]

    case <caso_2>:
        // Código
        [break;]

    ...

    case <caso_n>:
        // Código
        [break;]

    [default:]
        // Código
}

@acmupm

Control de flujo

  • Bloques switch:
int x = 5;

switch (x) {
    case 1:
        System.out.println("Caso 1!");
        break;

    case 2:
        System.out.println("Caso 2!");
        break;

    default:
        System.out.println("Otro caso");
}

Salida:

Otro caso

@acmupm

Control de flujo

  • Bloques switch:
int x = 1;

switch (x) {
    case 1:
        System.out.println("Caso 1!");
    case 2:
        System.out.println("Caso 2!");
        break;

    default:
        System.out.println("Otro caso");
}

Salida:

Caso 1!
Caso 2!

Cuidado: En un bloque switch, se ejecutan hacia abajo las instrucciones, hasta que se sale del bloque o se encuentra un break!

@acmupm

Control de flujo

Ejemplo con bloque switch:

int diasDelMes(String mes) {
    int dias;

    switch (mes) {
        case "enero":
        case "marzo":
        case "mayo":
        case "julio":
        case "agosto":
        case "octubre":
        case "diciembre":
            dias = 31;
            break;
        case "febrero":
            dias = 28;
            break;
        default:
            dias = 30;
            break;
    }
    return dias;
}

@acmupm

ESTO ES TODO

(DE MOMENTO)

@acmupm

Made with Slides.com