computación iii-inf2102 conceptos básicos para la progamción
TRANSCRIPT
-
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)