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

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

Восстановить пароль Регистрация
 
NightCrack
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 7
11.06.2014, 00:41     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым #1
Задачка такая:
Разработать программу, обеспечивающую ввод с клавиатуры целых чисел и сохранение их в одномерном массиве. Ввод осуществляется до тех пор, пока не будет введено значение 0.
После этого необходимо "сжать" массив, выбросив из него отрицательные элементы.
Исходный массив и результат его преобразования вывести на экран монитора.

Есть решение схожей задачи, написанное в Visual Studio (собственно, на это решение я и ориентировался в своём случае):
текст схожей программы
Кликните здесь для просмотра всего текста
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
 
using namespace std;
 
/// Òî÷êГ* âõîäГ* Гў ïðîãðГ*ììó (ГЈГ«Г*ГўГ*Г*Гї ГґГіГ*êöèÿ)
int main() {
    cout << "KR 04" << endl;
    // ÄèГ*Г*ì÷åñêèå Г¬Г*Г±Г±ГЁГўГ» (îñГ*îâГ*îé ГЁ âñïîìîãГ*òåëüГ*ûé)
    int *v = nullptr, *tmp = nullptr;
    // Г’ГҐГЄГіГ№Г*Гї äëèГ*Г* Г¬Г*Г±Г±ГЁГўГ*
    int size = 0;
    // Ââåä¸Г*Г*îå Г§Г*Г*Г·ГҐГ*ГЁГҐ
    int x;
    // ГЋГЎГ°Г*ГЎГ*òûâГ*ГҐГ¬ ââîäèìûå Г·ГЁГ±Г«Г* äî ïåðâîãî îòðèöГ*òåëüГ*îãî
    do {
        cout << "Vvedite chislo: ";
        // Ââîäèì ÷èñëî
        cin >> x;
        // Åñëè ââåëè ïîëîæèòåëüГ*îå ÷èñëî...
        if (x > 0) {
            // ÑîçäГ*ВёГ¬ Г*îâûé Г¬Г*Г±Г±ГЁГў size + 1
            tmp = new int[++size];
            if (v != nullptr) {
                // Êîïèðóåì ñîäåðæèìîå Г±ГІГ*ðîãî Г¬Г*Г±Г±ГЁГўГ*
                memcpy(tmp, v, (size - 1) * sizeof(v[0]));
                // ÎñâîáîæäГ*ГҐГ¬ Г±ГІГ*ðûé Г¬Г*Г±Г±ГЁГў
                delete [] v;
            }
            v = tmp;
            // ÑîõðГ*Г*ГїГҐГ¬ ââåä¸Г*Г*îå Г§Г*Г*Г·ГҐГ*ГЁГҐ Гў Г¬Г*Г±Г±ГЁГўГҐ
            v[size - 1] = x;
        } else {
            cout << "Chislo ne polozhitelnoe!" << endl;
        }
    } while (x >= 0);
    // Âûâîäèì ðåçóëüòГ*ГІ
    cout << endl << "Resultat:" << endl;
    if (size > 0) {
        int idx = 0;
        for (int i = 0; i < size; i++) {
            cout << i << ": " << v[i] << endl;
            if (v[i] > v[idx]) {
                idx = i;
            }
        }
        cout << endl << "Maksimalnoe:" << endl;
        cout << idx << ": " << v[idx] << endl;
    } else {
        cout << "Net polozhitelnih chisel!" << endl;
    }
    // Г§Г*âåðøГ*ГҐГ¬ Г°Г*áîòó ïðîãðГ*ììû
    return 0;
}

Мне же нужно написать программу в BC++ 4.5, а он не понимает вот это выражение: "nullptr".

В итоге у меня получилось вот что:
Кликните здесь для просмотра всего текста
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.h>
 
int *v, *tmp, size=0,x;
 
int main()
{
 cout<<"\n Ââåäèòå Г·ГЁГ±Г«Г*:";
 do
 {
  cin>>x;
  if (x!=0)
  {
    tmp=new int [++size];
    if (v!=0)
    {
     memcpy(tmp,v,(size - 1) * sizeof(v[0]));
     delete [] v;
    }
    v=tmp;
    v[size-1]=x;
  }
 }
 while (x!=0);
 cout<<v;
 return 0;
}

В 14 строке не знаю что подставить вместо нуля.
Подскажите как объявить (ну или просто сделать) пустой массив.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2014, 00:41     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым
Посмотрите здесь:

C++ Сжать массив, выбросив из него каждый второй элемент
Сжать массив, выбросив из него каждый второй элемент.... C++
C++ Сжать массив, выбросив из него каждый второй элемент
C++ Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не превышает 1
C++ Массивы. Задан массив,содержащий несколько нулевых элементов. Сжать его выбросив эти элементы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 07:04     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым #2
Цитата Сообщение от NightCrack Посмотреть сообщение
В 14 строке не знаю что подставить вместо нуля.
Подскажите как объявить (ну или просто сделать) пустой массив.
нормально там все написано, nullptr это и есть нулевой указатель.

C
1
int *v, *tmp
Переменные надо инициализировать

C
1
int *v=0, *tmp=0
Deiron
25 / 25 / 1
Регистрация: 25.05.2009
Сообщений: 98
11.06.2014, 09:37     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым #3
эммм, а разве это хорошо, указателям, без выделения памяти, присваивать значение? Я понимаю, что здесь имеется ввиду "пустой указатель", когда присваивается *v=0. Но ведь тут поведение не предсказуемо. Чисто формально компилятор может подумать, что "0" это обычный int, и указатель тогда будет изначально ссылаться не на 0x0, а на то место в памяти, где в тот момент времени лежал этот самый нолик.

Вместо nullptr пользуйтесь словом
C++
1
null
(это и есть указатель на 0x0 адрес памяти или "пустой указатель").

Т.е ваш код
C++
1
int *v = nullptr, *tmp = nullptr;
должен выглядеть как
C++
1
int *v = null, *tmp = null;
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 09:42     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым #4
указатель - целочисленная переменная, содержащая некий адрес памяти, инициализироваться должна как любая другая переменная. Разыменовываться да, должна после присвоения ей какого-нибудь адреса.

C
1
*v=0
- плохо, если указатель не содержит валидного адреса.

C
1
int *v=0
хорошо.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
11.06.2014, 09:45     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым #5
Цитата Сообщение от Deiron Посмотреть сообщение
Вместо nullptr пользуйтесь словом
вот nullptr ввели чтобы не использовать NULL и облегчить жизнь. Видать зря старались, стоит ТС обновить компилятор и всё встанет на свои места.
Deiron
25 / 25 / 1
Регистрация: 25.05.2009
Сообщений: 98
11.06.2014, 09:47     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым #6
ап: в 14 строке надо, соответсвенно:
C++
1
if (v != null)
формально, можно и просто
C++
1
if (v)
Но это уже будет "плохой код", хотя работать будет (почему - думаю, знаете)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2014, 11:19     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
NightCrack
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 7
11.06.2014, 11:19  [ТС]     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым #7
Спасиб ребята) ...тут разве что NULL большим регистром писать надо было, а так - очень выручили).

Интересно, а тему мою модеры так переименовали?
Yandex
Объявления
11.06.2014, 11:19     Сжать массив, выбросив из него отрицательные элементы - массив становится пустым
Ответ Создать тему
Опции темы

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