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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2009, 17:22   #1
tetra91
 
Регистрация: 08.11.2009
Сообщений: 5
Восклицание Проблемка с функцией

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

у меня получился вот такой код, помогите разобраться, пожалуйста, где у меня ошибка:
Код:
int i=0, j=0;

void Del(int **L,int n1,int m1, int i, int j)
{
    bool equal = false;
	
    for(;i<n1;i++)
	{
                for(;j<m1;j++)
				{
					   if(L[i][j]==L[i][j+1]) 
					   {
						   equal = true;
							break;
					   }
                       else {return Del(L, n1, m1, i+1, j);
					   }
				} break;
	}

	if (equal==true)
	{
		for (;i<n1;)
		{
			for (j=0; j<=m1; j++)
			{
				L[i][j]=L[i][j+1];
				return Del(L, n1, m1, i+1, j);
			}
		}
	}
}

Заранее спасибо...

Последний раз редактировалось tetra91; 08.11.2009 в 17:25.
tetra91 вне форума Ответить с цитированием
Старый 08.11.2009, 20:04   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Как я понял, "физического" удаления не происходит. Просто уменьшаем значение переменной, отвечающей за количество строк?
Тогда предлагаю такой вариант:
Код:
// m - количество строк, n - количество столбцов
void Del(int **L, int &m, int n, int K) // K - индекс просматриваемой строки
{
 int i,j;
 bool flag = true;
 for(j=1; i<n; ++j)
  if(L[K][j]!=L[K][j-1])  // если предыдущий элемент не равен текущему
   {
    flag = false; // отмечаем
    break;
   }
 if(flag)  // если в строке все элементы равны...
  {
   for(i=K; i<m-1; ++i)
    for(j=0; j<n; ++j)
     L[i][j] = L[i+1][j];  // ...то сдвигаем все строки ниже вверх
   --m;   // и уменьшаем количество строк
  }
}
Писал прямо здесь, поэтому возможны ошибки.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.11.2009, 22:53   #3
tetra91
 
Регистрация: 08.11.2009
Сообщений: 5
По умолчанию

В Вашем коде получается так, что эта функция просто меняет местами строки. Т.е. сначала идет та строка в которой элементы различны, а затем идут строки с одинаковыми элементами...
tetra91 вне форума Ответить с цитированием
Старый 10.11.2009, 02:13   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Нет, в моем коде как раз происходит сдвиг нижних строк вверх. Правда, там есть пара ошибок.
Вот верный вариант:
Код:
// m - количество строк, n - количество столбцов
void Del(int **L,int &m,int n, int K) // K - индекс просматриваемой строки
{
 int i,j;
 bool flag = true;
 for(j=1; j<n; ++j)
  if(L[K][j]!=L[K][j-1])
   {
    flag = false;
    break;
   }
   
 if(flag)
  {
   for(i=K; i<m-1; ++i)
    for(j=0; j<n; ++j)
     L[i][j] = L[i+1][j];
   --m;  
  }
}
Тестировал на таком коде:
Код:
#include <iostream>
using namespace std;

// m - количество строк, n - количество столбцов
void Del(int **L,int &m,int n, int K) // K - индекс просматриваемой строки
{
 int i,j;
 bool flag = true;
 for(j=1; j<n; ++j)
  if(L[K][j]!=L[K][j-1])
   {
    flag = false;
    break;
   }
   
 if(flag)
  {
   for(i=K; i<m-1; ++i)
    for(j=0; j<n; ++j)
     L[i][j] = L[i+1][j];
   --m;  
  }
}

void print(int **L, int m, int n)
{
 int i,j;
 for(i=0; i<m; i++)
  {
   for(j=0; j<n; j++)
    {
     cout.width(4);
     cout<<L[i][j];
    }
   cout<<endl; 
  }
 cout<<endl<<endl; 
}


int main(int argc, char *argv[])
{
int **M,m,n,i,j;
m=4;
n=4;
M = new int*[m];
for(i=0; i<m; i++)
 M[i] = new int[n];
 
for(i=0; i<m; i++)
 {
  for(j=0; j<n; j++)
   {
    M[i][j] = i+j;
   }
 }
for(j=0; j<n; j++)
 M[2][j] = 1;
 
print(M,m,n);
Del(M,m,n,2);
print(M,m,n);

for(i=0; i<m;i++)
 delete[] M[i];
delete[] M;  

cin.get();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 10.11.2009, 16:04   #5
tetra91
 
Регистрация: 08.11.2009
Сообщений: 5
По умолчанию

Спасибо большое!!!
tetra91 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемка Lacrimoso Общие вопросы C/C++ 11 24.09.2009 23:14
проблемка lucky Паскаль, Turbo Pascal, PascalABC.NET 1 12.05.2009 22:32
проблемка( Alexcomeback Общие вопросы C/C++ 4 16.04.2009 18:38