Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299

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

08.12.2011, 08:44. Показов 1127. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех.
Помогите найти и исправить причину не корректной работы программы.
Примечание: я еще новичок и решаю задачки на самом простом компиляторе Турбо Си.
Задание следующее: написать функцию, проверяющую, по возрастанию или убыванию упорядочена указанная строка двумерного массива. Упорядочить по возрастанию все строки двумерного массива, которые не упорядочены по убыванию.

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

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();
}
Заранее благодарю
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.12.2011, 08:44
Ответы с готовыми решениями:

Корректное удаление двумерного динамического массива
Доброго времени суток. В программе имеется двумерный динамический массив. Особенность его в том, что часть строк имеет больше столбцов,...

Функция сортировки двумерного массива
необходимо написать функцию сортирующую двумерный массив. за основу взял сортировку при помощи указателей типа: for (int g=0;...

Сортировки для двумерного массива
Подскажите, пожалуйста, код блочной сортировки для двумерного массива, или сортировки вставками (тоже для двумера). или и то и то (+...

6
302 / 160 / 62
Регистрация: 27.02.2010
Сообщений: 317
08.12.2011, 10:20
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;
                    }
1
80 / 79 / 35
Регистрация: 02.12.2011
Сообщений: 966
Записей в блоге: 3
08.12.2011, 10:32
Написано все очень просто


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;
}
0
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
09.12.2011, 19:32  [ТС]
Нет, в заданий сказано сначало надо проверить строки исходного двумерного массива на условия сортировки: для этого я в листинге создаю переменную n_str , которая проверяет выбранную строку двумерного массива и выводит сообщение(напимер: строка возростает/убывает/не отсортирована), а после идет сортировка по возрастанию тех строк массива которые не упорядочены по возрастанию...

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

Заранее благодарю...
0
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
09.12.2011, 21:55  [ТС]
Вставил цикл сортировки в исходник теперь 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();
}
0
80 / 79 / 35
Регистрация: 02.12.2011
Сообщений: 966
Записей в блоге: 3
10.12.2011, 02:01
Код не проверял но должно быть так вроде)

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; 
}
0
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
11.12.2011, 10:45  [ТС]
Можете взглянуть: вставил функции описанные выше, он выдает мне сообщение: 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.12.2011, 10:45
Помогаю со студенческими работами здесь

Процедура сортировки строк двумерного массива
Напишите, пожалуйста, процедуру (Не обязательно всю программу) сортировки строки двумерного массива по возрастанию.

Шаблонная функция сортировки двумерного массива
Помогите пожалуйста написать шаблонную функцию сортировки двумерного массива (матрицы) любым методом. Пробовал пузырьком, компилятор не...

Функция сортировки двумерного динамического массива
Помогите пожалуйста!Нужно составить функцию которая будет сортировать динамический двухмерный массив по убыванию(или возрастанию)методом...

Функция сортировки двумерного динамического массива
Это программа сортировки работает для целых чисел.Как сделать так чтобы за место целых чисел были дробные с тремя знаками после запятой.То...

Процедура сортировки столбцов двумерного массива
Напишите, пожалуйста, процедуру сортировки столбцов в двумерном массиве по возрастанию.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru