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

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

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

Передача символических имен функций - C++

05.07.2013, 14:26. Просмотров 703. Ответов 26
Метки нет (Все метки)

Здравствуйте,
Чтобы долго не объяснять, прилагаю условие задачи и мой код. Прошу Вашего совета по поводу вставки внутрь созданной функции указания на стандартную. Мне кажется, что моя запись ошибочна, но что именно не так, понять не могу. Вот код, задание ниже:
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
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <windows.h>
#define Nx  4
#define Ny  5
#define Nz  6
void vvod(float x[ ], int n, char q);
double brackets(float x[ ], int n, double a, double b, char f1, char f2);
{
double series = (f1(a*x[i])+ f2(b*x[i]));
return series;
}
main()
{
char str[50];
textbackground(2);
textcolor(15);
clrscr();
double x[Nx], y[Ny], z[Nz], w, a, b, c, g, r, q;
CharToOem("\nÂâåäèòå ýëåìåГ*ГІГ» Г¬Г*ññèâîâ x, y, z:\n", str);
printf(str);
vvod(x, Nx, 'x');
vvod(y, Ny, 'y');
vvod(z, Nz, 'z');
CharToOem("\nÂâåäèòå a:\n", str);
printf(str);
scanf("%lf",&x);
CharToOem("\n\nÂâåäèòå b:\n", str);
printf(str);
scanf("%lf",&y);
CharToOem("\n\nÂâåäèòå c:\n", str);
printf(str);
scanf("%lf",&z);
CharToOem("\n\nÂâåäèòå  g:\n", str);
printf(str);
scanf("%lf",&a);
CharToOem("\n\nÂâåäèòå  r:\n", str);
printf(str);
scanf("%lf",&b);
CharToOem("\n\nÂâåäèòå  q:\n", str);
printf(str);
scanf("%lf",&c);
w=sum(x, Nx)/znam+sum(z, Nz);
printf("w=%f\n",w);
{
int i;
float w=0;
for (i=0; i<n; i++)
w+=brackets(x[i]),Nx,a,b,sin(),cos())+brackets(y[i]),Ny,c,g,tan(),abc())+brackets(z[i]),Nz,r,q,cos(), sin());
printf("\nw = %f",w);
 
CharToOem("\nÄëÿ âûõîäГ* Г*Г*æìèòå ГЄГ«Г*ГўГЁГёГі Enter", str);
printf(str);
getch();
}
Миниатюры
Передача символических имен функций  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 14:26     Передача символических имен функций
Посмотрите здесь:

C++ Передача значения и передача переменной
Указатели, адресная арифметика и передача аргументов функций по значению и по ссылке C++
C++ Передача значений функций
Пространства имен и перегрузка функций C++
"Автозаполнение" имен типов/функций/переменных C++
Объясните, пожалуйста, как работает передача переменных при вызове функций? C++
Задачи из книги Прата (представить значения с помощью символических констант) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 15:14  [ТС]     Передача символических имен функций #2
подумала, и слегка подправила код. Ошибка компиляции только одна (соответсвенно прилагаю). Подозреваю что ошибка именно вот тут:
C
1
2
3
4
double brackets(float x[ ], int n, double a, double b, double f1(double), double f2(double));
{
double series = (f1(a*x[i])+ f2(b*x[i]));
return series;
Подправленный код:
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
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <windows.h>
#define Nx  4
#define Ny  5
#define Nz  6
void vvod(float x[ ], int n, char q);
double brackets(float x[ ], int n, double a, double b, double f1(double), double f2(double));
{
double series = (f1(a*x[i])+ f2(b*x[i]));
return series;
}
main()
{
char str[50];
textbackground(2);
textcolor(15);
clrscr();
double x[Nx], y[Ny], z[Nz], w, a, b, c, g, r, q;
CharToOem("\nВведите элементы массивов x, y, z:\n", str);
printf(str);
vvod(x, Nx, 'x');
vvod(y, Ny, 'y');
vvod(z, Nz, 'z');
CharToOem("\nВведите a:\n", str);
printf(str);
scanf("%lf",&a);
CharToOem("\n\nВведите b:\n", str);
printf(str);
scanf("%lf",&b);
CharToOem("\n\nВведите c:\n", str);
printf(str);
scanf("%lf",&c);
CharToOem("\n\nВведите  g:\n", str);
printf(str);
scanf("%lf",&g);
CharToOem("\n\nВведите  r:\n", str);
printf(str);
scanf("%lf",&r);
CharToOem("\n\nВведите  q:\n", str);
printf(str);
scanf("%lf",&q);
w=sum(x, Nx)/znam+sum(z, Nz);
printf("w=%f\n",w);
{
int i;
float w=0;
for (i=0; i<n; i++)
w+=brackets(x[i]),Nx,a,b,sin,cos)+brackets(y[i]),Ny,c,g,tan,abc)+brackets(z[i]),Nz,r,q,cos,sin);
printf("\nw = %f",w);
 
CharToOem("\nДля выхода нажмите Enter", str);
printf(str);
getch();
}
Миниатюры
Передача символических имен функций  
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 19:39     Передача символических имен функций #3
Точку с запятой, в 10 строке, уберите.

Добавлено через 3 минуты
В brackets(), i - это что?
C++
1
double series = (f1(a*x[i])+ f2(b*x[i]));
Добавлено через 2 минуты
Если создаёте массивы для double, то и:
C++
1
2
void vvod(double x[ ], int n, char q);
double brackets(double x[ ], int n, double a, double b, double f1(double), double f2(double))
Добавлено через 8 минут
C++
1
2
3
4
5
double brackets(double x, int n, double a, double b, double f1(double), double f2(double))
{
    double series = (f1(a * x)+ f2(b * x));
    return series;
}
C++
1
 w += brackets(x[i], Nx, a, b, sin, cos) + brackets(y[i], Ny, c, g, tan, abs) + brackets(z[i], Nz, r, q, cos, sin);
Добавлено через 2 минуты
Что за sum, znam, и n?
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 19:51  [ТС]     Передача символических имен функций #4
Что за sum, znam, и n?[/QUOTE]

Убрала, написала по дурости из другой задачи и не увидела. Внесла указанные Вами изменения: при компиляции вместо одной ошибки появилось девять. Вот они:
Миниатюры
Передача символических имен функций  
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
05.07.2013, 19:57     Передача символических имен функций #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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
typedef double (*Func)(double);
 
double sum(double *x,
           int n,
           double a,
           double b,
           Func f1,
           Func f2)
{
    double result = 0.0;
    while (n--)
        result += f1(a * x[n]) + f2(b * x[n]);
    return result;
}
 
double calc(double a,
            double b,
            double c,
            double g,
            double r,
            double q,
            double *x,
            double *y,
            double *z)
{
    double result =
        sum(x, 4, a, b, sin, cos) +
        sum(y, 5, c, g, tan, abs) +
        sum(z, 6, r, q, cos, sin);
    return result;
}
 
int main()
{
    double x[4] = {1, 2, 3, 4},
           y[5] = {5, 6, 7, 8, 9},
           z[6] = {10, 11, 12, 13, 14, 15},
           a = 1.5,
           b = 2.5,
           c = 3.3,
           g = 4.5,
           r = 5.5,
           q = 4.5;
    printf( "%4.2f", calc(a, b, c, g, r, q, x, y, z) );
    return 0;
}
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 20:05  [ТС]     Передача символических имен функций #6
Все равно не компилируется - есть ошибки. И, если не трудно, поясните, что это (*Func)
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
05.07.2013, 20:07     Передача символических имен функций #7
Pendalfik, компилируется в любом компиляторе С - http://ideone.com/aaYanz
Цитата Сообщение от Pendalfik Посмотреть сообщение
И, если не трудно, поясните, что это (*Func)
C
1
typedef double (*Func)(double);
Func - имя типа, который указывает на функцию, которая принимает double и возвращает double
svk2140
-8 / 0 / 1
Регистрация: 04.07.2013
Сообщений: 259
05.07.2013, 20:21     Передача символических имен функций #8
о боже мой почему ты не про инициализировал функции это же элементарный с++ даже такой чайник как я заметил)
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 20:37     Передача символических имен функций #9
Цитата Сообщение от Pendalfik Посмотреть сообщение
Внесла указанные Вами изменения:
Какие вы изменения там внесли никому не видно. Код покажите с изменениями, а то вслепую всё...
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 20:43  [ТС]     Передача символических имен функций #10
Никак. Даже с компиляцией не в Borland результат выдает 0. С такими исходными данными должно быть Rezult w=21733.167969.
Простите, но может можно определить что неверно в моей программе, хотелось бы все-таки понять.....
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
05.07.2013, 20:45     Передача символических имен функций #11
Цитата Сообщение от Pendalfik Посмотреть сообщение
С такими исходными данными должно быть Rezult w=21733.167969.
Посчитал руками и получилось 168.78. Мой код выше выдает аналогичный результат. В радианы не переводил.
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 20:48  [ТС]     Передача символических имен функций #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Какие вы изменения там внесли никому не видно. Код покажите с изменениями, а то вслепую всё...
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 <stdio.h>
#include <math.h>
#include <conio.h>
#include <windows.h>
#define Nx  4
#define Ny  5
#define Nz  6
void vvod(double x[ ], int n, char q);
double brackets(double x, int n, double a, double b, double f1(double), double f2(double))
{
    double series = (f1(a * x)+ f2(b * x));
    return series;
}
main()
{
char str[50];
textbackground(2);
textcolor(15);
clrscr();
double x[Nx], y[Ny], z[Nz], w, a, b, c, g, r, q;
CharToOem("\nВведите элементы массивов x, y, z:\n", str);
printf(str);
vvod(x, Nx, 'x');
vvod(y, Ny, 'y');
vvod(z, Nz, 'z');
CharToOem("\nВведите a:\n", str);
printf(str);
scanf("%lf",&a);
CharToOem("\n\nВведите b:\n", str);
printf(str);
scanf("%lf",&b);
CharToOem("\n\nВведите c:\n", str);
printf(str);
scanf("%lf",&c);
CharToOem("\n\nВведите  g:\n", str);
printf(str);
scanf("%lf",&g);
CharToOem("\n\nВведите  r:\n", str);
printf(str);
scanf("%lf",&r);
CharToOem("\n\nВведите  q:\n", str);
printf(str);
scanf("%lf",&q);
{
int i;
float w=0;
for (i=0; i<n; i++)
 w += brackets(x[i], Nx, a, b, sin, cos) + brackets(y[i], Ny, c, g, tan, abs) + brackets(z[i], Nz, r, q, cos, sin);
printf("\nw = %f",w);
 
CharToOem("\nДля выхода нажмите Enter", str);
printf(str);
getch();
}
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 20:52     Передача символических имен функций #13
Добавлено через 3 минуты
C++
1
int main()
Скобку в 45 строке удалите. И определите, наконец, переменную n.
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 20:53  [ТС]     Передача символических имен функций #14
Цитата Сообщение от Olivеr Посмотреть сообщение
Посчитал руками и получилось 168.78. Мой код выше выдает аналогичный результат. В радианы не переводил.
Другой компилятор кроме Borland использовать не могу. Ваш код уже просто скопировала и сохранила. При компиляции вот такие ошибки:
Миниатюры
Передача символических имен функций  
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 20:55     Передача символических имен функций #15
И разберитесь с w, она у вас float или double?
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
05.07.2013, 20:59     Передача символических имен функций #16
Pendalfik, похоже что abs для double не перегружена.
Попробуйте так:
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
typedef double (*Func)(double);
 
double sum(double *x,
           int n,
           double a,
           double b,
           Func f1,
           Func f2)
{
    double result = 0.0;
    while (n--)
        result += f1(a * x[n]) + f2(b * x[n]);
    return result;
}
 
double myAbs(double x)
{
    if (x < 0.0)
        x *= -1.0;
    return x;
}
 
double calc(double a,
            double b,
            double c,
            double g,
            double r,
            double q,
            double *x,
            double *y,
            double *z)
{
    double result =
        sum(x, 4, a, b, sin, cos) +
        sum(y, 5, c, g, tan, myAbs) +
        sum(z, 6, r, q, cos, sin);
    return result;
}
 
int main()
{
    double x[4] = {1, 2, 3, 4},
           y[5] = {5, 6, 7, 8, 9},
           z[6] = {10, 11, 12, 13, 14, 15},
           a = 1.5,
           b = 2.5,
           c = 3.3,
           g = 4.5,
           r = 5.5,
           q = 4.5;
    printf( "%4.2f", calc(a, b, c, g, r, q, x, y, z) );
    return 0;
}
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 21:01     Передача символических имен функций #17
И где реализация vvod()?

Добавлено через 2 минуты
Pendalfik, вот ваш код, который компилируется без ошибок (в студии). Добавил пустую реализацию vvod() и задал n = 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
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <windows.h>
#define Nx  4
#define Ny  5
#define Nz  6
void vvod(double x[ ], int n, char q)
{}
double brackets(double x, int n, double a, double b, double f1(double), double f2(double))
{
    double series = (f1(a * x)+ f2(b * x));
    return series;
}
 
int main()
{
char str[50];
//textbackground(2);
//textcolor(15);
//clrscr();
double x[Nx], y[Ny], z[Nz], w, a, b, c, g, r, q;
CharToOem("\nВведите элементы массивов x, y, z:\n", str);
printf(str);
vvod(x, Nx, 'x');
vvod(y, Ny, 'y');
vvod(z, Nz, 'z');
CharToOem("\nВведите a:\n", str);
printf(str);
scanf("%lf",&a);
CharToOem("\n\nВведите b:\n", str);
printf(str);
scanf("%lf",&b);
CharToOem("\n\nВведите c:\n", str);
printf(str);
scanf("%lf",&c);
CharToOem("\n\nВведите  g:\n", str);
printf(str);
scanf("%lf",&g);
CharToOem("\n\nВведите  r:\n", str);
printf(str);
scanf("%lf",&r);
CharToOem("\n\nВведите  q:\n", str);
printf(str);
scanf("%lf",&q);
 
int i;
int n = 3;
w = 0;
for (i=0; i<n; i++)
 w += brackets(x[i], Nx, a, b, sin, cos) + brackets(y[i], Ny, c, g, tan, abs) + brackets(z[i], Nz, r, q, cos, sin);
printf("\nw = %f",w);
 
CharToOem("\nДля выхода нажмите Enter", str);
printf(str);
getch();
return 0;
}
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 21:03  [ТС]     Передача символических имен функций #18
Цитата Сообщение от alsav22 Посмотреть сообщение
Добавлено через 3 минуты
C++
1
int main()
Скобку в 45 строке удалите. И определите, наконец, переменную n.
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
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <windows.h>
#define Nx  4
#define Ny  5
#define Nz  6
void vvod(double x[ ], int n, char q);
double brackets(double x, int n, double a, double b, double f1(double), double f2(double))
{
    double series = (f1(a * x)+ f2(b * x));
    return series;
}
main()
{
char str[50];
textbackground(2);
textcolor(15);
clrscr();
double x[Nx], y[Ny], z[Nz], w, a, b, c, g, r, q, n;
CharToOem("\nÂâåäèòå ýëåìåГ*ГІГ» Г¬Г*ññèâîâ x, y, z:\n", str);
printf(str);
vvod(x, Nx, 'x');
vvod(y, Ny, 'y');
vvod(z, Nz, 'z');
CharToOem("\nÂâåäèòå a:\n", str);
printf(str);
scanf("%lf",&a);
CharToOem("\n\nÂâåäèòå b:\n", str);
printf(str);
scanf("%lf",&b);
CharToOem("\n\nÂâåäèòå c:\n", str);
printf(str);
scanf("%lf",&c);
CharToOem("\n\nÂâåäèòå  g:\n", str);
printf(str);
scanf("%lf",&g);
CharToOem("\n\nÂâåäèòå  r:\n", str);
printf(str);
scanf("%lf",&r);
CharToOem("\n\nÂâåäèòå  q:\n", str);
printf(str);
scanf("%lf",&q);
int i;
float w=0;
for (i=0; i<n; i++)
 w += brackets(x[i], Nx, a, b, sin, cos) + brackets(y[i], Ny, c, g, tan, abs) + brackets(z[i], Nz, r, q, cos, sin);
printf("\nw = %f",w);
 
CharToOem("\nÄëÿ âûõîäГ* Г*Г*æìèòå Enter", str);
printf(str);
getch();
}
Миниатюры
Передача символических имен функций  
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 21:06     Передача символических имен функций #19
Насчёт этого всё написано:
Цитата Сообщение от alsav22 Посмотреть сообщение
И определите, наконец, переменную n.
Цитата Сообщение от alsav22 Посмотреть сообщение
И разберитесь с w, она у вас float или double?
Добавлено через 1 минуту
Значение n задайте и сделайте тип int, а не double.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 21:08     Передача символических имен функций
Еще ссылки по теме:

C++ Перегрузка имен функций
C++ Использование имен предопределенных объектов в качестве имен переменных
Передача массива в несколько функций, чтобы исходный массив не изменялся C++
Передача в "свойской" функции флагов и имен контейнеров C++
Передача функций обратного вызова как членов некоторого класса C++

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

Или воспользуйтесь поиском по форуму:
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 21:08  [ТС]     Передача символических имен функций #20
Простите, не увидела Ваш предыдущий ответ. У меня Ваш код все равно выдает две ошибки
а
C
1
n
я точно задать не могу - у меня три разных массива.
Миниатюры
Передача символических имен функций  
Yandex
Объявления
05.07.2013, 21:08     Передача символических имен функций
Ответ Создать тему
Опции темы

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