Показать полную графическую версию : Замена произвольных столбцов местами(массив)
ShadowMas
20-03-2009, 16:04
Всем привет, хотел посоветоваться решаю тут задачку такого плана:
Дана произвольная матрица размером 10:10 поменять произвольные значение столбцов местами.
Вобщем я думал как ето лучше сделать и вот примерно что надумал:
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
int main()
{
int arr[10][10]={{0,0}};
int i,j;
int sum = 0;
randomize;
for(i = 0; i < 10; i++)
for(j=0; j< 10; j++)
{
arr[i][j]=random(5);
}
printf("Massiv: n [ ");
for(i = 0; i < 10; i++)
for(j=0; j< 10; j++)
printf("%i ",arr[i][j]);
printf("]\n"); // вывод на экран нашего массива
Ну теперь сама задача я пока не делал програмкой опишу словами саму идею
Думаю,что случайно заменять не совсем получится(или я не знаю как :))
Вобщем я хочу использовать псевдослучайную замену.
Тоесть сравнивать к примеру первое значение массива со всеми последующими если оно ну допустим arr[0][0]>arr[i][j](соответственно условие в цикле) значит переместить его в конец массива(тоесть присвоит arr[0][0]==arr[9][9])
Вобщем хотел спросить, таким методом мне прийдётся каждое значение массива сравнивать с последующим и переносить его в конец, а если к примеру массив 100на100 то такой метод вызывает у меня сомнение :( может подскажите что то более практичное!
Зарание благодарю!!!
ShadowMas, заполнять случайными числами элементами массива получается, так почему не получится тогда сделать выборку по столбцам массива? Главное проверять, что б во второй раз одно и тоже число не выпало, а то менять не с чем будет.
Насчёт псевдослучайной замены, это основываясь на предыдущей генерации случайных чисел массиву идёт справнее что больше с тем и работать?
Как уже выше предложил - тем же методом что и заполняются элементы массива с помощью функции random().
Честно говоря, задачу не совсем понял. :dont-know Думаю,что случайно заменять не совсем получится »Непонял, что заменять с чем?сравнивать к примеру первое значение массива со всеми последующими если оно ну допустим arr[0][0]>arr[i][j](соответственно условие в цикле) значит переместить его в конец массива(тоесть присвоит arr[0][0]==arr[9][9]) »Это же вроде бы похоже на пузырьковую сортировку, так?
Немного бы код изменил, выделил цветом что добавил, при выполнении, будет наглядно видно содержимое массива, не в ряд, а десять строк в десять рядов.
...
printf("Massiv: n \n\n");
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++)
printf("%i ", arr[i][j]);
if(j % 10 == 0)
cout<<endl;
}
...
ShadowMas
20-03-2009, 18:57
Да спасибо так конечно будет нагляднее,я как то не подумал :).
Да я извиняюсь за не совсем коректную постановку вопроса.
Вообщем суть в том что бы в массиве размерностью 10на10
arr[10][10] ,случайным образом поменять местами значения столбиков ну к примеру
arr[0][0] меняем (случайным образом) с arr[0][9] или arr[1][7] или с любым другим arr[i][j]
Дело в том что я не как не могу условие придумать оптимальное, что бы не приходилось каждый раз сравнивать одно значение с последующими и переносить его в конец или там на шаг в перёд или ещё куда то.
Это вообще то не очень удобно каждый раз сравнивать, а вот как описать проще не как не придумаю :)
Извиняюсь если неправильно понял снова, но как понял, так и решил. Цель, перебросить все значения случайного столбца массива в другой столбец. Короче поменять содержимое двух столбцов. Красным цветом выделил, что нужно дописать. Единственно, можно вместо конкретных значений номеров столбца, генерировать случайные.#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
int main()
{
int arr[10][10] = {{0,0}};
int i, j, temp;
int sum = 0;
randomize;
for(i = 0; i < 10; i++)
for(j=0; j< 10; j++){
arr[i][j]=random(5);
}
printf("Massiv: n \n\n");
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++)
printf("%i ",arr[i][j]);
if(j % 10 == 0)
cout<<endl;
}
cout<<"\n\n Perenosim stolbsi\n";
// К примеру 5 столбец переносим на место 1 столца,
// А 1 столбец, на место 5 столбца
for(int i = 0; i < 10; i++){
temp = arr[i][5];
arr[i][5] = arr[i][0];
arr[i][0] = temp;
}
cout<<endl;
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++)
printf("%i ",arr[i][j]);
if(j % 10 == 0)
cout<<endl;
}
cin>>i;
}
ShadowMas
20-03-2009, 20:04
Да спасибо, так и есть :)
Только я так понял "Единственно, можно вместо конкретных значений номеров столбца, генерировать случайные"
Имеется введу что вместо arr[i][5]; можно записать примерно так
for(int i = 0; i < 10; i++){
random(j);
temp = arr[i][j];
arr[i][j] = arr[i][0];
arr[i][0] = temp;
}
Drongo, ShadowMas, можно обойтись и без переменной temp
arr[i][0]=arr[i][j]-arr[i][0];
arr[i][j]=arr[i][j]-arr[i][0];
arr[i][0]=arr[i][j]+arr[i][0];
ShadowMas, В таком виде, вместо каждого следующего элемента одного столбца, будет генерироваться каждый раз, разный.
...
for(int i = 0; i < 10; i++){
random(j);
temp = arr[i][j];
arr[i][j] = arr[i][0];
arr[i][0] = temp;
}
...Поэтому объяви переменную и вынеси random(j) вне блока for перед ним, и полученный номер присваивай randomColumn
...
int randomColum;
...
randomColumn = random(j);
for(int i = 0; i < 10; i++){
temp = arr[i][randomColumn];
arr[i][randomColumn] = arr[i][0];
arr[i][0] = temp;Можно ещё добавить такие заголовочные файлы
...
#include <ctime.h>
using std::time;
int main()
{
int arr[10][10] = {{0,0}};
int i, j, temp, randomColumn;
int sum = 0;
randomize;
srand(time(0));
...Тогда числа будут генерироваться каждый раз другие.
ShadowMas
20-03-2009, 23:01
Спасибо всем за помощь!!!
Ушел пробывать :up
ShadowMas
21-03-2009, 18:46
Да люди спасибо за помощь вот что получилось :
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
int main()
{
int arr[10][10] = {{0,0}};
int i, j, temp,a;
int sum = 0;
randomize;
for(i = 0; i < 10; i++)
for(j=0; j< 10; j++){
arr[i][j]=random(5);
}
printf("Massiv: n \n\n");
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++)
printf("%i ",arr[i][j]);
if(j % 10 == 0)
cout<<endl;
}
cout<<"\n\n Perenosim stolbsi\n";
cout<<"ukazite perviy stolbik"<<endl;
cin>>j;
cout<<"ukazite vtoroy stolbik"<<endl;
cin>>a;
for(int i = 0; i < 10; i++){
temp = arr[i][j];
arr[i][j] = arr[i][a];
arr[i][a] = temp;
cout<<endl;
}
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++)
printf("%i ",arr[i][j]);
if(j % 10 == 0)
cout<<endl;
getch();
return 0;
}
}
ShadowMas, Убери строку, что я выделил.
...
for(int i = 0; i < 10; i++){
temp = arr[i][j];
arr[i][j] = arr[i][a];
arr[i][a] = temp;
cout<<endl; // Лишняя
}
...
И добавь проверку выбора столбцов, иначе если ввести можно и -1 и 100 и выход за границы массива тебе обеспечен. ;)
...
cout<<"ukazite perviy stolbik"<<endl;
cin>>j;
while(j < 0 || j > 9){
cout<<"ukazite perviy stolbik 1 = ";
cin>>j;
}
cout<<"ukazite vtoroy stolbik"<<endl;
cin>>a;
while(a < 0 || a > 9){
cout<<"ukazite perviy stolbik 2 = ";
cin>>a;
}
...
И ещё, скобку поставить выше return, а getch(); вынести за скобку, иначе после вывода первого рядка массива, после нажатия любой клавиши, окно закроется.
...
if(j % 10 == 0)
cout<<endl;
}
getch();
return 0;
}
cout<<"\n\n Perenosim stolbsi\n";
cout<<"ukazite perviy stolbik"<<endl; »Если интересно сделать вместо транслита-латиницы выводить кирилицу, то вот совсем рядом есть тема - Кирилица в консоли (http://www.forum.oszone.net/thread-129824.html) ;)
ShadowMas
22-03-2009, 21:48
Спасибо за советы, да всё исправлю,а насчёт выхода за граници я как то даже и не подумал :yes:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.