Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
NightCrack
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 7
#1

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

11.06.2014, 00:41. Просмотров 678. Ответов 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
Ответы с готовыми решениями:

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

Сжать массив, выбросив из него каждый второй элемент....
написать программу чтоб было такое решение. В начале выдаёт от к примеру от...

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

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

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

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

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

C
1
int *v=0
хорошо.
1
Croessmah
++Ͻ
14365 / 8147 / 1533
Регистрация: 27.09.2012
Сообщений: 20,082
Записей в блоге: 3
Завершенные тесты: 1
11.06.2014, 09:45 #5
Цитата Сообщение от Deiron Посмотреть сообщение
Вместо nullptr пользуйтесь словом
вот nullptr ввели чтобы не использовать NULL и облегчить жизнь. Видать зря старались, стоит ТС обновить компилятор и всё встанет на свои места.
0
Deiron
26 / 26 / 9
Регистрация: 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
Помогите пожалуйста написать программу: Дан целочисленный массив размера N....

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

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


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

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

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