Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3

Динамический массив

01.01.2012, 19:57. Показов 796. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание такое:
Должно быть реализовано 2 способа заполнения массива: ручное (элементы массива вводит сам пользователь) и автоматическое (элементы массива генерируются случайным образом в задаваемом пользователем диапазоне) заполнение. Пользователь должен иметь возможность сам выбрать один из этих двух способов заполнения массива. Возможность такого выбора может быть реализована в виде меню.
1. Найти максимальный элемент массива;
2. Найти сумму элементов массива расположенных до последнего положительного элемента;
3. Сжать массив, удалив из него все элементы, модуль которых расположен в интервале [a; b]. Освободившиеся в конце массива элементы заполнить нулями

Скажите, почему у меня неправильно считает 2е и 3е задание? Спасибо!

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
int main()
{
    int i, n, k, p, r, imax;
    cout << "Enter number of elements: "; cin >> n;
    float *a = new float[n];
    cout << "\nIf you want to enter array elements by yourself, press 1\n\nIf you want computer to generate numbers of the array, press 2:\n\n";
    cin >> k;
 
    if (k==1)
    {
    for(int i=0; i<n; i++) 
    {
    cout << "Enter element of the array: ";
    cin >> a[i];
    }
    for (int i=0; i<n; i++)
    {
        cout << a[i] << endl;
    }
    cout << endl << endl;
    }
    
    
    if (k==2)
    {
        cout << "\nEnter the smallest number of interval: ";
        cin >> p;
        cout << "\nEnter the biggest number of interval: ";
        cin >> r;       
        
        srand (time(NULL));
 
        for(int i=0; i<n; i++) 
 
        a[i] = rand()%((r-p)*100)/100.0+p;
        
        for (int i=0; i<n; i++)
        {
        cout << a[i] << endl;
        }
        cout << endl;
    }
 
    for (int i = imax=0; i<n; i++)
    {
        if (a[i] > a[imax]) imax=i;
    }
 
    cout <<"Max element of the array is: " << a[imax] << endl << endl;
 
        int ipos=0;
        for (int i=n-1; i>=0; i--)
        {
            if (a[i]>0) ipos=i;
            break;
        }
        float sum=0;
        for (int i=0; i<ipos; i++)
            sum = sum+a[i];
        cout << "The sum befor the last positive element: "<< sum << endl << endl;
 
        int z, v, j , count;
        cout << "Enter the smallest number of interval for replacing numbers: ";
        cin >> z;
        cout << "Enter the biggest number of interval for replacing numbers: ";
        cin >> v;
        
        count=n;
        for (int i=0; i<count; i++)
        {
            if (fabs(a[i])>= z && fabs(a[i])<=v)            
            {
                a[i]=0;
            for (int j=i; j<count-1; j++)
                a[j]=a[j+1];
            
            count--;
            i--;
            }
        }
        
        for (int i=(n-count); i<n; i++) 
        {
            a[i]=0;
        }
 
        for (int i=0; i<n; i++)
            cout << a[i] << endl;
    
    return 0;
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.01.2012, 19:57
Ответы с готовыми решениями:

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

Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты класса динамический массив, если...

Создать динамический класс Book, содержащей динамический массив Authors
всем привет. может кто-то набросать код для такой вот задачи: Создать динамический класс Book, содержащей динамический массив...

5
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.01.2012, 22:02
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
54
55
56
57
58
59
60
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <iterator>
#include <numeric>
 
int main()
{
    srand(time(nullptr));
    std::vector<int> v(10);
    std::cout << "1 - random, 2 - you" << std::endl;
    int answ;
    std::cin >> answ;
    if(answ == 1)
    {
        int up, down;
        std::cout << "up, down" << std::endl;
        std::cin >> up >> down;
        if(down > up)
            std::swap(up, down);
        std::generate(v.begin(), v.end(),
            [up, down]
            {
                return rand() % (up - down) + down;
            });
    }
    else if(answ == 2)
    {
        std::generate(v.begin(), v.end(),
            []
            {
                int num;
                std::cin >> num;
                return num;
            });
    }
    else
    {
        std::cout << "you are really stupid... :\'(" << std::endl;
        return 1;
    }
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    std::cout << *std::max_element(v.begin(), v.end()) << std::endl;
    auto last = v.begin() + (v.rend() - std::find_if(v.rbegin(), v.rend(), [](int num) { return num > 0; })) - 1;
    if(last == v.begin() - 1)
        last = v.begin();
    std::cout << std::accumulate(v.begin(), last, 0) << std::endl;
    int a, b;
    std::cin >> a >> b;
    std::vector<int> vec(10);
    std::remove_copy_if(v.begin(), v.end(), vec.begin(), [a, b](int num) { return ((num >= a) && (num <= b)); });
    //std::copy(vec.begin(), vec.end(), v.begin());
    //std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}
Без C++0x
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <iterator>
#include <numeric>
 
template <class Iterator, class T> void mygenerate(Iterator first, Iterator last, T up, T down)
{
    for( ; first != last; ++first)
        *first = rand() % (up - down) + down;
}
 
template <class Iterator, class T> void mygenerate(Iterator first, Iterator last, std::istream &stream)
{
    T num;
    for( ; first != last; ++first)
    {
        stream >> num;
        *first = num;
    }
}
 
template <class T> bool isPositive(T num) { return num > 0; }
 
template <class IteratorInput, class IteratorOutput, class T> 
void remove_copy_if_in_a_b(IteratorInput first, IteratorInput last, IteratorOutput out, T a, T b)
{
    for( ; first != last; ++first)
    {
        if(!((*first >= a) && (*first <= b)))
            *out++ = *first;
    }
} 
 
int main()
{
    srand(time(NULL));
    std::vector<int> v(10);
    std::cout << "1 - random, 2 - you" << std::endl;
    int answ;
    std::cin >> answ;
    if(answ == 1)
    {
        int up, down;
        std::cout << "up, down" << std::endl;
        std::cin >> up >> down;
        if(down > up)
            std::swap(up, down);
        mygenerate(v.begin(), v.end(), up, down);
    }
    else if(answ == 2)
        mygenerate<std::vector<int>::iterator, int>(v.begin(), v.end(), std::cin);
    else
    {
        std::cout << "you are really stupid... :\'(" << std::endl;
        return 1;
    }
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    std::cout << *std::max_element(v.begin(), v.end()) << std::endl;
    std::vector<int>::iterator last = v.begin() + (v.rend() - std::find_if(v.rbegin(), v.rend(), isPositive<int>)) - 1;
    if(last == v.begin() - 1)
        last = v.begin();
    std::cout << std::accumulate(v.begin(), last, 0) << std::endl;
    int a, b;
    std::cin >> a >> b;
    std::vector<int> vec(10);
    remove_copy_if_in_a_b(v.begin(), v.end(), vec.begin(), a, b);
    //std::copy(vec.begin(), vec.end(), v.begin());
    //std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}


upd:. Второе задание, программа считала вместе с последним положительным элементом(включительно т.е.). Обновил оба кода.
2
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3
01.01.2012, 22:04  [ТС]
Спасибо большое!
Но я уще полгода только учусь, для меня такое решение слишком сложное
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.01.2012, 22:25
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <iterator>
#include <numeric>
 
//Генерирует массив через rand() в пределах (up; down]
template <class Iterator, class T> void mygenerate(Iterator first, Iterator last, T up, T down)
{
    for( ; first != last; ++first)
        *first = rand() % (up - down) + down;
}
 
//Генерирует массив из потока std::istream
template <class Iterator, class T> void mygenerate(Iterator first, Iterator last, std::istream &stream)
{
    T num;
    for( ; first != last; ++first)
    {
        stream >> num;
        *first = num;
    }
}
 
//Возвращает true если num > 0, иначе false
template <class T> bool isPositive(T num) { return num > 0; }
 
//Копирует источник [first; last) в out
//Если какой либо элемент из [first; last) попадает в промежуток [a; b]
//то этот элемент не копируется.
template <class IteratorInput, class IteratorOutput, class T> 
void remove_copy_if_in_a_b(IteratorInput first, IteratorInput last, IteratorOutput out, T a, T b)
{
    for( ; first != last; ++first)
    {
        if(!((*first >= a) && (*first <= b)))
            *out++ = *first;
    }
} 
 
int main()
{
    srand(time(NULL));
    std::vector<int> v(10);
    std::cout << "1 - random, 2 - you" << std::endl;
    int answ;
    std::cin >> answ;
    if(answ == 1)
    {
        int up, down;
        std::cout << "up, down" << std::endl;
        std::cin >> up >> down;
        if(down > up)
            std::swap(up, down);
        //Генерирует массив через rand()
        mygenerate(v.begin(), v.end(), up, down);
    }
    else if(answ == 2)
        //Генерирует массив через std::cin
        mygenerate<std::vector<int>::iterator, int>(v.begin(), v.end(), std::cin);
    else
    {
        //Ничего не генерирует :P
        std::cout << "you are really stupid... :\'(" << std::endl;
        return 1;
    }
    //Выводим массив путем копирования его в поток вывода
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    //Выводим максимальный элемент в массиве
    std::cout << *std::max_element(v.begin(), v.end()) << std::endl;
    //Находим последний положительный элемент
    std::vector<int>::iterator last = v.begin() + (v.rend() - std::find_if(v.rbegin(), v.rend(), isPositive<int>)) - 1;
    //Если его нет, пусть им будет первый элемент, так надо
    if(last == v.begin() - 1)
        last = v.begin();
    //Выводим сумму элементов массива с первого по last
    std::cout << std::accumulate(v.begin(), last, 0) << std::endl;
    int a, b;
    std::cin >> a >> b;
    std::vector<int> vec(10);
    //Копируем массив v в vec
    //Элементы, попадающие в промежуток [a; b] не копируются
    remove_copy_if_in_a_b(v.begin(), v.end(), vec.begin(), a, b);
    //Если надо, можно убрать комментарии у 2 строчек ниже и закомментировать 3-ю
    //Эти строчки копируют vec в v и выводят его
    //std::copy(vec.begin(), vec.end(), v.begin());
    //std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}
Добавил комментарии

template. В двух словах это такая штука, с помощью которой функцию можно вызывать с разными типами параметров без перегрузки самой функции. К примеру
C++
1
template <class T> T max(T a, T b) { return ((a > b) ? (a) : (b)); }
можно вызывать, если a и b будут int, float, double, char и т.д. Соответсвенно, если вам потребуется изменить тип массива, то не нужно будет менять каждую функцию.
Можно применять не только к функциям, но тут речь только о них.

vector. "Обертка" над массивом. Записи
C++
1
2
std::vector<int> vec(10);
int arr[10];
относительно эквивалентны. Но, если в обычном массиве мы можем записать только 10 или меньше элементов, то в вектор мы можем добавить другие элементы путем v.push_back(<T>). Соответственно, std::vector можно считать динамическим массивом. Подробнее можно прочитать тут
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
01.01.2012, 22:55
C++
1
2
3
4
5
for (int i=n-1; i>=0; i--)
{
    if (a[i]>0) ipos=i;
    break;
}
Этот цикл завершится уже после первого шага.
1
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3
02.01.2012, 00:55  [ТС]
Спасибо, мы классы еще не проходили, я не разберусь

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

Добавлено через 21 минуту
Все, нашла ошибку, всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.01.2012, 00:55
Помогаю со студенческими работами здесь

Создать динамический класс Book, содержащий динамический массив Authors
Мне нужно написать программу,а я не знаю как ее написать. Знаю, тут люди за кого-то не делают, укажите хотя бы направление. вот сама...

Можно ли в классе создавать массив переменной длинны. Например динамический массив?
Динамические массивы привлекают больше. :)

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

Написать функцию принимающую массив и возвращающую указатель на динамический массив
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел. Как сделать...

Заполнить динамический массив из файла и записать массив обратно в файл
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru