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

Не корректное выполнение сортировки двумерного массива - C++

Восстановить пароль Регистрация
 
HaRuKy
 Аватар для HaRuKy
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 287
08.12.2011, 08:44     Не корректное выполнение сортировки двумерного массива #1
Приветствую всех.
Помогите найти и исправить причину не корректной работы программы.
Примечание: я еще новичок и решаю задачки на самом простом компиляторе Турбо Си.
Задание следующее: написать функцию, проверяющую, по возрастанию или убыванию упорядочена указанная строка двумерного массива. Упорядочить по возрастанию все строки двумерного массива, которые не упорядочены по убыванию.

Алгоритм следующий:

1.Формировка двумерного массива; Выполняется корректно.
2.Проверка двумерного массива на условия сортировки; Выполняет не корректно.
3.Сортировка по возрастанию тех строк массива, которые не упорядочены по возрастанию. Выполняет не корректно.

Исходник:

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
#include "iostream.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#define N 100
#define M 100
void main()
{ randomize();
  clrscr();
  int i,j,n,m,a[N][M];
\\ формирование двумерного массива
  printf("Vvedite massiv:\n");
  scanf("%d %d", &n, &m);
  printf("n=%d m=%d \n",n,m);
  for(i=0;i<n;i++)
  {for(j=0;j<m;j++)
  {a[i][j]=random(9);
  printf("%3d", a[i][j]); }
  cout<<endl; }
\\ проверка строк на условия сортировки
  int ps1=0,ps2=0,k=1,n_str,buf;
  printf("Vvedite nomer stroki = \n");
  scanf("%d", &n_str);
  int sort[N];
\\ сортирую выбранную строку
  for(j=0;j<m-1;j++)
    { if (a[n_str][j]>=a[n_str][j+1]) {ps1=1;k++;} else {ps1=0;k=1;};
      if (a[n_str][j]<=a[n_str][j+1]) {ps2=1;k++;} else {ps2=0;k=1;};};
      if ((ps1==1) && (k==m)) {printf("vozrastaet");} else
       if ((ps2==1) && (k==m)) {printf("ybivaet");} else
     printf("ne otsortirovana");
  cout<<"\n";
\\ проверяю сортировку всех строк + условие если строка отсортирована по возрастанию или убыванию то созданный одномерный массив(sort[i]) выдает 1 если не отсортирована строка то выдает -1 
  for(i=0;i<n;i++)
   {for(j=0;j<m-1;j++)
    { if (a[i][j]>=a[i][j+1]) {ps1=1; k++;}   else
       if (a[i][j]<=a[i][j+1]) {ps2=2;k++;};};
       if ((ps1==1) && (k==m)) {sort[i]=1;} else
       if ((ps2==2) && (k==m)) {sort[i]=1;} else
     sort[i]=-1; k=1;}
\\   Сортировка по возрастанию
printf("Sortirovka po vozrastaniu: \n");
   for(i=0; i<n; i++)
    { for(j=0; j<m; j++)
     { if ((sort[i]==-1)&&(a[i][j]>=a[i][j+1]))
      { buf=a[i][j];
    a[i][j]=a[i][j+1];
    a[i][j+1]=buf;
      }
     }
    } 
    for(i=0;i<n;i++) cout<<sort[i];
   for(i=0; i<n; i++)
    { for(j=0; j<m; j++)
      { printf("%3d", a[i][j]);
      } cout<<"\n";
    }
    getch();
}
Заранее благодарю
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2011, 08:44     Не корректное выполнение сортировки двумерного массива
Посмотрите здесь:

C++ Чтение двумерного массива и выполнение над ним действий
залить из двумерного массива данные в одномерный длиной, равной количеству всех элементов исходного массива C++
функция сортировки двумерного массива C++
C++ Ошибки в программе сортировки Хоара двумерного массива в С++
Найти номер строки и столбца двумерного массива для минимального элемента этого массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
08.12.2011, 10:20     Не корректное выполнение сортировки двумерного массива #2
C++
1
2
3
4
5
6
7
8
9
10
    printf("Sortirovka po vozrastaniu: \n");
    for(int i=0; i < n; i++)
        if (sort[i] == -1)
            for (int k = 1; k < n; k++)
                for (int z = 0; z < n - k; z++)
                    if (a[i][z] > a[i][z + 1]){
                        int buf = a[i][z];
                        a[i][z] = a[i][z+1];
                        a[i][z+1] = buf;
                    }
Kidasov
76 / 76 / 12
Регистрация: 02.12.2011
Сообщений: 966
Записей в блоге: 3
08.12.2011, 10:32     Не корректное выполнение сортировки двумерного массива #3
Написано все очень просто


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
98
99
100
101
102
103
#include <iostream>
#include <cstring>
using namespace std;
 
const int M = 3;     //число строк
const int N = 3;     //число столбцов
 
 
//Обмен 2 чисел типа int
void swap(int &x, int &y)
{
  int buf = x;
  x = y;
  y = buf;
}
 
 
//Пузырьковая сортировка в 1 строке
void bubbleSort(int row, int **a)
{
  for (int i=0; i<N-1; i++)
  {
    for (int j=i+1; j<N; j++)
    {
      if (a[row][i] > a[row][j])
      {
    swap(a[row][i], a[row][j]);
      }
    }
  }
}
 
 
//Сортировка во всех строках исходной матрицы
void sortRows(int **a)
{
  int count = M;
  bool flag = true;
  fo
  output(a);r (int i=0; i<M; i++)
  {
    for (int j=0; j<N-1; j++)
    {
      if (a[i][j] > a[i][j+1]) { flag = false; break; }
    }
    if (!flag)
    {
      flag = true;
      bubbleSort(i, a);
    }
  }
  cout<<"\n";
}
 
 
//Ввод двумерного массива
void input(int **a)
{
  cout<<"input data : \n";
  for (int i=0; i<M; i++)
  {
    for (int j=0; j<N; j++)
      cin>>a[i][j];
  }
  cout<<"\n";
}
 
//Вывод двумерного массива
void output(int **a)
{
  cout<<"Output data: \n";
  for (int i=0; i<M; i++)
  {
    for (int j=0; j<N; j++)
      cout<<a[i][j]<<" ";
    cout<<"\n";
  }
}
 
//Удаление памяти, выделенной под массив
void del(int **a)
{
  for (int i=0; i<M; i++)
  {
    delete []a[i];
  }
  delete []a;
}
 
int main()
{
  int **a = new int *[M]; //Инициалихация двумерного динамического массива
  for (int i=0; i<M; i++)
  {
    a[i] = new int[N];
  }
  input(a);    //Ввод
  output(a);   //Вывод
  sortRows(a); //Сортировка
  cout<<"After sorting: \n";
  output(a);   //Вывод после сортировки
  return 0;
}
HaRuKy
 Аватар для HaRuKy
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 287
09.12.2011, 19:32  [ТС]     Не корректное выполнение сортировки двумерного массива #4
Нет, в заданий сказано сначало надо проверить строки исходного двумерного массива на условия сортировки: для этого я в листинге создаю переменную n_str , которая проверяет выбранную строку двумерного массива и выводит сообщение(напимер: строка возростает/убывает/не отсортирована), а после идет сортировка по возрастанию тех строк массива которые не упорядочены по возрастанию...

У меня в листинге почему, то она проверяет не корректно...почему не могу найти причину ... ?
Или не подскажете как можно по другому задать условие проверки ?

Заранее благодарю...
HaRuKy
 Аватар для HaRuKy
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 287
09.12.2011, 21:55  [ТС]     Не корректное выполнение сортировки двумерного массива #5
Вставил цикл сортировки в исходник теперь 3 часть из алгоритма работает корректно.
Некорректная работа программы проявляется в том, что в результате , при выборе строки он выдает сообщение что это строка отсортирована, например по убыванию, а одномерный массив sort[i] выдает значение 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
#include "iostream.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#define N 100
#define M 100
void main()
{ randomize();
  clrscr();
  int i,j,n,m,a[N][M];
  printf("Vvedite massiv:\n");
  scanf("%d %d", &n, &m);
  printf("n=%d m=%d \n",n,m);
  for(i=0;i<n;i++)
  {for(j=0;j<m;j++)
  {a[i][j]=random(9);
  printf("%3d", a[i][j]); }
  cout<<endl; }
  int ps1=0,ps2=0,ps3=0,k=1,n_str,buf;
  printf("Vvedite nomer stroki = \n");
// цикл для проверка выбранной строки двумерного массива + выдача сообщения о сортировке строки
  [B]scanf("%d", n_str);
  int sort[N];
  for(i=0;i<n-1;i++)
    { if (a[n_str][j]>=a[n_str][j+1]) {ps1=1;k++;} else {ps1=0;k=1;};
      if (a[n_str][j]<=a[n_str][j+1]) {ps2=2;k++;} else {ps2=0;k=1;};};
      if ((ps1==1) && (k==m)) {printf("vozrastaet");} else
       if ((ps2==2) && (k==m)) {printf("ybivaet");} else
     printf("ne otsortirovana");
  cout<<"\n";
// цикл для проверка всех строк двумерного массива на условия сортировки + если возрастает, то массив sort[i] выдает значение -1 если убывает или не отсортирована то массив выдает значение 1.
  for(i=0;i<n;i++)
   {for(j=0;j<m-1;j++)
    { if (a[i][j]>=a[i][j+1]) {ps1=1; k++;}   else
       if (a[i][j]<=a[i][j+1]) {ps2=2;k++;};};
    if ((ps1==1) && (k==m)) {sort[i]=-1;} else
     if ((ps2==2) && (k==m)) {sort[i]=1;} else
     sort[i]=1; }[/B]
    printf("Sortirovka po vozrastaniu: \n");
    for(i=0; i<n; i++)
     { if(sort[i]==1)
       { for(int c=1; c<n; c++)
     { for(int z=0; z<n-c;z++)
       { if(a[i][z]>a[i][z+1])
         { buf=a[i][z];
         a[i][z]=a[i][z+1];
         a[i][z+1]=buf;
         }
       }
     }
       }
     }
    for(i=0;i<n;i++) cout<<sort[i]<<" "; cout<<"\n";
     for(i=0; i<n; i++)
      { for(j=0; j<m; j++)
       { printf("%2d", a[i][j]);
       }  cout<<"\n";
      }
  getch();
}
Kidasov
76 / 76 / 12
Регистрация: 02.12.2011
Сообщений: 966
Записей в блоге: 3
10.12.2011, 02:01     Не корректное выполнение сортировки двумерного массива #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
//Сортировка всех неупорядоченных строк исходной матрицы
void sortRows(int **a)
{
  int buf;  //переменная, определяющая отсортирован наш массив по возрастанию или по убыванию
  output(a);
  for (int i=0; i<M; i++)
  {
    buf = check(i, a);
    if (!buf) { cout<<"строка "<<i<<" не отсортирована\n"; bubbleSort(i, a); }
    else if (buf > 0) { cout<<"строка "<<i<<"отсортирована по убыванию\n"; bubbleSort(i, a); }
    else cout<<"строка "<<i<<"отсортирована по возрастанию\n";
  cout<<"\n";
}
 
int check(int numb, int **a)
{ 
   int b = 0;  // b = -1 строка отсортирована по возрастанию
   int c = 0;  // c = 1 строка отсортирована по убыванию
   for (int i=0; i<N-1; i++)
   {
      if (a[numb][i] > a[numb][i+1]) с = 1;
      else c = 0; break;
   }
   if (!c)
     for (int i=0; i<N-1; i++)
     {
        if (a[numb][i] < a[numb][i+1]) b = -1;
        else b = 0; break;
     }
  if (c > b) return c;
  else if (b < 0) return b;
  else return 0; 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2011, 10:45     Не корректное выполнение сортировки двумерного массива
Еще ссылки по теме:

Составить программу сортировки одномерного числового массива от начала массива к элементу с заданным номером по убыванию (методом выбора) C++
C++ Исправить код для сортировки двумерного массива
C++ Шаблонная функция сортировки двумерного массива

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

Или воспользуйтесь поиском по форуму:
HaRuKy
 Аватар для HaRuKy
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 287
11.12.2011, 10:45  [ТС]     Не корректное выполнение сортировки двумерного массива #7
Можете взглянуть: вставил функции описанные выше, он выдает мне сообщение: Declaration syntax error в строке void sortRows(int **a) { ...
Не подскажете как правильно вставить функции в мои листинг ?
Просьба не судить строго я только учусь...

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
98
99
100
101
102
#include "iostream.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#define N 100
#define M 100
void main()
{ randomize();
  clrscr();
  int i,j,n,m,a[N][M];
  printf("Vvedite massiv:\n");
  scanf("%d %d", &n, &m);
  printf("n=%d m=%d \n",n,m);
  for(i=0;i<n;i++)
  {for(j=0;j<m;j++)
  {a[i][j]=random(9);
  printf("%3d", a[i][j]); }
  cout<<endl; }
  int ps1=0,ps2=0,ps3=0,k=1,n_str,buf;
  printf("Vvedite nomer stroki = \n");
  scanf("%d", n_str);
void sortRows(int **a)
  {
  int buf;  //переменная, определяющая отсортирован наш массив по возрастанию или по убыванию
  output(a);
  for (int i=0; i<M; i++)
  {
    buf = check(i, a);
    if (!buf) { cout<<"строка "<<i<<" не отсортирована\n"; bubbleSort(i, a); }
    else if (buf > 0) { cout<<"строка "<<i<<"отсортирована по убыванию\n"; bubbleSort(i, a); }
    else cout<<"строка "<<i<<"отсортирована по возрастанию\n";
  cout<<"\n";
}
 
int check(int numb, int **a)
{ 
   int b = 0;  // b = -1 строка отсортирована по возрастанию
   int c = 0;  // c = 1 строка отсортирована по убыванию
   for (int i=0; i<N-1; i++)
   {
      if (a[numb][i] > a[numb][i+1]) c = 1;
      else c = 0; break;
   }
   if (!c)
     for (int i=0; i<N-1; i++)
     {
        if (a[numb][i] < a[numb][i+1]) b = -1;
        else b = 0; break;
     }
  if (c > b) return c;
  else if (b < 0) return b;
  else return 0; 
}
  /* int sort[N];
  for(i=0;i<n-1;i++)
    { if (a[n_str][j]>=a[n_str][j+1]) {ps1=1;k++;} else {ps1=0;k=1;};
      if (a[n_str][j]<=a[n_str][j+1]) {ps2=2;k++;} else {ps2=0;k=1;};};
      if ((ps1==1) && (k==m)) {printf("vozrastaet");} else
       if ((ps2==2) && (k==m)) {printf("ybivaet");} else
     printf("ne otsortirovana");
  cout<<"\n";
  for(i=0;i<n;i++)
   {for(j=0;j<m-1;j++)
    { if (a[i][j]>=a[i][j+1]) {ps1=1; k++;}   else
       if (a[i][j]<=a[i][j+1]) {ps2=2;k++;};};
    if ((ps1==1) && (k==m)) {sort[i]=-1;} else
     if ((ps2==2) && (k==m)) {sort[i]=1;} else
     sort[i]=1; }   */
 /*  for(i=0; i<n; i++)
    { for(j=0; j<m; j++)
     { if(a[i][j]>=a[i][j+1]) {ps1=1; k++;} else
    if(a[i][j]<=a[i][j+1]) {ps2=1; k++;} else
     {ps3=1;k++;}
     };
       if(n_str==ps1){printf("vozrostaet");} else
    if(n_str==ps2){printf("ybivaet");} else
     if(n_str==ps3){printf("ne otsortirovana");}
    }
 */
 
   printf("Sortirovka po vozrastaniu: \n");
    for(i=0; i<n; i++)
     { if(sort[i]==1)
       { for(int c=1; c<n; c++)
     { for(int z=0; z<n-c;z++)
       { if(a[i][z]>a[i][z+1])
         { buf=a[i][z];
         a[i][z]=a[i][z+1];
         a[i][z+1]=buf;
         }
       }
     }
       }
     }
    for(i=0;i<n;i++) cout<<sort[i]<<" "; cout<<"\n";
     for(i=0; i<n; i++)
      { for(j=0; j<m; j++)
       { printf("%2d", a[i][j]);
       }  cout<<"\n";
      }
  getch();
}
Yandex
Объявления
11.12.2011, 10:45     Не корректное выполнение сортировки двумерного массива
Ответ Создать тему
Опции темы

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