Problema. Escribir un programa que calcule los porcentajes de dos números enteros de acuerdo al siguiente diálogo con una persona (usuario): Calcular porcentajes de enteros a y b a? 10 !persona b? 20 !persona a=33.33…% b=66.66…% Aplicaciones • elección con dos opciones (plebiscito, 2ª vuelta) • alumnos aprobados y reprobados
Algoritmo Etapas (pasos, instrucciones) que debe realizar (ejecutar) el computador para resolver un problema 1. escribir en la pantalla una línea con la frase “Calcular porcentajes de enteros a y b” 2. obtener número entero a • escribir el mensaje “a?” • leer el número entero a
3. obtener número entero b 4. escribir una línea con: • frase “a=” • nº real p (porcentaje de a c/r a la suma de a y b) • signo %
5. escribir una línea con “b=”, nº real 100-p, signo %
Programa. Algoritmo expresado en un lenguaje de programación Programa en lenguaje Java (instrucciones principales): Aux U = new Aux(); U.println(“Calcular porcentajes de enteros a y b“); int a = U.readInt(“a?”); int b = U.readInt(“b?”); double p = 100.0 * a/(a+b); U.println(”a=” + p + ”%”); U.println(”b=” + (100-p) + ”%”);
Lenguaje Java: características generales • inspirado en idioma inglés
– palabras int, println, read,... • uso de notación matemática
– expresiones: 100.0*a/(a+b), p-100 – funciones: println(...), readInt()
• sintaxis (gramática, escritura) reglamentada – instrucciones terminan con ; – palabras con significados especiales (int, println, readInt) – uso de minúsculas (salvo casos especiales)
• semántica (interpretación) precisa (sin ambigüedades) – instrucciones con significado/efecto bien definido
Explicaciones detalladas U.println(“Calcular porcentajes de …”); Semántica: escribe en la pantalla la frase encerrada entre “ Sintaxis: U.println(“...”); Función (método) que escribe parámetro (argumento) en una línea de la pantalla del computador, es decir, 1º escribe los caracteres de la frase 2º “salta” a la línea siguiente (posiciona el cursor de la pantalla en la primera posición de la siguinte línea)
int a = U.readInt(“a?”);
Semántica:
• escribe en la pantalla el mensaje “a?”
• lee un número entero y lo guarda en la variable a
Equivalencia
int a;
a = U.readInt(“a?”);
int a; Semántica: declara (define) a como una variable entera ¿variable? • representación simbólica de un valor (número) • representa una ubicación (celda) en la memoria del computador • capacidad: un valor/número (del tipo indicado) • puede variar (cambiar) su valor Sintaxis: tipo nombre; • tipo int: para nº entero (ejs: 123, -4) • tipo double: para nº real (ejs: 5.8, 100.0, 0.001) • nombre (identificador): letra seguida de letras, dígitos o_
Tipos de datos numéricos (enteros y reales) Tipo Nº
bits Mayor valor Menor Valor Precisión
(dígitos) int 32 2.147.483.647=231–1 -231 = -2...648 9 double 64 1.7 x 10301 -1.7 x 10301 15 bit: binary digit (dígito binario: 0 o 1) ¿mayor valor tipo int? • representación: 011...11 (32 bits) • primer bit: cero (signo positivo) • siguientes 31 bits: unos • valor: 1x20+1x21+...+1x230=1+2+...=2.147.483647=231-1 • similar al decimal 9...9 (n nueves)=10n-1
a = U.readInt(“a?”); 1º método (función) U.readInt(“…”)
1. escribe en la pantalla la frase encerrada entre “
2. espera que el usuario ingrese un número (dígitos y enter)
3. lee (obtiene) el número
4. entrega el número como resultado
2º número se guarda en (asigna a ) la variable a
Sintaxis: variable = U.readTipo(“…”);
readTipo(): readInt(“…”) o readDouble(“…”)
p=100.0*a/(a+b); calcula 100.0*a/(a+b) y guarda el resultado en la variable p
Instrucción de asignación
sintaxis: variable=expresión; semántica 1º evaluar expresión (calcular resultado) 2º asignar (guardar) resultado a (en) la variable ¿expresión? • se escribe en una línea (hacia el lado) y no en varios niveles • componentes:
o variables y constantes (enteras y reales) o operadores binarios (+,-,*,/) y unarios (+,-) o métodos (funciones) que entregan un número (Ej:readInt) o expresiones con o sin paréntesis
Evaluación de expresión
1º operadores unarios (+,-) 2º operadores “multiplicativos” (*,/) 3º operadores “aditivos” (+,-) Notas • en caso de operadores de igual prioridad, evaluar de izq a der.
Ej: 100.0*a/(a+b) equivale a (100.0*a)/(a+b) • paréntesis se usan para
o modificar orden de evaluación. Ej: 100.0*a/(a+b) o confirmar orden de evaluación. Ej: (100.0*a)/(a+b)
Tipo del resultado • tipo común. Ej: 1 / 2 es 0 (entero), 1.0 / 2.0 es 0.5 (real) • real si operandos son de tipos distintos. Ej: 1.0/2 es 0.5 Nota. ¿resultado de a/(a+b)*100.0? ¿por qué?
U.println(“a=” + p + ”%”); semántica 1º forma un string (cadena de caracteres) con la frase “a=” seguida del valor de la variable p y el signo %
+: operador de concatenación o añadidura 2º escribe el string en una línea equivalencia U.print(“a=”); U.print(p); U.println(“%”) U.print(“...”); Escribe frase (y no pasa a la sgte línea) U.print(expresión); • evalúa expresión. Ejemplo: p, 100-p • escribe el resultado
Problema. Para calcular el área y perímetro de la figura:
escriba un programa que establezca el siguiente diálogo
Figura entre cuadrado y círculo inscrito lado cuadrado? ... área=n° perímetro=nº
Solución 1 Aux U = new Aux(); U.println( “Figura entre cuadrado y círculo inscrito”); double x = U.readDouble(“lado cuadrado? “); double r = x/2; double pi = 3.1416; U.println(“área=“ + (x*x - pi*r*r)); U.println(“perímetro=” + (4*x + 2*pi*r));
Solución 2 Aux U = new Aux(); U.println( “Figura entre cuadrado y círculo inscrito”); double x=U.readDouble(“lado cuadrado? “), r=x/2; U.println(“área=“ + (Math.pow(x,2) – Math.PI*Math.pow(r,2)); U.println(“perímetro=” + (4*x + 2*Math.PI*r)); Math.PI • valor predefinido de ! (3.14159265358979323846) • constante real (valor inmodificable) Math.pow(r,2) • calcula y entrega r2 • función predefinida (incorporada al lenguaje Java) • sintaxis: Math.pow(x,y), x e y: expresiones • semántica: xy, con resultado real
Programa completo import java.io.*; //todo programa debe estar contenido en una clase //class Nombre{…} y grabarse en archivo Nombre.java class Programa { //encabezamiento del método principal (main) static public void main(String[]args) throws IOException { … //instrucciones } } comentarios (observaciones opcionales): //... (hasta el final de la línea)
Clase de la Aux con métodos para leer y escribir números import java.io.*; import java.util.Scanner; Class Aux //en archivo Aux.java { private Scanner scan; Public Aux(){ scan = new Scanner(new InputStreamReader(System.in)); public String readLine(String x)throws IOException{ print(x); return scan.nextLine(); } public int readInt(String x)throws IOException{ return Integer.parseInt(readLine(x)); } public double readDouble(String x)throws IOException{ return Double.parseDouble(readLine(x)); } public void println(String x){System.out.println(x);} public void print(String x){System.out.print(x);} public void print(int x){System.out.println(x);} public void print(double x){System.out.println(x);} }
Problema Escribir las instrucciones principales de un programa que establezca el siguiente diálogo: Perímetro y area de triangulo de lados a,b,c a ? ___ b ? ___ c ? ___ Perímetro = N° Area = N° Nota. El área se calcula como √s(s-a)(s-b)(s-c) con s=a+b+c (semi-perímetro) 2
Programa U.println(“perímetro y area de “ + “ triangulo de lados a,b,c”); //obtener lados double a=U.readDouble(“a ? ”), b=U.readDouble(“b ? ”), c=U.readDouble(“c ? ”);
//calcular y mostrar perimetro y area U.println(“Perímetro = ” + (a+b+c)); double s=(a+b+c)/2; //semi-perimetro U.println(“Area = “ + Math.sqrt(s*(s-a)*(s-b)*(s-c))); o Math.pow(s*(s-a)*(s-b)*(s-c), 0.5));
Uso (invocación) de métodos (funciones) predefinidasejemplosMath.sqrt(s*(s-a)*(s-b)*(s-c))Math.pow (s*(s-a)*(s-b)*(s-c), 0.5)
sintaxisMath.nombre(argumentos)¿argumentos? cero o más expresiones aritméticas (separadaspor comas)
semántica1° evaluar argumentos. Ejemplo: s*(s-a)*(s-b)*(s-c)2° evaluar función (método) con/en valores de argumentos3° recibir resultado de la función (en el lugar o punto deinvocación)
Funciones predefinidas en el lenguaje Java (métodos de clase predefinida Math) función significado ejemplo resultado sqrt(x) √ x, x ≥ 0 sqrt(4.0) 2.0 pow(x,y) xy pow(2.0,3.0) 8.0 exp(x) ex exp(1.0) 2.71... log(x) logex log(Math.E) 1.0 sin(x) seno de angulo x sin(Math.PI) 0.0 cos(x) coseno de x cos(Math.PI) -1.0 tan(x) tangente de x tan(Math.PI) 0.0 asin(x) arco-seno de x asin(1.0) Π/2
acos(x) arco-coseno x acos(1.0) 0.0 atan(x) arco-tangente x atan(0.0) 0.0 • todas las funciones reciben y entregan un double • un argumento double admite un int (int es asignable a double)
Funciones predefinidas en el lenguaje Java (métodos de clase Math) función significado arg result ejemplo result 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.x....
Problema. Ordenar dos enteros entre 0 y 9 generados al azar Números = 7 3 Ordenados = 3 7 //generar nº reales en rango [0,1[: 0.dd… double a=Math.random(), b=Math.random(); //generar enteros en rango [0,9](de un dígito) int i=(int)(10*a), j=(int)(10*b); U.println(“Numeros= “ + i + “ “ + j); //ordenar dos enteros U.println(“Ordenados= “+ Math.min(i,j) + “ “ + Math.max(i,j));
int i=(int)(10*a); • multiplica por 10 nº 0.d1d2…. Resultado nº=d1.d2….
ej: 5.7… • convierte d1.d2.. a entero, truncando decimales.
ej: 5.7.. a 5 • asigna entero a i
porque no se permite asignar un real a un entero: int i=10*a; coerción de tipos (casting) sintaxis: (tipo)(expresión) semántica
1. evaluar expresión 2. convertir resultado al tipo indicado 3. entregar resultado
Problema
Escribir las instrucciones principales de un programa que establezca el diálogo indicado en el siguiente ejemplo: Ordenar 3 enteros entre 1 y 100 generados al azar Numeros = 73 8 46 Ordenados = 8 46 73 Indicación. Si multiplica por 100 el Nº real 0.x1x2x3... (ej: 0.734...) que entrega la función random() obtendrá un número de la forma x1x2.x3.... (ej:73.4...). De la parte entera del resultado, usando coerción (int)(expresión), se puede obtener un Nº entero de 2 dígitos (valor entre 00 y 99). Sumando uno se obtiene un número entre 1 y 100.
Solución 1 //generar al azar 3 enteros entre 1 y 100 int a = (int)(Math.random()*100) + 1, b = (int)(Math.random()*100) + 1, c = (int)(Math.random()*100) + 1; U.println("Numeros="+a+" "+b+" "+c); //obtener menor, medio y mayor int mayor = Math.max(Math.max(a,b),c), menor = Math.min(Math.min(a,b),c), medio = a + b + c - menor - mayor;//J U.println("Ordenados="+ menor+" "+medio+" "+mayor);
Solución 2. Con Funciones (métodos) definidas por el programador class Ordenar3{ static public void main(String[]args) { U.println(“Ordenar 3 numeros “ + “entre 1 y 100 generados al azar”); int a=azar(1,100),b=azar(1,100),c=azar(1,100); U.println("Numeros="+a+" "+b+" "+c); U.println("Ordenados = " + minimo(a,b,c) + " “ + medio(a,b,c) + " " + maximo(a,b,c)); }
static public int azar(int x,int y){ return x + (int)(Math.random()*(y-x+1)); } static public int minimo(int x,int y,int z){ int aux=Math.min(x,y); return Math.min(aux,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 Notas • una función puede llamar a otra (predefinida o no) • las funciones pueden ser usadas también en otros programas
Funciones definidas por el programador sintaxis static public tipo-resultado nombre(parámetros) { instrucciones return expresión; } ¿parámetros? tipo nombre, ... semántica 1º copiar (asignar) argumentos de llamada en parámetros 2º ejecutar las instrucciones (si es que existen) 3º devolver valor de la expresión (del tipo-resultado) en el punto de invocación (uso)
Problema. Escribir los siguientes métodos: class Programa{ //minutos(x): convierte x (nº HHMM) a minutos static public int minutos(int x){ } //hhmm(x): convierte x (minutos) a nº HHMM static public int hhmm(int x){ } static public void main(String[]args) throws IOException{ } } • El método main debe establecer el diálogo del sgte ejemplo: Tiempo 1 (HHMM)? 1045 Tiempo 2 (HHMM)? 2215 Diferencia(HHMM)=1130
• Use operador % (resto/residuo de división entre enteros). Ejs: 27%2 es 1, 27%3 es 0 y 27%10 es 7
class Programa{ //minutos(x): convierte x (nº HHMM) a minutos static public int minutos(int x){ return x/100*60 + x%100; } //hhmm(x): convierte x (minutos) a nº HHMM static public int hhmm(int x){ return x/60*100 + x%60; } static public void main(String[]args) throws IOException{ int t1=U.readInt(“Tiempo 1 (HHMM)?”); int t2=U.readInt(“Tiempo 2 (HHMM)?”); int t=hhmm( Math.abs( minutos(t2)- minutos(t1) ) ); U.println(“Diferencia(HHMM)=”+t); } }
Funciones en clases independientes class U{ //en archivo U.java … static public int azar(int x,int y){ return x + (int)(Math.random()*(y-x+1)); } 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); } }
Uso de funciones de otra clase class Ordenar3{ //en archivo Ordenar3.java static public void main(String[]args) throws IOException{ U.println(“Ordenar 3 números “ + “entre 1 y 100 generados al azar”); int a=U.azar(1,100), b=U.azar(1,100), c=U.azar(1,100); U.println("Numeros="+a+" "+b+" "+c); U.println("Ordenados = " + U.minimo(a,b,c) + " " + U.medio(a,b,c) + " " + U.maximo(a,b,c)); } }
class Math{ //Clase predefinida Math static public //antes de cada función double sqrt(double x){...} double pow(double x,double y){...} double exp(double x){...} double log(double x){...} double sin/cos/tan(double x){...}//en radianes double asin/acos/atan(double x){...} double abs(double x){...} int abs(int x){...} double max(double x,double y){...} int max(int x,int y){...} double min(double x,double y){...} int min(int x,int y){...} double random(){...} static public final double PI=3.14...;//cte static public final double E=2.71...;//cte }
Tarea 1. nº de 3 dígitos? 123 resultado=321 2. int aaaammdd(int ddmmaaaa) //fechas J 3. Cajero automático ¿Cuánto dinero necesita? 38000 Retire los siguientes billetes: 3 de $10.000 1 de $5.000 3 de $1.000 4. Números al azar=45 78 23 67 Ordenados=23 45 67 78 5. static public int mayor(int x,int y) sin usar Math.max
Top Related