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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2011, 07:10   #1
Pretty_girl_666
Новичок
Джуниор
 
Регистрация: 16.08.2011
Сообщений: 2
По умолчанию Перестановка столбцов матрицы по заданному ключу

Добрый день! Помогите, пожалуйста. Задание такое: дана матрица размерностью [6х9]. Нужно поменять столбцы местами по заданному ключу, например, ключ следующий: [2,4,1,6,3,5]. И в итоге, в новой матрице у нас получится, что 2 столбец исходной матрицы у нас будет первым, 4 - вторым и т.д. Матрица исходная выводится из файла. Заранее спасибо!
Pretty_girl_666 вне форума Ответить с цитированием
Старый 16.08.2011, 08:15   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Чем помочь? Что у вас уже написано?
p51x вне форума Ответить с цитированием
Старый 16.08.2011, 08:34   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Отличная тема про матрицы. Уверен вы найдете решение вашей проблемы. Я бы написал, да уезжаю на месяц через час. Зашел так сказать на прощание)
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 16.08.2011, 13:15   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

присоединяюсь к вопросам p51x: Какой язык программирования? Что сделано? Что не получается? Хотя бы объявление матрицы и чтение из файла реализовано?

Цитата:
например, ключ следующий: [2,4,1,6,3,5].
как минимум, вижу два варианта решения.
1) оптимальный по скорости и простоте реализации. Но, имхо, не совсем соответствует условиям задачи...
Заводим ЕЩЁ одну матрицу такого же размера. Потом идём по ключу и пишем в выходную матрицу - сначала 2-й столбец, потом - 4-й столбец и т.д...

2) другой вариант. Без дополнительной матрицы. Но количество перестановок столбцов может быть неоптимальным...
Алгоритм такой.
формируем вектор (одномерный массив) с порядком сортировки.
Формируем его так - записываем под нужными индексами (номерами столбцов) их порядок в ключе.
Например, для ключа [2,4,1,6,3,5]
под 2-м столбцом пишем 1 (он же должен быть первый)
под 4-м столбцом - пишем 2 (он должен быть вторым)
под 1-м столбцом пишем 3 (он будет третим и т.д.)
получаем {3, 1, 5, 2, 6, 4 }
дальше сортируем этот массив (любым удобным методом, хоть "пузырьком"), при этом при обмене элементов в данном массиве ОДНОВРЕМЕННО переставляем столбцы в исходной матрице.
Всё.


p.s. вполне допускаю, что есть более экономичное и эффективное решение задачи, но я его сейчас (пока) не вижу...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.08.2011, 17:32   #5
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Немного поизвращался, вот что получилось.
Язык С++
Формат ввода ключа любой главное чтоб было шесть цифр от одного до шести

Хотелось бы услышать здоровую критику от тех, кто занимается программированием.
Что неправильно некрасиво в этой программке.

Код:
#include<iostream>
#include<fstream>
using namespace std;
const int max_str=255;//макс размер строки
const int max_y=6,max_x=9;//столбцы , строки

//*************** прототипы функций ***************//
int load_matr(int matr[max_x][max_y],char *in_fil);//функция заполнения матрицы
int copy(int one_matr[max_x][max_y],int two_matr[max_x][max_y],char *key);//копируем матрицу по ключу

int main(){
	setlocale(LC_ALL,"Russian");

	int matrix[max_x][max_y];// исходный массив
	int matrix_nex[max_x][max_y];// временный массив
	char key[max_str];// наш ключ 
	char in_file[max_str];//имя файла в котором храним матрицу

	cout<<"введите имя файла = ";
	cin>>in_file;
	load_matr(matrix,in_file);//загрузим матрицу

	cout<<"введите ключ key= ";
	cin>>key;
	copy(matrix,matrix_nex,key);

	cout<<"выведем исходную матрицу :\n";
	for(int x=0;x<max_x;x++){//строки
		for(int y=0;y<max_y;y++)//столбцы
			cout<<matrix[x][y]<<'\t';
		cout<<endl;
	}
	cout<<"\n\n выведем результат :\n";
	for(int x=0;x<max_x;x++){//строки
		for(int y=0;y<max_y;y++)//столбцы
			cout<<matrix_nex[x][y]<<'\t';
		cout<<endl;
	}
	system("pause");
	return 0;
}

///////////////////////////
//функция заполнения матрицы
///////////////////////////
int load_matr(int matr[max_x][max_y],char *in_fil){
	ifstream in;//создадим поток
	in.open(in_fil);//открываем для чтения с файла
	for(int x=0;x<max_x;x++)//строки
		for(int y=0;y<max_y;y++)//столбцы
			in>>matr[x][y];
	in.close();
	return 0;
}

/////////////////////////////
//копируем матрицу по ключу
/////////////////////////////
int  copy(int one_matr[max_x][max_y],int two_matr[max_x][max_y],char *key){

	int num_col=0;//столбец второй матрицы от первого до последнего

	for(int i=0;key[i]!='\0';i++)//читаем до конца строки
		if(key[i]>48&&key[i]<55){//условия при котором данный символ цифра от 1го до 6ти
			for(int x=0;x<max_x;x++)
				two_matr[x][num_col]=one_matr[x][key[i]-49];//копируем матрицу
			num_col++;
		}
	return 0;
}
Пример матрицы:
Код:
1 2 3 4 5 6
2 6 7 9 5 7
3 2 5 4 6 9
4 8 3 1 4 7
3 5 8 3 8 2
9 0 6 5 4 2
2 7 5 9 1 3
3 8 9 6 2 3
7 4 2 5 6 3

Последний раз редактировалось _kilik_; 16.08.2011 в 22:12.
_kilik_ вне форума Ответить с цитированием
Старый 16.08.2011, 19:20   #6
Pretty_girl_666
Новичок
Джуниор
 
Регистрация: 16.08.2011
Сообщений: 2
По умолчанию

Спасибо большое! У меня изначально было несколько по-другому и выдавал ошибку. Сейчас попробую Ваш вариант
Pretty_girl_666 вне форума Ответить с цитированием
Старый 16.08.2011, 19:39   #7
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

Цитата:
max_y=6,max_x=9;//столбцы , строки
фундаментальная ошибка
Alkagolik вне форума Ответить с цитированием
Старый 16.08.2011, 20:08   #8
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Alkagolik Посмотреть сообщение
фундаментальная ошибка
А по конкретней пожалуйста ?

Все дошло отсчет начинается от нуля сейчас поправлю

Последний раз редактировалось _kilik_; 16.08.2011 в 20:41.
_kilik_ вне форума Ответить с цитированием
Старый 16.08.2011, 21:11   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
2) другой вариант.
Третий вариант:
Код:
    int a[6][6];
	for(int i=0;i<6;i++){ for(int j=0;j<6;j++){ a[i][j]=rand(); printf("%d\t",a[i][j]);} printf("\n");}
	int k[6]={2,4,1,6,3,5};printf("\n");
	for(int i=0;i<6;i++){ for(int j=0;j<6;j++) printf("%d\t",a[k[i]][j]); printf("\n");}
т.е. ничего не меняя физически выдаем набор, отсортированый по твоему закону.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.08.2011, 00:31   #10
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

Я вообще-то про столбцы\строки. Поставлена задача слепить матрицу в 6 строк 9 столбцов. И относительно массивов
Код:
...
int massiv[stroki][stolbczi];
...
а фундаментальная, потому что относится к базовому понятию матрицы
Alkagolik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перестановка четных и нечетных столбцов матрицы Lowjedy Помощь студентам 1 10.05.2011 18:12
Перегрупировка столбцов в строки по ключу Serzh83 Microsoft Office Excel 2 26.11.2009 10:21
[ C/C++ ] Перестановка строк и столбцов zord Помощь студентам 2 18.11.2009 12:20
Перестановка столбцов bagfinder Паскаль, Turbo Pascal, PascalABC.NET 1 25.06.2009 19:28
Перестановка столбцов матрицы и строки. MaGWaY_minsk Помощь студентам 3 06.02.2009 00:55