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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2010, 13:02   #1
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию С# Матрица бррр..

Ещё на первом курсе я не любил матрицы, брр...гадость. И вот сел я за лабу, увидел задание и чуть не заплакал горькими слезами. Прошу помочь:

Если в матрице A меньше столбцов, содержащих нулевые элементы, чем в матрице В, расположить строки матрицы А в порядке убывания сумм положительных элементов строк. В противном случае увеличить все ненулевые элементы матрицы В на значение сумм положительных элементов соответствующих строк ( в которых ненулевые элементы расположены).

Для решения задачи создать класс «Матрица», содержащий закрытое поле-массив для хранения данных, методы ввода и вывода элементов матрицы, индексатор для доступа к элементам поля-массива, а также все необходимые для решения задачи свойства и методы.

Помогите пл3
До последней точки с запятой в коде...
Necare вне форума Ответить с цитированием
Старый 25.11.2010, 13:05   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Сколько раз уже на форуме говорилось - помочь можно, если есть свои наработки. Если - "решите за меня" - то во фриланс ->.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 25.11.2010, 13:10   #3
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

Свои наработки есть касательно ввода вывода, а как считать эти столбцы - хз...
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Matrica
    {
        int[,] x;

        public Matrica(string name)
        {
            Console.WriteLine("Введите кол-во строк для матрицы:" + name);
            int n = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите кол-во столбцов для матрицы" + name);
            int m = int.Parse(Console.ReadLine());
            x = new int[n, m];
        }
        public Matrica(int n, int m) { x = new int[n, m]; }
        public int[,] X
        {
            get { return x; }
            set { x = value; }
        }

        public int Stolb()
        {
            int k = 0;
            for (int i = 0; i < x.GetLength(1); i++)
            {
                for (int j = 0; j < x.GetLength(0); j++)
                    if (x[j, i] == 0)
                        k = k + 1;
            }
            return (k);
        }




        public void vvod(string name)
        {
            Console.WriteLine("Введите матрицу " + name);
            for (int i = 0; i < x.GetLength(0); ++i)
            {
                Console.WriteLine("Введите элементы " + i + "-й строки:");
                for (int j = 0; j < x.GetLength(1); ++j)
                    x[i, j] = int.Parse(Console.ReadLine());
            }
        }

        public void vyvod_matr(string zagolovok)
        {
            Console.WriteLine(zagolovok);
            for (int i = 0; i < x.GetLength(0); ++i)
            {
                for (int j = 0; j < x.GetLength(1); ++j)
                    Console.Write(" {0,7:f2}", x[i, j]);
                Console.WriteLine();
            }
        }


        class Program
        {
            static void Main(string[] args)
            {
                int s;
                Matrica A = new Matrica("A"); A.vvod("A");
                Matrica B = new Matrica("B"); B.vvod("B");
                A.vyvod_matr("Исходная матрица А");
                B.vyvod_matr("Исходная матрица B");
                if (A.Stolb() < B.Stolb())
                    Console.WriteLine("В матрице А столбцов с 0 больше чем в матрице B");
                else
                    if (A.Stolb() > B.Stolb())
                        
                        for (int i = 0; i < B.x.GetLength(0); i++)
                        {
                            s = 0;
                            for (int j = 0; j < B.x.GetLength(1); j++)
                            {                               
                                s = s + B.x[i, j];
                                if (B.x[i, j] != 0)
                                    B.x[i, j] = B.x[i, j] + s;
                            }
                        }    
                            B.vyvod_matr("Новая B");
Console.ReadKey();
            }
        }
    }
}
Ковыряю:б)увеличить все ненулевые элементы матрицы В на значение сумм положительных элементов соответствующих строк ( в которых ненулевые элементы расположены).
Код:
for (int i = 0; i < B.x.GetLength(0); i++)
                        {
                            s = 0;
                            for (int j = 0; j < B.x.GetLength(1); j++)
                            {
                                s = s + B.x[i, j];
                                if (B.x[i, j] != 0)
                                    B.x[i, j] = B.x[i, j] + s;

                            }
                        }
                            B.vyvod_matr("Новая B");

Где ошибка? Матрица А ={1 1
1 1}
Матрица B{0 2
4 3}
Новая матрица B = 0 4
8 10

увеличить все ненулевые элементы матрицы В на значение сумм положительных элементов соответствующих строк ( в которых ненулевые элементы расположены).
До последней точки с запятой в коде...

Последний раз редактировалось Stilet; 25.11.2010 в 16:29.
Necare вне форума Ответить с цитированием
Старый 25.11.2010, 22:47   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Ты меня прям заинтриговал))
В аттаче, пример с первым заданием
Цитата:
Если в матрице A меньше столбцов, содержащих нулевые элементы, чем в матрице В, расположить строки матрицы А в порядке убывания сумм положительных элементов строк
Второе, надеюсь сам сделаешь?

Кстати
Цитата:
В противном случае увеличить все ненулевые элементы матрицы В на значение сумм положительных элементов соответствующих строк ( в которых ненулевые элементы расположены).
В моем примере, есть функция которая считает сумму эл. Так что, будет не трудно пройти по строкам и приплюсовать сумму

P.S. C# только учу, так что сильно не бей
Вложения
Тип файла: zip Program.zip (1.1 Кб, 14 просмотров)
psycho-coder вне форума Ответить с цитированием
Старый 26.11.2010, 17:16   #5
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

Расслабься я сам в С# обитаю только с сентября.

Помучил, помучил и вымучил:

Код:
for (int i = 0; i < B.x.GetLength(0); i++)
                        {
                            s = 0;
                            for (int j = 0; j < B.x.GetLength(1); j++)
                            {
                                if (B.x[i, j] != 0)
                                    s = s + B.x[i, j];
                                                               
                            }
                               
                        }
Должно считать сумму элементов строки, но не правильно: элементы первого столбца увеличивает не на сумму элементов строки, а в два раза. Помогите с ошибкой плиз =)

Расслабься я сам в С# обитаю только с сентября.

Помучил, помучил и вымучил:

Код:
for (int i = 0; i < B.x.GetLength(0); i++)
                        {
                            s = 0;
                            for (int j = 0; j < B.x.GetLength(1); j++)
                            {
                                if (B.x[i, j] != 0)
                                    s = s + B.x[i, j];
                                           B.x[i, j] =B.x[i, j] +s;                    
                            }
                               
                        }
Должно считать сумму элементов строки, но не правильно: элементы первого столбца увеличивает не на сумму элементов строки, а в два раза. Помогите с ошибкой плиз =)

1) Чем меньше кода, тем лучше.
2) Пытаюсь писать то, что понимаю, а не сдирать хз чё. У тебя функции, значения которых мне не известны.
3) Да я не очень умный.
До последней точки с запятой в коде...

Последний раз редактировалось Stilet; 28.11.2010 в 16:38.
Necare вне форума Ответить с цитированием
Старый 26.11.2010, 19:09   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от Necare Посмотреть сообщение
1) Чем меньше кода, тем лучше.
2) Пытаюсь писать то, что понимаю, а не сдирать хз чё. У тебя функции, значения которых мне не известны.
3) Да я не очень умный.
1) Меньше кода не всегда лучше!
2) хз че не сдирай. Попытайся понять что там написано. Справку никто не отменял! Если не известны, могу прокомментировать. Если не понятно что для чего - спрашивай. Трассировкой пользовались?
3) Про твои умственные способности ни кто ничего не говорит. Все мы когда то, чему то учились.

Давайте разберем Ваш код:
Код:
for (int i = 0; i < B.x.GetLength(0); i++)
{
	// Переменная для хранения суммы. Почему она внутри цикла?
	// Она же будет постоянно обнуляться!
	s = 0; 
	
	for (int j = 0; j < B.x.GetLength(1); j++)
	{
		// Если не равно 0. Т.е. 1, 2, 3, 4 и т.д. и -1, -2, -3, -4 и т.д.
		if (B.x[i, j] != 0) s = s + B.x[i, j]; // Тогда приплюсовываем значение! (отрицательные также)
		B.x[i, j] =B.x[i, j] +s; // Затем к текущему элементу приплюсовываем сумму! ЗАЧЕМ?
	}
}
psycho-coder вне форума Ответить с цитированием
Старый 26.11.2010, 19:31   #7
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
1) Меньше кода не всегда лучше!
2) хз че не сдирай. Попытайся понять что там написано. Справку никто не отменял! Если не известны, могу прокомментировать. Если не понятно что для чего - спрашивай. Трассировкой пользовались?
3) Про твои умственные способности ни кто ничего не говорит. Все мы когда то, чему то учились.

Давайте разберем Ваш код:
Код:
for (int i = 0; i < B.x.GetLength(0); i++)
{
	// Переменная для хранения суммы. Почему она внутри цикла?
	// Она же будет постоянно обнуляться!
	s = 0; 
	
	for (int j = 0; j < B.x.GetLength(1); j++)
	{
		// Если не равно 0. Т.е. 1, 2, 3, 4 и т.д. и -1, -2, -3, -4 и т.д.
		if (B.x[i, j] != 0) s = s + B.x[i, j]; // Тогда приплюсовываем значение! (отрицательные также)
		B.x[i, j] =B.x[i, j] +s; // Затем к текущему элементу приплюсовываем сумму! ЗАЧЕМ?
	}
}
s=0. Так сумма и должна обнуляться каждую просмотренную строку. Строка прошла сумму посчитало. Обнулилось смотрим следующую строку.

// Затем к текущему элементу приплюсовываем сумму! ЗАЧЕМ?

увеличить все ненулевые элементы матрицы В на значение сумм положительных элементов соответствующих строк.


Я хотел: вот оно просматривает строку, находит сумму элементов и сразу же выполняет сложение.
До последней точки с запятой в коде...
Necare вне форума Ответить с цитированием
Старый 26.11.2010, 19:33   #8
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Так ведь сумма еще не посчитана! А вы ее уже суммируете!
psycho-coder вне форума Ответить с цитированием
Старый 26.11.2010, 19:34   #9
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

а как правильно?
До последней точки с запятой в коде...
Necare вне форума Ответить с цитированием
Старый 26.11.2010, 20:03   #10
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Сначала найти сумму строки.
Затем пройтись по строке и сложить все элементы с уже известной суммой.
Например вот так можно получить массив сумм, для каждой строки
Код:
private int[] SumRows()
{
  // Массив результатов
  int[] res = new int[mRows];

  // Обнуляем его
  for (int i = 0; i < mRows; i++) res[i] = 0; // Так на всякий :)
  
  for (int i = 0; i < mRows; i++)
    for (int j = 0; j < mCols; j++)
      // получаем сумму не нулевых эл.
      if (mMtx[i, j] != 0)
        res[i] += mMtx[i, j];

  return res; // Вернем результат
}
Смысл думаю понятен?
Во входном параметре можно указать номер строки, тогда можно будет получить сумму для конкретной строки
Код:
private int SumRow(int NumRow)
{
  // результат
  int res = 0
  
  for (int j = 0; j < mCols; j++)
    // получаем сумму не нулевых эл.
    if (mMtx[NumRow, j] != 0)
      res[i] += mMtx[NumRow, j];

  return res; // Вернем результат
}
Где mMtx - это исходная матрица.
А потом пройтись по строке и сложить все )
Код:

private void SumRow(int NumRow)
{
  // результат
  int res = 0
  
  for (int j = 0; j < mCols; j++)
    // получаем сумму не нулевых эл.
    if (mMtx[NumRow, j] != 0)
      res[i] += mMtx[NumRow, j];

  for (int j = 0; j < mCols; j++)
    // суммируем
    if (mMtx[NumRow, j] != 0)
      mMtx[NumRow, j] += res[i];
}
Положение i, j и NumRow зависит от того, в каком порядке Вы работаете с массивом.
psycho-coder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
TurboPascal: граф, матрица смежности и матрица инцидентности. ulala Помощь студентам 0 02.12.2009 10:11
матрица shelest Помощь студентам 1 25.11.2009 21:35
матрица Babur4iK Помощь студентам 1 11.11.2009 17:53
МАТРИЦА (СИ) Freia Помощь студентам 5 19.12.2008 22:39