M3 - Programació estructurada / Exercicis UF1: Classes

De wikiserver
Dreceres ràpides: navegació, cerca

Exemplars llibres

Per a la gestió dels llibres d'una petita biblioteca és precís conèixer el seu títol, autor, l'ISBN (cadena de 17 caràcters: 978-3-16-148410-0), el número d'exemplar (1, 2, 3, ...) i si es troba prestat o no. Escriu un programa en java que:

a) Defineix una estructura denominada ExemplarLlibre que permeti emmagatzemar les dades de qualsevol llibre.

b) Declarara e inicialitza dues variables del tipus ExemplarLlibre

c) Comprova si les variables declarades representen exemplars d'un mateix llibre o de llibres diferents.


ExemplarLlibre.java
package exemplarsllibres;

public class ExemplarLlibre {
     String titol;
     String autor;
     String isbn;
     int exemplar;
     boolean prestat;
}
ExemplarsLlibres.java
package exemplarsllibres;

import java.util.Scanner;

public class ExemplarsLlibres {

    /**
     * llibre1: Python 3
     * autor: Sébastien Chazallet
     * ISBN: 978-2-40-902575-4
     * llibre2: Learning python
     * autor: Lutz 
     * ISBN: 978-0-59-651398-6
     */
    public static void main(String[] args) {
        Scanner teclat = new Scanner(System.in);
        ExemplarLlibre llibre1 = new ExemplarLlibre();
        ExemplarLlibre llibre2 = new ExemplarLlibre();
        
        // Dades Llibre 1
        llibre1.titol = "Python 3";
        llibre1.autor = "Sébastien Chazallet";
        llibre1.isbn = "978-2-40-902575-4";
        llibre1.exemplar = 1;
        llibre1.prestat = false;
        
        // Dades llibre 2
        llibre2.titol = "Learning python";
        llibre2.autor = "Lutz";
        llibre2.isbn = "978-0-59-651398-6";
        llibre2.exemplar = 1;    
        llibre2.prestat = true;
        
        // Comparem llibres
     
        if ((llibre1.titol==llibre2.titol)&&(llibre1.autor==llibre2.autor)) {
            System.out.println("Són exemplars del mateix llibre");
        }
        else {
            System.out.println("No són exemplars del mateix llibre");
        }
       
        // Comparem instancies 
        
         if(llibre1 == llibre2){
             System.out.println("És la mateixa instancia!");
         }    
         else{
              System.out.println("No és la mateixa instancia");
         }    
         
         // I si copiem les dades ...
         
        llibre2.titol = llibre1.titol;
        llibre2.autor = llibre1.autor;
        llibre2.isbn = llibre1.isbn;
        llibre2.exemplar = llibre1.exemplar;    
        llibre2.prestat = llibre1.prestat;
         
         
         if(llibre1 == llibre2){
             System.out.println("És la mateixa instancia!");
         }    
         else{
              System.out.println("No és la mateixa instancia!");
         }    
         
         // I si assignem la instancia...
         llibre2 = llibre1;
         
         if(llibre1 == llibre2){
             System.out.println("És la mateixa instancia!");
         }    
         else{
              System.out.println("No és la mateixa instancia");
         }    
         
         //Aleshores que és llibre...
         System.out.println(llibre1);
         
                
    }
    
}

Estadístiques cargols

una fàbrica de cargols ens ha sol·licitat desenvolupar un programa en java que permeti obtenir e imprimir les estadístiques d'una determinada mostra de cargols. Per això, ens indiquen que cada cargol es caracteritza per la seva longitud i el seu diàmetre i que ambdues mesures han de emmagatzemar-se en un registre amb dos camps. El programa haurà de:

a) Sol·licitar a l'usuari les dades d'una mostra de cargols (longitud i diàmatre) i els emmagatzemi en un vector.

b) A partir de les dades introduïdes calcular i mostrar per pantalla la mitjana de les longituds i la mitjana dels diàmetres.

Nota: la mida de la mostra es definirà amb una constant denominada MIDA_MOSTRA.

Llançament daus

Volem fer un estudi estadístic en relació al llançament d'un dau de sis cares. En concret volem obtenir 100 seqüències i a continuació determinar quina ha estat la seqüencia més llarga, la més curta, el número que s'ha repetit més vegades i el número que més vegades ha tancat una seqüencia.

Una seqüencia acaba quan han sortit totes les cares del dau.

Definiu la classe seqüencia per recullir totes les dades d'una seqüencia.

Per simular el llançament d'un dau utilitzeu la classe Ramdom:

Random dau =new Random(); 

int numero =dau.nextInt(6)+1;)

Anàlisis frase

Fes un programa que llegeixi una frase sencera i ens indiqui quantes vegades surt cada lletra i en quantes paraules surt. El resultat s'ha de mostrar en el mateix ordre que apareixen les lletres en la frase.

Utilitza la classe recompte amb les següents propietats:

- lletra de tipus caràcter.
- numParaules de tipus enter.
- numVegades de tipus enter.


package analisifrase;

public class Caracter {
    char lletra;
    int numParaules;
    int numVegades;
}




package analisifrase;


public class AnalisiFrase {

    public static void main(String[] args) {
     String frase="aquesta es una frase de prova";
     String paraules[]=frase.split(" ");
     Caracter taulaCar[] = new Caracter[27];
     int numLletres = 0;
   
       // Repeticions de les lletres
       for (int i = 0; i < paraules.length; i++) {
            String paraula = paraules[i];
           
           for (int j=0; j< paraula.length(); j++){
              char lletra = paraula.charAt(j);
              int k =0;
              boolean trobat = false;
                while (!trobat && k<numLletres){
                    trobat = (taulaCar[k].lletra == lletra);
                    if (!trobat){
                        k++;
                    }
                }
                if (trobat){
                    taulaCar[k].numVegades++;
                } else {
                    Caracter car = new Caracter();
                    car.lletra = lletra;
                    car.numVegades =1;
                    taulaCar[numLletres] = car;                  
                    numLletres++;
                }
                      
                
            }                                        
       }
       // Paraules en les que apareix cada lletre
        for (int i = 0; i < numLletres; i++) {
            
            for (int j=0; j<paraules.length; j++){
                
                if (paraules[j].indexOf(taulaCar[i].lletra)!=-1){
                    taulaCar[i].numParaules++;
                }
            }
        }
 
       
       // Visualitzar els resultat
         for (int i = 0; i < numLletres; i++) {
             System.out.println("Caracter: "+taulaCar[i].lletra +
                                " Repeticions: "+taulaCar[i].numVegades +
                                " Paraules: "+taulaCar[i].numParaules); 
       }
    }
    
}

Polisses assegurances

Una companyia d’assegurances té les següents dades dels seus 100 clients:

  • Nom i cognoms
  • Número de pòlissa
  • Tipus de pòlissa
  • Quantitat assegurada

Existeixen tres tipus de pòlisses: Vehicle, Vida i Vivenda. En el primer cas es coneix la marca i l’any de matriculació, en el segon l’any de naixement i en el tercer si la vivenda posseeix o no sistema de seguretat.

Volem un programa que obtingui el següent llistat :

   Client: ...............................................................................................
   Pòlissa Nº:.....................................Tipus:.................................................
   Quantitat assegurada ............................... Total a pagar ....................................

Per a obtenir el total a pagar s’ha de tenir en compte:

  • El cost de l’assegurança en general és del 1% de la quantitat assegurada
  • Les assegurances de vida i les de vivenda tenen un descompte del 20%
  • En l’assegurança de vehicles s’aplicarà la següent taula d’increments del cost d’acord amb l’antiguitat del vehicle referida a l’any actual:
-per a més de 5 anys el 5%
-per a més de 8 anys el 10%
-per a més de 10 anys el 20%
  • En les assegurances de vivenda, el cost s’incrementarà un 20% si no es posseeixen sistemes de seguretat.

Cada client té només un tipus d’assegurança.

Nota: Fes servir el mateix mètode de l’exercici anterior per a guardar-ho en un fitxer.

Notes alumnes

Estem creant una base de dades amb els alumnes de primer. Ens interessa el nom i els cognoms. També ens interessa saber les notes que tenen a cada una de les tres primeres UF de programació. En total volem guardar informació de 20 alumnes. Primer de tot cal definir la classe Alumne.

El programa ha de permetre mitjançant un menú: afegir un nou alumne, posar notes a un alumne, llistar (el que sigui) , etc...

Per no perdre la informació cada vegada que executeu el programa i no haver d’estar inserint contínuament alumnes podeu ajudar-vos del codi de fitxers que ja teniu implementat.

El vostre programa tindrà aquest aspecte:

package programaalumnes;

public class ProgramaAlumnes {

  public static void main(String[] args) {

    GestioFitxer g= new GestioFitxer();
    Alumne alumnes[] = new Alumne[20];
    int quants=g.llegeix(alumnes);
    // Aquí va el vostre codi
    g.escriu(alumnes, quants);
  }
}

Amb el codi anterior el que heu fet inicialment passar tota la informació del fitxer a la taula d’alumnes. La variable quants indica quantes posicions de la taula teniu ocupades (és a dir, quants alumnes teniu). Lògicament la primera vegada que executeu, el fitxer no existirà (ja que encara no hi ha alumnes), la taula d’alumnes estarà buida i la variable quants valdrà 0.

El codi del final del programa el que fa és traspassar tota la informació de la taula al fitxer. Per a que això funcioni bé, heu d’actualitzar la variable quants cada vegada que inseriu o elimineu un alumne.

Nota: Per a que funcioni aquest codi de fitxer cal que afegiu a la capçalera de la classe Alumne-->implements Serializable


Classes Base:

  • Alumne.java
package programaalumnes;

import java.io.Serializable;

public class Alumne implements Serializable{
    String nom;
    String cognoms;
    double notes[]= new double[3];      
}
  • GestioFitxer.java
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package programaalumnes;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class GestioFitxer {

  public int llegeix(Alumne alumnes[]) {

    int quants = 0;
    ObjectInputStream entrada = null;
    try {
         entrada = new ObjectInputStream(new FileInputStream("Alumnes.dat"));
         Alumne a = (Alumne) entrada.readObject();
         while (a != null) {
           alumnes[quants] = a;
            quants++;
            a = (Alumne) entrada.readObject();
         }
         entrada.close();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    return quants;
  }

  public void escriu(Alumne alumnes[], int quants) {
    try {
         ObjectOutputStream sortida = new ObjectOutputStream(new FileOutputStream("Alumnes.dat"));
         for (int i = 0; i < quants; i++) {
           sortida.writeObject(alumnes[i]);
         }
         sortida.close();
        } catch (IOException Exception) {
        }

    }
  }
  • ProgramaAlumnes.java
package programaalumnes;

public class ProgramaAlumnes {
    
  public static void main(String[] args) {

    GestioFitxer g= new GestioFitxer();
    Alumne alumnes[] = new  Alumne[20];
    int quants=g.llegeix(alumnes);
      
    // Aquí va el vostre codi                             
        
    g.escriu(alumnes, quants);        
        
   }
}