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

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

29.06.2016, 07:53. Показов 6605. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2016, 07:53
Ответы с готовыми решениями:

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

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

Переместить нулевые элементы в начало массива
#include &lt;iostream&gt; #include&lt;time.h&gt; #include&lt;random&gt; using namespace std; int main() { int min, array,sum=0,f,s,q=0; ...

6
 Аватар для Banonanelly
91 / 22 / 35
Регистрация: 29.06.2016
Сообщений: 96
29.06.2016, 08:13
А почему нумерацию с 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
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
29.06.2016, 08:35
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
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 19
30.06.2016, 05:45  [ТС]
Цитата Сообщение от 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
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
30.06.2016, 06:41
Цитата Сообщение от Komo4ek Посмотреть сообщение
for (i=1; i<=k; i++)
Индексы в массиве начинаются с нуля и заканчиваются k-1 - м элементом
C++
1
for (i=0; i<=k-1; i++)
1
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 19
30.06.2016, 07:01  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Индексы в массиве начинаются с нуля и заканчиваются k-1 - м элементом
Заработало, спасибо, но почему это так важно? Почему от такой мелочи зависит так много?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
30.06.2016, 07:06
Это не мелочь.
Нулевой элемент остается неинициализированным,
а обращаясь к k-ому элементу Вы выходите за границы массива с непредсказуемыми последствиями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.06.2016, 07:06
Помогаю со студенческими работами здесь

Нулевые элементы переместить в начало массива
В одномерном массиве все нулевые элементы переместить в начало массива, порядок остальных элементов должен оставаться первоначальным. ...

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

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

Перенести нулевые элементы в конец массива (исправить ошибку)
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных. #include &lt;clocale&gt;...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru