calcular porcentajes de enteros a y b a? 10...

Post on 10-Aug-2020

8 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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