С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 13
1

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

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

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

Найти среднее арифметическое значение четных элементов и среднее арифметическое нечетных элементов и сравнить их между собой
Найти среднее арифметическое значение четных элементов и среднее арифметическое нечетных элементов...

Получить среднее арифметическое всех членов последовательности
Напишите пожалуйста полный код данной программы в microsoft visual studio c++ Даны...

Объявить переменные целочисленного типа с инициаторами в 10, 16 и 8- системах счисления. Получить среднее арифметическое и среднее геометрическое чисе
Буду очень благодарен=(( Объявить переменные целочисленного типа с инициаторами в 10, 16 и 8-...

Вычислить среднее арифметическое элементов последовательности
Написать программу, которая вычисляет среднее арифметическое последовательности дробных чисел,...

9
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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;
}
0
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);
}
0
43 / 39 / 12
Регистрация: 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));
0
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 13
28.01.2009, 20:33  [ТС] 5
Спасибо.Вот только я не знаю,как это в мою программу запихнуть...
Там нужно,чтобы ввод элементов и подсчёт средних значений должен быть в разных функциях
0
Заблокирован
28.01.2009, 23:11 6
Цитата Сообщение от Immes Посмотреть сообщение
И ещё один вопрос:как вычислять не квадратный корень из числа,а n-ой степени?
если вам корень нужен для среднегеометрического,то можно и без него обойтись(без корня), вот тут формула есть: http://en.wikipedia.org/wiki/Geometric_mean

Добавлено через 18 минут 50 секунд
а если не для среднегеометрического то: exp(log(x)/y); //x^y
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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]$
1
Заблокирован
29.01.2009, 04:40 8
ошуибся я в предыдущем посту:
exp(log(x)*y); //x^y
exp(log(x)/y); //x^(1/y)
0
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);  
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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 и совершенно случайно правильно сработает. Чем больше в программе случайностей, тем больше возможностей для появления ошибок.
У тебя в программе трудно разобраться, потому что она не структурирована, то есть не разделена а перемешана. При росте программы в ней не разберётся даже её автор, потому что отдельные моменты забываются.
0
12.02.2009, 06:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2009, 06:06
Помогаю со студенческими работами здесь

Определить среднее арифметическое отрицательных элементов последовательности
Составить алгоритм решения задачи и разработать программу на языке С++: С клавиатуры вводится...

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

Найти среднее арифметическое элементов последовательности, заканчивающихся цифрой «7»
Выполнить без использования массива! Длина последовательности целых чисел – случайное число от 10...

Получить числа b1, ..., b20, где bi*– среднее арифметическое всех членов последовательности a1, ..., a20, кроме ai
Помогите пожалуйста исправить программу или предложите свой вариант , задача: (Даны...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru