C/C++ - Замена произвольных столбцов местами(массив)

Аватара пользователя
ShadowMas

C/C++ - Замена произвольных столбцов местами(массив)

Сообщение ShadowMas »

Всем привет, хотел посоветоваться решаю тут задачку такого плана:



Дана произвольная матрица размером 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[j](соответственно условие в цикле) значит переместить его в конец массива(тоесть присвоит arr[0][0]==arr[9][9])



Вобщем хотел спросить, таким методом мне прийдётся каждое значение массива сравнивать с последующим и переносить его в конец, а если к примеру массив 100на100 то такой метод вызывает у меня сомнение Изображение может подскажите что то более практичное!



Зарание благодарю!!!
Аватара пользователя
Admiral

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение Admiral »

ShadowMas, заполнять случайными числами элементами массива получается, так почему не получится тогда сделать выборку по столбцам массива? Главное проверять, что б во второй раз одно и тоже число не выпало, а то менять не с чем будет.

Насчёт псевдослучайной замены, это основываясь на предыдущей генерации случайных чисел массиву идёт справнее что больше с тем и работать?

Как уже выше предложил - тем же методом что и заполняются элементы массива с помощью функции random().
Аватара пользователя
Drongo

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение Drongo »

Честно говоря, задачу не совсем понял. Изображение
Цитата ShadowMas:



Думаю,что случайно заменять не совсем получится
C/C++ - Замена произвольных столбцов местами(массив)




Непонял, что заменять с чем?
Цитата ShadowMas:



сравнивать к примеру первое значение массива со всеми последующими если оно ну допустим arr[0][0]>arr[j](соответственно условие в цикле) значит переместить его в конец массива(тоесть присвоит arr[0][0]==arr[9][9])
C/C++ - Замена произвольных столбцов местами(массив)




Это же вроде бы похоже на пузырьковую сортировку, так?



Немного бы код изменил, выделил цветом что добавил, при выполнении, будет наглядно видно содержимое массива, не в ряд, а десять строк в десять рядов.





Код:

Код: Выделить всё

...
   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
Аватара пользователя
ShadowMas

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение ShadowMas »

Да спасибо так конечно будет нагляднее,я как то не подумал Изображение.



Да я извиняюсь за не совсем коректную постановку вопроса.



Вообщем суть в том что бы в массиве размерностью 10на10

arr[10][10] ,случайным образом поменять местами значения столбиков ну к примеру



arr[0][0] меняем (случайным образом) с arr[0][9] или arr[1][7] или с любым другим arr[j]



Дело в том что я не как не могу условие придумать оптимальное, что бы не приходилось каждый раз сравнивать одно значение с последующими и переносить его в конец или там на шаг в перёд или ещё куда то.

Это вообще то не очень удобно каждый раз сравнивать, а вот как описать проще не как не придумаю Изображение
Аватара пользователя
Drongo

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение Drongo »

Извиняюсь если неправильно понял снова, но как понял, так и решил. Цель, перебросить все значения случайного столбца массива в другой столбец. Короче поменять содержимое двух столбцов. Красным цветом выделил, что нужно дописать. Единственно, можно вместо конкретных значений номеров столбца, генерировать случайные.
Возможное Решение

Код: Выделить всё

#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

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение ShadowMas »

Да спасибо, так и есть Изображение



Только я так понял "Единственно, можно вместо конкретных значений номеров столбца, генерировать случайные"

Имеется введу что вместо arr[5]; можно записать примерно так





Код:

Код: Выделить всё

for(int i = 0; i < 10; i++){
random(j);  
 temp = arr[i][j];
     arr[i][j] = arr[i][0];
     arr[i][0] = temp;
    }
Аватара пользователя
Admiral

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение Admiral »

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];
Аватара пользователя
Drongo

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение Drongo »

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)[/i] вне блока 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 
using std::time;
int main()
{
  int arr[10][10] = {{0,0}};
  int i, j, temp, randomColumn;
  int sum = 0;
  randomize;
  srand(time(0));
...

Тогда числа будут генерироваться каждый раз другие.
Аватара пользователя
ShadowMas

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение ShadowMas »

Спасибо всем за помощь!!!



Ушел пробывать Изображение
Аватара пользователя
ShadowMas

Re: C/C++ - Замена произвольных столбцов местами(массив)

Сообщение ShadowMas »

Да люди спасибо за помощь вот что получилось :



Код: Выделить всё

#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;
}
}
Ответить

Вернуться в «Программирование и базы данных»