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

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

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

Получить среднее арифметическое и среднее геомерическое элементов последовательности - C++

25.01.2009, 12:38. Просмотров 875. Ответов 9
Метки нет (Все метки)

Даны действительные числа a1, a2… Известно, что а1>0 и что среди a2, a3… есть хотя бы одно отрицательное число.Пусть a1,…, an – члены данной последовательности, предшествующие первому отрицательному члену (n заранее неизвестно).Получить среднее арифметическое и среднее геомерическое a1,…, an.
Саму программу я написала...но выяснилось,что необходимо,чтобы элементы вводились до первого отрицательного и размерность массива не должна определяться заранее.И так сделать у меня не получается.И ещё один вопрос:как вычислять не квадратный корень из числа,а n-ой степени?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2009, 12:38     Получить среднее арифметическое и среднее геомерическое элементов последовательности
Посмотрите здесь:

C++ Вычислите среднее арифметическое элементов последовательности без учета минимального и максимального
Среднее арифметическое последовательности C++
C++ Найти среднее арифметическое последовательности
Получить числа b1, ..., b20, где bi*– среднее арифметическое всех членов последовательности a1, ..., a20, кроме ai C++
C++ 0.Вводится последовательность из N вещественных чисел. Определить среднее арифметическое среди кратных 7 элементов последовательности
C++ Количество элементов последовательности, начиная с третьего, среднее арифметическое элементов
C++ Получить среднее арифметическое всех членов последовательности
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.01.2009, 13:00     Получить среднее арифметическое и среднее геомерическое элементов последовательности #2
C++
1
2
3
4
5
6
7
8
9
10
 
#include <stdio.h>
#include <math.h>
 
/* вычисляет корень n-ой степени из числа */
main()
{
    printf("%f\n", pow(27, 1.0/3));
    return 0;
}
Immes
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 13
28.01.2009, 19:44  [ТС]     Получить среднее арифметическое и среднее геомерическое элементов последовательности #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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
 
void vvod(int N, float *a);
void uslovie(int N, float *a, float *retmass);
float zashita(int min,int max);
 
int main()
{
    const int maxNat=100;           //ограничение на ввод количества элементов массива
    int N,i;
    float k,z;
    char ch;
 
 
        printf("\n---------------------ZADANIE----------------------\n");
        printf("\nDany deystvitel'nye chisla a1, a2, ... . Poluchit' ");
        printf("\nsrednee arifmeticheskoe i srednee geometricheskoe ");
        printf("\nposledovetel'nosti chisel predshestvujushih pervomu ");
        printf("\notricatel'nomu chislu an.Izvestno,chto a1>0 i");
        printf("\nsredi a2, a3... est' otricatel'noe chislo");
        printf("\n");
        printf("------------------------------------------------------");
    do
    {
        do
        {
            printf("\n");
            printf ("\nVvedite razmer massiva N(1 ... %d)= ",maxNat);   //ввод размерности массива N
            N=zashita(1,maxNat);
            if (N>maxNat)
            {
                printf("\nVy vveli nepravil'noe chislo.");
                printf("\nNazhmite lybuy klavishu.");
                _getch();
            }
        }
        while (N>maxNat);
 
              float *a = (float*)malloc(N*sizeof(float));
              vvod(N, a);
 
              float b[2];
              uslovie(N, a, b);
 
        printf("\nSrednee ariphmeticheskoe = %f",b[0]);
        printf("\nSrednee geometicheskoe = %f",b[1]);
 
        printf("\n\nDlja prodolzhenija raboty programmy nazhmite 'Y'");             //запрос на продолжение работы программы
        ch=(toupper(_getch()));
    }
    while(ch=='Y');
        printf("\n");
        printf("\n");
        printf("\n------------------------------------------------------");
        printf("                          Rabota programmy zavershena");
 
 
 
}
//------------------------------------------------------------------------------
 
void vvod(int N, float *a)
{
    const float maxInt=3.4e38;
    int i;
 
    for (int i=0;i<N;i++)
        {
            do                                                  //ввод элементов массива
            {
                printf("\nVvedite elementy massiva (-%d ... %d).",maxInt,maxInt);
                printf("\n a[%d] = ",i);
                a[i]=zashita(-maxInt,maxInt);
                if(a[i]<-maxInt||a[i]>maxInt)
                {
                    printf("\nVi vveli nepravil'noe chislo.");
                    printf("\nNazhmite na lubuy klavishu.");
                    getch();
                }
            }
            while(a[i]<-maxInt||a[i]>maxInt);
        }
    printf("\n");
    printf("N = %d",N);
    printf("\n");
    printf("\nIshodniy massiv a[%d]:",N);                       //вывод заданного массива a[N]
    printf("\n");
 
    for(int i=0;i<N;i++)
        {
            printf("a[%d] = %5.2f",i,a[i]);
            printf("\n");
        }
    printf ("\n");
}
 
//------------------------------------------------------------------------------
void uslovie(int N, float *a, float *retmass)
{
    float A=0, G=1;
 
    for (int i = 0; i < N; i++)
         {
      A += a[i];
      G = G*a[i];
     }
 
        retmass[0] = A/N;
        retmass[1] = pow(G,(1/N));
}
 
//------------------------------------------------------------------------------
float zashita(int min,int max)
{
    const int N=7;
    char ch;
    char str[100], str1[100];
 
    int i=0, cntPtr=0, cntE=0, cntNeg=0;
 
    do
    {
        ch=(char)getch();
 
        if((ch=='-')&&(cntNeg==0)&& min!=1)     // '-'
        {
            str[i++]=ch;
            putch(ch);
            cntNeg++;
        }
 
        if((ch=='e'||ch=='E')&&(cntE==0)&& min!=1)      // 'e'
        {
            str[i++]=ch;
            putch(ch);
            cntE++;
        }
 
        if((ch=='.')&&(i>0)&&(!cntPtr)&& min!=1)    // '.'
        {
            str[i++]=ch;
            putch(ch);
            cntPtr++;
        }
 
        if((ch>='0')&&(ch<='9'))                //
        {
            str[i++]=ch;
            putch(ch);
        }
 
        if((ch=='\b')&&(i>0))                   // работа BackSpace
        {
            i--;
            printf("\b \b");
        }
 
        if((i==(N+1))&&(i>0)&&(min==1)||(i==(N+2))&&(i>0)&&(min!=1))
        {
            i--;
            printf("\b \b");
        }
    }
    while(ch!='\r');
 
 
        str[i]='\0';                //преобразование числа с е в float
        bool f=0;
        for(int k=0;k<i;k++)
            if(str[k]=='e')
            {
                f=1;
                break;
            }
        if(f)
        {
            float bas=1,
                  degree=0;
            int k=0;
            while(str[k]!='e')
            {
                str1[k]=str[k];
                k++;
            }
            str1[k]='\0';
            bas=atof(str1);
            if(!bas)bas=1;
            k++;
            int k1=0;
            while(str[k]!='\0')
            {
                str1[k1]=str[k];
                k++;
                k1++;
            }
            str1[k1]='\0';
            degree=atof(str1);
            return(bas*pow(10,degree));
        }
 
        return atof(str);
}
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
28.01.2009, 20:00     Получить среднее арифметическое и среднее геомерическое элементов последовательности #4
C++
1
2
3
4
5
6
int x, kol=0, sum=0, prod=1;
float sr_ar, sr_geo;
while (cin>>x, x>=0)
{ ++kol; sum+=x; prod*=x;}
sr_ar = static_cast<float> (sum/kol);
sr_geo = static_cast<float> (pow(prod, 1/k));
Immes
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 13
28.01.2009, 20:33  [ТС]     Получить среднее арифметическое и среднее геомерическое элементов последовательности #5
Спасибо.Вот только я не знаю,как это в мою программу запихнуть...
Там нужно,чтобы ввод элементов и подсчёт средних значений должен быть в разных функциях
rrrFer
Заблокирован
28.01.2009, 23:11     Получить среднее арифметическое и среднее геомерическое элементов последовательности #6
Цитата Сообщение от Immes Посмотреть сообщение
И ещё один вопрос:как вычислять не квадратный корень из числа,а n-ой степени?
если вам корень нужен для среднегеометрического,то можно и без него обойтись(без корня), вот тут формула есть: http://en.wikipedia.org/wiki/Geometric_mean

Добавлено через 18 минут 50 секунд
а если не для среднегеометрического то: exp(log(x)/y); //x^y
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.01.2009, 00:23     Получить среднее арифметическое и среднее геомерическое элементов последовательности #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <math.h>
 
main()
{
    double x = 0.027;
    double y = 1.0/3;
    
    printf("%lf\n", exp(log(x)/y));
    printf("%lf\n", pow(x, y));
    return 0;
}
Код
[guest@station tmp]$ ./t
0.000020
0.300000
[guest@station tmp]$
rrrFer
Заблокирован
29.01.2009, 04:40     Получить среднее арифметическое и среднее геомерическое элементов последовательности #8
ошуибся я в предыдущем посту:
exp(log(x)*y); //x^y
exp(log(x)/y); //x^(1/y)
Immes
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 13
11.02.2009, 00:02  [ТС]     Получить среднее арифметическое и среднее геомерическое элементов последовательности #9
Помогите пожалуйста.Не могу сделать переменную a не глобальной и ещё не работает защита-он пишет,что число введено неверно,но всё равно его запоминает.
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>  
#include <ctype.h>  
#include <stdlib.h>  
#include <math.h>  
  
void vvod(float *maxNat);  
void uslovie(float maxNat, float *retmass);  
float zashita(int min,int max,int idx);  
 
float *a;
  
int main()  
{  
    // количнство введных элементов
    float maxNat=0;           
    int i;
    float k,z;
    char ch;
 
 
        printf("\n---------------------ZADANIE----------------------\n");
        printf("\nDany deystvitel'nye chisla a1, a2, ... . Poluchit' ");
        printf("\nsrednee arifmeticheskoe i srednee geometricheskoe ");
        printf("\nposledovetel'nosti chisel predshestvujushih pervomu ");
        printf("\notricatel'nomu chislu an.Izvestno,chto a1>0 i");
        printf("\nsredi a2, a3... est' otricatel'noe chislo");
        printf("\n");
        printf("------------------------------------------------------");
 
    do
    {            
            // выделим память для хранения 1-ого элемента
          //float *a = (float*)malloc(sizeof(float));    
          a = (float*)realloc(NULL, sizeof(float));              
          vvod(maxNat);
 
          if (maxNat != 0)
          {
            float b[2];
            uslovie(maxNat, b);
 
            printf("\nSrednee ariphmeticheskoe = %f",b[0]);
            printf("\nSrednee geometicheskoe = %f",b[1]);          
          };
          
 
      printf("\n Dlja prodolzhenija raboty programmy nazhmite 'Y'\n\n\n");                //запрос на продолжение работы программы
      ch=(toupper(_getch()));
    }
    while(ch=='Y');
 
    printf("\n");
    printf("\n------------------------------------------------------");
    printf("                          Rabota programmy zavershena\n");
    _getch();
}
//------------------------------------------------------------------------------
void vvod(float *maxNat)  
{
    const float maxInt=3.4e38;
    int i=0;    
    float el;
    
    do                                                            
    {        
        printf("\nVvedite chislo (-%g ... %g).",maxInt,maxInt);
        printf("\n a%d = ",i);
        el=zashita(-maxInt,maxInt,i);
 
        if(el<-maxInt||el>maxInt)
        {
            printf("\nVi vveli nepravil'noe chislo.");
            printf("\nNazhmite na lubuy klavishu.");
            _getch();
        }
 
        // добавляем в массив:        
        // realloc перераспределение памяти
        // в main выделили память и создали указатель
        // здесь мы перевыделяем память в зависимости от кол-ва элементов в массиве
        // 1. передаётся ссылка на старое место памяти
        // 2. выделяется нужное количество памяти  i * sizeof(float) байт
        // 3. из старого места "а" копируется в новое
        // 4. старое место удаляется        
        a = (float*)realloc(a, (i+1) * sizeof(float));
        a[i] = el;                        
        i++;
    } while(el>0);
    
    // количество введеных элементов
    *maxNat = (float)i;
 
 
    printf("\n");
    printf("\nN = %d",*maxNat);
    printf("\nVvedennye chisla:");                        //вывод заданного массива a[N]
    printf("\n");
 
    for(i=0;i<*maxNat;i++)
    {
        printf("a%d = %g",i,a[i]);
        printf("\n");
    }
}
 
//------------------------------------------------------------------------------
 
void uslovie(float maxNat, float *retmass)
{
    float A = 0, G = 1;
 
    for (int i = 0; i < maxNat; i++)
    {
        if(a[i]<0) break;
        A += a[i];
        G = G*a[i];
    }
 
    retmass[0] = A/maxNat;
    retmass[1] = pow(G,(1/maxNat));
}
 
//------------------------------------------------------------------------------
float zashita(int min,int max,int idx)
{
    const int N=7;
    char ch;
    char str[100], str1[100];
 
    int i=0, cntPtr=0, cntE=0, cntNeg=0;
 
    do
    {
        ch=(char)getch();
 
        if((ch=='-')&&(cntNeg==0) && min!=1 && idx!=0)     // '-'  
        {  
            str[i++]=ch;  
            putch(ch);  
            cntNeg++;  
        }  
  
        if((ch=='e'||ch=='E')&&(cntE==0)&& min!=1)      // 'e'  
        {  
            str[i++]=ch;  
            putch(ch);  
            cntE++;  
        }  
  
        if((ch=='.')&&(i>0)&&(!cntPtr)&& min!=1)    // '.'  
        {  
            str[i++]=ch;  
            putch(ch);  
            cntPtr++;  
        }  
  
        if((ch>='0')&&(ch<='9'))             //  
        {  
            str[i++]=ch;  
            putch(ch);  
        }  
  
        if((ch=='\b')&&(i>0))                   // работа BackSpace  
        {  
            i--;  
            printf("\b \b");  
        }  
  
        if((i==(N+1))&&(i>0)&&(min==1)||(i==(N+2))&&(i>0)&&(min!=1))  
        {  
            i--;  
            printf("\b \b");  
        }  
    }  
    while(ch!='\r');  
  
  
        str[i]='\0';                //преобразование числа с е в float  
        bool f=0;  
        for(int k=0;k<i;k++)  
            if(str[k]=='e')  
            {  
                f=1;  
                break;  
            }  
        if(f)  
        {  
            float bas=1,  
                  degree=0;  
            int k=0;  
            while(str[k]!='e')  
            {  
                str1[k]=str[k];  
                k++;  
            }  
            str1[k]='\0';  
            bas=atof(str1);  
            if(!bas)bas=1;  
     k++;  
            int k1=0;  
            while(str[k]!='\0')  
            {  
                str1[k1]=str[k];  
                k++;  
                k1++;  
            }  
            str1[k1]='\0';  
            degree=atof(str1);  
            return(bas*pow(10,degree));  
        }  
  
        return atof(str);  
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2009, 06:06     Получить среднее арифметическое и среднее геомерическое элементов последовательности
Еще ссылки по теме:

C++ Найти среднее арифметическое последовательности
Найти среднее арифметическое, и разность минимального и максимального элементов последовательности C++
Найти среднее арифметическое всех четных элементов последовательности C++
Найти среднее арифметическое тех элементов введенной числовой последовательности, номера которых кратны 3 C++
C++ Получить новую матрицу делением всех элементов матрицы на среднее арифметическое элементов заданной строке

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

Или воспользуйтесь поиском по форуму:
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.02.2009, 06:06     Получить среднее арифметическое и среднее геомерическое элементов последовательности #10
C++
1
void vvod(float *maxNat);
...
C++
1
2
        a = (float*)realloc(NULL, sizeof(float));              
        vvod(maxNat);
...
C++
1
    *maxNat = (float) i;
здесь ошибка в передаче аргумента

вообще
C++
1
2
    // количество введеных элементов
    *maxNat = (float)i;
количество введённых элементов может быть полэлемента, или три с половиной элемента ? не может ? ну тогда надо int или unsigned, если только элементов больше 4 гигабайт, тогда дробные юзают потому что они могут хранить большие целые числа, но double

изначально глобальные переменные нельзя делать, либо по максимуму минимизировать их использование, потому что не только вот такие ситуации возникают, когда от них не избавишься потому что они во всех функциях, но и потому, что в больших программах, где каждая часть программы как отдельная программа, такая глобальная переменная может неявным образом повлиять на какой-то участок и даже после отлова этой ошибки (а в неявных ошибках без дебаггера не разберёшься) избавиться от переменной и будущих проблем (там ещё проблемы с расширением программы наступают) тоже тяжело. Получается эффект виндовс, когда надо бы систему делать безопаснее, да только вот не сделаешь уже, потому что с самого начало всё топором вырублено.

C++
1
    for (i = 0; i < *maxNat; i++)
и тут тоже, i объявлена как int, а maxNat объявлена как float, в операции i < *maxNat, i совершенно случайно будет приведена к типу float и совершенно случайно правильно сработает. Чем больше в программе случайностей, тем больше возможностей для появления ошибок.
У тебя в программе трудно разобраться, потому что она не структурирована, то есть не разделена а перемешана. При росте программы в ней не разберётся даже её автор, потому что отдельные моменты забываются.
Yandex
Объявления
12.02.2009, 06:06     Получить среднее арифметическое и среднее геомерическое элементов последовательности
Ответ Создать тему
Опции темы

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