Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
1

Вопрос по определению типа переменной

24.10.2011, 14:44. Показов 2469. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В основной программе вычисляется с
C++
1
2
3
c = p (9)/h (3, z) + p (4); //Âû÷èñëåíèå ñ. Âûçîâ ðåêóðñèâíûõ ôóíêöèé p è h
cout << "c="<< c << endl;
cout <<"\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
// Ðåêóðñèâíàÿ ôóíêöèÿ äëÿ âû÷èñëåíèÿ p
double p (int i) 
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*p (i-1) - p (i-2));
    return EXIT_SUCCESS;
}
 
// Ðåêóðñèâíàÿ ôóíêöèÿ äëÿ âû÷èñëåíèÿ h
double h (int i, int z)
{
    if (i==1)
        return 0.5;
    if (i==2)
        return sin (0.5);
    if (i>=3)
        return (z*h (i-1, z) + h (i-2,z));
    return EXIT_SUCCESS;
}
Вопрос в том, что при вычислении с её тип нигде не указан, а при попытке указать
C++
1
double c;
или
C++
1
double c= p (9)/h (3, z) + p (4);
пишет error C2086: 'c' : redefinition

Что неправильно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2011, 14:44
Ответы с готовыми решениями:

Приведение переменной типа object к переменной производного типа в приложенном коде
Добрый день! Столкнулся с проблемой. Есть обработчик события. Обработчик события общий для двух...

Переменной d присвоить первую цифру после запятой некоторой переменной x типа float
Нужно целой переменной d присвоить первую цыфру после комы некоторой переменной x типа float ...

Как из переменной вида Real достать целую часть и сделать её переменной порядкового типа?
В программе была переменная типа Real. Применил к этой переменной функцию Int(x) (возвращает целую...

При присваивании символа unicode переменной типа char происходит выход за диапазон переменной
В программе при присваивании символа unicode переменной типа char происходит выход за диапазон...

20
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.10.2011, 14:53 2
Heidel, Значит очевидно где-то указан. Фулл код плиз.
0
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
24.10.2011, 14:56  [ТС] 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
#include <iostream.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
 
// Функция для расчета f(x,y)
double Func1 (double x, double y) 
{
    return sqrt(x)+(pow(y,2)/x);
}
 
// Рекурсивная функция для вычисления p
double p (int i) 
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*p (i-1) - p (i-2));
    return EXIT_SUCCESS;
}
 
// Рекурсивная функция для вычисления h
double h (int i, int z)
{
    if (i==1)
        return 0.5;
    if (i==2)
        return sin (0.5);
    if (i>=3)
        return (z*h (i-1, z) + h (i-2,z));
    return EXIT_SUCCESS;
}
 
// Заполнение массива произвольного размера случайными числами
void ZapolnenieMassiva (double *Massive, int SizeOfMassive)
{
 
cout << "Massiv iz " << SizeOfMassive <<" elementov\n";
 
    for (int i=0; i<SizeOfMassive; i++)
    {
        *(Massive+i)= rand()%101;
        cout << *(Massive+i) << " " ;
    }
    cout <<"\n\n" ;
}
 
// Обработка массива. Элементы массива, кратные какому-либо числу (Delitel), умножаются на переменную
void ObrabotkaMassiva (double *Massive, int SizeOfMassive, int Delitel, double Peremennaya)
{       
    
cout << "Elementy massiva kratnye " << Delitel << " umnojit na " << Peremennaya << "\n";
 
    for (int i=0; i<SizeOfMassive; i++)
    {
        
            if (fmod (*(Massive+i),Delitel)==0)
            {
                *(Massive+i) = *(Massive+i)*Peremennaya;
            }
            cout << *(Massive+i) << " " ;
    }
    cout <<"\n\n" ;
}
 
 
int main ( )
{
 
int s;
int t;
    cout << "Input s=";
    cin >> s;
    cout << "Input t=";
    cin >> t;
    cout <<"\n" ;
 
    double a = Func1(sqrt(abs(s)), t); //Вычисление a. Вызов функции Func1
    cout << "a=" << a << endl;
    
    double b = pow(t,2)+Func1(s,s); //Вычисление b. Вызов функции Func1   
    cout << "b=" << b << endl;
    cout <<"\n" ;
                                                                                                                                                                                       double c;
int z;
    cout << "Input z=";
    cin>> z;
    cout <<"\n" ;
 
    c = p (9)/h (3, z) + p (4); //Вычисление с. Вызов рекурсивных функций p и h
    cout << "c="<< c << endl;
    cout <<"\n" ;
 
double *nMassive, *mMassive, *lMassive;
int i=9, j=10, k=11;
int Delitel1=3, Delitel2=5, Delitel3=2;
 
    srand(time(NULL));
 
    nMassive = new double [i];
    mMassive = new double [j];
    lMassive = new double [k];
 
    ZapolnenieMassiva (nMassive, i); 
    ZapolnenieMassiva (mMassive, j);
    ZapolnenieMassiva (lMassive, k);
 
    cout <<"\n" ;
 
    ObrabotkaMassiva (nMassive, i, Delitel1, a );
    ObrabotkaMassiva (mMassive, j, Delitel2, b );
    ObrabotkaMassiva (lMassive, k, Delitel3, c );
 
return 0;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.10.2011, 15:07 4
C++
1
double c;
86 строчка в сааааамом конце.
0
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
24.10.2011, 15:10  [ТС] 5
Виновата, не заметила) Глупый вопрос получился)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.10.2011, 09:41 6
Цитата Сообщение от Heidel
C++
1
2
3
4
5
6
7
8
9
10
11
// Рекурсивная функция для вычисления p
double p (int i) 
{
        if (i==1)
                return cos (1);
        if (i==2)
                return -sin (1);
        if (i>=3)
                return (2*p (i-1) - p (i-2));
        return EXIT_SUCCESS;
}
EXIT_SUCCESS используется только для возврата из main()
(это целочисленная константа)
1
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
25.10.2011, 10:12 7
Цитата Сообщение от accept Посмотреть сообщение
EXIT_SUCCESS используется только для возврата из main()
(это целочисленная константа)
какая разница? в дабл преобрзуется ведь
0
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
25.10.2011, 10:18  [ТС] 8
Если убрать строку
C++
1
return EXIT_SUCCESS;
программа выдаст предупреждение warning C4715: 'p' : not all control paths return a value
Я не знаю каким еще образом можно учесть все варианты рекурсивной функции.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.10.2011, 10:31 9
Heidel, return 0 как бэ.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.10.2011, 01:44 10
Цитата Сообщение от vndtta
какая разница? в дабл преобрзуется ведь
оператор return должен возвращать тот же тип, что в определении функции
даже когда там есть неявное приведение

Цитата Сообщение от Heidel
Если убрать строку
когда пишешь оператор return, нужно смотреть на возвращаемое значение функции
C++
1
    return 0.0;
0
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
26.10.2011, 08:03  [ТС] 11
accept, ясно, спасибо)
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
26.10.2011, 12:02 12
Цитата Сообщение от accept Посмотреть сообщение
оператор return должен возвращать тот же тип, что в определении функции
даже когда там есть неявное приведение


когда пишешь оператор return, нужно смотреть на возвращаемое значение функции
C++
1
    return 0.0;
специально для тебя
C++
1
2
3
4
5
6
7
8
float f(){
    return 0;
}
 
int main(){
    float i=f();
    return 0;
}
компилирую
Bash
1
gcc -Wall 1.cpp -o 1
вывод
Bash
1
2
1.cpp: In function 'int main()':
1.cpp:6: warning: unused variable 'i'
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.10.2011, 02:08 13
C++
1
2
3
4
5
6
7
8
9
10
11
float f()
{
    return 0.0;
}
 
int main(){
    float i = f();
    
    std::cout << i << std::endl;
    return 0;
}
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
27.10.2011, 02:34 14
Цитата Сообщение от accept Посмотреть сообщение
0.0
Вообще-то это double, а не float.
И возвращать не обязательно именно такой тип, который указан в заголовке функции.
Главное, чтобы этот тип смог преобразоваться в тип, указанный в заголовке функции.
Т.е. 0.0 (double) преобразуется в float. 0( int ) преобразуется в float.
'a'( char ) преобразуется в float и т.д.

Добавлено через 2 минуты
Цитата Сообщение от vndtta Посмотреть сообщение
оператор return должен возвращать тот же тип, что в определении функции
даже когда там есть неявное приведение
Вы поняли, что сказали? Как это написать тип, указанный в заголовке функции, и при этом не тип, указанный в заголовке функции?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.10.2011, 02:39 15
Цитата Сообщение от Chelioss
'a'( char ) преобразуется в float и т.д.
если функция возвращает float, то надо писать число типа float
а писать char, когда она возвращается float - это только запутывать код

Цитата Сообщение от Chelioss
Вообще-то это double, а не float.
главное, что оно вещественное, а не целое и не символ

Цитата Сообщение от accept
оператор return должен возвращать тот же тип, что в определении функции
даже когда там есть неявное приведение
это вопрос оформления кода
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
27.10.2011, 02:44 16
Т.е. надо сперва поспорить, а только потом сказать про
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
?
Ну вы молодец.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.10.2011, 05:37 17
Цитата Сообщение от Chelioss
Т.е. надо сперва поспорить, а только потом сказать про
если ей сказать про оформление кода, она это не воспримет
потому говорится сразу "нельзя писать без отступов, нельзя использовать goto, нельзя делать бесконечные циклы, функция должна возвращать соответствующее значение"
иначе появляется что-нибудь вроде "return EXIT_SUCCESS;" , что тоже сработает без ошибок
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.10.2011, 05:51 18
Цитата Сообщение от Chelioss Посмотреть сообщение
Вообще-то это double, а не float.
И возвращать не обязательно именно такой тип, который указан в заголовке функции.
Главное, чтобы этот тип смог преобразоваться в тип, указанный в заголовке функции.
Обязательно. Если ты хочешь вернуть значение другого, но совместимого типа, то его обязательно надо преобразовать к типу самой функции. Хоть неявно, но обязательно. Не веришь - попробуй вернуть значение типа без обратной совместимости (то есть чтоб тип значения приводился к типу функции, а наоборот - нет), а в вызывающей функции присвоить его переменной типа самого значения. Или попробуй вернуть значение, тип которого может быть приведён к типу функции только явно.

Добавлено через 7 минут
Цитата Сообщение от Chelioss Посмотреть сообщение
Вы поняли, что сказали? Как это написать тип, указанный в заголовке функции, и при этом не тип, указанный в заголовке функции?
Он то понял, а ты нет. В заголовке указан один тип, явный операнд return имеет другой тип. Например,
C++
1
2
3
4
float f()
{
 return 0;
}
. В этом случае будет подставлено неявное преобразование, то есть на самом деле будет
C++
1
2
3
4
float f()
{
 return ((float)0);
}
, функция вернёт 0.0f, а не 0.

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
главное, что оно вещественное, а не целое и не символ
Контроль типов более строгий, чем твоё "лишь бы вещественное" и если вместо 0.0f подсунуть 0.0, то будет неявное приведение.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.10.2011, 06:02 19
Цитата Сообщение от taras atavin
и если вместо 0.0f подсунуть 0.0
можно любую заюзать, главное, что не символ 'a', когда функция возвращает вещественное число
потому что есть такая вещь, как "самодокументированность кода", когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
значит, либо у функции поменяли возвращаемый тип и забыли переделать тело, либо в функцию копировали из другого места и тоже не всё проверили
а когда всё соответствует, тогда всё нормально
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.10.2011, 07:03 20
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
Это вопрос контроля типов, ни чего общего с оформлением не имеющий.

Добавлено через 2 минуты
Цитата Сообщение от accept Посмотреть сообщение
когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
Нет. Надо только понимать, что под этим подразумевается приведение типа, а в вызывающей функции будет получен 0.0f.
0
27.10.2011, 07:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2011, 07:03
Помогаю со студенческими работами здесь

Попытка присвоить переменной типа integer выражение типа real
Здравствуйте форумчане. Написала программу для замены элементов массива после максимального...

Как сравнить переменную типа String с переменной типа Int?
Как сравнить переменную типа String с переменной типа Int в конструкции &quot;if&quot;???

Ошибка: присвоить переменной типа real выражение типа boolean
program graf; var x, y: real; begin writeln('Input x= '); readln(x); begin if (x &gt;...

Перенос значения переменной типа Real в переменную типа Integer
Как сделать так чтобы переменная типа integer приняло число которое было в переменной типа real???


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru