Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > создание windows-приложения на языке с#


Автор: michal3003 2.4.2012, 09:40
Сформировать матрицу A по правилу Aij=(2Bij + Bmin)/Bmax , где В - произвольно введенная матрица размером (m*n), Bmin - минимальный элемент матрицы B, Bmax - максимальный элемент матрицы B.

Автор: erm0l0v 2.4.2012, 12:35
Код

class Program
    {
        static void Main(string[] args)
        {
            Console.Write("n ->");
            int n = Convert.ToInt32(Console.ReadLine());
            Console.Write("m ->");
            int m = Convert.ToInt32(Console.ReadLine());

            double[,] B = CreateRandomMatrix(n, m);
            double Bmin = FindElement(B, n, m, (find, matrix, i, j) => find > matrix[i, j]);
            double Bmax = FindElement(B, n, m, (find, matrix, i, j) => find < matrix[i, j]);
            double[,] A = ConvertMatrix(B, n, m, (matrix, i, j) => (2 * matrix[i, j] + Bmin) / Bmax);
            PrintMatrix(A, n,m);
            Console.ReadLine();
        }

        static double[,] CreateRandomMatrix(int n, int m)
        {
            Random random = new Random();
            double[,] result = new double[n, m];
            for (int i = 0; i < n; i++)
            {
                for(int j = 0; j < m; j ++)
                {
                    result[i, j] = random.NextDouble();
                }
            }
            return result;
        }

        static double FindElement(double[,] matrix, int n, int m, Func<double, double[,], int, int,bool> check)
        {
            double? find = null;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    if (find == null)
                        find = matrix[i, j];
                    else
                        if (check((double)find, matrix, i, j))
                            find = matrix[i, j];
                }
            }
            return (double)find;
        }

        static double[,] ConvertMatrix(double[,] matrix, int n, int m, Func<double[,], int, int, double> convertFunction)
        {
            double[,] result = new double[n, m];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    result[i, j] = convertFunction(matrix, i, j);
                }
            }
            return result;
        }

        static void PrintMatrix(double[,] matrix, int n, int m)
        {
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    Console.Write("{0}\t", matrix[i, j]);
                }
                Console.WriteLine();
            }
        }
    }

Автор: michal3003 3.4.2012, 09:45
а как можно сделать в winforms???

Автор: erm0l0v 3.4.2012, 11:35
В чем конкретно проблема? или вы даже не пытались реализовать задачу самостоятельно?

Вот так "выучат" программистов а потом все думают почему самолеты падают)))

Автор: michal3003 3.4.2012, 11:56
Цитата(erm0l0v @ 3.4.2012,  11:35)
В чем конкретно проблема? или вы даже не пытались реализовать задачу самостоятельно?

Вот так "выучат" программистов а потом все думают почему самолеты падают)))

да нет, это не про меня)))на 1 кнопку ввожу данные первой матрицы,не могу сообразить как сделать на вторую кнопку реализовать вывод МАТРИЦЫ Aij по правилу........

Автор: erm0l0v 3.4.2012, 12:42
Ну вы можете вывести в таблицу "DataGridView" получится довольно красиво. Но если неохота заморачиваться с DataGrid можно вывести в TextBox или ListBox в этом случае вам нужно будет просто подготовить текст специального формата, с пробелами между числами.

По DataGridView вы найдете много информации в msdn, только обратите внимание что вам нужен DataGridView из WinForms а то вас поисковик может послать на DataGrid из WPF это не совсем что вам нужно.

Автор: michal3003 3.4.2012, 13:44
Цитата(erm0l0v @ 3.4.2012,  12:42)
Ну вы можете вывести в таблицу "DataGridView" получится довольно красиво. Но если неохота заморачиваться с DataGrid можно вывести в TextBox или ListBox в этом случае вам нужно будет просто подготовить текст специального формата, с пробелами между числами.

По DataGridView вы найдете много информации в msdn, только обратите внимание что вам нужен DataGridView из WinForms а то вас поисковик может послать на DataGrid из WPF это не совсем что вам нужно.

Сначала я задаю m & n, т.е. длину матрицы.Потом нажимаю кнопку сформировать data GV клеточками(размером m & n) для ввода данных.В первую data GV я ввожу данные матрицы B, как вывести с помощью второй кнопки по правилу (см. в условии задачи) матрицу А во вторую data GV.?????

Добавлено через 4 минуты и 21 секунду
Ну примерно что-то так....

Автор: erm0l0v 3.4.2012, 14:34
То есть матрицу B вы сформировали, матрицу А посчитали осталось вывести?

Вы можете обратиться к строкам и столбцам DataGridView и задавать значения, а как вы это покажете в своем приложении зависит от вас, можно отобразить на том же DataDridView где у вас показана исходная матрица, но мне кажется будет удобнее если вы покажете и исходную и обработанную матрицу на двух DataGridView.

Автор: michal3003 3.4.2012, 15:12
Цитата(erm0l0v @ 3.4.2012,  14:34)
То есть матрицу B вы сформировали, матрицу А посчитали осталось вывести?

Вы можете обратиться к строкам и столбцам DataGridView и задавать значения, а как вы это покажете в своем приложении зависит от вас, можно отобразить на том же DataDridView где у вас показана исходная матрица, но мне кажется будет удобнее если вы покажете и исходную и обработанную матрицу на двух DataGridView.

это понятно мне....

А как посчитать по формуле матрицу А???Как циклы сформировать правильно в программном коде,примерно???

Автор: erm0l0v 3.4.2012, 15:44
Посмотрите мое первое сообщение там все есть.

Код

double Bmin = FindElement(B, n, m, (find, matrix, i, j) => find > matrix[i, j]);
double Bmax = FindElement(B, n, m, (find, matrix, i, j) => find < matrix[i, j]);


находим Bmin Bmax

Код

double[,] A = ConvertMatrix(B, n, m, (matrix, i, j) => (2 * matrix[i, j] + Bmin) / Bmax);


конвертируем матрицу.

Все что вам нужно считать матрицу B подсунуть её в этот код и показать полученную матрицу A.

Не пугайтесь переменных
Код

Func<double[,], int, int, double> convertFunction

это лямбда выражения (функции). Запись выше показывает что в качестве параметра хотим видеть функцию которая принимает значения double[,], ini, int и возвращает double.
В коде лямбда выражение будет использоваться как обычная функция:

Код

result[i, j] = convertFunction(matrix, i, j);


а объявляется выражение так:
Код

(matrix, i, j) => (2 * matrix[i, j] + Bmin) / Bmax


здесь у нас Bmin и Bmax это просто переменные которые должны быть объявлены выше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)