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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2011, 02:21   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию Добавление строки или столбца в указанное место массива

Всем доброй ночи
Вобщем задача такова...
Сделать так чтоб добовлялась строка или столбец(по выбору пользователя) в указанное место 2-х мерного массива
заранее спасибо
вот код
Код:
#include "col.h"
#include <string.h>
#include <conio.h>
int** arrcreate(int,int);
void DeleteArr(int**,int );
void FillArr(int**,int,int);
void ShowArr(int**,int,int);
void SortArr(int**,int,int);
void SwapArr(int**,int,int);
int main()
{
setlocale(LC_ALL,"Russian");
int rows;
int cols;
int **mas;
cout<<"Введите количество столбцов"<<endl;
cin>>rows;
cout<<"Введите количество строк"<<endl;
cin>>cols;
mas=arrcreate(rows,cols);
FillArr(mas,rows,cols);
ShowArr(mas,rows,cols);
SortArr(mas,rows,cols);
cout<<endl;
ShowArr(mas,rows,cols);
SwapArr(mas,rows,cols);
cout<<endl;
ShowArr(mas,rows,cols);
DeleteArr(mas,rows);


return 0;
}
//Создание массива
int** arrcreate(int r,int c)
{
	int**a=new int*[r];
	for(int i=0;i<r;i++)
		{
			a[i]=new int[c];
		
		}
	return a;
}

void DeleteArr(int**p,int r)
{
for(int i=0;i<r;i++)
	{
		delete []p[i];
	}
delete []p;

}
//заполнение массива
void FillArr(int**p,int r,int c)
{
	for(int i=0;i<r;i++)
	{
		for(int k=0;k<c;k++)
		{
			p[i][k]=rand()%20+79;
		}
	}
}
//вывод массива
void ShowArr(int**p,int r,int c)
{
	for(int i=0;i<r;i++)
	{
		for(int k=0;k<c;k++)
		{
			cout<<p[i][k]<<'\t';
		}
		cout<<endl;
	}
}
//сортировка массива
void SortArr(int**p,int r,int c)
{
int *a=new int[r*c];
for(int i=0;i<r*c;i++)
{
	a[i]=p[i/c][i%c];
	
}
bool change;
	do
	{
		change=false;
		for(int i=0; i<r*c-1; i++)			
		{
			if(a[i]>a[i+1])
			{
				int tmp=a[i];
				a[i]=a[i+1];
				a[i+1]=tmp;
				change=true;
			}		
		}
	}
	while(change);
	for(int i=0;i<r*c;i++)
	{
		p[i/c][i%c]=a[i];
	}
}
//перемешка массива
void SwapArr(int**p,int r,int c)
{
	
		for(int k=0;k<200;k++)
		{
			int a=rand()%r;
			int b=rand()%r;
			int e=rand()%c;
			int d=rand()%c;
			int tmp;
			int tmp1;
			tmp=p[a][d];
			tmp1=p[b][e];
			p[a][d]=tmp1;
			p[b][e]=tmp;

			

		}

	

}
revaldo666 вне форума Ответить с цитированием
Старый 28.03.2011, 03:04   #2
GroZa
Freelancer
Пользователь
 
Аватар для GroZa
 
Регистрация: 29.01.2011
Сообщений: 33
По умолчанию

Наработки или фриланс можно сразу в ICQ 8-380-444
falax species rerum
GroZa вне форума Ответить с цитированием
Старый 28.03.2011, 03:29   #3
GroZa
Freelancer
Пользователь
 
Аватар для GroZa
 
Регистрация: 29.01.2011
Сообщений: 33
По умолчанию

Наверное, как-то так.
Код:
void InsertRow( int** p, int r, int c, int i ) // i = 0 - в начало
{
	if ( ( i > r ) || ( p == NULL ) ) return;
	p = ( int** )realloc( ( void* )p, r + 1 );
	if ( i < r ) memcpy( p + i + 1, p + i, ( r - i ) * sizeof( int ) );
	p[i] = new int[c];
}

void InsertCol( int** p, int r, int c, int i )
{
	if ( ( i > c ) || ( p == NULL ) ) return;
	for ( int x = 0; x < r; x++ )
	{
		p[x] = ( int* )realloc( ( void* )p[x], c + 1 );
		if ( i < c ) memcpy( p[x] + i + 1, p[x] + i, ( c - i ) * sizeof( int ) );
	}
}
falax species rerum

Последний раз редактировалось GroZa; 28.03.2011 в 04:16.
GroZa вне форума Ответить с цитированием
Старый 28.03.2011, 03:47   #4
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

=))

Спасибо
Немогбы обьяснить что делает функция realloc?

Последний раз редактировалось revaldo666; 28.03.2011 в 03:49.
revaldo666 вне форума Ответить с цитированием
Старый 28.03.2011, 04:13   #5
GroZa
Freelancer
Пользователь
 
Аватар для GroZa
 
Регистрация: 29.01.2011
Сообщений: 33
По умолчанию

Переопределяет размер массива
falax species rerum
GroZa вне форума Ответить с цитированием
Старый 28.03.2011, 11:45   #6
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Подскажите ещё вот что...выдаёт ошибку на этапе выполнения, при добавлении строки или столбца (память не может быть Read)
Код:
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
using namespace std;
int** arrcreate(int,int);
void DeleteArr(int**,int );
void FillArr(int**,int,int);
void ShowArr(int**,int,int);
void SortArr(int**,int,int);
void SwapArr(int**,int,int);
void InsertRow( int**,int,int,int);
void InsertCol( int**,int,int,int);
int main()
{
setlocale(LC_ALL,"Russian");
int rows;
int cols;
int **mas;
int choise;
do{
	cout<<"1-Создать массив"<<endl;
	cout<<"2-Добавить столбец"<<endl;
	cout<<"3-Добавить строку"<<endl;
	cout<<"4-Заполнить массив"<<endl;
	cout<<"5-Отобразить массив на экране"<<endl;
	cout<<"6-Сортировать массив"<<endl;
	cout<<"7-Перемешать массив"<<endl;
	cout<<"8-Удалить массив"<<endl;
	cout<<"9-Выход"<<endl;
	cin>>choise;
if(choise==1)
{
cout<<"Введите количество столбцов"<<endl;
cin>>rows;
cout<<"Введите количество строк"<<endl;
cin>>cols;
mas=arrcreate(rows,cols);
}
if(choise==2)
{
cout<<"Введите куда вставить столбец"<<endl;
cin>>choise;
InsertRow(mas,rows,cols,choise);
}
if(choise==3)
{
cout<<"Введите куда вставить строку"<<endl;
cin>>choise;
InsertCol(mas,rows,cols,choise);
}
if(choise==4)
{
FillArr(mas,rows,cols);
}
if(choise==5)
{
ShowArr(mas,rows,cols);
}
if(choise==6)
{
SortArr(mas,rows,cols);
}
if(choise==7)
{
SwapArr(mas,rows,cols);
}
if(choise==8)
{
DeleteArr(mas,rows);
}

}while(choise!=9);

return 0;
}
//Создание массива
int** arrcreate(int r,int c)
{
	int**a=new int*[r];
	for(int i=0;i<r;i++)
		{
			a[i]=new int[c];
		
		}
	return a;
}

void DeleteArr(int**p,int r)
{
for(int i=0;i<r;i++)
	{
		delete []p[i];
	}
delete []p;

}
//заполнение массива
void FillArr(int**p,int r,int c)
{
	for(int i=0;i<r;i++)
	{
		for(int k=0;k<c;k++)
		{
			p[i][k]=rand()%20+79;
		}
	}
}
//вывод массива
void ShowArr(int**p,int r,int c)
{
	for(int i=0;i<r;i++)
	{
		for(int k=0;k<c;k++)
		{
			cout<<p[i][k]<<'\t';
		}
		cout<<endl;
	}
}
//сортировка массива
void SortArr(int**p,int r,int c)
{
int *a=new int[r*c];
for(int i=0;i<r*c;i++)
{
	a[i]=p[i/c][i%c];
	
}
bool change;
	do
	{
		change=false;
		for(int i=0; i<r*c-1; i++)			
		{
			if(a[i]>a[i+1])
			{
				int tmp=a[i];
				a[i]=a[i+1];
				a[i+1]=tmp;
				change=true;
			}		
		}
	}
	while(change);
	for(int i=0;i<r*c;i++)
	{
		p[i/c][i%c]=a[i];
	}
}
//перемешка массива
void SwapArr(int**p,int r,int c)
{
	
		for(int k=0;k<200;k++)
		{
			int a=rand()%r;
			int b=rand()%r;
			int e=rand()%c;
			int d=rand()%c;
			int tmp;
			int tmp1;
			tmp=p[a][d];
			tmp1=p[b][e];
			p[a][d]=tmp1;
			p[b][e]=tmp;

			

		}
}
//добавление столбцов
void InsertRow( int** p, int r, int c, int i ) // i = 0 - в начало
{
	if ( ( i > r ) || ( p == NULL ) ) return;
	p = ( int** )realloc( ( void* )p, r + 1 );
	if ( i < r ) memcpy( p + i + 1, p + i, ( r - i ) * sizeof( int ) );
	p[i] = new int[c];
}
//добавление строк
void InsertCol( int** p, int r, int c, int i )
{
	if ( ( i > c ) || ( p == NULL ) ) return;
	for ( int x = 0; x < r; x++ )
	{
		p[x] = ( int* )realloc( ( void* )p[x], c + 1 );
		if ( i < c ) memcpy( p[x] + i + 1, p[x] + i, ( c - i ) * sizeof( int ) );
	}
}
revaldo666 вне форума Ответить с цитированием
Старый 28.03.2011, 11:59   #7
GroZa
Freelancer
Пользователь
 
Аватар для GroZa
 
Регистрация: 29.01.2011
Сообщений: 33
По умолчанию

Забыл умножить на размер int:
Код:
p = ( int** )realloc( ( int** )p, ( r + 1 ) * sizeof( int ) );
для второй функции -аналогично
falax species rerum

Последний раз редактировалось GroZa; 28.03.2011 в 12:15.
GroZa вне форума Ответить с цитированием
Старый 28.03.2011, 12:41   #8
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Должно быть примерно так?
Код:
void InsertRow( int** p, int r, int c, int i ) // i = 0 - в начало
{
	if ( ( i > r ) || ( p == NULL ) ) return;
	p = ( int** )realloc( ( int** )p, ( r + 1 ) * sizeof( int ) );
	if ( i < r ) memcpy( p + i + 1, p + i, ( r - i ) * sizeof( int ) );
	p[i] = new int[c];
}
Всёравно не работает.
revaldo666 вне форума Ответить с цитированием
Старый 28.03.2011, 14:50   #9
GroZa
Freelancer
Пользователь
 
Аватар для GroZa
 
Регистрация: 29.01.2011
Сообщений: 33
По умолчанию

У меня работает. Приведи код приложения которым ты проверяешь
falax species rerum
GroZa вне форума Ответить с цитированием
Старый 28.03.2011, 14:53   #10
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Код:
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
using namespace std;
int** arrcreate(int,int);
void DeleteArr(int**,int );
void FillArr(int**,int,int);
void ShowArr(int**,int,int);
void SortArr(int**,int,int);
void SwapArr(int**,int,int);
void InsertRow( int**,int,int,int);
void InsertCol( int**,int,int,int);
int main()
{
setlocale(LC_ALL,"Russian");
int rows;
int cols;
int **mas;
int choise;
do{
	cout<<"1-Создать массив"<<endl;
	cout<<"2-Добавить столбец"<<endl;
	cout<<"3-Добавить строку"<<endl;
	cout<<"4-Заполнить массив"<<endl;
	cout<<"5-Отобразить массив на экране"<<endl;
	cout<<"6-Сортировать массив"<<endl;
	cout<<"7-Перемешать массив"<<endl;
	cout<<"8-Удалить массив"<<endl;
	cout<<"9-Выход"<<endl;
	cin>>choise;
if(choise==1)
{
cout<<"Введите количество столбцов"<<endl;
cin>>rows;
cout<<"Введите количество строк"<<endl;
cin>>cols;
mas=arrcreate(rows,cols);
}
if(choise==2)
{
cout<<"Введите куда вставить столбец"<<endl;
cin>>choise;
InsertRow(mas,rows,cols,choise);
}
//if(choise==3)
//{
//cout<<"Введите куда вставить строку"<<endl;
//cin>>choise;
//InsertCol(mas,rows,cols,choise);
//}
if(choise==4)
{
FillArr(mas,rows,cols);
}
if(choise==5)
{
ShowArr(mas,rows,cols);
}
if(choise==6)
{
SortArr(mas,rows,cols);
}
if(choise==7)
{
SwapArr(mas,rows,cols);
}
if(choise==8)
{
DeleteArr(mas,rows);
}

}while(choise!=9);

return 0;
}
//Создание массива
int** arrcreate(int r,int c)
{
	int**a=new int*[r];
	for(int i=0;i<r;i++)
		{
			a[i]=new int[c];
		
		}
	return a;
}

void DeleteArr(int**p,int r)
{
for(int i=0;i<r;i++)
	{
		delete []p[i];
	}
delete []p;

}
//заполнение массива
void FillArr(int**p,int r,int c)
{
	for(int i=0;i<r;i++)
	{
		for(int k=0;k<c;k++)
		{
			p[i][k]=rand()%20+79;
		}
	}
}
//вывод массива
void ShowArr(int**p,int r,int c)
{
	for(int i=0;i<r;i++)
	{
		for(int k=0;k<c;k++)
		{
			cout<<p[i][k]<<'\t';
		}
		cout<<endl;
	}
}
//сортировка массива
void SortArr(int**p,int r,int c)
{
int *a=new int[r*c];
for(int i=0;i<r*c;i++)
{
	a[i]=p[i/c][i%c];
	
}
bool change;
	do
	{
		change=false;
		for(int i=0; i<r*c-1; i++)			
		{
			if(a[i]>a[i+1])
			{
				int tmp=a[i];
				a[i]=a[i+1];
				a[i+1]=tmp;
				change=true;
			}		
		}
	}
	while(change);
	for(int i=0;i<r*c;i++)
	{
		p[i/c][i%c]=a[i];
	}
}
//перемешка массива
void SwapArr(int**p,int r,int c)
{
	
		for(int k=0;k<200;k++)
		{
			int a=rand()%r;
			int b=rand()%r;
			int e=rand()%c;
			int d=rand()%c;
			int tmp;
			int tmp1;
			tmp=p[a][d];
			tmp1=p[b][e];
			p[a][d]=tmp1;
			p[b][e]=tmp;

			

		}
}
void InsertRow( int** p, int r, int c, int i ) // i = 0 - в начало
{
	if ( ( i > r ) || ( p == NULL ) ) return;
	p = ( int** )realloc( ( int** )p, ( r + 1 ) * sizeof( int ) );
	if ( i < r ) memcpy( p + i + 1, p + i, ( r - i ) * sizeof( int ) );
	p[i] = new int[c];
}

void InsertCol( int** p, int r, int c, int i )
{
	if ( ( i > c ) || ( p == NULL ) ) return;
	for ( int x = 0; x < r; x++ )
	{
		p[x] = ( int* )realloc( ( void* )p[x], (c + 1)*sizeof(int) );
		if ( i < c ) memcpy( p[x] + i + 1, p[x] + i, ( c - i ) * sizeof( int ) );
	}
}
я сначало создаю массив, потом добовляю строку или столбец, после этого на любом действии ошибку о памяти выкидывает...
revaldo666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление препятствия в игру или закраска столбца в StringGrid Arm!n Помощь студентам 1 29.12.2010 21:23
обмен столбца и строки двумерного массива Shelena Помощь студентам 12 08.11.2010 12:04
Переод каретки в указанное место в RE MyLastHit Общие вопросы Delphi 8 08.08.2010 20:49
Автоматическое добавление строки или условное копирование формул. Возможно ли? PhilAT Microsoft Office Excel 8 24.04.2010 23:15
Найти номера(индексы) в матрице хотябы одной строки или хотя бы одного столбца не содержащих еденицы Сергей Попов Паскаль, Turbo Pascal, PascalABC.NET 1 28.11.2008 08:59