Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
andreip
0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 12
1

Алгоритм (псевдокод) одномерного динамического массива

10.07.2010, 16:30. Просмотров 3976. Ответов 12
Метки нет (Все метки)

Суть проблемы такова:
Задан массив – А(10). Получить из него массив В, состоящий из элементов массива А, которые меньше 0.
Массивы создаются с использованием операций NEW и DELETE. Ввод исходных данных: реальный размер массивов и их значения. Обращение к элементам массива – через косвенную адресацию.

(да и ведь динамические масивы нельзя при создании инициализировать - тут тоже много непонтяного(( )

Перерыл кучу ссылок, книгу Павлоской, но более-менее работоспосбных идей так и не появилось(
Код хочу написать сам, знать бы только алгоритм)
Помогите пожалуйста)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2010, 16:30
Ответы с готовыми решениями:

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

Из динамического одномерного массива в статический
Здравствуйте! Я хотел бы попросить вас показать на данном примере, как...

Объявление динамического одномерного массива.
БИЛЕТ №14 3. Составьте программу, в которой объявляется динамический...

Сортировка динамического одномерного массива
void Sort(int *l, int n) { for (*(l + 1) = 0; *(l + 1)<n - 1; *(l + 1)++)...

Удаление динамического одномерного массива
Я в шоке оказывается надо еще удалять массив из памяти когда его создаешь....

12
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.07.2010, 16:49 2
Создаешь два массива. int*A, int*B; Вводишь кол-во элем в первом массиве. Вводишь кол-во элем во втором массиве. Пишешь A=new int[кол-во элем в первом]. B=new int[кол-во элем во втором].
А затем цикл. От 0 до кол-во элем в первом введите значение элем массива. Потом от 0 до кол-во элем во втором введите значение элем массива.
Косвенная адрессация это ->

Хотя. Можно только A. Потом заполняешь массив. Если i-ый элемент массива меньше 0, счетчик++. Потом B=new int[счетчик]. Затем цикл от 0 до кол-во элем в первом массиве. если a[i]<0 то b[i]=a[i]. Ну и далее... Вроде так
1
andreip
0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 12
10.07.2010, 16:55  [ТС] 3
Цитата Сообщение от Lavroff Посмотреть сообщение
Создаешь два массива. int*A, int*B; Вводишь кол-во элем в первом массиве. Вводишь кол-во элем во втором массиве. Пишешь A=new int[кол-во элем в первом]. B=new int[кол-во элем во втором].
А затем цикл. От 0 до кол-во элем в первом введите значение элем массива. Потом от 0 до кол-во элем во втором введите значение элем массива.
Косвенная адрессация это ->

Хотя. Можно только A. Потом заполняешь массив. Если i-ый элемент массива больше 0, счетчик++. Потом B=new int[счетчик]. Ну и далее... Вроде так
Ещё вопрос ... каким образом в таких случаях массив заполняется? (второй вариант)
0
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
10.07.2010, 17:01 4
andreip, я себе вижу эту задачу так:
1. Вывод на экран запроса на ввод размера массива (можно не делать, т.к. у вас даже явно задано значение). Запись значения в переменную size
2. Выделение памяти для массива А, используя переменную size в качестве размера массива.
3. Вывод на экран запроса на ввод элементов массива (не более, size штук).
4. Запись значений в массив А.
5. Обнуление переменной size.
6. Проход по значениям массива А: если элемент меньше нуля - инкрементируем переменную size.
7. Выделение памяти для массива B, используя переменную size в качестве размера массива.
8. Проход по значениям массива A с переносом положительных в массив B.
9. Печать массива B
1
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
10.07.2010, 17:05 5
Цитата Сообщение от andreip Посмотреть сообщение
Задан массив – А(10).
Размер массива А известен - 10 элементов. Значит, динамически выделять ему память не нужно, объявляешь так:
C++
1
2
const int size=10;
int A[size];
В цикле проходишь по всему массиву А и считаешь число элементов, удовлетворяющих условию.
Потом выделяешь память операцией new для массива В с числом элементов, которое ты подсчитал на предыдущем этапе.
Цитата Сообщение от andreip Посмотреть сообщение
через косвенную адресацию
- пример:
C++
1
2
for(int i=0; i<size; ++i)
    *(B+i)=*(A+i)
В конце не забудь освободить память, выделенную для массива В, операцией delete[].
1
andreip
0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 12
10.07.2010, 17:08  [ТС] 6
Всем спасибо!
Идей предостаточно, буду писать)
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.07.2010, 17:14 7
Что-то мозг от жары совсем не варит... Попытался написать по своему же псевдокоду. Вот что вышло:

Что тут не так?
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
#include <iostream>
int main()
{
    int*A;
    int*B;
    int sizeA, count=0;
    std::cout<<"Enter size of A\n";
    std::cin>>sizeA;
    A=new int[sizeA];
    for(int i=0;i<sizeA;i++)
    {
        std::cout<<"Enter "<< i <<" ii element of array\n";
        std::cin>>A[i];
        if(A[i]<0)
            count++;
    }
    B=new int[count];
    for(int i=0;i<sizeA;i++)
    {
        if(A[i]<0)
            B[i]=A[i];
    }
    for(int i=0;i<count;i++)
        std::cout<<"Massiv: "<< B[i] <<' ';
    std::cout<<"\n";
    delete[] A;
    delete[] B;
    return 0;
}
0
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
10.07.2010, 17:16 8
Цитата Сообщение от Lavroff Посмотреть сообщение
C++
1
B[i]=A[i];
ошибка в этой строчке (Массив B может быть меньше, чем исходный)
0
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
10.07.2010, 17:18 9
Что тут не так?
C++
1
2
3
4
5
for(int i=0, j=0;i<sizeA;i++)
{
        if(A[i]<0)
             B[j++]=A[i];
}
1
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.07.2010, 17:20 10
MikeSoft, Да. И как тогда быть? А то я что-то ноль сейчас совсем(

Добавлено через 52 секунды
Nameless One, Спасибо.)
0
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
10.07.2010, 17:22 11
Цитата Сообщение от Lavroff Посмотреть сообщение
MikeSoft, Да. И как тогда быть? А то я что-то ноль сейчас совсем(
Использовать дополнительную переменную-индекс.
1
easybudda
Модератор
Эксперт CЭксперт С++
10146 / 6053 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
10.07.2010, 17:24 12
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
#include <iostream>
 
int main(){
    const int SIZE = 10;
    int * arr, * negatives, neg_count;
    
    arr = new int [ SIZE ];
    neg_count = 0;
    for ( int i = 0; i < SIZE; ++i ){
        std::cout << "ARRAY[" << i << "] = ";
        std::cin >> arr[i];
        if ( arr[i] < 0 )
            ++neg_count;
    }
    
    if ( ! neg_count ) {
        std::cerr << "No negative elements!" << std::endl;
        delete [] arr;
        return 1;
    }
    
    negatives = new int [ neg_count ];
    int * pNeg = negatives;
    for ( int i = 0; i < SIZE; ++i )
        if ( arr[i] < 0 )
            *pNeg++ = arr[i];
    
    std::cout << "Negative elements:" << std::endl;
    for ( int i = 0; i < neg_count; ++i )
        std::cout << negatives[i] << " ";
    std::cout << std::endl;
    
    delete [] arr;
    delete [] negatives;
    
    return 0;
}
1
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
10.07.2010, 17:29 13
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
//---------------------------------------------------------------------------
#include <iostream.h>
//---------------------------------------------------------------------------
int main()
{
  int size = 0, count = 0, j = 0;
  cout << "Enter array size: ";
  cin >> size;
  int *A = new int[size];
 
  for (int i = 0; i < size; i++) {
    cout << "Enter elementh (" << i << "/" << size << "): ";
    cin >> A[i];
    if (A[i] < 0) count++;
  }
 
  int *B = new int[count];
  for (int i = 0; i < size; i++) {
    if (A[i] < 0) {
      B[j++] = A[i];
    }
  }
 
  for (int i = 0; i < count; i++) {
    cout << B[i] << " ";
  }
 
  delete []A;
  delete []B;
 
  return 0;
}
//---------------------------------------------------------------------------
0
10.07.2010, 17:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2010, 17:29

Обработка одномерного динамического массива
создать одномерный динамический массив произвольного размера.Заполнить его...

Передача и изменение одномерного динамического массива
Помогите пожалуйста разобраться с проблемой, передаю в функцию динамический...

Список на основе одномерного динамического массива
Добрый вечер! Кто может привести в пример структуру такого списка? (на...


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

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

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