Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.08 KB | None | 0 0
  1. /*
  2.  * laura.launonen@tuni.fi
  3.  * harkkatyö
  4.  * lausekielinen ohjelmointi 2
  5.  *
  6.  * Ohjelma lataa kuvan tiedostosta taulukkoon, jota käyttäjä voi käskyjen mukaan muokata.
  7.  *
  8.  */
  9. import java.io.*;
  10. import java.util.Scanner;
  11. public class BimEdit{
  12.    
  13.     //luokkavakiot ohjelmalle
  14.     public static final String LOPETA = "quit";
  15.     public static final String TULOSTA = "print";
  16.     public static final String INFO = "info";
  17.     public static final String INVERT = "invert";
  18.     public static final String DILAATIO = "dilate";
  19.     public static final String ERODE = "erode";
  20.     public static final String LATAUS = "load";
  21.    
  22.     public static final Scanner lukija = new Scanner(System.in);
  23.     public static void main(String[] args) {
  24.     //pääohjelma tarkistaa komentoriviparametrit ja komennon ja kutsuu komennonsuoritusmetodia
  25.        
  26.         //alkunäytön tulostus
  27.         tervehdys();
  28.  
  29.         //tarkistetaan onko annettu komentoriviparametri oikea sekä kutsutaan komennonkysyjä-metodia
  30.         if(args.length == 1 || (args.length == 2 && args[1].equals("echo"))) {
  31.            
  32.             //parametrin ensimmäinen osa on tiedoston nimi
  33.             String tiedostonNimi = args[0];
  34.            
  35.             //apumuuttuja, johon lisätään tausta- ja edustavärit
  36.             char[] merkit = new char[2];
  37.            
  38.             //ladataan tiedostosta kuva taulukkoon
  39.             char[][] kuva = lataaKuvaTaulukkoon(tiedostonNimi, merkit);
  40.            
  41.             //jos kuva ei ole tyhjä, niin tarkistetaan onko komento kaksiosainen vai yksiosainen.
  42.             if (kuva != null) {
  43.                 boolean jatketaan = true;
  44.                 while (jatketaan) {  
  45.                     System.out.println("print/info/invert/dilate/erode/load/quit?");
  46.                     //luetaan syöte käyttäjältä
  47.                     String komento = lukija.nextLine();
  48.                    
  49.                     //Jos komentoriviparametreissa on annettu käsky "echo", tulostetaan se syöttämisen jälkeen näytölle
  50.                     if (args.length == 2 && args[1].equals("echo")) {
  51.                         System.out.println(komento);
  52.                     }    
  53.                     else if (komento.equals(LOPETA)) {
  54.                         jatketaan = false;
  55.                     }                
  56.                    
  57.                     //Suoritetaan valittu komento
  58.                     // tarkastetaan dilate ja erode käskyistä, että ne sisältävät numeron
  59.                     else if (komento.split(" ")[0].equals("dilate") && komento.split(" ").length == 2) {
  60.                        
  61.                         String[] komennonOsat = komento.split(" ");
  62.                         int syote = Integer.parseInt(komennonOsat[1]);
  63.                         char etuMerkki = merkit[1];
  64.                         kuva = dilateJaErode(kuva, syote, etuMerkki);
  65.                     }
  66.                    
  67.                     else if (komento.split(" ")[0].equals(ERODE) && komento.split(" ").length == 2) {
  68.                         String[] komennonOsat = komento.split(" ");
  69.                         int syote2 = Integer.parseInt(komennonOsat[1]);
  70.                         char takaMerkki = merkit[0];
  71.                         kuva = dilateJaErode(kuva, syote2, takaMerkki);
  72.                     }
  73.                     else if (komento.equals(TULOSTA)) {
  74.                         kuvanTulostus(kuva);  
  75.                     }
  76.                     else if (komento.equals(INFO)) {
  77.                         infous(kuva, merkit);
  78.                     }
  79.                     else if (komento.equals(INVERT)) {
  80.                         kuva = inverttaus(kuva, merkit);
  81.                     }                                      
  82.                     else if (komento.equals(LATAUS
  83.                    
  84.                     )) {
  85.                         kuva = lataaKuvaTaulukkoon(tiedostonNimi, merkit);
  86.                     }
  87.                     else {
  88.                         System.out.println("Invalid command!");
  89.                     }
  90.                 }
  91.             }
  92.             //jos kuva on tyhjä
  93.             else {
  94.                 System.out.println("Invalid image file!");
  95.                 System.out.println("Bye, see you soon.");
  96.             }
  97.         }
  98.          //jos komentoriviparametrit ovat virheelliset
  99.         else {
  100.             System.out.println("Invalid command-line argument!");
  101.             System.out.println("Bye, see you soon.");
  102.  
  103.         }  
  104.     }
  105.     // PRINT-syötteen METODI
  106.     public static void kuvanTulostus(char[][] kuva) {
  107.         if (kuva != null) {
  108.              // Käydään läpi rivi kerrallaan
  109.             for (int rivi = 0; rivi < kuva.length; rivi++) {
  110.                 // Käydään sarakkeet läpi.
  111.                 for (int sarake = 0; sarake < kuva[0].length; sarake++) {
  112.                    //tulostetaan taulukko
  113.                    System.out.print(kuva[rivi][sarake]);
  114.                 }
  115.                 // Rivin lopussa vaihdetaan riviä.
  116.                 System.out.println();
  117.             }
  118.         }
  119.     }
  120.            
  121.     //METODI info syötteelle
  122.     public static void infous(char[][] kuva, char[] merkit) {
  123.        
  124.         //tehdään tarvittavat muuttujat
  125.         int riviLkm = kuva.length;
  126.         int sarakeLkm = kuva[0].length;
  127.         char taustaMerkki = merkit[0];
  128.         char etuMerkki = merkit[1];
  129.         int eMerkkiLkm = 0;
  130.         int tMerkkiLkm = 0;
  131.        
  132.         //käydään rivit läpi
  133.         for (int rivi = 0; rivi < kuva.length; rivi++) {
  134.             // Käydään sarakkeet läpi.
  135.             for (int sarake = 0; sarake < kuva[rivi].length; sarake++) {
  136.                
  137.                 //lasketaan edusta- ja taustamerkkien lukumäärä
  138.                 if (kuva[rivi][sarake] == taustaMerkki){
  139.                     tMerkkiLkm++;
  140.                 }
  141.                 else if (kuva[rivi][sarake] == etuMerkki) {
  142.                     eMerkkiLkm++;
  143.                 }
  144.             }
  145.         }
  146.         //tulostetaan kuvan info
  147.         System.out.println(riviLkm + " x " + sarakeLkm);
  148.         System.out.println(taustaMerkki + " " + tMerkkiLkm);
  149.         System.out.println(etuMerkki + " " + eMerkkiLkm);
  150.     }
  151.            
  152.     //METODI INVERT-SYÖTTEELLE
  153.     public static char[][]inverttaus(char[][] kuva, char[]merkit) {
  154.         char a = merkit[0];
  155.         char b = merkit[1];
  156.         //tämä vaihtaa merkit a:sta b:hen
  157.         if (kuva != null && kuva.length > 0 && kuva[0].length > 0) {
  158.             // Käydään läpi kaikki taulukon alkiot kaksinkertaisen silmukan avulla.
  159.             int rivilkm = kuva.length;
  160.             for (int rivi = 0; rivi < rivilkm; rivi++) {
  161.                 for (int sarake = 0; sarake < kuva[rivi].length; sarake++) {
  162.                     // Vaihdetaan merkki a merkiksi b.
  163.                     if (kuva[rivi][sarake] == a) {
  164.                         kuva[rivi][sarake] = b;
  165.                     }
  166.                     // Vaihdetaan merkki b merkiksi a.
  167.                     else if (kuva[rivi][sarake] == b) {
  168.                       kuva[rivi][sarake] = a;
  169.                     }
  170.                 }
  171.             }
  172.         return kuva;
  173.         }
  174.        
  175.     return null;
  176.     }
  177.    
  178.  
  179.     //METODI DILATE- ja ERODE käskyille, suurentaa ja pienentää kuvaa
  180.     public static char[][] dilateJaErode(char[][] kuva, int syote, char merkki) {
  181.         if (kuva != null && kuva.length > 0 && kuva[0].length > 0) {
  182.             int riviLkm = kuva.length;
  183.             int sarakeLkm = kuva[0].length;
  184.            
  185.             char[][] uusiKuva = new char[riviLkm][sarakeLkm];
  186.  
  187.             //kopioidaan kuva uudeksi kuvaksi
  188.             for (int rivi = 0; rivi < riviLkm; rivi++) {
  189.                 for (int sarake = 0; sarake < sarakeLkm; sarake++) {
  190.                    uusiKuva[rivi][sarake] = kuva[rivi][sarake];
  191.                 }
  192.             }        
  193.            
  194.            
  195.             //syöte = käyttäjän komennon perässä oleva luku,
  196.             //joka kertoo kuvan koon, määritellään pääohjelmassa            
  197.             if (syote < 3 || syote % 2 == 0) {
  198.                 System.out.println("Invalid command.");
  199.             }
  200.             else {
  201.                 //r = taulukon reunat, jotka eivät ole "ikkunan" keskikohdassa koskaan
  202.                 int r = (syote - 1) / 2;
  203.                
  204.                 //käydään läpi taulukkoa, jätetään r kokoiset reunat käymättä
  205.                 for (int rivi = r; rivi < kuva.length - r; rivi++) {
  206.                     for (int sarake = r; sarake < kuva[rivi].length - r; sarake++){
  207.                         for (int x = rivi - r; x < rivi + r + 1; x++) {
  208.                             for (int y = sarake - r; y < sarake + r + 1; y++) {
  209.                            
  210.                                 if (kuva[x][y] == merkki) {
  211.                                     uusiKuva[rivi][sarake] = merkki;
  212.                                 }
  213.                             }
  214.                         }
  215.                     }
  216.                 }
  217.             return uusiKuva;
  218.             }
  219.         }
  220.         return null;
  221.     }
  222.    
  223.    
  224.    
  225.     //ALKUNÄYTÖN TULOSTUS METODI tervehdys
  226.     public static void tervehdys() {
  227.  
  228.         System.out.println("-----------------------");
  229.         System.out.println("| Binary image editor |");
  230.         System.out.println("-----------------------");
  231.        
  232.     }
  233.    
  234.     //KUVAN LATAUSMETODI
  235.     public static char[][] lataaKuvaTaulukkoon(String tiedostonNimi, char[] merkit) {
  236.         Scanner tiedostonLukija = null;
  237.        
  238.         //varaudutaan poikkeukseen ja yritetään lukea tiedostoa
  239.         try {
  240.             //luodaan tiedosto-olio
  241.             if (merkit.length == 2 && merkit != null && tiedostonNimi != null) {
  242.                 File tiedosto = new File(tiedostonNimi);
  243.                 //liitetään lukija tiedostoon
  244.                 tiedostonLukija = new Scanner(tiedosto);
  245.                
  246.              
  247.                 //luodaan muuttujat tiedon keräykselle tiedoston alusta 4 riviä.
  248.                 int riviLkm = Integer.parseInt(tiedostonLukija.nextLine());
  249.                 int sarakeLkm = Integer.parseInt(tiedostonLukija.nextLine());
  250.                 char merkki1 = tiedostonLukija.nextLine().charAt(0);
  251.                 char merkki2 = tiedostonLukija.nextLine().charAt(0);
  252.                
  253.                 //kuvan tausta ja edustamerkit
  254.                 merkki1 = merkit[0];
  255.                 merkki2 = merkit[1];
  256.                 //tarkistetaan että koot ovat sopivat
  257.                 if (riviLkm < 3 || sarakeLkm < 3 ) {
  258.                     return null;
  259.                 }
  260.                 else {
  261.                     char[][] kuva = new char[riviLkm][sarakeLkm];
  262.                    
  263.                     while (tiedostonLukija.hasNextLine()) {
  264.                         for(int rivi = 0; rivi < riviLkm; rivi++ ) {
  265.                             String rivit = tiedostonLukija.nextLine();
  266.                             if(rivit.length() == sarakeLkm) {
  267.                                 for (int sarake = 0; sarake < sarakeLkm; sarake++) {
  268.                                     char merkki = rivit.charAt(sarake);
  269.                                     if(merkki == merkki1 || merkki == merkki2) {
  270.                                         kuva[rivi][sarake] = merkki;
  271.                                     }
  272.                                     else {
  273.                                         return null;
  274.                                     }
  275.                                 }
  276.                             }
  277.                             else {
  278.                                 return null;
  279.                             }
  280.                         }
  281.                     }
  282.                    
  283.                 //suljetaan lukija
  284.                 tiedostonLukija.close();
  285.                     return kuva;
  286.                 }
  287.             }
  288.         }
  289.         //siepataan poikkeus, tai jos kuva on tyhjä
  290.         catch (Exception e){
  291.             if (tiedostonLukija != null) {
  292.                 tiedostonLukija.close();
  293.             }
  294.             return null;
  295.         }
  296.     //palautetaan ladattu kuva
  297.     return null;
  298.     }
  299. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement