Auxiliar CC30A
Marzo 16, 2001
Introducción a Java

Auxs: Rhodrigo Meza, Rodrigo Paredes, Bárbara Poblete

PROBLEMA 1:

Primero veamos cual es el problema 1:

[0:40 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% more prb1.java
/**
 * autor: Rodrigo Paredes
 * correo: raparede@dcc.uchile.cl
 *
 * Este ejemplo se desarrolla para el curso cc30a, clase auxiliar 1
 * como ven es el clasico programa Hello World
 */

public class prb1 {
    public static void main (String[] args) {
        System.out.println("Hello World!");
    }
}

Compilacion del programa:
[0:40 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% javac prb1.java 

Ejecucion del programa:
[0:41 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% java prb1
Hello World!
PROBLEMA 2:
Ahora que conocemos cual es la version procedural de HelloWorld, veamos
como se ve con una estructura "mas elaborada", que por cierto es la que
se recomienda usar:

La idea es hacer una aplicacion "modular", que significa esto:
Que la aplicacion este compuesta de elementos, tal como si fuera
un mecano, en este caso basta con dos elementos:

Primero definimos una clase interna que hace el trabajo sucio
Segundo, con la clase principal invocamos la clase interna:

[1:00 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% more prb2.java
/**
 * autor: Rodrigo Paredes
 * correo: raparede@dcc.uchile.cl
 *
 * Este ejemplo se desarrolla para el curso cc30a, clase auxiliar 1
 * como ven es el clasico programa Hello World, pero con una
 * metodologia mas depurada
 */

/**
 * clase interna
 */
class HelloWorld {
    String mensaje;
    public HelloWorld () {
        this.mensaje= "Hellow World!";
    }
    public HelloWorld (String otroMensaje) {
        this.mensaje= otroMensaje;
    }
    public void imprime () {
        System.out.println (mensaje);
    }
}

/**
 * clase principal
 */
public class prb2 {
    public static void main (String[] args) {
        HelloWorld objeto1= new HelloWorld();
        objeto1.imprime();
        System.out.println ("Ahora en castellano:");
        HelloWorld objeto2= new HelloWorld("Hola Mundo!");
        objeto2.imprime();
    }
}

Compilacion del programa:
[1:05 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% javac prb2.java

Ejecucion del programa:
[1:05 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% java prb2
Hellow World!
Ahora en castellano:
Hola Mundo!

Noten dos cosas
1.- Al compilar se genera el byte code de la clase HelloWorld, y el de la
clase prb2

[1:05 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% ls -la
total 16
drwxr-xr-x   2 raparede aroup        512 Mar  9 00:53 ./
drwxr-xr-x   3 raparede aroup        512 Mar  9 00:19 ../
-rw-r--r--   1 raparede aroup        530 Mar  9 01:05 HelloWorld.class
-rw-r--r--   1 raparede aroup        587 Mar  9 00:55 clase.txt
-rw-r--r--   1 raparede aroup        414 Mar  9 00:55 prb1.class
-rw-r--r--   1 raparede aroup        293 Mar  9 00:54 prb1.java
-rw-r--r--   1 raparede aroup        532 Mar  9 01:05 prb2.class
-rw-r--r--   1 raparede aroup        774 Mar  9 01:05 prb2.java

Recuerden que HelloWorld es la clase que hace el trabajo sucio, prb2 solo
la invoca.

2.- El constructor de la clase HelloWorld tiene 2 versiones distintas,
las que diferencian por su firma:
firma 1: public HelloWorld () 
firma 2: public HelloWorld (String otroMensaje)

La diferencia entre las firmas se ve con los argumentos, la firma 1
no tiene argumentos, la firma 2 tiene 1 argumento, y ademas es del
tipo String!!

Esto se conoce como sobrecarga de metodos!


PROBLEMA 3:
Sigamos con lo basico, ahora veremos el if, if/else, while, for.
Les dejo a ustedes investigar el do while y el switch.
 

Uso del if:

        String control = "hola";
        if (control.equals("castellano") ) {
            System.out.println ("Caso verdadero del if");
        }
        System.out.println ("Esto siempre se vera");

Uso del if/else:
        String control = "hola";
        if (control.equals("castellano") ) {
            System.out.println ("Esto se ve si es verdadero");
        }
        else {
            System.out.println ("Esto se ve si es falso");
        }

Uso del while:
        int contador;
        /**
         * inicializacion
         */
        contador = 0;
        /**
         * while (/* condicion */) {
         * }
         */
        while (contador < limite) {
            System.out.println ("Iteracion No " + contador);
            /**
             * incremento
             */
            contador++;
        }

Uso del for:
        int contador;
        /**
         * for ( /* inicializacion */; /* condicion */; /* incremento*/){
         * }
         */
        for ( contador = 0; contador < limite; contador++) {
            System.out.println ("Iteracion No " + contador);
        }


Compilacion del programa:
[1:54 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% javac prb3.java

Ejecucion del programa:
[1:55 anakena:~/cursos/aux/cc30a/2000.1/aux01/]% java prb3
Uso de if:
caso verdadero:
Caso verdadero del if
Esto siempre se vera
caso falso:
Esto siempre se vera

Uso de if/else:
caso verdadero:
Esto se ve si es verdadero
caso falso:
Esto se ve si es falso

Uso de while:
Iteracion No 0
Iteracion No 1
Iteracion No 2

Uso de for:
Iteracion No 0
Iteracion No 1
Iteracion No 2
PROBLEMA 4:
[8:27 anakena:~/cursos/aux/cc30a/01.1/aux01/]% more prb4.java
/**
 * autor: Rodrigo Paredes
 * correo: raparede@dcc.uchile.cl
 *
 * Este ejemplo se desarrolla para el curso cc30a, clase auxiliar 1
 * Manejo de entrada y salida estandar
 */

/**
 * importamos la libreria de I/O, con esto se agregan de una
 * vez todas las definiciones de java.io.*, en terminos practicos
 * por ahora sirve para escribir menos
 */
import java.io.*;

/**
 * clase principal
 */
public class prb4 {
    public static void main (String[] args) {
        /**
         * Para escribir en la salida estandar se usa
         * System.out.print()  : que escribe en la salida estandar
         * System.out.println(): que escribe en la salida estandar y agrega
         *                       el \n (fin de linea)
         */
        int numero=5;
        String palabra= "hola";
        String frase= "esta es una frase";
        System.out.println("Escritura de un numero:");
        System.out.print(">>");
        System.out.print(numero);
        System.out.print("<<");
        System.out.print("\n");
        /**
         * noten el uso de print, y que se agrega el \n
         */
        System.out.println("Escritura de una palabra:");
        System.out.print(">>");
        System.out.print(palabra);
        System.out.print("<<");
        System.out.print("\n");
        System.out.println("Escritura de una frase:");
        System.out.print(">>");
        System.out.print(frase);
        System.out.print("<<");
        System.out.print("\n");

        /**
         * La entrada es un poco mas complicada, puesto que hay que
         * manejar la posible excepcion (o error) al leer desde algun
         * dispositivo
         */
        // Lectura de un caracter desde el teclado
        char c= '\0';
        System.out.print ("Indique un caracter: ");
        try {
            c= (char)System.in.read();
            /**
             * System.in.read() retorna un integer, como esperamos un caracter
             * le aplicamos un casting (cambio de tipo explicito)
             */
        }
        catch (IOException ioEx) {
            /**
             * de no estar el import java.io.* la linea se escribe como
             * catch (java.io.IOException ioEx) {
             */
            System.out.println ("error en la lectura");
        }
        System.out.println ("Caracter leido: >>" + c + "<<");

        // Lectura del resto de la frase en el teclado
        String linea = "";
        try {
            while ( (c = (char)System.in.read()) != '\n')
                linea = linea + c;
            System.out.println ("Resto de la linea: >>" + linea + "<<");
        }
        catch (IOException ioEx) {}

        // Lectura de una frase desde el teclado
        InputStreamReader isr= new InputStreamReader(System.in);
        // vamos a leer un flujo (stream) de entrada
        BufferedReader br = new BufferedReader(isr);
        // lo vamos a manejar dentro de un buffer de datos
        /**
         * esto es equivalente a:
         * BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         */
        // Hay que manejar la excepcion
        System.out.print ("Escriba una frase: ");
        try{
            linea= br.readLine();
            System.out.println ("la frase fue: >>" + linea + "<<");
        }
        catch (IOException ioEx){}

        // Lectura de un numero
        System.out.print ("Escriba un numero: ");
        try{
            linea= br.readLine();
            numero= Integer.parseInt(linea);
            numero++;
            System.out.println ("El sucesor del numero es: >>" + numero + "<<");
        }
        catch (IOException ioEx){}

    }
}

compilacion:
[8:27 anakena:~/cursos/aux/cc30a/01.1/aux01/]% javac prb4.java

ejecucion:
[8:30 anakena:~/cursos/aux/cc30a/01.1/aux01/]% java prb4
Escritura de un numero:
>>5<<
Escritura de una palabra:
>>hola<<
Escritura de una frase:
>>esta es una frase<<
Indique un caracter: c                
Caracter leido: >>c<<
Resto de la linea: >><<
Escriba una frase: hola!!
la frase fue: >>hola!!<<
Escriba un numero: 234
El sucesor del numero es: >>235<<



Una forma de evitarse los
try {
    ...
}
catch {
    ...
}

es con lo siguiente:
public static void main(String args) throws IOException {
    ...
}

El problema de esto es que la interrupcion la tendra que atrapar
la clase llamadora del objeto.
PROBLEMA 5
[8:31 anakena:~/cursos/aux/cc30a/01.1/aux01/]% more prb5.java
/**
 * autor: Rodrigo Paredes
 * correo: raparede@dcc.uchile.cl
 *
 * Este ejemplo se desarrolla para el curso cc30a, clase auxiliar 1
 * Lectura y escritura de archivos de texto
 */

/**
 * importamos la libreria de I/O, con esto se agregan de una
 * vez todas las definiciones de java.io.*, en terminos practicos
 * por ahora sirve para escribir menos
 */
import java.io.*;

/**
 * clase principal
 */
public class prb5 {
    public static void main (String[] args) {
        /**
         * Primero vamos a leer un archivo llamado "archi.txt"
         * Para esto el buffer de lectura lo conectaremos a un archivo
         */
        BufferedReader archi= null;
        try {
            archi= new BufferedReader (new FileReader("archi.txt"));
        }
        catch (FileNotFoundException fnfEx){
            System.out.println ("Archivo archi.txt no existe");
        }
        String linea;

        System.out.println ("El archivo es el siguiente:");
        try {
            for (int i= 0; (linea= archi.readLine()) != null; i++ ){
                System.out.println ("la linea " + i + " fue: >>" + linea + "<<");
            }
            archi.close();
        }
        catch (IOException ioEx){
            System.out.println ("error entrada/salida");

        }

        /**
         * Ahora vamos a escribir en el archivo "output.txt"
         */
        System.out.println ("Escribiendo el archivo");
        BufferedWriter outputFile= null;

        try {
            FileWriter fw = new FileWriter("output.txt");
            BufferedWriter bw= new BufferedWriter(fw);
            PrintWriter salida = new PrintWriter(bw);
            salida.println("Esta el la primera linea");
            salida.close();
            /**
             * Ahora le hacemos un append al archivo
             * Noten que el constructor de FileWriter se invoca con
             * la firma:
             * FileWriter(String fileName, boolean append);
             */
            bw= new BufferedWriter(new FileWriter("output.txt", true));
            salida= new PrintWriter(bw);
            salida.println("Esta es la segunda linea");
            salida.println("Esta es la tercera linea");
            double d= 12345.67890;
            salida.print("Escribiendo un numero: ");
            salida.println(d);
            salida.close();
        }
        catch (IOException ioEx){}
    }
}

compilacion:
[8:34 anakena:~/cursos/aux/cc30a/01.1/aux01/]% javac prb5.java

Ejecucion:
Antes veamos que no esta el archivo:

[8:35 anakena:~/cursos/aux/cc30a/01.1/aux01/]% ls
ForClass.class      archi.txt           prb2.java           prb5.class
HelloWorld.class    clase.txt           prb3.class          prb5.java
IfClass.class       prb1.class          prb3.java
IfElseClass.class   prb1.java           prb4.class
WhileClass.class    prb2.class          prb4.java

Archivo archi.txt
[8:36 anakena:~/cursos/aux/cc30a/01.1/aux01/]% more archi.txt 
Archivo de pruebas
para lectura

cc30a, aux 01, 2001.1

Ejecucion
[8:35 anakena:~/cursos/aux/cc30a/01.1/aux01/]% java prb5
El archivo es el siguiente:
la linea 0 fue: >>Archivo de pruebas<<
la linea 1 fue: >>para lectura<<
la linea 2 fue: >><<
la linea 3 fue: >>cc30a, aux 01, 2001.1<<
Escribiendo el archivo

Archivo output.txt:
[8:36 anakena:~/cursos/aux/cc30a/01.1/aux01/]% more output.txt 
Esta el la primera linea
Esta es la segunda linea
Esta es la tercera linea
Escribiendo un numero: 12345.6789