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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
viny-puh
Сообщений: n/a
#1

Сжать массив - C++

06.03.2010, 15:09. Просмотров 2407. Ответов 9
Метки нет (Все метки)

Помогите пожалуйста!
Задача: Сжать массив, удалив из него элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2010, 15:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сжать массив (C++):

Сжать массив, выбросив из него отрицательные элементы - массив становится пустым - C++
Задачка такая: Разработать программу, обеспечивающую ввод с клавиатуры целых чисел и сохранение их в одномерном массиве. Ввод...

Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не превышает 1 - C++
Помогите пожалуйста написать программу: Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не...

Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не превышает 1 - C++
Помогите пожалуйста написать программу. Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не...

сжать массив - C++
помогите пожалуйста Сжать заданный массив b1, b2,...,bm отбрасыванием нулевых элементов!решить с и спользованием функций

Сжать массив - C++
Задание: сжать массив, удалив из него вс енулевые элементы! Вот мой первый вариант, он работает, но мне он не нравиться #include...

Сжать и отсортировать массив - C++
Дан массив а (n). Переписать в массив b(n) только положительные элементы массива а, деленные на 3 (со сжатием, без пустых элементов...

9
Norby
65 / 65 / 2
Регистрация: 12.03.2008
Сообщений: 392
06.03.2010, 16:41 #2
Что конкретно не получается? Задача-то элементарная.
0
Spoofi
8 / 8 / 1
Регистрация: 25.12.2009
Сообщений: 18
06.03.2010, 19:15 #3
Скорее всего проблема в сжатии массива... Дам подсказку - по условию задачи не сказано, что нельзя использовать дополнительный массив, значит создайте такойже по размеру массив, заполните его нулями.

В 1 массиве предположим, что уже заменены нулями элементы, чей модуль не превышает 1. Тогда через цикл записывайте все не нулевые элементы массива А в массив Б. И все, дальше уже что душе угодно с ними делать можно.
0
Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
06.03.2010, 19:26 #4
Можно обойтись и без использования второго массива, просто переместить в конец массива все элементы кторые по модулю больше 1 а затем присвоить им 0;
А вообще мне кажется что человек просто хочет чтоб ему написали готовый код=);
Я писать не буду может захочет подумать, но если что скажи поможем с кодом.

Добавлено через 3 минуты
Единственное замечание, это то что не совсем ясно из условия, если в исходном массиве содержатся элементы равные нулю, их надо считать элементами массива( модуль нуля тоже не превосходит единицу ), и оставить на местах, или же их тоже нужно "сжать"?
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
06.03.2010, 19:27 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "math.h"
#include <iostream>
int main()
{
    int a[] = { 1, 0, -3, 4, -2, 2, 8, 9};
    std::cout << "Before: " << std::endl;
    for (int i = 0; i < 8; i++)
        std::cout << a[i] << "\t";
    int count = 0;
    for (int i = 0; i < 8; i++)
    {
        if ( abs(a[i]) > 1 ) // оставим те модуль которых превышает единицу
            a[count++] = a[i];
    }
    for (int i = count; i < 8; i++) // оставшееся заполняем нулями
        a[i] = 0;
    std::cout << std::endl << "After: " << std::endl;
    for (int i = 0; i < 8; i++)
        std::cout << a[i] << "\t";
return 0;
}
Без второго массива
0
Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
06.03.2010, 19:50 #6
Немного не так, я думаю что нужно использовать масив элементов с плавающей точной а не целых чисел, поскольку если я не ошибаюсь модуль числа это само число со знаком плюс, если брать массив целых чисел то условию будет соответствовать только ноль( и плюс минус еденица если в условии имеется ввиду включительно единицу );
Но если даже брать целые числа и плюс минус еденицу включительно, то код все равно немного не правильный, в строке
C++
1
2
3
4
5
        for (int i = 0; i < 8; i++)
        {
                if ( abs(a[i]) > 1 ) // оставим те модуль которых превышает единицу
                        a[count++] = a[i];
        }
count=0 изначально тоесть первый элемент "затирается"(даже если он не превышает 1 по модулю) элементом больше 1 по модулю!
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
06.03.2010, 20:18 #7
count=0 изначально тоесть первый элемент "затирается"(даже если он не превышает 1 по модулю) элементом больше 1 по модулю!
Before:
2 0 -3 4 -2 2 8 9
After:
2 -3 4 -2 2 8 9 0
Вроде ничего не затирается...
Модуль это модуль. Программно так:
C++
1
number>=0 ? number : -number
Немного не так, я думаю что нужно использовать масив элементов с плавающей точной а не целых чисел
C++
1
float a[] = { 2, 0, -3, 4, -2, 2, 8, 9};
int на float заменить, и все будет тоже самое )
0
Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
06.03.2010, 20:42 #8
но всё равно, ведь то что по модулю больше одного должно быть в конце массива и равным нулю...
тоесть если брать массив float
Before:
0.2 -0.78 -3.4 4.0 -0,9 2.0
то должно быть
After:
0.2 -0.78 -0.9 0.0 0.0 0.0
Это собственно и получается сжатие и заполнение свободных элементов нолями, как я понимаю... или я не прав?

Добавлено через 6 минут
Цитата Сообщение от insideone Посмотреть сообщение
Вроде ничего не затирается...
давай посмотрим внимательнее
C++
1
2
3
4
5
6
        int count = 0;  // count инициализируется нулём. ок
        for (int i = 0; i < 8; i++)  // условие. ок
        {
                if ( abs(a[i]) > 1 ) // оставим те модуль которых превышает единицу. ок
                        a[count++] = a[i]; // а это ли не запара?
        }
// а это ли не запара?
допустим первый элемент удовлетворяющий условию abs(a[i]) > 1 был в массиве четвёртым тоесть i=3
и что мы имеем?
C++
1
a[1] = a[3] // где теперь a[1]?
ведь если первый элемент подходящий под условию четвертый (i=3) то значит все элементы до него удалятся не должны ( в том числе и a[1]) а у тебя он "затирается" a[3] получается...
1
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
06.03.2010, 21:05 #9
Before:
0.2 -0.78 -3.4 4.0 -0,9 2.0
то должно быть
After:
0.2 -0.78 -0.9 0.0 0.0 0.0
Цитата Сообщение от viny-puh Посмотреть сообщение
удалив из него элементы, модуль которых не превышает единицу
Если я правильно понял это условие то надо оставить те числа которые больше единицы по модулю. Если нет... надо переписать условие и все дела

Цитата Сообщение от Amarted Посмотреть сообщение
a[1] = a[3] // где теперь a[1]?
a[1] был проверен в цикле ранее оставлен или нет - решает условие... условие здесь главное
0
Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
06.03.2010, 21:24 #10
Всё я тебя понял, если учитывать то что ты понял условие "удалив из него элементы, модуль которых не превышает единицу" как то что надо оставить элементы по модулю больше единицы тогда твой код ясен;
Но насколько меня учили в школе НЕ ПРИВЫШАЮШИХ единицу это значит НЕ БОЛЬШЕ единицы и тогда просто надо поменять условие abs(a[i]) > 1 на abs(a[i]) < 1 либо <= 1 если единицу тоже учитывать.
я не много по другому написал, но смысл в общем тот же.
1
06.03.2010, 21:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2010, 21:24
Привет! Вот еще темы с ответами:

Сжать массив, выбросив нулевые элементы - C++
Добрый день, уважаемые мастера, прошу помочь решить две задачи. 1) Составить программу решения задачи на С ++, использовать процедуры...

Найти сумму элементов и сжать массив - C++
Условие в одномерном массиве, состоящем из n-действительных элементов, вычислить: 1) номер минимального по модулю элемента массива; ...

Сжать массив-как это сделать? - C++
Здравствуйте, у меня вот тут задание такое есть,не знаю как сделать. Задача: Сжать массив,удалив из него все элементы,модуль которых...

Сжать массив путём удаления нулей - C++
Нужно написать программу которая сжимает массив путём удаления нулей (если они есть), не используя вспомагательный массив. Буду очень...


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

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

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