Guest User

Untitled

a guest
Feb 20th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.48 KB | None | 0 0
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5. package apdc_lw1;
  6.  
  7. /**
  8.  *
  9.  * @author Klaus
  10.  */
  11. public class APDC_LW1 {
  12.  
  13.     /**
  14.      * @param args the command line arguments
  15.      */
  16.     public static void main(String[] args) {
  17.         // TODO code application logic here
  18.         if(args.length < 2)
  19.         {
  20.             System.out.println("Недостаточное количество аргументов командной строки. Необходимо два аргумента: имена входного и выходного файлов");
  21.             return;
  22.         }
  23.         if(!new java.io.File(args[0]).isFile())
  24.         {
  25.             System.out.println("Указан неправильный исходных файл, проверьте правильость задания");
  26.             return;
  27.         }
  28.         if(new java.io.File(args[1]).exists())
  29.         {
  30.             System.out.println("Указанный выходной файл уже существует, укажите другое имя");
  31.             return;
  32.         }
  33.        
  34.         AM_model model = new AM_model();
  35.         AL_model model2 = new AL_model();
  36.         int result;
  37.        
  38.         result = readFile(args[0], model);
  39.         switch(result)
  40.         {
  41.             case -1:
  42.                 System.out.println("Ошибка при доступе к файлу исходных данных");
  43.                 break;
  44.             case -2:
  45.                 System.out.println("Слишком большой размер модели");
  46.                 break;
  47.             case -3:
  48.                 System.out.println("Обнаружены недопустимые символы во входном файле");
  49.                 break;
  50.             case -4:
  51.                 System.out.println("Недостаточно строк в исходном файле");
  52.                 break;
  53.             case -5:
  54.                 System.out.println("В одной из строк недостаточно элементов");
  55.                 break;
  56.             case -6:
  57.                 System.out.println("Обнаружена петля в исходной матрице");
  58.                 break;
  59.             default:
  60.                 System.out.println("Разбор матрицы завершен успешно");
  61.         }
  62.         if(result < 0)
  63.         {
  64.             System.out.println("Обнаружены ошибки во входных данных, работа завершена");
  65.             return;
  66.         }
  67.         System.out.println("Полученный битовый массив: (блоки в памяти распологаются согласно соглашения x86, в данном выводе отображены как результат mov ax, word ptr [memadr])");
  68.         for(int n = 0; n < model.size; n++)
  69.         {
  70.             for(int m = model.sizeof - 1; m >= 0; m--)
  71.             {
  72.                 String temp = Integer.toBinaryString(model.model[n * model.sizeof + m] & 0xFF);
  73.                
  74.                 while(temp.length() < 8)
  75.                 {
  76.                     temp = "0" + temp;
  77.                 }
  78.                 System.out.print(temp);
  79.             }
  80.             System.out.println();
  81.         }
  82.         result = processModel(model, model2);
  83.         switch(result)
  84.         {
  85.             default:
  86.                 System.out.println("Обработка модели завершена");
  87.         }
  88.        
  89.         result = writeFile(model2, args[1]);
  90.         switch(result)
  91.         {
  92.             case -1:
  93.                 System.out.println("Ошибка при доступе к файлу результатов");
  94.                 break;
  95.             default:
  96.                 System.out.println("Вывод списка дуг в файл успешно завершен");
  97.         }
  98.        
  99.     }
  100.     public static int readFile(String in, AM_model out) {
  101.         java.io.BufferedReader br;
  102.         java.util.Vector<Byte> vmodel;
  103.         try {
  104.             br = new java.io.BufferedReader(new java.io.FileReader(in));
  105.             String source = br.readLine();
  106.             if(!source.matches("[ 10]+"))
  107.             {
  108.                 return -3; // недопустимые символы во входном файле
  109.             }
  110.             String[] parts = source.split("[ ]+");
  111.             int size = parts.length;
  112.             if(size > 16)
  113.             {
  114.                 return -2; // слишком большая модель
  115.             }
  116.             vmodel = new java.util.Vector<Byte>();
  117.            
  118.             if(parts[0].equals("1"))
  119.             {
  120.                 return -6; // петля
  121.             }
  122.                    
  123.             int temp = 0;
  124.             int sz = 0;
  125.             for(int m = size - 1; m >= 0; m--)
  126.             {
  127.                 if(sz > 0 && sz % 8 == 0)
  128.                 {
  129.                     vmodel.add((byte)temp);
  130.                     temp = 0;
  131.                 }
  132.                 temp >>= 1;
  133.                 temp = parts[m].equals("1") ? (temp | 0x80) : temp;
  134.                 sz++;
  135.             }
  136.             temp >>= (8 - (size % 8));
  137.             vmodel.add((byte)temp);
  138.            
  139.             for(int n = 1; n < size; n++)
  140.             {
  141.                 source = br.readLine();
  142.                 if(source == null)
  143.                 {
  144.                     return -4; // недостаточно строк в файле
  145.                 }
  146.                 if(!source.matches("[ 10]+"))
  147.                 {
  148.                     return -3; // недопустимые символы во входном файле
  149.                 }
  150.                 parts = source.split("[ ]+");
  151.                 if(parts.length != size)
  152.                 {
  153.                     return -5; // в одной из строк недостаточно элементов
  154.                 }
  155.                 if(parts[n].equals("1"))
  156.                 {
  157.                     return -6; // петля
  158.                 }
  159.                
  160.                 temp = 0;
  161.                 sz = 0;
  162.                 for(int m = size - 1; m >= 0; m--)
  163.                 {
  164.                     if(sz > 0 && sz % 8 == 0)
  165.                     {
  166.                         vmodel.add((byte)temp);
  167.                         temp = 0;
  168.                     }
  169.                     temp >>= 1;
  170.                     temp = parts[m].equals("1") ? (temp | 0x80) : temp;
  171.                     sz++;
  172.                 }
  173.                 temp >>= (8 - (size % 8));
  174.                 vmodel.add((byte)temp);
  175.             }
  176.             //model = new Model();
  177.             out.setModel(new byte[vmodel.size()]);
  178.             out.setSize(size);
  179.             out.setSizeof((size + 7) / 8);
  180.             for(int n = 0; n < vmodel.size(); n++)
  181.             {
  182.                 out.model[n] = vmodel.get(n);
  183.             }
  184.             br.close();
  185.         } catch (java.io.IOException ex) {
  186.             return -1; // ошибка доступа к файлу
  187.         }
  188.         return 0;
  189.     }
  190.     public static int processModel(AM_model in, AL_model out)
  191.     {
  192.         java.util.Vector<Byte> vmodel = new java.util.Vector<Byte>();
  193.         int temp = 0;
  194.         int sz = 0;
  195.         int cnt = 0;
  196.         out.sizeof = (int)Math.ceil(Math.log(in.size) / Math.log(2));
  197.         for(int n = 0; n < in.size; n++)
  198.         {
  199.             int cur = 0;
  200.             for(int m = in.sizeof - 1; m >= 0; m--)
  201.             {
  202.                 cur <<= 8;
  203.                 cur |= in.model[n * in.sizeof + m] & 0xFF;
  204.             }
  205.             for(int m = in.size - 1; m >= 0; m--)
  206.             {
  207.                 if(sz >= 8)
  208.                 {
  209.                     vmodel.add((byte)(temp >> (sz - 8)));
  210.                     sz -= 8;        
  211.                 }
  212.                 if((cur >> (in.size - 1 - m) & 0x01) == 1)
  213.                 {
  214.                     temp = temp << out.sizeof;
  215.                     temp |= n;
  216.                     sz += out.sizeof;
  217.                     temp = temp << out.sizeof;
  218.                     temp |= m;
  219.                     sz += out.sizeof;
  220.                     cnt++;
  221.                 }
  222.                 //System.out.println(n + " -> " + ((cur >> (in.size - 1 - m) & 0x01) == 1 ? m : "Z"));
  223.             }
  224.         }
  225.         if(sz > 0)
  226.         {
  227.             vmodel.add((byte)(temp << (8 - sz)));
  228.         }
  229.         out.setSize(cnt);
  230.         out.setModel(new byte[vmodel.size()]);
  231.         for(int n = 0; n < vmodel.size(); n++)
  232.         {
  233.             out.model[n] = vmodel.get(n);
  234.         }
  235.         return 0;
  236.     }
  237.     public static int writeFile(AL_model in, String out) {
  238.         java.io.BufferedWriter bw;
  239.         try {
  240.             bw = new java.io.BufferedWriter(new java.io.FileWriter(out));
  241.             bw.write("Список дуг\n");
  242.             int mask = 0;
  243.             for(int n = 0; n < in.sizeof; n++)
  244.             {
  245.                 mask <<= 1;
  246.                 mask += 1;
  247.             }
  248.             for(int n = 0; n < in.size; n++)
  249.             {
  250.                 int temp = in.getBits(n * in.sizeof * 2, in.sizeof * 2);
  251.                 int from = temp >> in.sizeof;
  252.                 int to = temp & mask;
  253.                 bw.write("Дуга #" + n + ": " + from + " --> " + to + "\n");
  254.             }
  255.             bw.write("\n");
  256.             bw.close();
  257.         } catch (java.io.IOException ex) {
  258.             return -1; // ошибка доступа к файлу
  259.         }
  260.         return 0;
  261.     }
  262. }
Add Comment
Please, Sign In to add comment