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

Сжать массив, удалив из него все элементы, модуль которых не превышает 1. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
YaDenis03
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 139
25.10.2012, 00:04     Сжать массив, удалив из него все элементы, модуль которых не превышает 1. #1
В одномерном массиве, состоящем из 20 вещественных элементов, вычислить:
1) сумму элементов массива с нечетными номерами;
2) сумму элементов массива, расположенных между первым и последним отрицательными элементами.

Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 00:04     Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
Посмотрите здесь:

Сжать массив, удалив из него все элементы, модуль которых находится в интервале [a,b] C++
C++ Сжать массив, удалив из него все элементы, модуль которых находится в интервале [a,b].
C++ Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не превышает 1
Дан целочисленный массив размера N. Сжать массив, удалив из него все элементы, модуль которых не превышает 1 C++
C++ Сжать массив, удалив из него все элементы. модуль которых не превышает, заданного числа.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
25.10.2012, 09:36     Сжать массив, удалив из него все элементы, модуль которых не превышает 1. #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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
#define N 20
 
int main()
{
    int* A = new int[N];
    for (int i = 0; i < N; i++)
    {
        A[i] = ((int)(rand() % (2 * N) - 0.5 * N));
        printf("%d ",A[i]);
    }
 
    int k1 = 0, k2 = N-1;
    while (A[k1] > 0 && k1 < N) k1++;
    while (A[k2] > 0 && k2 >= 0) k2--;
 
    int sum1 = 0, sum2 = 0;
    for (int t = 0; t < N; t++)
    {
        if ((t % 2) > 0) sum1+=A[t];
        if ((t >= k1) && (t <= k2)) sum2+=A[t];
    }
 
    printf("\nsum1 = %d sum2 = %d\n", sum1, sum2);
             
    _getch();
 
    return 0;
}
http://liveworkspace.org/code/8764df...75c64f364c459e
Миниатюры
Сжать массив, удалив из него все элементы, модуль которых не превышает 1.  
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.10.2012, 11:34     Сжать массив, удалив из него все элементы, модуль которых не превышает 1. #3
Цитата Сообщение от YaDenis03 Посмотреть сообщение
Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
Для этого можно воспользоваться стандартной функцией remove_if
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
/*
В одномерном массиве, состоящем из 20 вещественных элементов, вычислить:
...
 Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
*/
 
#include <iostream>
#include <algorithm>
#include <functional>
 
const int N = 20;
double getRand(void) { return 0.2 * (rand() % (2 * N)); }
 
int main(void)
{
    setlocale(0, "rus");
    double Array[N];
    std::generate(Array, Array + N, getRand);
    std::cout << "Исходный массив: ";
    std::copy(Array, Array + N, std::ostream_iterator<double>(std::cout, " "));
    std::cout << std::endl;
 
    double * M = std::remove_if(Array, Array + N, std::bind2nd(std::less<double>(), 1.0));
    int NewSize = std::distance(Array, M);
 
    std::cout << "Сжатый массив: ";
    std::copy(Array, Array + NewSize, std::ostream_iterator<double>(std::cout, " "));
    std::cout << std::endl;
 
    system("pause");
}
Правда, тут нет вычисления модуля числа. С модулем должно быть так:
C++
1
2
std::remove_if(Array, Array + N,
                std::compose1(std::bind2nd(std::less<double>(), 1.0), abs));
Но моя стандартная библиотека не содержит шаблона compose1 почему-то. Поэтому не могу проверить.

Добавлено через 27 минут
Можно написать свою функцию сравнения. Так будет даже нагляднее:
C++
1
2
3
4
5
6
7
8
9
10
11
bool IsLessThanOne(double X)
{
    return (abs(X) < 1.0);
}
 
int main(void)
{
// ...
    double * M = std::remove_if(Array, Array + N, IsLessThanOne);
// ...
}
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
25.10.2012, 11:36     Сжать массив, удалив из него все элементы, модуль которых не превышает 1. #4
вы уже создавали подобную тему 1 раз не вижу смысла создавать её еще раз
одномерный массив, состоящий из 20 вещественных элементов
у вас там был коментарий...
Цитата Сообщение от YaDenis03 Посмотреть сообщение
ошибок много выдаёт...(
действительно если вы тупо скопипастили мой код то будет куча ошибок потому что не инициализирован mas1, в который помещается урезанный массив mas. достаточно перед всем что я написал вставить
C++
1
int mas1[20];
и все заработает.
единственное у меня была помарка что четность номера я считал как i%2==0, но т.к. массив начинается с 0 то соответственно сума считалась нечетных номеров
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
25.10.2012, 12:20     Сжать массив, удалив из него все элементы, модуль которых не превышает 1. #5
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <memory.h>
 
#define N 20
 
#define __countof(p) sizeof(p) / sizeof(p[0]) \
 
int main()
{
    double* A = new double[N+1];
    memset((void*)A, 0x00, sizeof(double) * (N + 1));
 
    for (int i = 0; i < N; i++)
    {
        A[i] = (rand() % (2 * N) - 0.5 * N  + 1) / 65535 * 10000;
        printf("%f ",A[i]);
    }
 
    int k1 = 0, k2 = N-1;
    while (A[k1] > 0 && k1 < N) k1++;
    while (A[k2] > 0 && k2 >= 0) k2--;
 
    double sum1 = 0, sum2 = 0;
    for (int t = 0; t < N; t++)
    {
        if ((t % 2) > 0) sum1+=A[t];
        if ((t >= k1) && (t <= k2)) sum2+=A[t];
    }
 
    printf("\n\nsum of odds = %lf sum between negatives = %lf\n\n", sum1, sum2);
 
    for (int q = 0; A[q] != 0.00 && q < N+1; q++)
    {
        double val = fabs(A[q]); if (val < 1) q--;
        for (int n = q+1; A[n] != 0.00 && val < 1 && n < N+1; n++)
             A[n] = A[n+1];
    }
 
    for (int m = 0; A[m] != 0.00 && m < N+1; m++)
        printf("%f ",A[m]);
    printf("\n");
 
    _getch();
 
    return 0;
}
http://liveworkspace.org/code/7f36db...bc88e04ee96d55
Миниатюры
Сжать массив, удалив из него все элементы, модуль которых не превышает 1.  
Yandex
Объявления
25.10.2012, 12:20     Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
Ответ Создать тему
Опции темы

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