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

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

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

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

05.07.2013, 14:26. Просмотров 745. Ответов 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();
}
0
Миниатюры
Передача символических имен функций  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 14:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача символических имен функций (C++):

Перегрузка имен функций - C++
Благодаря чему в С++ разрешена перегрузка имен функций?

Передача значений функций в главную программу, вызов функций - C++
Здравствуйте! Скорее всего, неправильно передаю значения функциям и в главную программу. Помогите найти ошибку! В итоге выводит...

Пространства имен и перегрузка функций - C++
описание: есть библиотека. Пространство имен namespace1, в нем есть несколько перегруженных функций func(). // header.h #ifndef...

"Автозаполнение" имен типов/функций/переменных - C++
Собственно вопрос в названии. Чтобы понимать, что за &quot;автозаполнение&quot; : когда вписываешь экземпляр класса/структуры, выдается окошко выбора...

Задачи из книги Прата (представить значения с помощью символических констант) - C++
Только начал изучать книгу Прата &quot;Язык программирования С++&quot;,столкнулся с такой задачей: Напишите программу, которая запрашивает широту в...

Передача в "свойской" функции флагов и имен контейнеров - C++
Добрый день! Пишу значит функцию, что она конкретно делает не важно в данном контексте: void GetDIR(const char *Target, ??????? )...

26
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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;
}
1
alsav22
5425 / 4820 / 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;
}
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();
}
0
Миниатюры
Передача символических имен функций  
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 21:06 #19
Насчёт этого всё написано:
Цитата Сообщение от alsav22 Посмотреть сообщение
И определите, наконец, переменную n.
Цитата Сообщение от alsav22 Посмотреть сообщение
И разберитесь с w, она у вас float или double?
Добавлено через 1 минуту
Значение n задайте и сделайте тип int, а не double.
0
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 21:08  [ТС] #20
Простите, не увидела Ваш предыдущий ответ. У меня Ваш код все равно выдает две ошибки
а
C
1
n
я точно задать не могу - у меня три разных массива.
0
Миниатюры
Передача символических имен функций  
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 21:09 #21
Цитата Сообщение от Pendalfik Посмотреть сообщение
int main()
Где сделали?
0
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 21:14  [ТС] #22
Цитата Сообщение от 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
55
56
57
58
59
 
#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;
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;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 21:22 #23
Насчёт ошибок. Первые пять это предупреждения (не ошибки), что переменные не используются и что значение n не задано. Нужно задать значение n. А ошибка одна. Попробуйте вместо abs ниписать fabs.
1
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 21:27  [ТС] #24
Цитата Сообщение от alsav22 Посмотреть сообщение
Насчёт ошибок. Первые пять это предупреждения (не ошибки), что переменные не используются и что значение n не задано. Нужно задать значение n. А ошибка одна. Попробуйте вместо abs ниписать fabs.
Заменила, ошибки действительно пропали. Последний вопрос: как при моём задании мне задать значение n?

Добавлено через 2 минуты
А vvod так и не работает...
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 21:30 #25
Цитата Сообщение от Pendalfik Посмотреть сообщение
А vvod так и не работает...
А где у вас реализации vvod()? Чему работать?
0
Pendalfik
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 31
05.07.2013, 21:38  [ТС] #26
Цитата Сообщение от alsav22 Посмотреть сообщение
А где у вас реализации vvod()? Чему работать?
а вот это:
C
1
2
3
vvod(x, Nx, 'x');
vvod(y, Ny, 'y');
vvod(z, Nz, 'z');
Просто в предыдущем задании (там была одна функция и было проще) vvod работал
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
#include<stdio.h>
#include<math.h>
#define Nx  6
#define Ny 10
#define Nz  9
void vvod(float x[], int n, char q);
float sum(float x[], int n, double f1(double));
void main()
{
float x[Nx], y[Ny], z[Nz], w, znam;
vvod(x, Nx, 'x');
vvod(y, Ny, 'y');
vvod(z, Nz, 'z');
znam=sum(y, Ny, cos);
if(znam)
{
w=sum(x, Nx, sin)/znam+sum(z, Nz, tan);
printf("w=%f\n",w);
}
else
puts("Деление на 0");
}
void vvod(float x[], int n, char q)
{
int i;
for (i=0; i<n; i++)
{
printf("Введите %c[%i]=\n",q, i+1);
scanf("%f",&x[i]);
}
return;
 }
float sum(float x[], int n, double f1(double))
{
float s=0;
int i;
for(i=0; i<n; i++)
s+=x[i] * f1(x[i]);
return s;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 21:46 #27
Цитата Сообщение от Pendalfik Посмотреть сообщение
а вот это:
Это вызов функции, у которой нет реализации.

Добавлено через 1 минуту
Цитата Сообщение от Pendalfik Посмотреть сообщение
vvod работал
Потому что там реализация написана.

Добавлено через 2 минуты
Специально для вас:
C++
1
2
3
4
5
6
7
8
9
void vvod(double x[ ], int n, char q)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("Введите %c[%i]=\n", q, i + 1);
        scanf("%f",&x[i]);
    }
}
Добавлено через 3 минуты
Вот это в одном цикле не получится подсчитать, потому что размеры массивов разные:
C++
1
w += brackets(x[i], Nx, a, b, sin, cos) + brackets(y[i], Ny, c, g, tan, fabs) + brackets(z[i], Nz, r, q, cos, sin);
Для каждого массива сделайте свой цикл (для вычисления brackets(x[i], Nx, a, b, sin, cos)), потом результаты сложите.
1
05.07.2013, 21:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 21:46
Привет! Вот еще темы с ответами:

Передача значений функций - C++
извините конечно за дурацкий вопрос, не нашёл, думаю, может вы поможете... задача такова: мне надо например сделать 3 разных функции...

Использование имен предопределенных объектов в качестве имен переменных - C++
Есть код: #include &lt;iostream&gt; using namespace std; void func() { int cout; cout &lt;&lt;cout &lt;&lt;endl; }

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные? - C++
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Передача параметров указателями при написании функций - C++
Как написать вот такую программу : Вычислить и запомнить суммы положительных элементов каждой строки матрицы a(10,20), b(15,10)....


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

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

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