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

Работа с пользовательскими функциями на языке С++ - C++

Восстановить пароль Регистрация
 
VВладимир
1 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 50
15.11.2013, 17:50     Работа с пользовательскими функциями на языке С++ #1
Здравствуйте! Написал несложную программу на С++. В данный момент времени попытался разбить ее на функции, но она неправильно работает - после разбивки на функции она выдает некорректный результат.Однако если все выражения описаны в одной главной функции main, то расчет правильный. Я думаю, что после разбивки на функции у меня неправильно организован вызов описанных в программе пользовательских функций. Подскажите, пожалуйста, что я неправильно делаю. Заранее благодарен! Прикладываю текст программы, в которой кроме главной присутствует одна пользовательская функция.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <windows.h> 
#include <iostream> 
#include <iomanip>
 
char bufRus[256];
 
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
     
using namespace std;
 
 
float x111, x112, x113, x114, x121, x122, x123, x124, x131, x132, x133, x134, x141, x142, x143, x144, alpha ;
float w111, w112, w113, w114, w121, w122, w123, w124, w131, w132, w133, w134, w141, w142, w143, w144;
float y11, y12, y13, y14;
 
float function1_sloy1  (float S11, float S12, float S13, float S14, float f11, float f12, float f13, float f14)
{
x111=88.8;     x112= 88.8;        x113=88.8;     x114=88.8;                       w111=0.42;   w112=0.4; w113=0.5;     w114=0.6;
x121=400;          x122=400;              x123=400;         x124=400;                         w121=0.09;  w122=0.3;  w123=0.2;     w124=0.2;
x131=21.6;           x132=21.6;           x133=21.6;         x134=21.68;                          w131=0.17;   w132=0.2;  w133=0.2;    w134=0.15;
x141=80;                x142=80;          x143=80;         x144=80;                                  w141=0.33;   w142=0.1;  w143= 0.1;   w144=0.05;                                             
                                                                                                        
S11=x111*w111+x121*w121+x131*w131+x141*w141;
S12=x112*w112+x122*w122+x132*w132+x142*w142;
S13=x113*w113+x123*w123+x133*w133+x143*w143;
S14=x114*w114+x124*w124+x134*w134+x144*w144;
 
alpha=0.5;
f11=-0.5+1 / (1 + exp(-1 *alpha *S11));    
f12=-0.5+1 / (1 + exp(-1 *alpha *S12));    
f13=-0.5+1 / (1 + exp(-1 *alpha *S13));    
f14=-0.5+1 / (1 + exp(-1 *alpha *S14)); 
 
y11=(-0.5+1 / (1 + exp(-1 *alpha *S11)));    
y12=(-0.5+1 / (1 + exp(-1 *alpha *S12)));    
y13=(-0.5+1 / (1 + exp(-1 *alpha *S13)));    
y14=(-0.5+1 / (1 + exp(-1 *alpha *S14)));
 
  return y11;
  return y12;
  return y13;
  return y14; 
 
}
 
int main() 
{
float y11, y12, y13, y14;
 
float function1_sloy1  (float S11, float S12, float S13, float S14, float f11, float f12, float f13, float f14) //Здесь //компилятор находит ошибку
 
 cout <<y11<< endl;
cout <<y12<< endl;
cout <<y13<< endl;
cout <<y14<< endl;
 system("pause");  
 return 0;
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2013, 17:50     Работа с пользовательскими функциями на языке С++
Посмотрите здесь:

C++ Работа с функциями
работа с функциями C++
Поменять местами значения i и j элементов массива с пользовательскими функциями C++
C++ Работа с функциями
C++ динамический массив с пользовательскими функциями
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aleator
 Аватар для Aleator
66 / 66 / 3
Регистрация: 04.05.2011
Сообщений: 1,142
15.11.2013, 17:59     Работа с пользовательскими функциями на языке С++ #2
Цитата Сообщение от VВладимир Посмотреть сообщение
return y11;
return y12;
return y13;
return y14;
Не понял? Что это такое?
VВладимир
1 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 50
15.11.2013, 18:20  [ТС]     Работа с пользовательскими функциями на языке С++ #3
Моя функция должна возвращать значения - это можно сделать с помощью оператора return - как я понял его использование в моем случае обязательно, так как функция возвращает значание. Но правильно я его использую - это другой вопрос. компилятор находит ошибку в 57 сроке при попытке вызова функции - expected init-declarator before "cout".
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.11.2013, 19:24     Работа с пользовательскими функциями на языке С++ #4
float function1_sloy1 (float S11, float S12, float S13, float S14, float f11, float f12, float f13, float f14) //Здесь //компилятор
это объявление функции в теле другой функции или что?
VВладимир
1 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 50
15.11.2013, 19:31  [ТС]     Работа с пользовательскими функциями на языке С++ #5
Это попытка вызова функции function1_sloy1 в теле функции main - смотрел в нескольких источниках - там сделано так же - сначала функция описывается, а затем вызывается в функции main. Все равно ее надо где-то вызвать, чтобы получить результат. Но, видимо, я делаю это неправильно. В тех примерах, откуда я это взял, были очень простые функции, моя функция более громоздкая по сравнению с ними. Просто хочется, чтобы все работало...
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.11.2013, 19:38     Работа с пользовательскими функциями на языке С++ #6
не не, у тебя именно попытка описать функцию. Этого в теле другой функции нельзя.

вызов функции выглядит как
C++
1
y = function1_sloy1(p1, p2, p3, p4, p5, p6, p7, p8);
это значит раз.
Два - это то, что функция может вернуть только одно значение. так что

C++
1
2
3
4
  return y11;
  return y12;
  return y13;
  return y14;
есть бессмысленный код. если тебе нужно вернуть много значений, то:
можно вернуть структуру,
можно передать указателя для результата в параметры,
можно вернуть указатель на "массив".

в общем нужно тебе самые основы языка почитать.
VВладимир
1 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 50
15.11.2013, 23:03  [ТС]     Работа с пользовательскими функциями на языке С++ #7
Спасибо. Я уже понял свою ошибку - функция может вернуть только одно значение. Я уже разобрался
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
16.11.2013, 00:39     Работа с пользовательскими функциями на языке С++ #8
Попытаюсь объяснить попроще.Оставим на будущее указатели,массивы,структуры и т.д.В вашем случае.Представте себе кастрюлю и сковородку где вы можете сварить суп и приготовить что то еще.Продукты одни и те же но блюда получатся разные их можно и смешать.Кастрюля и сковородка это и есть наши функции.Инградиенты(продукты) это наши переменные.Мы говорим,что в кастрюле мы варим суп,а на сковородке котлеты.Это то,что будут выдавать наши функции.Понятно,что из кастрюли мы сможем взять только суп,но не суп и автомобиль и пылесос.Что имеется в кастрюле никак не может оказаться на сковородке.Это к тому,что все переменные в теле функции так в ней и останутся,выйдет только то что мы укажем т.е результат нам же это нужно.Просмотреть наши переменные в теле функции мы можем с помощью оператора cout сколько угодно,результат вывести return но только один.Смотрим ваш код.
C++
1
2
3
float x111, x112, x113, x114, x121, x122, x123, x124, x131, x132, x133, x134, x141, x142, x143, x144, alpha ;
float w111, w112, w113, w114, w121, w122, w123, w124, w131, w132, w133, w134, w141, w142, w143, w144;
float y11, y12, y13, y14;
куча переменных объявлена глобольно и нигде не используются за исключением
C++
1
float y11, y12, y13, y14;
которые объявлены еще и в int main()Функции
C++
1
float function1_sloy1  (float S11, float S12, float S13, float S14, float f11, float f12, float f13, float f14)
принимать нечего.Т.е вы собрались варить суп,а принесли кучу железок.Здесь
C++
1
2
3
4
x111=88.8;     x112= 88.8;        x113=88.8;     x114=88.8;                       w111=0.42;   w112=0.4; w113=0.5;     w114=0.6;
x121=400;          x122=400;              x123=400;         x124=400;                         w121=0.09;  w122=0.3;  w123=0.2;     w124=0.2;
x131=21.6;           x132=21.6;           x133=21.6;         x134=21.68;                          w131=0.17;   w132=0.2;  w133=0.2;    w134=0.15;
x141=80;                x142=80;          x143=80;         x144=80;
у вас что то инициализировано,но никто не знает что это.Тип переменных не указан.Далее
C++
1
2
3
4
S11=x111*w111+x121*w121+x131*w131+x141*w141;
S12=x112*w112+x122*w122+x132*w132+x142*w142;
S13=x113*w113+x123*w123+x133*w133+x143*w143;
S14=x114*w114+x124*w124+x134*w134+x144*w144;
Тоже тип не известен,но все строчки делают одно и то же т.е пусть это будет не S11,S12...... а S = a * b + c * d + x * y + m * n.У вас это выполняется 4 раза.Напишем одну функцию и будем вызывать ее столько сколько нам нужно,а данные вводить либо с клавиатуры либо как у вас как угодно.Объявление функции будет выглядеть так.
Тип возвращаемого значения//имя функции//то что мы хотим принимать
C++
1
float Summ (float a,float b,float c,float d,float x,float y,float m,float n)
Наша функция будет
C++
1
2
3
4
5
6
float Summ (float a,float b,float c,float d,float x,float y,float m,float n)
{
float  S = 0;//объявили переменную и обнулили
 S = a * b + c * d  + x * y + m * n;//указали что нужно делать с принятыми переменными
return S;//вернули результат
}
Но лучше так результат будет один и тот же но нагляднее
C++
1
2
3
4
float Summ (float a,float b,float c,float d,float x,float y,float m,float n)
{
return a * b + c * d  + x * y + m * n;//указали что нужно делать с принятыми переменными и вернули результат
}
Аналогично
C++
1
2
3
4
5
6
7
8
9
10
float function1_sloy1 (float a)
{
float alpha= 0.9;
return -0.5+1 / (1 + exp(-1 *alpha *a));
}
float function2_sloy2 (float a)
{
float alpha= 0.5;
return (-0.5+1 / (1 + exp(-1 *alpha *a)));
}
Вызываем в мейне
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
 
{
float y11 = 0, y12 = 0, y13 = 0;
float x111=88.8,w111=0.42,x121=400,w121=0.09,x131=21.6,w131=0.17,w133=0.2,x141=80;
 
 y11=Summ ( x111,w111,x121,w121, x131,w131,x141,w133);
 y12 = function1_sloy1 (y11);
 y13 = function2_sloy2 (y11);
 cout <<y11<< endl;
 cout <<y12<< endl;
 cout <<y13<< endl;
 system("pause");
 return 0;
 }
Как то так.Возможны опечатки писал в окне.Возможны и не точности подправте ,но я понимаю так.Результат не знаю какой,но работать будет.
VВладимир
1 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 50
16.11.2013, 14:25  [ТС]     Работа с пользовательскими функциями на языке С++ #9
Спасибо за помощь! Я разобрался. Я понял, что функция может вычислять много значений, а возвратить только одно. Еще помог небольшой видеокурс. То есть практически ничто не мешает построить большой расчет в одной функции, а возвратить только нужное значение, что мне и надо в принципе. Единственный минус - громоздкость функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2013, 16:42     Работа с пользовательскими функциями на языке С++
Еще ссылки по теме:

Работа с функциями C++
Работа с функциями C++
Работа с функциями C++

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

Или воспользуйтесь поиском по форуму:
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
16.11.2013, 16:42     Работа с пользовательскими функциями на языке С++ #10
Вы считаете это громоздким?
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <windows.h> 
#include <iostream> 
#include <iomanip>
 
char bufRus[256];
 
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
     
using namespace std;
 
 float Summ (float a,float b,float c,float d,float x,float y,float m,float n)
{
return a * b + c * d  + x * y + m * n;//указали что нужно делать с принятыми переменными и вернули результат
}
float function1_sloy1 (float a)
{
float alpha= 0.9;
return -0.5+1 / (1 + exp(-1 *alpha *a));
}
float function2_sloy2 (float a)
{
float alpha= 0.5;
return (-0.5+1 / (1 + exp(-1 *alpha *a)));
}
 
int main()
 
{
float y11 = 0, y12 = 0, y13 = 0;
float x111=88.8,w111=0.42,x121=400,w121=0.09,x131=21.6,w131=0.17,w133=0.2,x141=80;
 
 y11=Summ ( x111,w111,x121,w121, x131,w131,x141,w133);
 y12 = function1_sloy1 (y11);
 y13 = function2_sloy2 (y11);
 cout <<y11<< endl;
 cout <<y12<< endl;
 cout <<y13<< endl;
 system("pause");
 return 0;
 }
Каждая функция содержит всего одну строчку кода
Yandex
Объявления
16.11.2013, 16:42     Работа с пользовательскими функциями на языке С++
Ответ Создать тему
Опции темы

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