40
Computación III- INF2102 Conceptos básicos para la progamción

Computación III-INF2102 Conceptos básicos para la progamción

Embed Size (px)

Citation preview

  • Computacin III-INF2102Conceptos bsicos para la progamcin

  • Problema: escribir un programa que lea 3 nmeros enteros y los imprima en la pantalla en orden ascendente Ingrese primer nmero: 45Ingrese segundo nmero: 57Ingrese tercer nmero: 23Los nmeros en orden: 23 45 57

  • Solucin convencionalimport java.util.*;class Ordenados { static public void main(String[]args) { Scanner C = new Scanner(System.in); System.out.print(ingresa primer numero :); double a = C.nextDouble(); System.out.print(ingresa segundo numero :); double b = C.nextDouble(); System.out.print(ingresa tercer numero :); double c = C.nextDouble(); double mayor = Math.max(Math.max(a,b),c), menor = Math.min(Math.min(a,b),c), medio = a + b + c - menor - mayor; System.out.println("Ordenados="+ menor+" "+medio+" "+mayor); }}

  • Funciones predefinidas en el lenguaje Java (mtodos de clase Math)

    funcin

    significado

    arg*

    resultado

    ejemplo

    resultado

    sqrt(x)

    ( x, x ( 0

    double

    double

    sqrt(4.0)

    2.0

    pow(x,y)

    xy

    double

    double

    pow(2.0,3.0)

    8.0

    exp(x)

    ex

    double

    double

    exp(1.0)

    2.71...

    log(x)

    logex

    double

    double

    log(Math.E)

    1.0

    sin(x)

    seno de angulo x

    double

    double

    sin(Math.PI)

    0.0

    cos(x)

    coseno de x

    double

    double

    cos(Math.PI)

    1.0

    tan(x)

    tangente de x

    double

    double

    tan(Math.PI)

    0.0

    asin(x)

    arco-seno de x

    double

    double

    asin(1.0)

    /2

    acos(x)

    arco-coseno x

    double

    double

    acos(1.0)

    0.0

    atan(x)

    arco-tangente x

    double

    double

    atan(0.0)

    0.0

    abs(x)

    |x|

    int

    double

    int

    double

    abs(-3)

    abs(-3.0)

    3

    3.0

    max(x,y)

    mayor entre x e y

    int

    double

    int

    double

    max(4, 6)

    max(4.1, 6.5)

    6

    6.5

    min(x,y)

    menor entre x e y

    int

    double

    int

    double

    min(4, 6)

    min(4.1, 6.5)

    4

    4.1

    random()

    N al azar en [0,1[

    double

    random( )

    0.xxx....

    Nota. un argumento double admite un int (int es asignable a double)

  • Solucin 2. Con Funciones (mtodos) definidas por el programador

    class Ordenar3{

    static public void main(String[]args)

    {

    double a = leerDouble(primer numero ),

    b = leerDouble (segundo numero ),

    c = leerDouble(tercer numero);

    System.out.println("Ordenados = " +

    minimo(a,b,c) + " +

    medio(a,b,c) + " " +

    maximo(a,b,c));

    }

  • static public double leerDouble(String x){

    System.out.println(x);

    Scanner c = new Scanner(System.int);

    double n = c.nextDouble();

    return n

    }

    static public int minimo(int x,int y,int z){

    return Math.min(Math.min(x,y),z);

    }

    static public int maximo(int x,int y,int z){

    return Math.max(Math.max(x,y),z);

    }

    static public int medio(int x,int y,int z){

    return x+y+z - minimo(x,y,z) -maximo(x,y,z);

    }

    }//fin de la clase Ordenar3

  • Funciones definidas por el programador

    sintaxis

    static public tipo-resultado nombre(parmetros)

    {

    instrucciones

    return expresin;

    }

    parmetros? tipo nombre, ...

    semntica

    1 copiar (asignar) argumentos de llamada en parmetros

    2 ejecutar las instrucciones

    3 devolver valor de la expresin (del tipo-resultado) en el punto de invocacin (uso)

  • Problema.

    Escribir un programa que permita al usuario ingresar los coeficientes a, b y c de una ecuacin cuadrtica

    a*x2+b*x+c = 0 y muestre las races de la ecuacin

    computador

    Solucion de la ecuacion ax2+bx+c

    ingresa a: 3 (persona

    ingresa b: 3 (persona

    ingresa c: -18 (persona

    las soluciones son x1 = 6 x2 = -3

    computador

  • Programa completo

    import java.util.*;

    class Ecuacion {

    static public void main(String[]args) {

    Scanner C = new Scanner(System.in);

    //leer datos

    System.out.print(ingresa a:);

    double a = C.nextDouble();

    System.out.print(ingresa b:);

    double b = C.nextDouble();

    System.out.print(ingresa c:);

    double c = C.nextDouble();

    //calcular resultados

    double disc = Math.sqrt(b*b-4*a*c);

    double r1 = (-b + disc)/(2*a*c);

    double r2 = (-b - disc)/(2*a*c);

    // mostrar solucin

    System.out.print(las soluciones son );

    System.out.print(x1 = +r1+ x2 = +r2);

    }

    }

  • import java.util.Scanner

    Importa la clase Scanner del paquete java.util. Se puede escribir import java.util.* para importar todas de una vez

    class Ecuacion {

    Marca el inicio de la clase. La clase Ecuacin debe estar en un archivo llamado Ecuacin.java (creado por el programador con un editor adecuado)

    static public void main(String[]args) {

    marca el comienzo de las instrucciones que se ejecutarn cuando se eche a correr el programa

    Scanner C = new Scanner(System.in);

    Crea un objeto Scanner para leer datos desde el teclado y se asigna a la variable C

    //leer datos

    comentarios, son ignorados por el computador

  • System.out.print(...);

    Escribe en la salida lo que va entre las comillas textualmente

    Existen las instrucciones print (que no pone fin de la linea) y

    println (que si lo pone)

    double b = C.nextDouble();

    Escanea la entrada asociada a la variable C (el teclado en este

    caso) suponiendo que lo que viene es un nmero decimal.

    Se asigna el valor recibido a la variable. Se pueden leer otros

    tipos de datos:

    int c = C.nextInt();

    (para leer y guardar en una variable valores enteros)

    char c = C.nextChar();

    (para leer y guardar en una variable caracteres)

    String s = C.nextLine();

    Para leer text (esto lee hasta que se encuentra un fin de lnea)

  • System.out.print(...);

    Escribe en la salida lo que va entre las comillas textualmente

    double disc = Math.sqrt(b*b-4*a*c);

    Llama a la funcin predefinida Math.sqrt que recibe como argumento un real y devuelve un real que corresponde

    a la raz cuadrada del argumento

    System.out.print(x1 = +r1+ x2 = +r2);

    Muestra texto combinado con variables, lo que no va entre comillas

    se entiende que es una variable y se muestra el dato que contiene.

    Para concatenar datos y texto se usa el sigo +. Lo mismo se puede

    lograr con:

    System.out.print(x1 = );

    System.out.print(r1);

    System.out.print( x2 = )

    System.out.print(r2);

  • Problema: qu pasa si las races son imaginarias?

    double disc = Math.abs(b*b-4*a*c);

    System.out.println(las soluciones son );

    if (b*b < 4*a*c) {

    double imag = Math.sqrt(disc/(2*a));

    System.out.print(x1 = +b*b/(2*a));

    System.out.println( + +imag+i);

    System.out.print(x2 = +b*b/(2*a));

    System.out.println( - +imag+i);

    else{

    System.out.println(x1 =

    +(b*b+Math.sqrt(disc))/(2*a));

    System.out.println(x2 =

    +(b*b+Math.sqrt(disc))/(2*a));

    }

  • Problema

    Escribir un mtodo (funcin) que reciba dos enteros y entregue el mayor de los dos (sin usar Math.max).

    Ejemplo de uso(invocacin): int m = mayor(a,b);

    x y

    Solucin 1 (rebuscada)

    static public int mayor(int x, int y){

    return (x + y + Math.abs(x-y))/2;

    }

    Solucin 2 (ms natural)

    static public int mayor(int x, int y){

    if( x > y )

    return x;

    else

    return y;

    }

    (x+y)/2

    |x-y|

  • Caso especial 1: cada instruccin puede ser otro if-else

    static public int mayor(int x,int y,int z)

    {

    if( x >= y )

    if( x >= z )

    return x;

    else

    return z;

    else

    if( y >= z )

    return y;

    else

    return z;

    }

  • Caso especial 2: else puede omitirse

    static public int mayor(int x,int y,int z)

    {

    int aux=x;

    if( y > aux) aux=y;

    if( z > aux) aux=z;

    return aux;

    }

  • Caso especial 3:

    bloque {...} para agrupar varias instrucciones

    if( a>=b)

    {

    mayor=a;

    menor=b;

    }

    else

    {

    mayor=b;

    menor=a;

    }

  • Condiciones compuestas

    static public int mayor(int x,int y,int z)

    {

    if( x >= y && x >= z )

    return x;

    else

    if( y >= z )

    return y;

    else

    return z;

    }

  • Condicin compuesta

    sintaxis

    condicin1 operador-lgico condicin2 . . .

    operador lgico:

    &&: y, and, conjuncin

    ||: o, or, disyuncin

    (: no, not, negacin (operador unario)

    semntica

    c1

    c2

    c1 && c2

    c1 || c2

    (c1

    V

    V

    V

    V

    F

    V

    F

    F

    V

    F

    F

    V

    F

    V

    V

    F

    F

    F

    F

    V

    V si ambos V

    V si alguno V

    V si F

    Nota. c2 se evala slo si es necesario. Por ej

    if(x>=y && x>=z)... si x=z no se evala

  • prioridades de operadores

    (orden de evaluacin)

    1

    + - ( (unarios)

    2

    (tipo) cast

    3

    * / %

    4

    + -

    5

    < > =

    6

    == (=

    7

    &&

    8

    ||

  • Problema 2 Escribir un programa que establezca el siguiente dilogo:

    Determinar calificacin cualitativa

    Nota (entre 1.0 y 7.0) ? ___

    Calificacin = x

    En que la calificacin x se determina de acuerdo a la siguiente tabla:

    Nota

    calificacin

    1.0 3.9

    reprobado

    4.0 4.9

    aprobado

    5.0 5.9

    distincin

    6.0 7.0

    distincin mxima

    < 1.0 o > 7.0

    fuera de rango

  • Solucin 1: con if sin else

    System.out.print(Nota(entre 1.0 y 7.0));

    double nota = C.nextDouble();

    System.out.print(Calificacion = );

    if( 1.0

  • Solucin 2: con if else (ms eficiente)

    if( 1.0

  • Solucin 3: ms breve y eficiente.

    Con indentacin (uso de mrgenes) que evidencia seleccin mltiple

    if( nota < 1 || nota > 7 )

    System.out.println(Fuera de rango);

    else if( nota < 4 )

    System.out.println(reprobado);

    else if( nota < 5 )

    System.out.println(aprobado);

    else if( nota < 6 )

    System.out.println(distincin);

    else

    System.out.println(distincin mxima);

  • Tipo boolean

    constantes: true (verdadero) y false (falso)

    variables: boolean nombre;

    expresiones: condiciones

    asignacin: variable=condicin;

    ejemplos:

    boolean p ;

    p = a>=b && a>=c;

    if( p ) //equivalencia: if( p==true )

    System.out.println(mayor=+a);

  • Funciones que retornan boolean

    ejemplo:

    static public boolean par(int x){

    return x%2==0;

    }

    equivalencia:

    static public boolean par(int x){

    if(x%2==0) return true; else return false;

    }

    uso

    if(par(n))

    System.out.print(par);

    else System.out.print(impar);

    sintaxis

    static public boolean nombre(parmetros){

    instrucciones;

    return condicin (exp de tipo boolean);

    }

  • Problema 1

    Escribir un programa que muestre la siguiente tabla:

    Nraiz

    2 N

    3 N

    ...

    30N

  • Algoritmo

    1. inicializar variable n con valor 2

    2. repetir las siguientes instrucciones hasta que n > 30:

    escribir n y (n

    sumar 1 a n

    alternativamente

    1. inicializar variable n con valor 2

    2. repetir mientras n ( 30:

    escribir n y (n

    sumar 1 a n

  • Programa

    System.out.println("N raiz");

    int n = 2;

    while( n

  • Instruccin while

    Sintaxis

    while( condicin )

    instruccin;

    o, si se necesita repetir varias instrucciones

    while(condicin)

    {

    instrucciones;

    }

  • Semntica

    Mientras condicin se cumpla (sea true)

    ejecutar instruccin(es)

    graficamente:

    instruccin(es)

    condicin

    true

    false

  • Problema 2

    Escribir una funcin que calcule la raz cuadrada de X

    Razonamiento

    Sea Y una aproximacin de (X

    Si Y < (X entonces X/Y > (X

    Si Y > (X entonces X/Y < (X

    En ambos casos se obtendr una mejor aproximacin promediando Y y X/Y

    Y (X X/Y X

    X/Y Y

  • Funcin

    static public double raiz(double x)

    {

    double y = x/2;

    while(Math.abs(y*y-x)>0.00001)//o 1E-5

    y = (y + x/y)/2;

    return y;

    }

  • Problema 3. Escribir un programa para el siguiente dilogo:

    Adivine X (entero entre 1 y 100)

    X ? 30

    X > 30

    X ? 85

    X < 85

    ...

    X ? 73

    X = 73 Felicitaciones

  • Solucin para un intento solamente

    System.out.println(Adivine X+

    (entero entre 1y100));

    int x = (int)(Math.random()*100)+1;

    System.out.print("X ? ");

    int n=C.nextInt();

    if (x == n)

    System.out.println("X = +n+

    Felicitaciones);

    else if( x > n )

    System.out.println(X > +n);

    else

    System.out.println(X < +n);

  • Repetir este bloque hasta que adivine

    Solucin hasta adivinar?

    System.out.println(Adivine X+

    (entero entre 1y100));

    int x = int)(Math.random()*100)+1;

    System.out.print("X ? ");

    int n=C.nextInt();

    if (x == n)

    System.out.println("X = +n+

    Felicitaciones);

    else if( x > n )

    System.out.println(X > +n);

    else

    System.out.println(X < +n);

  • Solucin 1: con un flag

    boolean fin = false;

    while( ! fin ){ //while(fin==false)

    System.out.print("X ? ");

    int n = C.nextInt();

    if( x == n )

    fin = true;

    else if( x > n )

    System.out.println(X > +n);

    else

    System.out.println(X < +n);

    }

    System.out.println("X = + x +

    Felicitaciones);

  • Solucin 2: usando un esquema (patrn) ms general

    //obtener primer dato

    System.out.print("X ? ");

    int n = C.nextInt();

    //repetir hasta detectar fin de datos

    while( n != x ){

    //procesar dato

    if( x > n )

    System.out.println(X > +n);

    else

    System.out.println(X < +n);

    //obtener siguiente dato

    System.out.print("X ? ");

    n = C.nextInt();

    }

    //instrucciones finales

    System.out.println("X = +n+

    Felicitaciones);

  • Solucin 3: con esquema (patrn) while(true){...break;...}

    //repetir indefinidamente

    while( true ){

    //obtener dato

    System.out.print("x ? ");

    int n = C.nextInt();

    //quebrar repeticin al detectar fin

    if( n == x ) break;

    //procesar dato

    if( x > n )

    System.out.println(X > +n);

    else

    System.out.println(X < +n);

    }

    System.out.println("X = +x+

    Felicitaciones);

  • Tarea 1 (Entrega al comienzo de la prxima clase en hoja impresa)

    Modificar de modo de permitir al usuario rendirse y

    computador muestra el nmero

    Escribir programa que adivine N que piensa una persona (que no miente)