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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено через 18 минут 50 секунд
а если не для среднегеометрического то: exp(log(x)/y); //x^y
0
accept
4831 / 3252 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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
rrrFer
Заблокирован
29.01.2009, 04:40 #8
ошуибся я в предыдущем посту:
exp(log(x)*y); //x^y
exp(log(x)/y); //x^(1/y)
0
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);  
}
0
accept
4831 / 3252 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2009, 06:06
Привет! Вот еще темы с ответами:

Вычислить среднее арифметическое, сумму элементов и количество элементов заданной последовательности - C++
Ваести значения для Х. Значения Х&gt;0 , поэтому для окончания вычисления ввести число 0. Вычислить сумму всех значении Х и количество Х....

Среди первых n элементов последовательности найти среднее арифметическое отрицательных элементов - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; /* Пусть a=0.01; a=sin(k+a) , k=2,3,... Среди первых n элементов...

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

Количество элементов последовательности, начиная с третьего, среднее арифметическое элементов - C++
Задача 2. Использование инструкций для организации циклов (обработка вещественных значений) Написать программу, в которой с клавиатуры...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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