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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
viny-puh
Сообщений: n/a
06.03.2010, 15:09     Сжать массив #1
Помогите пожалуйста!
Задача: Сжать массив, удалив из него элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Norby
 Аватар для Norby
64 / 64 / 2
Регистрация: 12.03.2008
Сообщений: 392
06.03.2010, 16:41     Сжать массив #2
Что конкретно не получается? Задача-то элементарная.
Spoofi
 Аватар для Spoofi
8 / 8 / 1
Регистрация: 25.12.2009
Сообщений: 18
06.03.2010, 19:15     Сжать массив #3
Скорее всего проблема в сжатии массива... Дам подсказку - по условию задачи не сказано, что нельзя использовать дополнительный массив, значит создайте такойже по размеру массив, заполните его нулями.

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

Добавлено через 3 минуты
Единственное замечание, это то что не совсем ясно из условия, если в исходном массиве содержатся элементы равные нулю, их надо считать элементами массива( модуль нуля тоже не превосходит единицу ), и оставить на местах, или же их тоже нужно "сжать"?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
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;
}
Без второго массива
Amarted
 Аватар для 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 по модулю!
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
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 заменить, и все будет тоже самое )
Amarted
 Аватар для 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] получается...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
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] был проверен в цикле ранее оставлен или нет - решает условие... условие здесь главное
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2010, 21:24     Сжать массив
Еще ссылки по теме:

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

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

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

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