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

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

14.09.2013, 23:15. Показов 7977. Ответов 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];
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2013, 23:15
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 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
Может быть как то так,если я правильно понял.

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  [ТС]
Цитата Сообщение от 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
Тогда так.
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
http://ru.wikipedia.org/wiki/%... 0%B5%D0%BC
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
16.09.2013, 00:09  [ТС]
да. только строки
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
16.09.2013, 00:11
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от Nekto Посмотреть сообщение
это не то, что нужно. нужно именно определенный вид массива преобразовать в одномерный (отсортированный), без последующей дополнительной сортировки

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

общая идея такая:
когда массив двумерный будет задан, нужно среди его первого столбца искать минимум, затем записать минимум в новый массив (одномерный).
затем как-то удалить старый минимум (возможное решение: сдвиг всех элементов на 1 влево так, что потом получится целая строка из одинаковых элементов)
найти новый минимум и т.д.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
16.09.2013, 00:28
Цитата Сообщение от allex Посмотреть сообщение
это не то, что нужно. нужно именно определенный вид массива преобразовать в одномерный (отсортированный), без последующей дополнительной сортировки
Как это не то? Почитай ссылку внимательнее. Тебе нужен пункт "3. Два упорядоченных массива половинного размера соединяются в один."
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
16.09.2013, 00:40
Тут скорей это: 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
Вот такой вариант пойдет?Если строки сортированы по условию работать будет.
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  [ТС]
вылетает с ошибкой, после задания массива.
игнатура проблемы:
Имя события проблемы: 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
Не знаю,что еще нужно.
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!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
17.09.2013, 16:45
Как вариант:
Кликните здесь для просмотра всего текста
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
вот может быть. храним в массиве указатели на строки. ищем минимум между числами на котырые указывают указатели, после нахождения минимума переносим его в одномерный массив, а указатель который указывал на минимум теперь указывает на число следующее за минимумом.
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  [ТС]
Всем большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2013, 21:13
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru