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

Динамический массив - C++

Восстановить пароль Регистрация
 
Travka
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3
01.01.2012, 19:57     Динамический массив #1
Задание такое:
Должно быть реализовано 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;
        }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.01.2012, 19:57     Динамический массив
Посмотрите здесь:

C++ статический массив ----> динамический массив
Динамический массив C++
C++ Динамический массив
динамический массив C++
Динамический массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.01.2012, 22:02     Динамический массив #2
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:. Второе задание, программа считала вместе с последним положительным элементом(включительно т.е.). Обновил оба кода.
Travka
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3
01.01.2012, 22:04  [ТС]     Динамический массив #3
Спасибо большое!
Но я уще полгода только учусь, для меня такое решение слишком сложное
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.01.2012, 22:25     Динамический массив #4
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 можно считать динамическим массивом. Подробнее можно прочитать тут
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
01.01.2012, 22:55     Динамический массив #5
C++
1
2
3
4
5
for (int i=n-1; i>=0; i--)
{
    if (a[i]>0) ipos=i;
    break;
}
Этот цикл завершится уже после первого шага.
Travka
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3
02.01.2012, 00:55  [ТС]     Динамический массив #6
Спасибо, мы классы еще не проходили, я не разберусь

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

Добавлено через 21 минуту
Все, нашла ошибку, всем спасибо
Yandex
Объявления
02.01.2012, 00:55     Динамический массив
Ответ Создать тему
Опции темы

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