[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania 2

Wykłady z wiosny 2011: W5 (28 marca) - W8 (18 kwietnia)

W5: 28 marca 2011

Pisaliśmy kalkulator ONP

Oto pierwsza wersja kodu głównej klasy:

   1 public class ONP {
   2     public static void main( String [] args ) {
   3         XStos s= new XStos();
   4         Liczba x;
   5 
   6         for( int i= 1; i < args.length; i++ ) {
   7             String a= args[i];
   8             try {
   9                 if( args[0].equals( "d" ) )
  10                    x= new Liczba( a );
  11                 else if( args[0].equals( "b" ) )
  12                    x= new LiczbaBinarna( a );
  13                 else if( args[0].equals( "r" ) )
  14                     x = new LiczbaRzymska( a );
  15                 else {
  16                     System.err.println( args[0] + " jest nieobslugiwany" );
  17                     return;
  18                 }
  19                 s.push( x );
  20             } catch( NumberFormatException e ) {
  21                 //System.err.println( e );
  22                 if( a.equals( "+" ) ) {
  23                     x = (Liczba) s.pop();
  24                     x.add( (Liczba)s.pop() );
  25                     s.push( x );
  26                 } else if( a.equals( "*" ) ) {
  27                     x= (Liczba) s.pop();
  28                     x.mul( (Liczba) s.pop() );
  29                     s.push( x );
  30                 } else if( a.equals( "-" ) ) {
  31                     x= (Liczba) s.pop();
  32                     Liczba y= (Liczba) s.pop();
  33                     y.sub( x );
  34                     s.push( y );
  35                 } else if( a.equals( "/" ) ) {
  36                     x= (Liczba) s.pop();
  37                     Liczba y= (Liczba) s.pop();
  38                     y.div( x );
  39                     s.push( y );
  40                 } else if( a.equals( "=" ) ) {
  41                     System.out.println( "=" + s.pop() );
  42                 } else 
  43                     System.err.println( "Nieznany symbol: " + a );
  44             }
  45             //System.err.println( s );
  46         }
  47     }
  48 }

Interfejs Liczba:

   1 public interface Liczba {
   2     public void add( Liczba y );
   3 
   4     public void sub( Liczba y );
   5 
   6     public void mul( Liczba y );
   7 
   8     public void div( Liczba y );
   9 }

Szkielet Liczby:

   1 public class LiczbaSzkielet implements Liczba {
   2     protected double x;
   3 
   4     public LiczbaSzkielet() {
   5         x = 0;
   6     }
   7 
   8     public void add( Liczba y ) {
   9         x += ((LiczbaSzkielet)y).x;
  10     }
  11 
  12     public void sub( Liczba y ) {
  13         x -= ((LiczbaSzkielet)y).x;
  14     }
  15 
  16     public void mul( Liczba y ) {
  17         x *= ((LiczbaSzkielet)y).x;
  18     }
  19 
  20     public void div( Liczba y ) {
  21         x /= ((LiczbaSzkielet)y).x;
  22     }
  23 }

Liczba dziesiętna:

   1 public class LiczbaDziesietna extends LiczbaSzkielet {
   2     public LiczbaDziesietna( String a ) 
   3         throws NumberFormatException
   4     {
   5         x = Double.parseDouble( a );
   6     }
   7 
   8     public String toString() {
   9         return ""+x;
  10     }
  11 }

Liczba binarna:

   1 public class LiczbaBinarna extends LiczbaSzkielet {
   2 
   3     public LiczbaBinarna( String a ) 
   4         throws NumberFormatException
   5     {
   6         for( int i= 0; i < a.length(); i++ )
   7             if( a.charAt(i) != '0' && a.charAt(i) != '1' )
   8                 throw new NumberFormatException( a + " to nie jest liczba binarna" );
   9             else {
  10                 x *= 2;
  11                 x += a.charAt(i) == '0' ? 0 : 1;
  12             }
  13     }
  14 
  15     public String toString() {
  16         String r= "";
  17         int c = (int)x;
  18         while( c != 0 ) {
  19             if( c % 2 == 1 )
  20                 r = "1" + r;
  21             else
  22                 r = "0" + r;
  23             c /= 2;
  24         }
  25         return x == 0 ? "0" : r;
  26     }
  27 
  28 }

Liczba rzymska:

   1 public class LiczbaRzymska extends LiczbaSzkielet {
   2     public LiczbaRzymska( String a )
   3         throws NumberFormatException 
   4     {
   5         x = parse( a );
   6     }
   7 
   8     public void set( String v ) {
   9         x= parse( v );
  10     }
  11 
  12     public double parse(String v ) {
  13 
  14       int lt = 0;
  15       int ls = 0;
  16       int ld = 0;
  17       int lj = 0;
  18 
  19       for (Character c : v.toCharArray()) {
  20             switch (c) {
  21                 case 'M':
  22                     if (ld > 0 || lj > 0 || ls > 1) {
  23                         throw new NumberFormatException("Zla lczba rzymska \"" + v + "\"");
  24                     } else if (ls == 1) {
  25                         ls = 9;
  26                     } else {
  27                         if (lt < 9) {
  28                             lt++;
  29                         } else {
  30                             throw new NumberFormatException("Zla lczba rzymska \"" + v + "\"");
  31                         }
  32                     }
  33                     break;
  34                 case 'D':
  35                     if (lj > 0 || ld > 0 || ls > 1) {
  36                         throw new NumberFormatException("Zla liczba rzymska \"" + v + "\"");
  37                     } else if (ls == 1) {
  38                         ls = 4;
  39                     } else {
  40                         ls = 5;
  41                     }
  42                     break;
  43                 case 'C':
  44                     if (lj > 0 || ld > 1) {
  45                         throw new NumberFormatException("Zla liczba rzymska\"" + v + "\"");
  46                     } else if (ld == 1) {
  47                         ld = 9;
  48                     } else {
  49                         if (ld < 9) {
  50                             ld++;
  51                         } else {
  52                             throw new NumberFormatException("Zla lczba rzymska \"" + v + "\"");
  53                         }
  54                     }
  55                     break;
  56                 case 'L':
  57                     if (lj > 0 || ld > 1) {
  58                         throw new NumberFormatException("Zla liczba rzymska \"" + v + "\"");
  59                     } else if (ld == 1) {
  60                         ld = 4;
  61                     } else {
  62                         ld = 5;
  63                     }
  64                     break;
  65                 case 'X':
  66                     if (lj > 1) {
  67                         throw new NumberFormatException("Zla liczba rzymska \"" + v + "\"");
  68                     } else if (lj == 1) {
  69                         lj = 9;
  70                     } else {
  71                         if (ld < 9) {
  72                             ld++;
  73                         } else {
  74                             throw new NumberFormatException("Zla lczba rzymska \"" + v + "\"");
  75                         }
  76                     }
  77                     break;
  78                 case 'V':
  79                     if (lj > 1) {
  80                         throw new NumberFormatException("Zla liczba rzymska \"" + v + "\"");
  81                     } else if (lj == 1) {
  82                         lj = 4;
  83                     } else {
  84                         lj = 5;
  85                     }
  86                     break;
  87                 case 'I':
  88                     if (lj < 9) {
  89                         lj++;
  90                     } else {
  91                         throw new NumberFormatException("Zla lczba rzymska \"" + v + "\"");
  92                     }
  93                     break;
  94                 default:
  95                     throw new NumberFormatException("Znak " + c + " nie jest elementem liczby rzymskiej"  );
  96             }
  97       }
  98 
  99       return 1000 * lt + 100 * ls + 10 * ld + lj;
 100 
 101     }
 102 
 103     private void addDigit(StringBuffer b, int no, char d, char d5, char d10) {
 104         if (no == 4) {
 105             b.append(d);
 106             b.append(d5);
 107         } else if (no == 9) {
 108             b.append(d);
 109             b.append(d10);
 110         } else {
 111             if (no / 5 > 0) {
 112                 b.append(d5);
 113             }
 114             for (int i = 0; i < no % 5; i++) {
 115                 b.append(d);
 116             }
 117         }
 118     }
 119 
 120     public String toString() {
 121         int rx = (int)x;
 122         int lt = rx / 1000;
 123         int ls = (rx % 1000) / 100;
 124         int ld = (rx % 100) / 10;
 125         int lj = rx % 10;
 126 
 127         StringBuffer b = new StringBuffer();
 128         this.addDigit(b, lt, 'M', 'B', '@');
 129         this.addDigit(b, ls, 'C', 'D', 'M');
 130         this.addDigit(b, ld, 'X', 'L', 'C');
 131         this.addDigit(b, lj, 'I', 'V', 'X');
 132 
 133         return b.toString();
 134     }
 135 }

Fabryki:

   1 public interface FabrykaLiczb {
   2     public Liczba utworz( String s );
   3 }

   1 public class FabrykaLiczbDziesietnych implements FabrykaLiczb {
   2     public Liczba utworz( String s ) {
   3         return new LiczbaDziesietna( s );
   4     }
   5 }

   1 public class FabrykaLiczbBinarnych implements FabrykaLiczb {
   2     public Liczba utworz( String s ) {
   3         return new LiczbaBinarna( s );
   4     }
   5 }

   1 public class FabrykaLiczbRzymskich implements FabrykaLiczb {
   2     public Liczba utworz( String s ) {
   3         return new LiczbaRzymska( s );
   4     }
   5 }

I ostateczny kod kalkulatora:

   1 public class ONP {
   2     public static void main( String [] args ) {
   3         XStos s= new XStos();
   4         Liczba x;
   5         FabrykaLiczb f;
   6         if( args[0].equals( "d" ) )
   7            f= new FabrykaLiczbDziesietnych();
   8         else if( args[0].equals( "b" ) )
   9            f= new FabrykaLiczbBinarnych();
  10         else if( args[0].equals( "r" ) )
  11            f= new FabrykaLiczbRzymskich();
  12         else {
  13             System.err.println( args[0] + " jest nieobslugiwany" );
  14             return;
  15         }
  16 
  17         for( int i= 1; i < args.length; i++ ) {
  18             String a= args[i];
  19             try {
  20                 x= f.utworz( a );
  21                 s.push( x );
  22             } catch( NumberFormatException e ) {
  23                 //System.err.println( e );
  24                 if( a.equals( "+" ) ) {
  25                     x = (Liczba) s.pop();
  26                     x.add( (Liczba)s.pop() );
  27                     s.push( x );
  28                 } else if( a.equals( "*" ) ) {
  29                     x= (Liczba) s.pop();
  30                     x.mul( (Liczba) s.pop() );
  31                     s.push( x );
  32                 } else if( a.equals( "-" ) ) {
  33                     x= (Liczba) s.pop();
  34                     Liczba y= (Liczba) s.pop();
  35                     y.sub( x );
  36                     s.push( y );
  37                 } else if( a.equals( "/" ) ) {
  38                     x= (Liczba) s.pop();
  39                     Liczba y= (Liczba) s.pop();
  40                     y.div( x );
  41                     s.push( y );
  42                 } else if( a.equals( "=" ) ) {
  43                     System.out.println( "=" + s.pop() );
  44                 } else 
  45                     System.err.println( "Nieznany symbol: " + a );
  46             }
  47             //System.err.println( s );
  48         }
  49     }
  50 }

Testy:

lap-jstar:~/jimp/2> java ONP d 2 2 + 3 / 5 + =
=6.333333333333333
lap-jstar:~/jimp/2> java ONP r XLII XIV / =   
=III
lap-jstar:~/jimp/2> java ONP b 100 10 \* =    
=1000
lap-jstar:~/jimp/2>

W6 i W7: 4 i 11 kwietnia 2011

Pisaliśmy program, który czyta z pliku listę studentów Imię Nazwisko Liczba-punktów po jednym studencie w linii i wystawia oceny wg zadanej skali.

Omawialiśmy: interfejsy, klasy wewnetrzne zwykłe i anonimowe, rzutowanie (polimorfizm), JCF i programowanie w IDE Netbeans.

Kod projektu Oceny znajdą Państwo tutaj.

W8: 18 kwietnia 2011

Pisaliśmy prostą aplikacje okienkową: kalkulator 4-działaniowy oparty o Java Desktop Application Framework.

Kod projektu znajdą Państwo tutaj. W ramach pracy domowej proszę go dokończyć.


2015-09-23 06:44