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

Перенести нулевые элементы в начало массива - C++

29.06.2016, 07:53. Просмотров 606. Ответов 6

Доброго времени. Ниже дан фрагмент программы, который должен сортировать массив следующим образом: сначала располагаются все элементы, равные нулю, а потом — все остальные. Пример: исходный массив - 10203, отсортированный должен выглядеть так - 00123. Но алгоритм не работает.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Сортировка массива
void assort(int M[100], int k)
{
 int i,j;
 int p;
 j=0;
 for (i=1; i<=k; i++)
 {
  if (M[i]==0)
  {
    p = M[i];
    M[i] = M[j];
    M[j] = p;
    j=j+1;
  }
 }
 cout << "Assorted array: ";
 for (i=1; i<=k; i++)
  cout << M[i] << " ";
}
0
Миниатюры
Перенести нулевые элементы в начало массива  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2016, 07:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перенести нулевые элементы в начало массива (C++):

Перенести в начало массива нулевые элементы
Составить программу для преобразования массива:переставить элементы массива...

одномерный массив. Все его элементы, не равные нулю, переписать, сохраняя их порядок в начало массива, а нулевые элементы в конец массива in c++
одномерный массив. Все его элементы, не равные нулю, переписать, сохраняя их...

Переместить нулевые элементы в начало массива
#include &lt;iostream&gt; #include&lt;time.h&gt; #include&lt;random&gt; using namespace std;...

В каждой строке все элементы, не равные нулю, переписать в начало строки, а нулевые элементы – в конец массива
Дан двумерный массив. В каждой строке все его элементы, не равные нулю,...

Перенести нулевые элементы в конец массива (исправить ошибку)
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались...

Как перенести нулевые элементы массива на парные позиции?
Пользователь вводит массив. Надо отсортировать массив так, дабы все нули в...

6
Banonanelly
89 / 21 / 35
Регистрация: 29.06.2016
Сообщений: 96
29.06.2016, 08:13 #2
А почему нумерацию с 1 начинаете?
C++
1
for (i = 0; i < k; i++)
Добавлено через 12 минут
И вообще, вот правильный алгоритм
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int i1=0, i2=n-1;
 
while (i1<i2)
{
    while (i1 < i2 && !a[i1])
         i1++;
    while (i2 > i1 && a[i2])
        i2--;
    if (i1 < i2)
    {
        int tmp=a[i1];
        a[i1]=a[i2];
        a[i2]=tmp;
    }
    i1++;
    i2--;
}
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
29.06.2016, 08:35 #3
Banonanelly, Ваш алгоритм нарушит порядок расположения ненулевых элементов (их сортировать не надо).
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
#include <iostream>
using namespace std;
 
void assort(int* M, int k)
{
    int* t=new int[k];
    int j=0;
    for (int i=0; i<k; i++)
        if (M[i]==0)
            t[j++]=0;
    for (int i=0; i<k; i++)
        if (M[i]!=0)
            t[j++]=M[i];
    for (int i=0; i<k; i++)
        M[i]=t[i];
    delete[] t;
}
int main()
{
    int x[5]={1,0,99,0,15};
    assort(x,5);
    cout << "rezult array: ";
    for (int i=0; i<5; i++)
        cout << x[i] << " ";
    system("pause");
    return 0;
}
1
Komo4ek
0 / 0 / 1
Регистрация: 08.05.2016
Сообщений: 16
30.06.2016, 05:45  [ТС] #4
Цитата Сообщение от zss Посмотреть сообщение
C++
Ваш алгоритм работает, но в моей программе (когда я его перенес и адаптировал) он выдаёт следующее (см. скрин 1). Причем это 1049 выдает при любом массиве любой размерности вместо последнего 0 или первого числа<>0 в отсортированном массиве в зависимости от того, с чего начинаем. На 2 и 3 скрине должны быть одинаковые результаты, но это не так.
Может, проблема в другой части программы? Вот код всей программы, хотя я ошибок не нашел.
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#include <Windows.h>
#include <iostream.h>
using namespace std;
//---------------------------------------------------------------------------
#include <stdio.h>
 
#pragma argsused
 
// Ввод массива
void input(int M[100], int k)
{
 int i;
 for (i=1; i<=k; i++)
 {
  cout << "Enter " << i <<" element: ";
  cin >> M[i];
 }
 cout << "Entered array: ";
 for (i=1; i<=k; i++)
  cout << M[i] << " ";
}
 
// Минимальный элемент массива
float min_n(int M[100], int k)
{
 int i;
 int minx;
 minx=100000;
 for (i=1;i<=k;i++)
 {
  if (M[i]<minx)
  minx=M[i];
 }
 return minx;
}
 
// Сумма элементов, расположенных между первым и последним положительными элементами
float sum_fl(int M[100], int k, bool &f1)
{
 int i,p,q,d;
 int s;
 p=0;
 s=0;
 for (i=1;i<=k;i++)
 {
  if (M[i]>0)
  {
   p=p+1;
   if (p==1) q=i;
   d=i;
  }
 }
 if (p<2) f1=false;
 else
 {
  f1=true;
  for (i=q+1; i<=d-1; i++)
   s=s+M[i];
 }
 return s;
}
 
// Сортировка массива
void assort(int* M, int k)
{
    int* t=new int[k];
    int j=0;
    for (int i=0; i<k; i++)
        if (M[i]==0)
            t[j++]=0;
    for (int i=0; i<k; i++)
        if (M[i]!=0)
            t[j++]=M[i];
    for (int i=0; i<k; i++)
        M[i]=t[i];
    delete[] t;
 
    /* for (int i=0; i<k; i++)
     if (M[i]==1049)
      M[i]=0; */
      
    cout << "rezult array: ";
    for (int i=0; i<k; i++)
        cout << M[i] << " ";
}
 
// Основная программа
int main()
{
 /* SetConsoleCP(1251);
 SetConsoleOutputCP(1251); */
 int A[100];
 int n;
 bool f;
 do
 {
  cout << "Razmer massiva (n>0): ";
  cin >> n;
 }
 while (n<=0);
 input(A,n);
 cout << "\n";
 cout << "Minimalnii element: ";
 cout << min_n(A,n);
 cout << "\n";
 cout << "Summa mejdu poloj. elementami: ";
 sum_fl(A,n,f);
 if (f==false)
 {
 cout << "--- \n";
 cout << "(V massive menshe 2 polojitel'nih elementov)";
 }
 else cout << sum_fl(A,n,f);
 cout << "\n";
 assort(A,n);
  cout << "\n";
 system("pause");
 return 0;
 
}
0
Миниатюры
Перенести нулевые элементы в начало массива   Перенести нулевые элементы в начало массива   Перенести нулевые элементы в начало массива  

zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
30.06.2016, 06:41 #5
Цитата Сообщение от Komo4ek Посмотреть сообщение
for (i=1; i<=k; i++)
Индексы в массиве начинаются с нуля и заканчиваются k-1 - м элементом
C++
1
for (i=0; i<=k-1; i++)
1
Komo4ek
0 / 0 / 1
Регистрация: 08.05.2016
Сообщений: 16
30.06.2016, 07:01  [ТС] #6
Цитата Сообщение от zss Посмотреть сообщение
Индексы в массиве начинаются с нуля и заканчиваются k-1 - м элементом
Заработало, спасибо, но почему это так важно? Почему от такой мелочи зависит так много?
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
30.06.2016, 07:06 #7
Это не мелочь.
Нулевой элемент остается неинициализированным,
а обращаясь к k-ому элементу Вы выходите за границы массива с непредсказуемыми последствиями.
0
30.06.2016, 07:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2016, 07:06
Привет! Вот еще темы с решениями:

Положительные элементы перенести в начало массива
Дан линейный массив из n элементов. Получить новый массив, разместив сначала...

Неотрицательные элементы массива перенести в начало
С одномерным массивом, состоящим из n целочисленных элементов, произвести...

Положительные элементы массива перенести в начало
Задан линейный массив, состоящий из n элементов. Расставить в нём в том же...

Положительные элементы массива перенести в начало
В одномерном массиве, состоящем из n вещественных элементов, вычислить: 3....


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

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

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