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

Предупреждение в программе с рекурсивными функциями - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 13:04     Предупреждение в программе с рекурсивными функциями #1
Вопрос по институтскому заданию.
Задача. Описать рекурсивные функции для определения pi, hi. Задать значение z и вычислить с.
p1=cos 1; p2=-sin1; h1=0.5; h2=sin0.5; pi=2p(i-1)-p(i-2); hi=z*h(i-1)+h(i-2); c=p9/h3+p4

Программа
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
#include <iostream.h>
#include <math.h>
 
double pFunction (int i);
double hFunction (int i, int z);
 
int main ( )
{
double c;
int z;
cout << "Input z=";
cin>> z;
 
c=pFunction (9)/hFunction (3, z)+pFunction (4);
cout << "c="<< c << endl;
 
return 0;
}
 
 
double pFunction (int i) //Рекурсивная функция для вычисления p
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*pFunction (i-1) - pFunction (i-2));
}
 
double hFunction (int i, int z) //Рекурсивная функция для вычисления h
{
    if (i==1)
        return 0.5;
    if (i==2)
        return sin (0.5);
    if (i>=3)
        return (z*hFunction (i-1, z) + hFunction (i-2,z));
}
При компиляции выдает два предепреждения
warning C4715: 'pFunction' : not all control paths return a value
warning C4715: 'hFunction' : not all control paths return a value

Что неверно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2011, 13:04     Предупреждение в программе с рекурсивными функциями
Посмотрите здесь:

C++ Массив с функциями
C++ Работа с функциями
C++ Работа с функциями..!
C++ Калькулятор с функциями
Работа с функциями C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:14     Предупреждение в программе с рекурсивными функциями #2
Цитата Сообщение от Heidel Посмотреть сообщение
warning C4715: 'pFunction' : not all control paths return a value
warning C4715: 'hFunction' : not all control paths return a value
"Не все пути выполнения возвращают значение".

C++
1
2
3
4
5
6
7
8
9
10
11
double hFunction (int i, int z) //Рекурсивная функция для вычисления h
{
        if (i==1)
                return 0.5;
        if (i==2)
                return sin (0.5);
        if (i>=3)
                return (z*hFunction (i-1, z) + hFunction (i-2,z));
 
       // а что, если i == -12? Что тогда возвращать?
}
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
11.10.2011, 13:17     Предупреждение в программе с рекурсивными функциями #3
Чуть чуть переделал. Зря объявляли просто в начале функции, а потом внизу в подпрограмме опять их объявляли.
Среда DEV-cpp

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
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
double pFunction (int i) 
{
        if (i==1)
                return cos (1);
        if (i==2)
                return -sin (1);
        if (i>=3)
                return (2*pFunction (i-1) - pFunction (i-2));
}
 
double hFunction (int i, int z) 
{
        if (i==1)
                return 0.5;
        if (i==2)
                return sin (0.5);
        if (i>=3)
                return (z*hFunction (i-1, z) + hFunction (i-2,z));
}
int main(int argc, char *argv[])
{
    
    double c;
int z;
cout << "Input z=";
cin>> z;
 
c=pFunction (9)/hFunction (3, z)+pFunction (4);
cout << "c="<< c << endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 2 минуты
эээ поспешил я, оно то компилируется но правильно ли работает?
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 13:25  [ТС]     Предупреждение в программе с рекурсивными функциями #4
IIIa66uMEM6eP, а что изменилось то? при компиляции твоего кода выдаются точно такие же предупреждения.


talis, а так?

C++
1
2
3
4
5
6
7
8
9
10
11
double pFunction (int i) //ÐåêóðñèâГ*Г*Гї ГґГіГ*êöèÿ äëÿ âû÷èñëåГ*ГЁГї p
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*pFunction (i-1) - pFunction (i-2));
    else 
        return 0;
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:29     Предупреждение в программе с рекурсивными функциями #5
Heidel, да, как-то так. Только else там бессмысленный, его можно убрать. Ну и вообще, подойдёт ли вам ноль, или нужно какое-то другое значение?
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 13:38  [ТС]     Предупреждение в программе с рекурсивными функциями #6
talis, ок, написала вот так
C++
1
2
3
4
5
6
7
8
9
10
double pFunction (int i) //ÐåêóðñèâГ*Г*Гї ГґГіГ*êöèÿ äëÿ âû÷èñëåГ*ГЁГї p
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*pFunction (i-1) - pFunction (i-2));
    return EXIT_SUCCESS;
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:40     Предупреждение в программе с рекурсивными функциями #7
*facepalm*

#define EXIT_SUCCESS 0
Что изменилось? Проверьте математическую сторону вашего алгоритма. Как он отнесётся к тому, что эта функция вернёт ноль? Возможен ли такой сценарий?
-=ЮрА=-
11.10.2011, 13:46
  #8

Не по теме:

Вопрос к ТС

Цитата Сообщение от Heidel Посмотреть сообщение
double pFunction (int i) //Рекурсивная функция для вычисления p
{
* * * * if (i==1)
* * * * * * * * return cos (1);
* * * * if (i==2)
* * * * * * * * return -sin (1);
* * * * if (i>=3)
* * * * * * * * return (2*pFunction (i-1) - pFunction (i-2));
* * * * return EXIT_SUCCESS;
}
- как Пи собрался вычислить через косинус и синус единицы, вообще бред, может арксинус нужен, да например арксинус 1 - это Пи на два

Nameless One
11.10.2011, 13:48
  #9

Не по теме:

-=ЮрА=-, там не http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi, там http://www.cyberforum.ru/cgi-bin/latex.cgi?p_i. Просто ТС не знает о latex-разметке

aeshes
11.10.2011, 13:49
  #10

Не по теме:

-=ЮрА=-, в задаче через pi обозначено не математическое Пи, а i-й член последовательности р
упс, не успела

Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 13:50  [ТС]     Предупреждение в программе с рекурсивными функциями #11
Nameless One, а как сделать
Цитата Сообщение от Nameless One Посмотреть сообщение
latex-разметку
?
-=ЮрА=-
Заблокирован
Автор FAQ
11.10.2011, 13:50     Предупреждение в программе с рекурсивными функциями #12
Вот так Пи можно вычислить
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    std::cout<<"PI = asin(1)*2 : "<<asin(1)*2<<"\r\n";
    system("pause");
    return 0;
}
Миниатюры
Предупреждение в программе с рекурсивными функциями  
-=ЮрА=-
11.10.2011, 13:52
  #13

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Не по теме:
-=ЮрА=-, там не , там . Просто ТС не знает о latex-разметке
- аааа ну тогды ясно, сам себе всё усложнил

aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 13:52     Предупреждение в программе с рекурсивными функциями #14
Heidel, над формой быстрого ответа есть редактор формул, похожий на редактор формул в Word, в нем и набираете
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.10.2011, 14:05     Предупреждение в программе с рекурсивными функциями #15
Я бы сделал так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double p(int i)
{
   double result;
   switch(i)
   {
   case 0:
      abort();
 
   case 1:
      result = cos(1.);
      break;
 
   case 2:
      result = - sin(1.);
      break;
   
   default:
     result = 2 * p(i - 1) - p(i - 2);
   }
   
   return result;
}
Или так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double p(int i)
{
   if(i == 0)
   {
       abort();
       return 0; // never gonna be executed
   }
   if(i == 1)
       return cos(1.);
   if(i == 2)
       return - sin(1.);
   
   return 2 * p(i - 1) - p(i - 2);
}
Или бы вообще сдвинул индексы так, чтобы они начинались с нуля:
C
1
2
3
4
5
6
7
8
double p(size_t i)
{
   if(i == 0)
      return cos(1.);
   if(i == 1)
      return - sin(1.);
   return 2 * p(i - 1) - p(i - 2);
}
Nameless One, а как сделать latex-разметку
Взять какую-нибудь книгу по http://www.cyberforum.ru/cgi-bin/latex.cgi?\LaTeX (я бы посоветовал "Набор и верстка в системе http://www.cyberforum.ru/cgi-bin/latex.cgi?\LaTeX" Львовского), и почитать главу о наборе математических формул. Формулы набираются в парном теге [latex][/latex]. Ну или, как посоветовали выше, воспользоваться редактором формул
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2011, 14:27     Предупреждение в программе с рекурсивными функциями
Еще ссылки по теме:

Помощь с функциями C++
C++ Знакомство с функциями
C++ Не получается с функциями

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

Или воспользуйтесь поиском по форуму:
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
11.10.2011, 14:27  [ТС]     Предупреждение в программе с рекурсивными функциями #16
Nameless One, со switch очень хороший вариант, спасибо!
Yandex
Объявления
11.10.2011, 14:27     Предупреждение в программе с рекурсивными функциями
Ответ Создать тему
Опции темы

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