Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/35: Рейтинг темы: голосов - 35, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
1

Двумерный массив в одномерный

14.09.2013, 23:15. Показов 7339. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуцте,

Есть двумерный массив с отсортированными строками. нужно его преобразовать в одномерный отсортированный.
Алгоритм предлагаю следующий: (для массива 3*3)

перебираем 9 раз массив
если (эта строка непомеченная) ищем среди 1 столбца минимум и записываем его в одномерный.
затем "удаляем" минимальный элемент из двумерного массива.
если находим строку , где 1 элемент = последнему, значит помечаем эту строку=0.

вот код который у меня получился.
сортирует нормально, но когда доходит до помеченной строки, реагирует неправильно.
P.S. недавно начал программировать. объесняйте пожалуйста подробней ))

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
include <iostream>
using namespace std;
 
int main( )
{
    int i,j,k,min,buf,n,stroka;
    int a[10][10], b[10], strk[10];
 
    for(i=0; i<9; i++)
    {
        b[i]=0;
        strk[i]=1;
    }
 
    for(i=0; i<3; i++)
        for (j=0; j<3; j++)
        {
            cout<<"введите элементы массива a"<<i<<j<<"\n";
            cin>>a[i][j];
        }
 
 
    cout<<"\n";
    for(i=0; i<3; i++)
        for (j=0; j<3; j++)
        {
            cout<<" "<<a[i][j];
        }
    cout<<"\n";
/////////////////////////////////////////////////////////////////////
    //j=0;
    k=0;
    buf=0;
    for (n=0; n<9; n++)
    {
        min=a[0][0];
        buf=0;
        for (i=1; i<3; i++)
        {
            //  stroka=1;
            if ((min>a[i][0])&&(strk[i]!=0))
            {
                min=a[i][0];
                buf=i;
            }
            else
            {
                min=a[i+1][0];
                break;
            }
            //  break;
        }
        if (k==0)
        {
            b[k]=min;
            cout<<min<<"-min";
            k++;
        }
        else    if (min!=b[k-1])
        {
            b[k]=min;
            cout<<min<<"-min";
            k++;
        }
        else strk[i]=0;
        for (j=0; j<2; j++)
        {
            //  if (a[buf][0]!=a[buf][2])
            {
                a[buf][j]=a[buf][j+1];
                cout<<a[buf][j]<<"=";
            }
            else
            {
                //  stroka=0;
                break;
            }
 
        }
    }
 
/////////////////////////////////////////////////////
    for(i=0; i<3; i++)
        for (j=0; j<3; j++)
        {
            cout<<" "<<a[i][j];
        }
    cout<<"\n";
    for(i=0; i<9; i++)
    {
        cout<<" "<<b[i];
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.09.2013, 23:15
Ответы с готовыми решениями:

Массив: преобразорвать двумерный массив в одномерный и отсортировать его методом пузырька
всем привет. народ помогите с прогой, конкретно с функцией sort (65 строка), она должна двухмерный...

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

Дан двумерный массив размерностью 4*5. Сформировать одномерный массив
Дан двумерный массив размерностью 4*5, заполненный целыми числами с клавиатуры. Сформировать...

Дан двумерный массив. Сформировать одномерный массив из элементов заданного массива, расположенных под побочной диагональю.
Дан двумерный массив размером n x n. Сформировать: Одномерный массив из элементов заданного...

17
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
15.09.2013, 11:34 2
лучше переписать все элементы из двумерного массива в одномерный и произвести его сортировку
мне кажется что это легче чем возится с двумерным и помечать строки
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
15.09.2013, 16:24  [ТС] 3
Это не эффективно и задача дана преподавателем.

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

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
using namespace std;
 
int main( )
{
    int i,j,k,min,buf,n,t; 
    /* 
    n - для внешнего цикла
    t - для хранения временной переменной. если частный случай и при удалении элемента массива, происходит неправильная сортировка.
    buf - временное хранение переменной i
    min - поиск минимального элемента в столбце
    k - хранение переенной одномерного массива  
    */
    int a[10][10], b[10];
 
    for(i=0; i<9; i++)
    {
        b[i]=0;
            }
 
    for(i=0; i<3; i++)
        for (j=0; j<3; j++)
        {
            cout<<"введите элементы массива a"<<i<<j<<"\n";
            cin>>a[i][j];
        }
 
 
    cout<<"\n";
    for(i=0; i<3; i++)
        for (j=0; j<3; j++)
        {
            cout<<" "<<a[i][j];
        }
    cout<<"\n";
//начало главной части
    k=0;
 
    for (n=0; n<9; n++)
    {
        min=a[0][0];
        buf=0;
        for (i=1; i<3; i++)
        {
            if (a[i][0]!=a[i][2])
            {
                if (min>a[i][0])
 
                {
                    min=a[i][0];
                    buf=i;
                }
            }
        }
        b[k]=min;
    //  cout<<min<<"-min";
        k++;
        for (j=0; j<2; j++)
        {
            if (a[buf][0]!=a[buf][2])
            {
                a[buf][j]=a[buf][j+1];
            //  cout<<a[buf][j]<<"=";
            }
            else
            {
                if (a[buf][0]>b[k])
                {
                    b[k]=a[buf][0];
                    k++;
                }
                else
                {
                    t=a[buf][0];    //все хорошо, но элемент добавляется после перебора 3 строк массива
                    a[buf][0]=b[k];
                    b[k]=t;
                }
            }
 
        }
    }
 
 
// конец главной части
    for(i=0; i<3; i++) // вывод на экран двумерного массива
        for (j=0; j<3; j++)
        {
            cout<<" "<<a[i][j];
        }
    cout<<"\n"; 
    for(i=0; i<9; i++) // вывод на экран одномерного массива
    {
        cout<<" "<<b[i];
    }
}
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
15.09.2013, 21:38 4
Может быть как то так,если я правильно понял.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
    srand(time(NULL));
    const int str=3;
    const int stolb=3;
    int mass[str][stolb];
    int temp;
    //заполняем двухмерный массив и выводим на экран
    cout<<"До сортировки""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
         {
            mass[i][j]=1+rand()%100;
            cout<<mass[i][j]<<"\t";
         }
        cout<<"\n\n";
    }
    //Сортируем массив
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбцах упорядочиваем
       for(int x=0;x<stolb;x++)
         {
           for(int z=0;z<str-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
     }
    //вывод на экран после сортировки
    cout<<"После сортировки по возрастанию""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
 //объявляем одномерный массив
   int B[str*stolb]; //одномерный массив
   int namber=0; //индексы одномерного массива
 
  //Копируем данные двумерного массива в одномерный
   for (int i=0;i<str;i++)
   {
       for (int j=0;j<stolb;j++)
       {
          B[namber]=mass[i][j];
          namber++;
       }
   }
 //выводим полученный массив
   cout<<"Массив после копирования""\n\n";
   for (int i=0;i<str*stolb;i++)
   cout<<B[i]<<"\t";
   cout<<"\n\n";
 
return 0;
}
1
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
15.09.2013, 23:29  [ТС] 5
Цитата Сообщение от Genn55 Посмотреть сообщение
Может быть как то так,если я правильно понял.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
    srand(time(NULL));
    const int str=3;
    const int stolb=3;
    int mass[str][stolb];
    int temp;
    //заполняем двухмерный массив и выводим на экран
    cout<<"До сортировки""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
         {
            mass[i][j]=1+rand()%100;
            cout<<mass[i][j]<<"\t";
         }
        cout<<"\n\n";
    }
    //Сортируем массив
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбцах упорядочиваем
       for(int x=0;x<stolb;x++)
         {
           for(int z=0;z<str-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
     }
    //вывод на экран после сортировки
    cout<<"После сортировки по возрастанию""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
 //объявляем одномерный массив
   int B[str*stolb]; //одномерный массив
   int namber=0; //индексы одномерного массива
 
  //Копируем данные двумерного массива в одномерный
   for (int i=0;i<str;i++)
   {
       for (int j=0;j<stolb;j++)
       {
          B[namber]=mass[i][j];
          namber++;
       }
   }
 //выводим полученный массив
   cout<<"Массив после копирования""\n\n";
   for (int i=0;i<str*stolb;i++)
   cout<<B[i]<<"\t";
   cout<<"\n\n";
 
return 0;
}
в целом все так, но это частный случай задания массива.
массив должен быть примерно такой :
6 8 9
1 5 7
2 3 4
а из него уже должен формироваться одномерный массив.
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
15.09.2013, 23:49 6
Тогда так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
    srand(time(NULL));
    const int str=3;
    const int stolb=3;
    int mass[str][stolb];
    int temp;
    //заполняем двухмерный массив и выводим на экран
       for(int i=0; i<str; i++)
        for (int j=0; j<stolb; j++)
        {
            cout<<"введите элементы массива a"<<i<<j<<"\n";
            cin>>mass[i][j];
        }
 
 
    cout<<"\n";
    for(int i=0; i<str; i++)
        for (int j=0; j<stolb; j++)
        {
            cout<<" "<<mass[i][j];
        }
    cout<<"\n";
    //Сортируем массив
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбцах упорядочиваем
       for(int x=0;x<stolb;x++)
         {
           for(int z=0;z<str-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
     }
    //вывод на экран после сортировки
    cout<<"После сортировки по возрастанию""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
 //объявляем одномерный массив
   int B[str*stolb]; //одномерный массив
   int namber=0; //индексы одномерного массива
 
  //Копируем данные двумерного массива в одномерный
   for (int i=0;i<str;i++)
   {
       for (int j=0;j<stolb;j++)
       {
          B[namber]=mass[i][j];
          namber++;
       }
   }
 //выводим полученный массив
   cout<<"Массив после копирования""\n\n";
   for (int i=0;i<str*stolb;i++)
   cout<<B[i]<<"\t";
   cout<<"\n\n";
 
return 0;
}
Если нужно вводить с клавиатуры

Добавлено через 2 минуты
и эти инклуды лишние
C++
1
2
#include<stdlib.h>
#include<time.h>
и это
C++
1
 srand(time(NULL));
лишнее.

Добавлено через 1 минуту
Понял.Сейчас переделаю.У вас должны только строки отсортированы?
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 23:50 7
http://ru.wikipedia.org/wiki/%... 0%B5%D0%BC
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
16.09.2013, 00:09  [ТС] 8
да. только строки
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
16.09.2013, 00:11 9
Цитата Сообщение от allex Посмотреть сообщение
а из него уже должен формироваться одномерный массив.
Отсортированный?

Добавлено через 1 минуту
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
    srand(time(NULL));
    const int str=3;
    const int stolb=3;
    int mass[str][stolb];
    int temp;
    //заполняем двухмерный массив и выводим на экран
       for(int i=0; i<str; i++)
        for (int j=0; j<stolb; j++)
        {
            cout<<"введите элементы массива a"<<i<<j<<"\n";
            cin>>mass[i][j];
        }
 
 
    cout<<"\n";
    for(int i=0; i<str; i++)
        for (int j=0; j<stolb; j++)
        {
            cout<<" "<<mass[i][j];
        }
    cout<<"\n";
    //Сортируем массив
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
 
     }
    //вывод на экран после сортировки
    cout<<"После сортировки по возрастанию""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
 //объявляем одномерный массив
   int B[str*stolb]; //одномерный массив
   int namber=0; //индексы одномерного массива
 
  //Копируем данные двумерного массива в одномерный
   for (int i=0;i<str;i++)
   {
       for (int j=0;j<stolb;j++)
       {
          B[namber]=mass[i][j];
          namber++;
       }
   }
 //выводим полученный массив
   cout<<"Массив после копирования""\n\n";
   for (int i=0;i<str*stolb;i++)
   cout<<B[i]<<"\t";
   cout<<"\n\n";
 
return 0;
}
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
16.09.2013, 00:24  [ТС] 10
Цитата Сообщение от Nekto Посмотреть сообщение
это не то, что нужно. нужно именно определенный вид массива преобразовать в одномерный (отсортированный), без последующей дополнительной сортировки

Добавлено через 11 минут
Genn55, это не то )))
пользователь ввел массив с клавиатуры. по условию, он уже отсортирован по строкам.
дальше из этого двумерного массива, нужно сделать одномерный (отсортированный). при этом его не нужно дополнительно сортировать, после того как массив будет преобразован в одномерный. массив должен так собраться в одномерный, чтобы дальнейшая сортировка была не нужна.

общая идея такая:
когда массив двумерный будет задан, нужно среди его первого столбца искать минимум, затем записать минимум в новый массив (одномерный).
затем как-то удалить старый минимум (возможное решение: сдвиг всех элементов на 1 влево так, что потом получится целая строка из одинаковых элементов)
найти новый минимум и т.д.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
16.09.2013, 00:28 11
Цитата Сообщение от allex Посмотреть сообщение
это не то, что нужно. нужно именно определенный вид массива преобразовать в одномерный (отсортированный), без последующей дополнительной сортировки
Как это не то? Почитай ссылку внимательнее. Тебе нужен пункт "3. Два упорядоченных массива половинного размера соединяются в один."
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
16.09.2013, 00:40 12
Тут скорей это: http://en.wikipedia.org/wiki/Merge_algorithm
he general merge algorithm has a set of pointers p0..n that point to positions in a set of lists L0..n. Initially they point to the first item in each list. The algorithm is as follows:

While any of p0..n still point to data inside of L0..n instead of past the end:

do something with the data items p0..n point to in their respective lists
find out which of those pointers points to the item with the lowest key; advance one of those pointers to the next item in its list
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
16.09.2013, 01:53 13
Вот такой вариант пойдет?Если строки сортированы по условию работать будет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include<iostream>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
 
    const int str=3;
    const int stolb=3;
    int mass[str][stolb];
    int temp[str],max = 0;
    int counter,columnMin;
    //заполняем двухмерный массив и выводим на экран
       for(int i=0; i<str; i++)
        for (int j=0; j<stolb; j++)
        {
            cout<<"введите элементы массива a"<<i<<j<<"\n";
            cin>>mass[i][j];
            if (mass[i][j]> max)
            max = mass[i][j];
        }
 
 
    cout<<"\n";
 
    for(int i=0; i<str; i++)
        for (int j=0; j<stolb; j++)
        {
            cout<<" "<<mass[i][j];
        }
    cout<<"\n";
 //строки сортированы по условию
 //сумма элементов строки будет возрастать с ростом номера строки   
 //делаем проходы столько раз, сколько строк в массиве
  for(int N = 0; N < str - 1; N++)
   {
//анализируем массив и находим строку,
//сумма элементов которой минимальная
       for(int i = N; i < str; i++)
         {
//обнуляем счетчик суммы элементов строки
   counter = 0;
//проходим по элементам данной строки
//и считаем сумму
       for(int j = 0; j < stolb; j++)
         counter += mass[i][j];
 
//max в итоге будет хранить значение минимальной суммы
//columnMin будет хранить значение строки, в которой
//была найдена минимальная сумма
         if(max > counter)
           {
             max = counter;
             columnMin = i;
            }
        }
 
       for(int j = 0; j < stolb; j++)
         {
            temp[j] = mass[columnMin][j];
            mass[columnMin][j] = mass[N][j];
            mass[N][j] = temp[j];
         }
   }
    //вывод на экран после сортировки
    cout<<"После сортировки по возрастанию""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
 //объявляем одномерный массив
   int B[str*stolb]; //одномерный массив
   int namber=0; //индексы одномерного массива
 
  //Копируем данные двумерного массива в одномерный
   for (int i=0;i<str;i++)
   {
       for (int j=0;j<stolb;j++)
       {
          B[namber]=mass[i][j];
          namber++;
       }
   }
 //выводим полученный массив
   cout<<"Массив после копирования""\n\n";
   for (int i=0;i<str*stolb;i++)
   cout<<B[i]<<"\t";
   cout<<"\n\n";
 
return 0;
}
Возможно не лучший вариант,но работает при условии,что строки уже отсортированы.
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
16.09.2013, 23:12  [ТС] 14
вылетает с ошибкой, после задания массива.
игнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: cyberforum.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 52375734
Имя модуля с ошибкой: cyberforum.exe
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 52375734
Код исключения: c0000005
Смещение исключения: 000015e3
Версия ОС: 6.1.7601.2.1.0.256.48
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
17.09.2013, 02:35 15
Не знаю,что еще нужно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<iostream>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
 
    const int str=3;
    const int stolb=3;
    int mass[str][stolb];
    int temp;
    //заполняем двухмерный массив и выводим на экран
    cout<<"Введите элементы массива "<<"\n";
       for(int i=0; i<str; i++)
        for (int j=0; j<stolb; j++)
        {
         cin>>mass[i][j];
        }
    cout<<"\n";
    cout<<"Начальный  массив"<<"\n\n";
  for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
    cout<<"\n";
    //Сортируем массив
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбцах упорядочиваем
       for(int x=0;x<stolb;x++)
         {
           for(int z=0;z<str-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
     }
    //вывод на экран после сортировки
    cout<<"После сортировки по возрастанию""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
 //объявляем одномерный массив
   int B[str*stolb]; //одномерный массив
   int namber=0; //индексы одномерного массива
 
  //Копируем данные двумерного массива в одномерный
   for (int i=0;i<str;i++)
   {
       for (int j=0;j<stolb;j++)
       {
          B[namber]=mass[i][j];
          namber++;
       }
   }
 //выводим полученный массив
   cout<<" Одномерный отсортированный массив ""\n\n";
   for (int i=0;i<str*stolb;i++)
   cout<<B[i]<<"\t";
   cout<<"\n\n";
 
return 0;
}
Миниатюры
Двумерный массив в одномерный  
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
17.09.2013, 16:45 16
Как вариант:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <utility>
#include <vector>
#include <cstdlib>
#include <ctime>
 
 
template<
      typename InputIterator
    , typename OutputIterator
    , typename Compare = std::less<typename std::iterator_traits<InputIterator>::value_type>
>
OutputIterator
merge(std::vector<std::pair<InputIterator, InputIterator>> input, OutputIterator output, Compare const compare = Compare()) {
   using input_range = std::pair<InputIterator, InputIterator>; 
   
   auto const range_less = [=] (input_range lhs, input_range rhs) {
      return compare(*lhs.first, *rhs.first);
   };
   auto const range_empty = [] (input_range range) {
      return range.first == range.second;
   };
    
   input.erase(std::remove_if(std::begin(input), std::end(input), range_empty), std::end(input));   
       
   while (!input.empty()) {
      auto const min = std::min_element(std::begin(input), std::end(input), range_less);
            
      *output++ = *min->first++;
      
      if (range_empty(*min)) {
         input.erase(min);
      }
   }
   
   return output;
}
 
 
int main() {
   std::size_t const height = 10;
   std::size_t const width  = 10;
   int matrix[height][width];
   int array[height * width];
   
   std::srand(std::time(nullptr));
   for (auto & row : matrix) {
      std::generate(std::begin(row), std::end(row), [] () { return std::rand() % 1000; });
      std::sort(std::begin(row), std::end(row));
   }
   
   std::cout << "before merge" << std::endl;
   for (auto const& row : matrix) {
      std::copy(std::begin(row), std::end(row), std::ostream_iterator<int>{std::cout, "\t"});
      std::cout << std::endl;
   }
   
   std::vector<std::pair<int *, int *>> rows(height);
   for (std::size_t i = 0; i != height; ++i) {
      rows[i] = {std::begin(matrix[i]), std::end(matrix[i])};
   }
   merge(rows, array);
   
   std::cout << "after merge" << std::endl;
   std::copy(std::begin(array), std::end(array), std::ostream_iterator<int>{std::cout, "\t"});
   std::cout << std::endl;
}
http://ideone.com/C9VkKK
1
18 / 18 / 13
Регистрация: 14.09.2013
Сообщений: 37
17.09.2013, 21:05 17
вот может быть. храним в массиве указатели на строки. ищем минимум между числами на котырые указывают указатели, после нахождения минимума переносим его в одномерный массив, а указатель который указывал на минимум теперь указывает на число следующее за минимумом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "stdafx.h"
#include <iostream>
#include <LIMITS.H>
using namespace std;
 
int main()
{
    const int rows=3;
    const int columns=3;
    int matrix[rows][columns];
    const int sorted_size=rows*columns;
    int sorted[sorted_size];
    const int *pointers[rows];
 
    for(int i=0;i<rows;++i)
    {
        cout<<"please enter numbers to "<<i<<" column"<<endl;
        pointers[i]=matrix[i];
        for(int j=0;j<columns;++j)
            cin>>matrix[i][j];
            
    }
    //SORTING////////////////////////////////////
    for(int i=0;i<sorted_size;++i)
    {
        int min_place=0;
        int min=INT_MAX;
        for(int j=0;j<rows;++j)// 
        {
            if(pointers[j] && *pointers[j]<min) //searching minimum between elements in pointers
            {
                min=*pointers[j];
                min_place=j;
            }
        }
        if(*pointers[min_place]!=matrix[min_place][columns-1])
        {
            ++pointers[min_place];//now pointer[min_place] points to next number, that follows after min (we found it before)
        }
        else
        {
            pointers[min_place]=nullptr;// if no more numbers in matrix[min_place]
        }
        sorted[i]=min;
    }
 
for(int i=0;i<sorted_size;++i)
{
    cout<<" "<<sorted[i];
}
cout<<endl;
system("pause");
}
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
17.09.2013, 21:13  [ТС] 18
Всем большое спасибо!
0
17.09.2013, 21:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2013, 21:13
Помогаю со студенческими работами здесь

Скопировать двумерный массив в одномерный массив из 50 элементов
Создать двумерный массив 10*5, заполнить его значениями ( i^2-j^2), где i и j итераторы двумерного...

Двумерный массив в одномерный
Задача: двумерный массив N*N преобразовать в одномерный N2. По особому алгоритму( приложения)...

Одномерный и двумерный массив.
Всем привет ! Хотелось бы чтоб мне помогли с задачами ! я буду их пробовать решить но до завтра...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru