powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление одновременно столбцов и строк.
18 сообщений из 18, страница 1 из 1
Удаление одновременно столбцов и строк.
    #38074762
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите разобраться в программе.
Вторую неделю мучаюсь
Задан двумерный динамический массив целых чисел.
Нужно исключить из матрицы столбцы и строки, в которых нечетных элементов меньше, чем четных.
Написал только для строк , компилируется но работает неверно + иногда ошибки при работе с кучей, видимо выходит за пределы.
Как реализовать это одновременно с удалением столбцов не представляю, так как сразу удалять строку после проверки нельзя ,ведь это может повлиять на будущую проверку столбцов. Скорее всего надо будет просто запоминать все строки и столбцы с нужным параметром, а потом только удалять.
Модератор: Отредактировано
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074773
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикрепи правильный исходник. А модератор уберёт кривые версии.
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074776
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
// ConsoleApplication14.cpp: определяет точку входа для консольного приложения.
//


#include "stdafx.h"
#include <iostream>
#include <iomanip>	
#include <stdlib.h>
#include <time.h>

using namespace std;
 int D;

void print_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
			cout << setw(4) << mtx[i][j] << " ";

		cout << endl;
	}
}

void fill_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			mtx[i][j] = rand() % 1000;
}

int matrix_operations (int **mtx, int N, int M)
{ 
	
	int ne4=0,chet=0;
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
		{
				if (mtx[i][j]%2==1) ne4+=1 ;
			else chet+=1;
		}	
		
			
				
	
			if (chet>ne4&&i!=N)
			{
				for (int k=i;k<N;k++);
				{
				memmove((void**)mtx[i],(void**)mtx[i+1],(M)*sizeof(int));
				}
				N=N-1;
				mtx= (int **)realloc((void *)mtx,N*sizeof(int));

				
	
			}
			ne4=0;chet=0;
			cout<<endl<<N;
	}
				D=N;
					return(**mtx);
}
int main()
{
	srand((unsigned)time(NULL));
	
	int		N = 0, M = 0;

	while(N == 0)
	{
		cout << "Enter number of rows: "; 
		cin >> N;
	}

	while(M == 0)
	{
		cout << "Enter number of columns: "; 
		cin >> M;
	}

	int		**mtx = (int**) malloc(N*sizeof(int*));

	if(mtx == NULL)
	{
		cout << "Error: cannot allocate memory" << endl;
		return -1;
	}

	for(int i = 0; i < N; i++)
	{
		mtx[i] = (int*) malloc(M*sizeof(int));

		if(mtx[i] == NULL)
		{
			cout << "Error: cannot allocate memory" << endl;
			return -1;
		}
	}

	fill_matrix(mtx, N, M);

	print_matrix(mtx, N, M);
	matrix_operations (mtx,N,M);
	cout << endl<<D<<endl;

	print_matrix(mtx, D, M);
	cout<<endl;
	cout << D;


	for(int i = 0; i < N; i++)
		free(mtx[i]);

	free(mtx);

	return 0;
}
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074777
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Newbie22Написал только для строк , компилируется но работает неверно + иногда ошибки при работе с кучей, видимо выходит за пределы.
Ты слишком сложно делаешь.
Лучше просто выдели память под новый массив, скопируй в него "хорошие" ячейки старого, а старый массив убей.


Newbie22Как реализовать это одновременно с удалением столбцов не представляю, так как сразу удалять строку после проверки нельзя ,ведь это может повлиять на будущую проверку столбцов. Скорее всего надо будет просто запоминать все строки и столбцы с нужным параметром, а потом только удалять. Да, правильно.
Сделай два одномерных массива, один для строк, другой для колонок. Пробеги по исходному массиву и если строку исходного массива надо удалять, ставь единичку во временном массиве для строк, если удалять не надо - ставишь нолик. Аналогично для колонок. Потом на основе этих временных массивов высчитываешь размерность нового массива.
И не забудь по окончании работы удалить эти два одномерных массива.
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074779
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Enter number of rows: 5
Enter number of columns: 5
408 349 814 454 114
571 893 477 188 642
120 362 432 884 814
972 867 668 109 188
942 956 178 229 398

4
4
3
3
0 0 0 0 0
571 893 477 188 642
972 867 668 109 188

3
вот результат работы
а в плане должно получиться только
571 893 477 188 642
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074783
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В задании написано "В результате преобразования должна измениться матрица, просто вывести результат преобразования на экран – недостаточно. "

Как я понимаю должен измениться исходный массив поэтому новый массив объявлять нежелательно
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074791
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Newbie22В задании написано "В результате преобразования должна измениться матрица, просто вывести результат преобразования на экран – недостаточно. "

Как я понимаю должен измениться исходный массив поэтому новый массив объявлять нежелательноНу так у тебя же и будет уже преобразованная матрица в памяти.
Хотя конечно, если предпод желает обязательно увидеть игры с realloc() то в этом случае копирование действительно нет смысла делать. Но с другой стороны, realloc() физически делает именно это - выделяет новый кусок памяти, копирует в него из старого либо по размеру нового куска, либо по размеру старого (зависит от того меньше новый старого или больше). Так что используя realloc() ты в любом случае уже делаешь новый массив.
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074807
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Именно он realloc и хочет видеть, и как реализовать все это используя realloc я, увы, не знаю.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
int matrix_operations (int **mtx, int N, int M)
	
{

		int ne4=0,chet=0;

	int *delete_stolb=(int*) malloc(M*sizeof (int));
	int *delete_stroka=(int*) malloc(N*sizeof (int));
	
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
			{
				if (mtx[i][j]%2==1) ne4+=1 ;
			else chet+=1;
		}	
			if (chet>ne4) 
				delete_stroka[i]=1;
			else delete_stroka[i]=0;

				int ne4=0,chet=0;
}



Можете подсказать как реализовать заполнения массива, запоминающего удаленные стобцы
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074819
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то что я написал выше почему-то неправильно подсчитывает
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074862
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
Реализовал 2 массива которые подсчитываю какие столбцы и строки выбирать, далее идея такая подсчитать количество элементов нового массива и просто не проверять если ни в 1 одномерном ни в другом одномерном нет условно допустим 1, то его записывать в массив( Вероятнее всего у меня получиться цикл в цикле в цикле)
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074982
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
realloc() в цикле делать теоретически можно, но дико. Это излишне сложно и неэффективно.
Но в принципе возможно....
Например так (Не проверял, поэтому могут быть ошибки):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void delete_row(int **matrix, int rows, int cols, int row_to_kill) {
   int *arr = *matrix; // для удобства
   memove(arr + row_to_kill * cols, arr + (row_to_kill+1) * cols, (rows-row_to_kill-1)*cols*sizeof(int));
   *matrix = realloc( arr, (rows-1)*cols*sizeof(int));
}

void delete_col(int **matrix, int rows, int cols, int col_to_kill) {
   int *arr = *matrix; // для удобства
   int row;
   for (row = 0; row < rows; row++ ) {
      memove(arr + row * cols + col_to_kill, arr + row * cols + col_to_kill+1, (cols-col_to_kill-1)*sizeof(int));
   }
   *matrix = realloc( arr, (rows-1)*cols*sizeof(int));
}

а потом в цикле вызываешь эти процедуры на каждую строку и колонку которую надо удалять.
Ну и не забудь что удаление проще делать с конца а не с начала. Тогда не надо будет пересчитывать координаты остальных строк которые еще не удалены, но должны быть.
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074988
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
Почти реализовал всю программу без realloc, проблема в том что в начале выводит 1 лишнее число и не всегда правильно работает


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
#include "stdafx.h"
#include <iostream>
#include <iomanip>	
#include <stdlib.h>
#include <time.h>

using namespace std;
 int D;

void print_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
			cout << setw(4) << mtx[i][j] << " ";

		cout << endl;
	}
}

void fill_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			mtx[i][j] = rand() % 1000;
}

int matrix_operations (int **mtx, int N, int M)
	

{

		int ne4=0,chet=0,X=0,Y=0;

	int *delete_stolb=(int*) malloc(M*sizeof (int));
	int *delete_stroka=(int*) malloc(N*sizeof (int));


	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
			{
				if (mtx[i][j]%2==0) chet+=1 ;
			else ne4+=1;
		    }	
			if (chet>ne4) 
				delete_stroka[i]=1;
			else 
			   {
				delete_stroka[i]=0;
				X+=1;
			   }
				ne4=0,chet=0;
	}
	for(int i = 0; i < N; i++)
		cout<< delete_stroka[i];
	cout<<endl;
	

	for(int i = 0; i < M; i++)
	{
		for(int j = 0; j < N; j++)
			{
				if (mtx[j][i]%2==0) chet+=1 ;
			else ne4+=1;
		    }	
			if (chet>ne4) 
				delete_stolb[i]=1;
			else 
			    {
				delete_stolb[i]=0;
				Y+=1;
			   }
				ne4=0,chet=0;
	}

	
	for(int i = 0; i < M; i++)
		cout<< delete_stolb[i];

	cout<<endl<<X<<endl<<Y;

		 int		**mtx1 = (int**) malloc(X*sizeof(int*));

	if(mtx1 == NULL)
	{
		cout << "Error: cannot allocate memory" << endl;
		return -1;
	}

	for(int i = 0; i < X; i++)
	{
		mtx1[i] = ( int*) malloc(Y*sizeof(int));

		if(mtx1[i] == NULL)
		{
			cout << "Error: cannot allocate memory" << endl;
			return -1;
		}
	}


	int max=0;

	if(N>M)
		 max=N;
	else
		 max=M;

	cout<<endl<<max;
	
	for(int i=0; i<X ;i++)
	{
		for (int j=0; j<Y; j++)
		{
			int i1=i,j1=j;
			for (int k=0; k < max; k++)
			{
			if((delete_stroka[i1]==0) && (delete_stolb[j1]==0))
			{
				mtx1[i][j]=mtx[i1][j1];
				break;
			}
			   else 
			   { 
				 if (delete_stroka[i1]==1) i1+=1;
			     if (delete_stolb[j1]==1) j1+=1;
			   }
			   
			}
		}
	}
	cout<<X<<Y;
		
		for(int i = 0; i < X; i++)
	{
		for(int j = 0; j < Y; j++)
			cout << setw(4) << mtx1[i][j] << " ";

		cout << endl;
	}
		free(delete_stolb);
		free(delete_stroka);
		for(int i = 0; i < X; i++)
		free(mtx1[i]);

	free(mtx1);


	
				
					return(**mtx1);
}
int main()
{
	srand((unsigned)time(NULL));
	
	int		N = 0, M = 0;

	while(N == 0)
	{
		cout << "Enter number of rows: "; 
		cin >> N;
	}

	while(M == 0)
	{
		cout << "Enter number of columns: "; 
		cin >> M;
	}

	int		**mtx = (int**) malloc(N*sizeof(int*));

	if(mtx == NULL)
	{
		cout << "Error: cannot allocate memory" << endl;
		return -1;
	}

	for(int i = 0; i < N; i++)
	{
		mtx[i] = (int*) malloc(M*sizeof(int));

		if(mtx[i] == NULL)
		{
			cout << "Error: cannot allocate memory" << endl;
			return -1;
		}
	}

	fill_matrix(mtx, N, M);

	print_matrix(mtx, N, M);
	matrix_operations (mtx,N,M);
	cout << endl<<D<<endl;




	for(int i = 0; i < N; i++)
		free(mtx[i]);

	free(mtx);

	return 0;
}
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38074990
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть в том что я проверяю является ли число из 1 массива исключенным , если нет, то записываю в другой массив
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38075598
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
//--------------------------------------------------------------------
void delete_row(int* &matrix, int &rows, int cols, int row_to_kill)
{
   memmove(matrix + row_to_kill * cols, matrix + (row_to_kill+1) * cols, (rows-row_to_kill)*cols*sizeof(int));
   rows--;
   matrix = (int *)realloc(matrix, rows*cols*sizeof(int));
}
//--------------------------------------------------------------------
void print_matrix(int *mtx, int rows, int cols)
{
	for(int row = 0; row < rows; row++)
	{
		for(int col = 0; col < cols; col++)
			cout << setw(4) << *(mtx+row*cols+col) << " ";

		cout << endl;
	}
}
//--------------------------------------------------------------------
void rows_to_delete(int *delete_rows, int *mtx, int rows, int cols)
{
    int chet=0;

    for(int row = 0; row < rows; row++)
    {
         for(int col = 0; col < cols; col++)
	 {
		if((*(mtx+row*cols+col))%2==0)
                      chet++ ;
		else
                      chet--;
	 }

	 if (chet>0)
		delete_rows[row]=1;
    }

}
//--------------------------------------------------------------------
void matrix_operations (int* &mtx, int &rows, int &cols)
{
	int *delete_cols=(int*) malloc(cols*sizeof (int));
	int *delete_rows=(int*) malloc(rows*sizeof (int));
	memset(delete_rows,0,rows*sizeof (int));
        memset(delete_cols,0,cols*sizeof (int));

	rows_to_delete(delete_rows, mtx, rows, cols);
	for(int i = 0; i < rows; i++)
		cout<< delete_rows[i];
	cout<<endl;


	int number_of_rows_deleted=0;
	int temp_rows=rows;
	for(int row = 0; row < temp_rows; row++)
	{
                if(delete_rows[row]!=0)
                {
                       delete_row(mtx, rows, cols, row-number_of_rows_deleted);
                       number_of_rows_deleted++;
                }
	}
}
//--------------------------------------------------------------------
int main()
{
        srand((unsigned)time(NULL));
 
	int rows = 0, cols = 0;

	while(rows == 0)
	{
		cout << "Enter number of rows: ";
		cin >> rows;
	}

	while(cols == 0)
	{
		cout << "Enter number of columns: ";
		cin >> cols;
	}

	int *mtx = (int*) malloc(rows*cols*sizeof(int));

	if(mtx == NULL)
	{
		cout << "Error: cannot allocate memory" << endl;
		return -1;
	}

	fill_matrix(mtx, rows, cols);
	print_matrix(mtx, rows, cols);
	cout<<endl;
	matrix_operations(mtx, rows, cols);
	print_matrix(mtx, rows, cols);
	cout<<endl;

	free(mtx);

	return 0;
}


...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38075614
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там можно как-то лаконичнее сделать. По сути мы маркируем строки и столбцы
признаком удаления и в ОДНУ операцию new/malloc/realloc создаём копию
матрицы с пропуском отмеченых. Это по смыслу - она тразнакция и не нужно
делать избыточных memmove в циклах. Эти промежуточные состояния
матрицы всё равно никому нафиг не нужны.
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38076043
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У подхода с memmove свои плюсы, он не требует выделения дополнительной памяти. Можно вообще без malloc/realloc обойтись, используя память исходного массива.
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38076062
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Развивая идею можно создать производный класс MatrixHiddingColumns
и перегрузить индексаторы таким образом чтобы скрытые столбцы просто
не отображались и не участвовали в матричных расчётах.

Итого - вообще никаких операций с менеджером памяти.

Как видите. Это не предел.
...
Рейтинг: 0 / 0
Удаление одновременно столбцов и строк.
    #38084188
Newbie22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,
Спасибо
Все хорошо, но вот только программа не подсчитывает и не удаляет столбцы
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление одновременно столбцов и строк.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]