Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2012, 14:26   #1
RIOs
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 49
По умолчанию Перемножение матриц. интересная проблема (C#)

Задание такое перемножить две матрицы.
Вот код:
Код:
static void Main(string[] args)
        {
            int n1, n2, n3, m1, m2, m3, tmp;
            Console.WriteLine("Введите n1:");
            n1 = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите m1:");
            m1 = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите n2:");
            n2 = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите m2:");
            m2 = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите n3:");
            n3 = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите m3:");
            m3 = int.Parse(Console.ReadLine());

            Random rnd = new Random();

            int[,] A = new int[n1, m1];
            int[,] B = new int[n2, m2];
            int[,] C = new int[n3, m3];

            for (int i = 0; i < n1; ++i)
            {
                for (int j = 0; j < m1; ++j)
                {
                    A[i, j] = rnd.Next(1, 9);
                    Console.Write("{0,3}", A[i, j]);
                    
                }
                Console.WriteLine();
            }
            Console.WriteLine();

            for (int i = 0; i < n2; ++i)
            {
                for (int j= 0; j< m2; ++j)
                {
                    B[i, j] = rnd.Next(1, 9);
                    Console.Write("{0,3}", B[i, j]);

                }
                Console.WriteLine();
            }

            Console.WriteLine("Перемноженная матрица");

            for (int i = 0; i < n1; ++i)
            {
                for (int j = 0; j < m2; ++j)
                {
                    
                    for (int k = 0; k < n2; ++k)
                    {
                        
                        tmp = A[i, k] * B[k, j];
                        C[i, j] = A[i, k] * B[k, j]+tmp;
                     
                    }
                    Console.Write("{0,3}", C[i, j]);

                } 
                
            }
            
            Console.ReadKey();
        }

Проблема, в том, что при выводе перемноженной матрицы формируется элементов больше (из-за того, что он выводит промежуточные)
Код:
tmp = A[i, k] * B[k, j];
C[i, j] = A[i, k] * B[k, j]+tmp;
Вот этот участок кода я думаю не правильный. Тут должен быть другой алгоритм подсчета элементов (т.е должно выйти строка на столбец)
RIOs вне форума Ответить с цитированием
Старый 14.06.2012, 17:00   #2
RIOs
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 49
По умолчанию

Ребят помогите пожалуйста.
Просто вставьте код. Для опытных программистов проблемы нет, эт просто я что-то туплю =((
и так тоже высчитывается не правильно (((
Код:
C[i,j]+=A[i,k]*B[k,j]
RIOs вне форума Ответить с цитированием
Старый 14.06.2012, 17:16   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
using System;
 
namespace Example
{
    class Program
    {
	
static void Main(string[] args)
        {
            int k,l,m;
            Console.WriteLine("Введите k:");
            k = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите l:");
            l = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите m:");
            m = int.Parse(Console.ReadLine());

            Random rnd = new Random();

            int[,] A = new int[k, l];
            int[,] B = new int[l, m];
            int[,] C = new int[k, m];

            for (int i = 0; i < k; ++i)
            {
                for (int j = 0; j < l; ++j)
                {
                    A[i, j] = rnd.Next(1, 9);
                    Console.Write("{0,3}", A[i, j]);  
                }
                Console.WriteLine();
            }
            Console.WriteLine();

            for (int i = 0; i < l; ++i)
            {
                for (int j= 0; j< m; ++j)
                {
                    B[i, j] = rnd.Next(1, 9);
                    Console.Write("{0,3}", B[i, j]);
                }
                Console.WriteLine();
            }

            Console.WriteLine("Перемноженная матрица");

            for (int i = 0; i < k; ++i)
            {
                for (int j = 0; j < m; ++j)
                {
                    C[i, j] = 0;
                    for (int q = 0; q < l; ++q)
                        C[i, j] += A[i, q] * B[q, j];               
                    Console.Write("{0,3}", C[i, j]);
                }  
				Console.WriteLine();				
            }
            
            Console.ReadKey();
        }
		
	}
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.06.2012, 17:36   #4
RIOs
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 49
По умолчанию

Спасибо, действительно работает.

Теперь вообще интересно. В чем отличие моего кода от последнего варианта товарища BDA?
RIOs вне форума Ответить с цитированием
Старый 14.06.2012, 17:42   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Пожалуйста.
Во-первых, считывание и задание только требуемых размеров:
Код:
int[,] A = new int[k, l];
int[,] B = new int[l, m];
int[,] C = new int[k, m];
Во-вторых, обнуление C[i, j] = 0;. Я не знаю C#, но, похоже, как и в C, локальные переменные не обнуляются.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.06.2012, 18:04   #6
RIOs
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 49
По умолчанию

BDA, а заметил громадную мою недоработку. В цикле for в последнем не надо скобок фигурных... интересно почему. Меня вообще эти циклы постоянно пугают. Надо по ним литературу почитать хорошую. Чтобы полностью надрочиться на них. Только вот не знаю какую(
RIOs вне форума Ответить с цитированием
Старый 14.06.2012, 18:20   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Что почитать, не могу посоветовать, т.к. сам ничего не читал.
Код:
for (int q = 0; q < l; ++q)
  C[i, j] += A[i, q] * B[q, j];
Я убрал скобки, т.к. остался всего 1 оператор внутри цикла, хотя преподаватели советуют ставить скобки в любом случае (но кто слушает преподавателей ).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перемножение матриц mozg2011 Общие вопросы Delphi 13 23.02.2012 21:50
Перемножение матриц N * M и M * L Pan_rust Помощь студентам 0 13.05.2011 10:14
Перемножение матриц Blad47 Общие вопросы C/C++ 1 02.02.2009 00:21
Перемножение матриц Арина Помощь студентам 1 18.05.2007 19:21