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

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

Войти
Регистрация
Восстановить пароль
 
NightCrack
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 7
#1

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

11.06.2014, 00:41. Просмотров 572. Ответов 6
Метки нет (Все метки)

Задачка такая:
Разработать программу, обеспечивающую ввод с клавиатуры целых чисел и сохранение их в одномерном массиве. Ввод осуществляется до тех пор, пока не будет введено значение 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 строке не знаю что подставить вместо нуля.
Подскажите как объявить (ну или просто сделать) пустой массив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2014, 00:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сжать массив, выбросив из него отрицательные элементы - массив становится пустым (C++):

Сжать массив, выбросив из него каждый второй элемент.... - C++
написать программу чтоб было такое решение. В начале выдаёт от к примеру от 1 до 10 char a={1,2,3,4,5,6,7,8,9,10}; чтоб потом выдал...

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

Сжать массив, выбросив из него каждый второй элемент - C++
Дан целочисленный массив с количеством элементов n. Сжать массив, выбросив из него каждый второй элемент.

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

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

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

6
uglyPinokkio
326 / 229 / 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
1
Deiron
26 / 26 / 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;
1
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
11.06.2014, 09:42 #4
указатель - целочисленная переменная, содержащая некий адрес памяти, инициализироваться должна как любая другая переменная. Разыменовываться да, должна после присвоения ей какого-нибудь адреса.

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

C
1
int *v=0
хорошо.
1
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,879
Записей в блоге: 3
Завершенные тесты: 1
11.06.2014, 09:45 #5
Цитата Сообщение от Deiron Посмотреть сообщение
Вместо nullptr пользуйтесь словом
вот nullptr ввели чтобы не использовать NULL и облегчить жизнь. Видать зря старались, стоит ТС обновить компилятор и всё встанет на свои места.
0
Deiron
26 / 26 / 1
Регистрация: 25.05.2009
Сообщений: 98
11.06.2014, 09:47 #6
ап: в 14 строке надо, соответсвенно:
C++
1
if (v != null)
формально, можно и просто
C++
1
if (v)
Но это уже будет "плохой код", хотя работать будет (почему - думаю, знаете)
1
NightCrack
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 7
11.06.2014, 11:19  [ТС] #7
Спасиб ребята) ...тут разве что NULL большим регистром писать надо было, а так - очень выручили).

Интересно, а тему мою модеры так переименовали?
0
11.06.2014, 11:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2014, 11:19
Привет! Вот еще темы с ответами:

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

Массивы. Задан массив,содержащий несколько нулевых элементов. Сжать его выбросив эти элементы. - C++
Задан массив,содержащий несколько нулевых элементов. Сжать его выбросив эти элементы.

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

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


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

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

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