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

Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.96
илья1995
3 / 3 / 1
Регистрация: 17.10.2011
Сообщений: 169
11.01.2013, 22:05     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #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
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    const int n = 10;
    double arr[n], max;
 
    cout << "Введите " << n << " чисел:" << endl;
    for (int i=0; i<n; i++)
        cin >> arr[i];
    
    max = arr[0];
    for (int i=1; i<n; i++)
        if (abs(arr[i]) > abs(max))
            max = arr[i];
 
 
    cout << "Максимальный по модулю равен " << max << endl;
 
    system("pause");
    return 0;               
}
программа ищит максимальный по модулю элемент. как в нее добавить еще чтоб она могла :Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
в общем задача звучит так:В одномерном массиве, состоящем из n вещественных элементов, вычислить максималь-ный по модулю элемент массива. Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 22:05     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
Посмотрите здесь:

Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных C++
C++ Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
Преобразовать массив таким образом, чтобы элементы, равные нулю располагались после остальных. C++
C++ Преобразовать массив таким образом чтобы сначала располагались все элементы равные нулю а потом остальные
C++ Преобразовать массив таким образом, чтобы сначала располагались четные, а потом нечетные элементы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 22:25     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #2
С 0 можно делать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
 
int main() 
{ 
    const int size = 10; 
    int array[size] = { 1, 2, 3, 0, 4, 0, 5, 6, 7, 8 }; 
    int i, j; 
 
    for ( i = 0; i < size; ++i) 
        if(array[i] == 0) 
        { 
            for ( j = i; j < size - 1; ++j) 
                array[j] = array[j+1]; 
            array[size - 1] = 0; 
        } 
 
        for ( i = 0; i < size; ++i) 
            std::cout << array[i] << " "; 
        std::cout << std::endl;
}
илья1995
3 / 3 / 1
Регистрация: 17.10.2011
Сообщений: 169
11.01.2013, 22:33  [ТС]     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #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
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    const int n = 10;
    double arr[n], max;
 
    cout << "Введите " << n << " чисел:" << endl;
    for (int i=0; i<n; i++)
        cin >> arr[i];
    
    max = arr[0];
    for (int i=1; i<n; i++)
        if (abs(arr[i]) > abs(max))
            max = arr[i];
 
 
    cout << "Максимальный по модулю равен " << max << endl;
    int i, j; 
 
    for ( i = 0; i < n; ++i) 
        if(arr[i] == 0) 
        { 
            for ( j = i; j < n - 1; ++j) 
                arr[j] = arr[j+1]; 
            arr[n - 1] = 0; 
        } 
 
        for ( i = 0; i < n; ++i) 
           cout << arr[i] << " "; 
        cout << endl;
    system("pause");
    return 0;               
}
Добавлено через 2 минуты
не могли бы вы пояснить как работает ваш цикл по поиск 0 и установки его в конец массива
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 22:36     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #4
Мог бы всё просто. Проходим циклом по массиву, если встречаем 0, начинаем второй цикл с этого элемента и каждому элементу массива, начинаем с того где был, 0 присваиваем впереди стоящий, а последнему элементу присваиваем 0.

Добавлено через 36 секунд
Сейчас внесу поправку относительно, того если нулевые элементы стоят рядом.
илья1995
3 / 3 / 1
Регистрация: 17.10.2011
Сообщений: 169
11.01.2013, 22:40  [ТС]     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #5
Цитата Сообщение от David Sylva Посмотреть сообщение
Мог бы всё просто. Проходим циклом по массиву, если встречаем 0, начинаем второй цикл с этого элемента и каждому элементу массива, начинаем с того где был, 0 присваиваем впереди стоящий, а последнему элементу присваиваем 0.

Добавлено через 36 секунд
Сейчас внесу поправку относительно, того если нулевые элементы стоят рядом.
ясно спасибо
lopata
5 / 5 / 0
Регистрация: 09.12.2009
Сообщений: 42
11.01.2013, 22:42     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #6
C++
1
2
3
4
5
6
7
8
int index;
    for (int i=0; i<n; i++)
        if (arr[i]==0)
        {
            for(index =i; index < n-1; index++)
                arr[index]= arr[index+1];
            arr[n-1]= 0;
        }
илья1995
3 / 3 / 1
Регистрация: 17.10.2011
Сообщений: 169
11.01.2013, 22:48  [ТС]     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #7
Цитата Сообщение от lopata Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int index;
    for (int i=0; i<n; i++)
        if (arr[i]==0)
        {
            for(index =i; index < n-1; index++)
                arr[index]= arr[index+1];
            arr[n-1]= 0;
        }
цикл помойму точно такой же как и у David Sylva
tlittle
347 / 118 / 1
Регистрация: 08.01.2013
Сообщений: 726
11.01.2013, 22:59     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #8
Цитата Сообщение от David Sylva Посмотреть сообщение
С 0 можно делать так
Не против, если я вмешаюсь?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    const int size = 10; 
 
    int array[size] = { 1, 2, 3, 0, 4, 0, 5, 6, 7, 8 }; 
    int i; 
 
    int zerocount=0;
 
    for ( i = 0; i < size-zerocount; ++i) 
    {
        if(array[i] != 0) 
        { 
            array[i-zerocount]=array[i];
        } else {
            zerocount++;
        }
    }
    for ( i = size-zerocount; i < size; ++i) array[i]=0;
Единственный вопрос, первый цикл нормально отработает в такой конструкцией в цикле?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 23:13     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #9
С повторяющимися 0, надо делать так
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
#include <iostream> 
 
int main() 
{ 
    const int size = 10; 
    int array[size] = { 0, 0, 0, 0, 0, 3, 4, 6, 7, 8 }; 
    int i, j; 
    int s = size;
 
    
    for ( i = 0; i < s; ++i) 
        if(array[i] == 0) 
        { 
            for ( j = i; j < size - 1; ++j)  
                array[j] = array[j+1];   
            array[size-1] = 0;  
            i--; 
            s--;
        }
            
        
        std::cout << std::endl;
        for ( i = 0; i < size; ++i) 
            std::cout << array[i] << " "; 
        std::cout << std::endl;
}
Добавлено через 3 минуты
tlittle с нулями стоящими рядом отработает неправильно.

Добавлено через 1 минуту
tlittle вы слишком усложнили эту задачу.
tlittle
347 / 118 / 1
Регистрация: 08.01.2013
Сообщений: 726
11.01.2013, 23:17     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #10
Цитата Сообщение от David Sylva Посмотреть сообщение
Добавлено через 3 минуты
tlittle с нулями стоящими рядом отработает неправильно.
С фига ли?

Добавлено через 1 минуту
tlittle вы слишком усложнили эту задачу.
1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0

Сколько итераций цикла сделает Ваш алгоритм? Сколько мой? А теперь представим, что в этом массиве 1000 значений?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 23:23     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #11
tlittle
Вот так попробуй
C++
1
int array[size] = { 0, 0, 0, 0, 0, 0, 5, 6, 7, 8 };
нормально отработает?
илья1995
3 / 3 / 1
Регистрация: 17.10.2011
Сообщений: 169
11.01.2013, 23:24  [ТС]     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #12
а как оформить мою задачу каждый пункт в виде функции. Все необходимые данные для функций должны передаваться им в качестве параметров Использование глобальных переменных в функциях не допускается.
David Sylva
11.01.2013, 23:25
  #13

Не по теме:

Цитата Сообщение от David Sylva Посмотреть сообщение
tlittle
Если вставляешь код, вставляй полностью вместе с заголовками, неудобно проверять.

ZubSam
12 / 12 / 1
Регистрация: 24.03.2012
Сообщений: 238
11.01.2013, 23:28     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #14
Цитата Сообщение от David Sylva Посмотреть сообщение
а последнему элементу присваиваем 0.
а что происходит в этот момент с этим последним элементом , он ведь хранит в себе значение "8" ?
tlittle
347 / 118 / 1
Регистрация: 08.01.2013
Сообщений: 726
11.01.2013, 23:31     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #15
Цитата Сообщение от David Sylva Посмотреть сообщение
tlittle
Вот так попробуй
C++
1
int array[size] = { 0, 0, 0, 0, 0, 0, 5, 6, 7, 8 };
нормально отработает?
Нет, не отработает. Надо убрать из "for ( i = 0; i < size-zerocount; ++i)" конструкцию -zerocount" (попробовать не могу, не программирую в c++ ) Тогда:

первая проход цикла - счетчик нулей равен 1
второй проход цикла - счетчик нулей равен 2
...
шестой проход цикла - счетчик нулей равен 6
седьмой проход цикла - сместили пятерку на 6 позиций влево (т.е., на позицию 0)
...
десятый проход цикла - сместили восьмерку на 6 позиций влево (т.е., на позицию 4)

Дальше остаток массива заполняется нулями.

Добавлено через 1 минуту
Цитата Сообщение от ZubSam Посмотреть сообщение
а что происходит в этот момент с этим последним элементом , он ведь хранит в себе значение "8" ?
Он уже не хранит (не должен хранить) в себе значение 8, значение 8 хранит в себе элемент [-1]
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 23:33     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #16
ZubSam мы его передвинули на позицию вперёд.

Добавлено через 48 секунд
илья1995 не много подождите, сейчас мы закончим с tlittle обсуждение.

Добавлено через 26 секунд
tlittle сейчас проверю по скорости, как работают алгоритмы.
ZubSam
12 / 12 / 1
Регистрация: 24.03.2012
Сообщений: 238
11.01.2013, 23:33     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #17
Цитата Сообщение от David Sylva Посмотреть сообщение
мы его передвинули на позицию вперёд.
то есть он автоматический сдвигается на одну позицию вперед?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 23:35     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #18
Цитата Сообщение от ZubSam Посмотреть сообщение
то есть он автоматический сдвигается на одну позицию вперед?
Мы его подвинули в цикле.
tlittle
347 / 118 / 1
Регистрация: 08.01.2013
Сообщений: 726
11.01.2013, 23:36     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #19
Цитата Сообщение от David Sylva Посмотреть сообщение
ZubSam мы его передвинули на позицию вперёд.

Добавлено через 48 секунд
илья1995 не много подождите, сейчас мы закончим с tlittle обсуждение.

Добавлено через 26 секунд
tlittle сейчас проверю по скорости, как работают алгоритмы.
Да а что тут проверять. Создай массив на 1000 элементов. Нечетные элементы = 0. Четные равны 1. Твой алгоритм выполнит 500000 присвоений. Мой 1500

ЗЫ. А не. Мой 1000. Сколько твой чо-то боюсь ошибиться, но порядок такой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 23:41     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
Еще ссылки по теме:

C++ Превратить массив таким образом, чтобы все элементы, равные нулю и единице, располагались после всех остальных
C++ Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1
Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1 C++

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

Или воспользуйтесь поиском по форуму:
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 23:41     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #20
Цитата Сообщение от tlittle Посмотреть сообщение
Да а что тут проверять. Создай массив на 1000 элементов. Нечетные элементы = 0. Четные равны 1. Твой алгоритм выполнит 500000 присвоений. Мой 1500
ЗЫ. А не. Мой 1000. Сколько твой чо-то боюсь ошибиться, но порядок такой.

Не по теме:

Да ты прав, я просто твой код, толком не посмотрел.
Был не прав, извиняюсь.

Yandex
Объявления
11.01.2013, 23:41     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
Ответ Создать тему
Опции темы

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