rsvaco

prg pract 2 arturo sampedro reig

Mar 2nd, 2017
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.27 KB | None | 0 0
  1.  
  2. /**
  3.  * PRGParseNum: Práctica 2 de PRG.
  4.  *
  5.  * @author (professors IIP - PRG)
  6.  * @version (curs 2016-17)
  7.  */
  8. public class PRGParseNum {
  9.    
  10.     /************************** CODIGO INICIAL  **************************/
  11.    
  12.     public final static char PUNT = '.';  // Separador parte fraccionaria.
  13.     public final static char COMA = ',';  // Separador parte fraccionaria.
  14.     public final static char EXP1 = 'e';  // Separador parte exponencial.
  15.     public final static char EXP2 = 'E';  // Separador parte exponencial.
  16.     public final static int  BASE = 10;   // Base de numeración por defecto.
  17.    
  18.     /**
  19.      * Devuelve el entero asociado al carácter dígito en c.
  20.      * @param c: char.
  21.      * @return int: valor del dígito.
  22.      * PRECONDICIÓN: '9' >= c >= '0'
  23.      */
  24.     public static int parseDig(char c) {
  25.         return c - '0';
  26.         // alternativamente, se puede utilizar:
  27.         // return Character.getNumericValue(c);
  28.     }
  29.    
  30.    
  31.     /************************ EJEMPLOS INICIALES *************************/    
  32.        
  33.     /** Devuelve la suma de los dígitos contenidos en una String.
  34.      * @param s String s: Cadena de caracteres sobre los que se opera.
  35.      * @return int. */
  36.     public static int sumaDigitos(String s) {
  37.         // Caso base: String vacía
  38.         if (s.length() == 0) { return 0; }
  39.         else {
  40.         // Caso general: String no vacía. Tratar substring posterior.
  41.             char c = s.charAt(0);
  42.             if (c >= '0' && c <= '9') {
  43.                 return (c - '0') + sumaDigitos(s.substring(1));
  44.             }
  45.             else { return sumaDigitos(s.substring(1)); }
  46.         }
  47.     }
  48.        
  49.     /** Devuelve la suma de los dígitos contenidos en una String.
  50.      * Versión alternativa utilizando un parámetro posicional.
  51.      * @param s String s: Cadena de caracteres sobre los que se opera.
  52.      * @param pos: posición sobre la que se está trabajando en s.
  53.      * @return int. */
  54.     public static int sumaDigitos(String s, int pos) {
  55.         // Caso base: String vacía
  56.         if (pos >= s.length()) { return 0; }
  57.         else {
  58.         // Caso general: String no vacía. Tratar substring posterior.
  59.             char c = s.charAt(pos);
  60.             if (c >= '0' && c <= '9') {
  61.                 return (c - '0') + sumaDigitos(s, pos + 1);
  62.             }
  63.             else { return sumaDigitos(s, pos + 1); }
  64.         }
  65.     }    
  66.    
  67.     /** Devuelve la suma de los dígitos contenidos en una String.
  68.      * @param s String s: Cadena de caracteres sobre los que se opera.
  69.      * @return int. */
  70.     public static int sumaDigitos2(String s) {
  71.         // Caso base: String vacía
  72.         if (s.length() == 0) { return 0; }
  73.         else {
  74.         // Caso general: String no vacía. Tratar substring anterior.
  75.             int len = s.length();
  76.             char c = s.charAt(len - 1);
  77.             if (c >= '0' && c <= '9') {
  78.                 return (c - '0') + sumaDigitos(s.substring(0, len - 1));
  79.             }
  80.             else { return sumaDigitos(s.substring(0, len - 1)); }
  81.         }
  82.     }    
  83.    
  84.     /******************  PROBLEMA A: parseInt(String s) ******************/
  85.        
  86.     /**
  87.      * EJEMPLO, "1234", con analisis DESCENDENTE:
  88.      *   s                    s.charAt(s.length()-1)-'0'  
  89.      * "1234"      123*10   +        4                      = 1234
  90.      * "123"       12*10    +        3                      =  123
  91.      * "12"        1*10     +        2                      =   12
  92.      * "1"         1                                        =    1
  93.  
  94.      *
  95.      * EJEMPLO, "1234", con analisis ASCENDENTE:
  96.      *   s    s.charAt(0)-'0'    Math.pow(10,s.length()-1)
  97.      * "1234"       1         *         10^3                = 1000 +
  98.      *  "234"       2         *         10^2                =  200 +
  99.      *   "34"       3         *         10^1                =   30 +
  100.      *    "4"       4                                       =    4
  101.      *                                                       _____
  102.      *                                                        1234    
  103.      *  
  104.      * PRECONDICIÓN: s contiene un entero, >= 0, bien formado.
  105.      */
  106.     public static int parseUnsignedInt(String s) {
  107.         if (s.equals("")) { return 0; }
  108.         if (s.length() == 1) { return parseDig(s.charAt(0)); }
  109.         else {
  110.         return parseDig(s.charAt(0)) * (int) Math.pow(BASE, s.length() -1) + parseUnsignedInt(s.substring(1));
  111.         }
  112.     }  
  113.    
  114.     /**
  115.      * PRECONDICIÓN: s contiene un entero, tal vez con signo, bien formado.
  116.      */    
  117.     public static int parseInt(String s) {
  118.         if (s.charAt(0) == '-') { return - parseUnsignedInt(s.substring(1)); }
  119.         if (s.charAt(0) == '+') { return + parseUnsignedInt(s.substring(1)); }
  120.         else return parseUnsignedInt(s);
  121.     }    
  122.    
  123.     /****************  PROBLEMA B: parseDouble(String s) *****************/    
  124.    
  125.     /**
  126.      * PRECONDICIÓN: s contiene un número en coma flotante bien formado. */
  127.     public static int posFracSep(String s) {
  128.         if (s.equals("")) { return -1; }
  129.         if (s.charAt(s.length()-1) == PUNT || s.charAt(s.length()-1) ==  COMA) { return s.length() -1; }
  130.         else return posFracSep(s.substring(0, s.length() -1));
  131.     }
  132.    
  133.     /**
  134.      * PRECONDICIÓN: s, contiene los dígitos de la parte fraccionaria
  135.      * de un valor double bien formado.
  136.      */
  137.     public static double parseFrac(String s) {
  138.         return parseInt(s) * Math.pow(10, -s.length());
  139.     }
  140.    
  141.     /**
  142.      * PRECONDICIÓN: s contiene un double, bien formado, tal vez con signo,
  143.      * que puede tener (o no) parte fraccionaria. No contiene parte exponencial.
  144.      */  
  145.     public static double parseDoubleBas(String s)   {
  146.         double res = 0.0;
  147.         if (posFracSep(s) != -1) {
  148.             if (s.charAt(0) == PUNT || s.charAt(0) == COMA) { s = "0" + s; }
  149.             res = (parseInt(s.substring(0, posFracSep(s))));
  150.             if (res >= 0) { res += (parseFrac(s.substring(posFracSep(s) +1))); return res; }
  151.             else res -= (parseFrac(s.substring(posFracSep(s) +1))); return res;
  152.         }
  153.         else return parseInt(s);
  154.     }
  155.    
  156.    
  157.     /*******************  AMPLIACIONES RECOMENDADAS  ********************/
  158.    
  159.    
  160.    
  161.    
  162.    
  163. }
Advertisement
Add Comment
Please, Sign In to add comment