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

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

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

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

01.01.2012, 19:57. Просмотров 491. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.01.2012, 19:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамический массив (C++):

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

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

динамический массив (Целое число разложить на массив простых множителей) - C++
Доброго времени суток всем. Целое число необходимо разложить на массив простых множителей. Столкнулся с проблемой, мне нужно, чтобы...

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

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла - C++
задача: передать динамический массив в функцию, и записать в каждый элемент строку из файла. количество строк известно вот что у меня...

Как преобразовать массив в динамический? Массив вычисляет сумму элементов каждой диагонали матрицы - C++
Ошибка : Вызвано исключение по адресу 0x00BB2F4F в Проект6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE05. #...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soon
2540 / 1305 / 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:. Второе задание, программа считала вместе с последним положительным элементом(включительно т.е.). Обновил оба кода.
2
Travka
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3
01.01.2012, 22:04  [ТС] #3
Спасибо большое!
Но я уще полгода только учусь, для меня такое решение слишком сложное
0
soon
2540 / 1305 / 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 можно считать динамическим массивом. Подробнее можно прочитать тут
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
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;
}
Этот цикл завершится уже после первого шага.
1
Travka
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 3
02.01.2012, 00:55  [ТС] #6
Спасибо, мы классы еще не проходили, я не разберусь

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

Добавлено через 21 минуту
Все, нашла ошибку, всем спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2012, 00:55
Привет! Вот еще темы с ответами:

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) - C++
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если в массиве чётных чисел оказалось...

Двумерный массив (поменять статический массив на динамический) - C++
Нужно поменять статический массив на динамический с выделением памяти #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; ...

Массив и память. Как создать динамический массив? - C++
не могу исправить ошибки. И нужен динамический массив я что-то попробовала для его создания но ничего не вышло #include &quot;stdafx.h&quot; ...

Переделать динамический массив на статический массив - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int main() { int dim, counter_1 = 1, counter_2 =...


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

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

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