Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Замена произвольных столбцов местами(массив) (http://forum.oszone.net/showthread.php?t=135301)

ShadowMas 20-03-2009 16:04 1069419

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

Дана произвольная матрица размером 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 то такой метод вызывает у меня сомнение :( может подскажите что то более практичное!

Зарание благодарю!!!

Admiral 20-03-2009 17:50 1069506

ShadowMas, заполнять случайными числами элементами массива получается, так почему не получится тогда сделать выборку по столбцам массива? Главное проверять, что б во второй раз одно и тоже число не выпало, а то менять не с чем будет.
Насчёт псевдослучайной замены, это основываясь на предыдущей генерации случайных чисел массиву идёт справнее что больше с тем и работать?
Как уже выше предложил - тем же методом что и заполняются элементы массива с помощью функции random().

Drongo 20-03-2009 18:14 1069529

Честно говоря, задачу не совсем понял. :dont-know
Цитата:

Цитата ShadowMas
Думаю,что случайно заменять не совсем получится »

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

Цитата ShadowMas
сравнивать к примеру первое значение массива со всеми последующими если оно ну допустим 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 1069594

Да спасибо так конечно будет нагляднее,я как то не подумал :).

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

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

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

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

Drongo 20-03-2009 19:24 1069617

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

#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 1069646

Да спасибо, так и есть :)

Только я так понял "Единственно, можно вместо конкретных значений номеров столбца, генерировать случайные"
Имеется введу что вместо 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;
    }


Admiral 20-03-2009 21:01 1069700

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 20-03-2009 21:14 1069712

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 1069838

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

Ушел пробывать :up

ShadowMas 21-03-2009 18:46 1070473

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

Код:

#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;
}
}


Drongo 21-03-2009 20:38 1070574

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;
}

Цитата:

Цитата ShadowMas
Код:

cout<<"\n\n Perenosim stolbsi\n";
 cout<<"ukazite perviy stolbik"<<endl;

»

Если интересно сделать вместо транслита-латиницы выводить кирилицу, то вот совсем рядом есть тема - Кирилица в консоли ;)

ShadowMas 22-03-2009 21:48 1071321

Спасибо за советы, да всё исправлю,а насчёт выхода за граници я как то даже и не подумал :yes:


Время: 04:53.

Время: 04:53.
© OSzone.net 2001-