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

заменить отрицательные елементы массива - C++

Восстановить пароль Регистрация
 
Ded Makar
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 28
23.09.2011, 19:15     заменить отрицательные елементы массива #1
В общем, есть массив размерностью 100 элементов, диапазон от -100 до 100. Нужно заменить все элементы с отрицательными значениями средним арифметическим значением всех положительных элементов. Заранее спасибо)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NinGAZ
13 / 13 / 1
Регистрация: 27.07.2011
Сообщений: 162
23.09.2011, 19:17     заменить отрицательные елементы массива #2
это как вообще? поподробнее
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.09.2011, 19:26     заменить отрицательные елементы массива #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
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
#define N 100
 
void Init(double *a, int n)
{
   int i;
   for (i = 0; i < n; i++)
      a[i] = rand() % 201 - 100;
}
 
void Print(double *a, int n)
{
   int i;
   for (i = 0; i < n; i++)
      printf("%.5f ", a[i]);
   printf("\n");
}
 
int Sred(double *a, int n, double *sred)
{
   int i, k = 0;
   double sum = 0;
   for (i = 0; i < n; i++)
      if (a[i] > 0)
      {
         k++;
         sum += a[i];
      }
   if (k > 0)
   {
      *sred = sum / k;
      return 1;
   }
   else
      return 0;
}
 
void Zamena(double *a, int n, double sred)
{
   int i;
   for (i = 0; i < n; i++)
         if (a[i] < 0)
            a[i] = sred;
}
 
int main()
{
   double a[N], sred;
   int i;
   Init(a, N);
   Print(a, N);
   if (Sred(a, N, &sred))
      Zamena(a, N, sred);
   Print(a, N);
   getchar();
   return 0;
}
Ded Makar
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 28
24.09.2011, 10:47  [ТС]     заменить отрицательные елементы массива #4
Теперь понятно, почему оно не работало) Я на среднее арифметическое целый тип поставил, вот прога мне одни 0 вместо отрицательних чисел и писала. спасибо за помощь)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.09.2011, 14:34     заменить отрицательные елементы массива #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
50
51
52
53
54
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
#include <cstdlib>
#include <ctime>
 
double positive_average(const std::vector<double> & vec){
    double sum = 0.0;
    size_t count = 0;
    
    for ( std::vector<double>::const_iterator i = vec.begin(); i != vec.end(); ++i )
        if ( *i > 0.0 && ++count )
            sum += *i;
    
    return ( count ) ? sum / static_cast<double>(count) : 0.0;
}
 
template <typename T>
class RandNumber {
    int lo;
    int hi;
public:
    RandNumber(int Lo, int Hi): lo(Lo), hi(Hi) {}
    T operator () (){
        return static_cast<T>( rand() % (hi - lo + 1) + lo );
    }
};
 
int main(){
    const int SIZE(10);
    const int LO(-200);
    const int HI(200);
    
    std::vector<double> vec(SIZE);
    srand(time(NULL));
    std::generate(vec.begin(), vec.end(), RandNumber<double>(LO, HI));
    
    std::cout << "ARRAY:   ";
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " "));
    std::cout << std::endl;
    
    double avg = positive_average(vec);
    if ( avg > 0.0 ){
        std::cout << "Average of positive elements: " << avg << std::endl;
        std::replace_if(vec.begin(), vec.end(), std::bind2nd(std::less<double>(), 0.0), avg);
        std::cout <<"CHANGED: ";
        std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " "));
        std::cout << std::endl;
    }
    
    return 0;
}
Код
andrew@debnout:~/cpp/numbers$ g++ -o neg2average neg2average.cpp
andrew@debnout:~/cpp/numbers$ ./neg2average 
ARRAY:   165 48 -4 59 -4 -38 12 -148 113 -147 
Average of positive elements: 79.4
CHANGED: 165 48 79.4 59 79.4 79.4 12 79.4 113 79.4 
andrew@debnout:~/cpp/numbers$ ./neg2average 
ARRAY:   -88 -11 -95 -51 63 -101 199 103 -168 -120 
Average of positive elements: 121.667
CHANGED: 121.667 121.667 121.667 121.667 63 121.667 199 103 121.667 121.667 
andrew@debnout:~/cpp/numbers$ ./neg2average 
ARRAY:   25 -56 176 -182 -143 155 99 68 88 -45 
Average of positive elements: 101.833
CHANGED: 25 101.833 176 101.833 101.833 155 99 68 88 101.833 
andrew@debnout:~/cpp/numbers$

Не по теме:

диапазон [-200, 200] опять же по невнимательности, исправьте, если принципиально...

rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
24.09.2011, 15:03     заменить отрицательные елементы массива #6

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
Выпендрёж от скуки...
Ну, раз уж такое дело, то


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 <iostream>
#include <algorithm>
#include <iterator>
#include <functional>
#include <array>
#include <random>
#include <ctime>
 
int main()
{
    typedef std::ostream_iterator<int> int_out_iter;
 
    auto rand_generator = std::bind(std::uniform_int_distribution<int>(-100, 100),
                                    std::mt19937(std::time(nullptr)));
 
    std::array<int, 100> a;
    std::generate(a.begin(), a.end(), rand_generator);
 
    std::copy(a.begin(), a.end(), int_out_iter(std::cout, " "));
    std::cout << '\n';
 
    int sum = 0;
    std::for_each(a.begin(), a.end(), [&sum](int i) { if(i > 0) sum+= i; });
 
    int pos_average = sum / a.size();
    std::replace_if(a.begin(), a.end(), [](int i) { return i < 0; }, pos_average);
 
    std::copy(a.begin(), a.end(), int_out_iter(std::cout, "  "));
    std::cout << '\n';
 
    return 0;
}
easybudda
24.09.2011, 16:07     заменить отрицательные елементы массива
  #7

Не по теме:

Цитата Сообщение от rangerx Посмотреть сообщение
int pos_average = sum / a.size();
Вот всё-таки не комильфо как-то среднее арифметическое целым числом делать, а так да, компактненько...

Yandex
Объявления
24.09.2011, 16:07     заменить отрицательные елементы массива
Ответ Создать тему
Опции темы

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