Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
allex
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
14.09.2013, 23:15     Двумерный массив в одномерный #1
Здравствуцте,

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

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

общая идея такая:
когда массив двумерный будет задан, нужно среди его первого столбца искать минимум, затем записать минимум в новый массив (одномерный).
затем как-то удалить старый минимум (возможное решение: сдвиг всех элементов на 1 влево так, что потом получится целая строка из одинаковых элементов)
найти новый минимум и т.д.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
16.09.2013, 00:28     Двумерный массив в одномерный #11
Цитата Сообщение от allex Посмотреть сообщение
это не то, что нужно. нужно именно определенный вид массива преобразовать в одномерный (отсортированный), без последующей дополнительной сортировки
Как это не то? Почитай ссылку внимательнее. Тебе нужен пункт "3. Два упорядоченных массива половинного размера соединяются в один."
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
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;
}
Возможно не лучший вариант,но работает при условии,что строки уже отсортированы.
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
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
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;
}
Миниатюры
Двумерный массив в одномерный  
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
D3fend0r
17 / 17 / 1
Регистрация: 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");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2013, 21:13     Двумерный массив в одномерный
Еще ссылки по теме:

Сравнить двумерный и одномерный массив C++
C++ Преобразовать одномерный массив в двумерный
Перевернуть одномерный и двумерный массив C++

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

Или воспользуйтесь поиском по форуму:
allex
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 20
17.09.2013, 21:13  [ТС]     Двумерный массив в одномерный #18
Всем большое спасибо!
Yandex
Объявления
17.09.2013, 21:13     Двумерный массив в одномерный
Ответ Создать тему
Опции темы

Текущее время: 21:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru