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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2009, 19:43   #1
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию операции с матрицей с#

мне нужно проверять матрицу таким способом:
у меня есть матрица, например, 4Х4. и каждий елемент - 0,1 или 2.
если среди 8 соседних елементов какой-либо единицы есть 1, то общее число единиц увеличивается на 1.

Код:
int  k=0;
            for (int i = 0; i < r; i++)
                for (int j = 0; j < r; j++)
                    if (m[i][j]==1 && (m[i-1][j-1]==1 || m[i-1][j]==1 || m[i-1][j+1]==1 || m[i][j-1]==1 || m[i][j+1]==1 || m[i+1][j-1]==1 || m[i+1][j]==1 || m[i+1][j+1]==1))
                        k++;
ето ведь уж слишком, да? должно бить что-то более рациональное...

Последний раз редактировалось Stilet; 21.05.2009 в 10:42.
Natok вне форума Ответить с цитированием
Старый 20.05.2009, 20:02   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Может, что-нибудь такое:
Код:
int k=0;
for (int i = 0; i < r; i++)
 for (int j = 0; j < r; j++)
  for (int a=-1; a<=1; a++)
   for (int b=-1; b<=1; b++)
    if (!(a==0&&b==0) && m[i+a][j+b]==1) k++;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 20.05.2009, 20:26   #3
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

спасибо большое
но здесь надо еще разобратся с индексами...Visual Studio говорит тут о проблемах с индексировании...)))
шас попробеум
Natok вне форума Ответить с цитированием
Старый 20.05.2009, 20:32   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
но здесь надо еще разобратся с индексами...Visual Studio говорит тут о проблемах с индексировании...)))
Я не проверял. Писал прямо тут.
Надо еще добавить проверку, чтобы суммарный индекс не выходил за границы матрицы.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 20.05.2009, 22:25   #5
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

Код:
int k = 0;
            for (int i = 0; i < r; i++)
                for (int j = 0; j < r; j++)
                    for (int a = -1; a <= 1; a++)
                        for (int b = -1; b <= 1; b++)
                            if (!(a == 0 && b == 0) && ((i+a)>=0) && ((i+a)<r)) && ((i+b)>=0) && ((i+b)<r)) && m[i + a][j + b] == 1 ) k++;
значит так должно бы работать, но в етом случае " сер Visual Studio 2008" говорит, что слишком много "&&"...


Последний раз редактировалось Stilet; 21.05.2009 в 10:44.
Natok вне форума Ответить с цитированием
Старый 20.05.2009, 23:04   #6
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
Восклицание

но, даже если осуществить проверку на границы в if, то как ми проверим уже в цыкле первый елемент, ведь он не будет проверятся, так как не виполняется условие...

помогите, пожалйста, найти ошибку!
Natok вне форума Ответить с цитированием
Старый 21.05.2009, 00:42   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот так, вроде, работает:
Код:
int k=0;
bool flag;
for (int i = 0; i < r; i++)
 for (int j = 0; j < r; j++)
  {
   flag = false;
   for (int a=-1; a<=1; a++)
    for (int b=-1; b<=1; b++)
     {
      if(i+a<0 || i+a >=r ||j+b<0 || j+b>=r) continue;
      if (!(a==0&&b==0) && m[i+a][j+b]==1) flag = true;
     }
   if(flag) k++;
  }
ps Писал на c++, но не суть.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 21.05.2009, 01:54   #8
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

спасибо большое,Sazary!

но оно заработало и с предидущим кодом, просто надо было добавить условие m[i][j] == 1

Код:
int k = 0;
            for (int i = 0; i < r; i++)
                for (int j = 0; j < r; j++)
                    for (int a = -1; a <= 1; a++)
                        for (int b = -1; b <= 1; b++)
                            if (!(a == 0 && b == 0) && i+a>=0 && i+a<r && j+b>=0 && j+b<r && m[i + a][j + b] == 1 && m[i][j] == 1) k++;
а самое главное - можно было двигатся по i и j с 1 до r-1,и код был бы намного проще

Последний раз редактировалось Stilet; 21.05.2009 в 10:44.
Natok вне форума Ответить с цитированием
Старый 21.05.2009, 02:01   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
а самое главное - можно было двигатся по i и j с 1 до r-1,и код был бы намного проще
Но тогда бы не учитывались элементы на границе ) А ведь их нужно учитывать..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 21.05.2009, 02:13   #10
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

м-да, действительно...мне не хватает внимательности...ето из-за отсутсвия опита в програмировании или из-за отсутсвия досточного количества мозгов

а можно вопрос?
что делает оператор continue?
я так понимаю, что когда виполняется условие, то цикл просто двигается дальше, да?
да, кажется так и есть...
Natok вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
операции с квадратной матрицей HoOpe Общие вопросы C/C++ 6 01.04.2009 22:30
Задача с матрицей Kawun Помощь студентам 9 26.03.2009 00:29
C++, Операции с прямоугольной матрицей WinterLord Помощь студентам 5 14.12.2008 04:03
помогите с матрицей Panda Помощь студентам 1 01.07.2008 11:31
Задача с матрицей H[o][o]K Помощь студентам 1 15.12.2007 16:51