На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Портирование Java (Android) на C# (WinForms)


Я уже писал о заказе на перенос кода C# на Java, а тут хочу рассказать о работе по обратному портированию. Итак, как перенести проект Android, рассчитывающий по формулам различные значения: диапазон, вероятность, степень свободы и критерий хи-квадрата.



Сначала я не хотел браться, так как не работаю с Andriod – там хоть и java, но немного отличающаяся Java, есть нюансы и тонкости. Однако, заказчик давний и хороший, поэтому ршил посмотреть. Исходник оказался состоящим из одного файла MainActivity.java и на первый взгляд не требовал подключения каких-то специфических библиотек, поэтому я решил все-таки сделать этот заказ.

Поля класса MainActivity

private Float[] arrayInt;
    private int N;
    private  float a, b;
    private  float[] tableHi;
    private String buff;
переводятся просто:

private double[] arrayInt;
        private int N;
        private float a, b;
        private float[] tableHi;
        private String buff;
Далее в программе семь методов и каждый из них необходимо преобразовать из Java в C#. Для примера возьмем метод ReadTableHi()

private void ReadTableHi() {
        tableHi = new float[21];
        File file = new File("/sdcard/","hi.txt");
        StringBuilder text = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            int i = 0;
            while ((line = br.readLine()) != null) {
                tableHi[i] = Float.valueOf(line);
                i++;
            }
            br.close();
            Toast toast = Toast.makeText(this, "Таблица ХИ-квадрат критерия загружена/ \n Первое значение " + tableHi[0],Toast.LENGTH_LONG);
            toast.show();
        }
        catch (IOException e) {
            Toast toast = Toast.makeText(this, e.getMessage(),Toast.LENGTH_LONG);
            toast.show();
        }
    }
Он загружает в программу числа из файла вот в таком формате.



Преобразованный метод получается таким

private void ReadTableHi()
        {
            tableHi = new float[21];
            string[] lines = File.ReadLines("hi.txt").ToArray(); ;
            for (int i=0; i< lines.Length; i++)
            {
                tableHi[i] = float.Parse(lines[i]);

            }
            MessageBox.Show("Таблица ХИ-квадрат критерия загружена \n Первое значение " + tableHi[0]);
        }
Я убрал обработку ошибок, так как мы точно знаем, что файл у нас будет. Или вот метод Generate()

public void Generate(View view) {
        try{
            //Инициализация переменных
            // - КОЛИЕЧЕСТВО СЛУЧАЙНЫХ ЧИСЕЛ
            EditText text_N = findViewById(R.id.n_text);
            N = Integer.valueOf(text_N.getText().toString());
            // - НИЖНЯЯ ГРАНИЦА ДИАПАЗОНА
            EditText text_a = findViewById(R.id.a_text);
            a = Float.valueOf(text_a.getText().toString());
            // - ВЕРХНЯЯ ГРАНИЦА ДИАПАЗОНА
            EditText text_b = findViewById(R.id.b_text);
            b = Float.valueOf(text_b.getText().toString());
            // - МАССИВ СЛУЧАЙНЫХ ЧИСЕЛ
            arrayInt = new Float[N];
            String helpArrayInt = "";

            //Отчистка текстового поля
            EditText listArray = findViewById(R.id.array_list);
            listArray.setText("");

            //Генерация массива случайных чисел
            for (int i = 0; i < N; i++){
                float randomInt = (float)( Math.random() * (b - a) ) + a;
                arrayInt[i] = randomInt;
                helpArrayInt += "[" + randomInt + "]";
            }

            //Отображение массива сл. чисел на экране
            listArray.setText("Массив случайных чисел из [" + N + "] элементов: \n" + helpArrayInt);

            //Включение кнопки расчёта
            Button Cal = findViewById(R.id.cal_bot);
            Cal.setClickable(true);
            Cal.setEnabled(true);
        }catch (Exception e){
            EditText listArray = findViewById(R.id.array_list);
            listArray.setText(e.getMessage());
        }
    }
Его аналог на C#:

public void Generate()
        {
            try
            {
                //Инициализация переменных
                // - КОЛИЕЧЕСТВО СЛУЧАЙНЫХ ЧИСЕЛ
                N =  (int) numericUpDown1.Value;
                // - НИЖНЯЯ ГРАНИЦА ДИАПАЗОНА
                a = (int)numericUpDown2.Value;
                // - ВЕРХНЯЯ ГРАНИЦА ДИАПАЗОНА
               b = (int)numericUpDown3.Value;
                // - МАССИВ СЛУЧАЙНЫХ ЧИСЕЛ
                arrayInt = new double[N];
                String helpArrayInt = "";

                //Отчистка текстового поля
               // EditText listArray = findViewById(R.id.array_list);
             //   listArray.setText("");

                //Генерация массива случайных чисел
                for (int i = 0; i < N; i++)
                {
                    double randomInt = (double)(RandomNumber() * (b - a)) + a;
                    arrayInt[i] = randomInt;
                    helpArrayInt += "[" + randomInt + "]";
                }

                //Отображение массива сл. чисел на экране
              textBox1.Text = "Массив случайных чисел из [" + N + "] элементов: \n" + helpArrayInt;


            }
            catch (Exception e)
            {
            }
        }
Так как в NET нет встроенного метода Math.random() для чисел типа float или double, то приходится писать свой метод:

public double RandomNumber()
    {       
		string str = "0," + random.Next(0, 99999999).ToString() + random.Next(0, 99999999).ToString();
		double fl = Convert.ToDouble(str);
		return fl;
	}
Так и с остальными функциями. Это интересный процесс. Если вам требуется конвертировать код Java в C# или наоборот – пишите.



Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.



тегизаметки, java, си шарп, портирование, перенос кода





Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Структуры данных и способы их реализации
Обычное утро удаленного администратора сайта


© upread.ru 2013-2020
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.