Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
allex
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
#1

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

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

Здравствуцте,

Есть двумерный массив с отсортированными строками. нужно его преобразовать в одномерный отсортированный.
Алгоритм предлагаю следующий: (для массива 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];
    }
}

http://www.cyberforum.ru/cpp-beginners/thread580057.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 23:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Двумерный массив в одномерный (C++):

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

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

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

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

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

17
User409368
191 / 168 / 32
Регистрация: 09.09.2013
Сообщений: 524
15.09.2013, 11:34 #2
лучше переписать все элементы из двумерного массива в одномерный и произвести его сортировку
мне кажется что это легче чем возится с двумерным и помечать строки
0
allex
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
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
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
allex
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
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
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
Nekto
342 / 287 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 23:50 #7
http://ru.wikipedia.org/wiki/%D0%A1%...B8%D0%B5%D0%BC
0
allex
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
16.09.2013, 00:09  [ТС] #8
да. только строки
0
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
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
allex
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
16.09.2013, 00:24  [ТС] #10
это не то, что нужно. нужно именно определенный вид массива преобразовать в одномерный (отсортированный), без последующей дополнительной сортировки

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

общая идея такая:
когда массив двумерный будет задан, нужно среди его первого столбца искать минимум, затем записать минимум в новый массив (одномерный).
затем как-то удалить старый минимум (возможное решение: сдвиг всех элементов на 1 влево так, что потом получится целая строка из одинаковых элементов)
найти новый минимум и т.д.
0
Nekto
342 / 287 / 37
Регистрация: 23.03.2012
Сообщений: 838
16.09.2013, 00:28 #11
Цитата Сообщение от allex Посмотреть сообщение
это не то, что нужно. нужно именно определенный вид массива преобразовать в одномерный (отсортированный), без последующей дополнительной сортировки
Как это не то? Почитай ссылку внимательнее. Тебе нужен пункт "3. Два упорядоченных массива половинного размера соединяются в один."
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
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
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
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
allex
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
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
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
Миниатюры
Двумерный массив в одномерный  
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
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
D3fend0r
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
allex
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
17.09.2013, 21:13  [ТС] #18
Всем большое спасибо!
0
17.09.2013, 21:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2013, 21:13
Привет! Вот еще темы с решениями:

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

Дан двумерный массив размерностью Н. сформировать одномерный массив из элементов заданного массива расположенных над главной диагональю.
помогите решить=)Дан двумерный массив размерностью Н. сформировать одномерный...

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

Преобразовать двумерный массив в одномерный
Дано двумерный массив a. Необходимо создать одномерный массив b, располагая в...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru