Diferència entre revisions de la pàgina «M3 - Programació estructurada / Exercicis UF1: Classes»

De wikiserver
Dreceres ràpides: navegació, cerca
(Exercici 1)
(Notes alumnes)
 
(Hi ha 19 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
==Exercici 1==
+
==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'''
 +
<source lang = "java">
 +
package exemplarsllibres;
 +
 
 +
public class ExemplarLlibre {
 +
    String titol;
 +
    String autor;
 +
    String isbn;
 +
    int exemplar;
 +
    boolean prestat;
 +
}
 +
</source>
 +
:'''ExemplarsLlibres.java'''
 +
<source lang = "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);
 +
       
 +
               
 +
    }
 +
   
 +
}
 +
</source>
 +
-->
 +
 
 +
==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.
 
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.
Línia 6: Línia 128:
  
 
Definiu la classe seqüencia per recullir totes les dades d'una seqüencia.
 
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:
 +
 +
<pre>
 +
Random dau =new Random();
 +
 +
int numero =dau.nextInt(6)+1;)
 +
</pre>
 +
 +
==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:
 +
<pre>
 +
- lletra de tipus caràcter.
 +
- numParaules de tipus enter.
 +
- numVegades de tipus enter.
 +
</pre>
  
 
<!--
 
<!--
package exSequencies;
+
<source lang="java">
 +
package analisifrase;
 +
 
 +
public class Caracter {
 +
    char lletra;
 +
    int numParaules;
 +
    int numVegades;
 +
}
 +
 
 +
 
  
import java.io.Serializable;
 
  
public class Sequencia implements Serializable{
+
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);
 +
      }
 +
    }
 +
   
 
}
 
}
 +
</source>
 
-->
 
-->
  
==Exercici 2==
+
==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 :
 +
 
 +
<pre>
 +
  Client: ...............................................................................................
 +
  Pòlissa Nº:.....................................Tipus:.................................................
 +
  Quantitat assegurada ............................... Total a pagar ....................................
 +
</pre>
 +
 
 +
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'''.
 
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'''.
  
Línia 29: Línia 266:
 
El vostre programa tindrà aquest aspecte:
 
El vostre programa tindrà aquest aspecte:
 
<source lang="java">
 
<source lang="java">
 +
package programaalumnes;
 +
 
public class ProgramaAlumnes {
 
public class ProgramaAlumnes {
  
Línia 54: Línia 293:
 
:*Alumne.java
 
:*Alumne.java
 
<source lang="java">
 
<source lang="java">
/*
+
package programaalumnes;
* 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 exAlumnesBase;
 
  
 
import java.io.Serializable;
 
import java.io.Serializable;
 
/**
 
*
 
* @author albert
 
*/
 
  
 
public class Alumne implements Serializable{
 
public class Alumne implements Serializable{
             
+
    String nom;
 +
    String cognoms;
 +
    double notes[]= new double[3];     
 
}
 
}
 
</source>
 
</source>
Línia 79: Línia 310:
 
  * and open the template in the editor.
 
  * and open the template in the editor.
 
  */
 
  */
package exAlumnesBase;
+
package programaalumnes;
  
 
import java.io.FileInputStream;
 
import java.io.FileInputStream;
Línia 86: Línia 317:
 
import java.io.ObjectInputStream;
 
import java.io.ObjectInputStream;
 
import java.io.ObjectOutputStream;
 
import java.io.ObjectOutputStream;
 
/**
 
*
 
* @author albert
 
*/
 
  
 
public class GestioFitxer {
 
public class GestioFitxer {
Línia 116: Línia 342:
 
     try {
 
     try {
 
         ObjectOutputStream sortida = new ObjectOutputStream(new FileOutputStream("Alumnes.dat"));
 
         ObjectOutputStream sortida = new ObjectOutputStream(new FileOutputStream("Alumnes.dat"));
         for (int i = 0; i <= quants; i++) {
+
         for (int i = 0; i < quants; i++) {
 
           sortida.writeObject(alumnes[i]);
 
           sortida.writeObject(alumnes[i]);
 
         }
 
         }
Línia 128: Línia 354:
 
:*ProgramaAlumnes.java
 
:*ProgramaAlumnes.java
 
<source lang="java">
 
<source lang="java">
/*
+
package programaalumnes;
* 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 exAlumnesBase;
 
 
 
/**
 
*
 
* @author albert
 
*/
 
  
 
public class ProgramaAlumnes {
 
public class ProgramaAlumnes {
Línia 155: Línia 371:
 
}
 
}
 
</source>
 
</source>
 
==Exercici 2 (extra)==
 
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 :
 
 
<pre>
 
  Client: ...............................................................................................
 
  Pòlissa Nº:.....................................Tipus:.................................................
 
  Quantitat assegurada ............................... Total a pagar ....................................
 
</pre>
 
 
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.
 
 
==Exercici 3==
 
 
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:
 
<pre>
 
- lletra de tipus caràcter.
 
- numParaules de tipus enter.
 
- numVegades de tipus enter.
 
</pre>
 

Revisió de 20:56, 18 nov 2021

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.


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.


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);        
        
   }
}