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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 14:44     Вопрос по определению типа переменной #1
В основной программе вычисляется с
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

Что неправильно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.10.2011, 14:53     Вопрос по определению типа переменной #2
Heidel, Значит очевидно где-то указан. Фулл код плиз.
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
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;
}
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.10.2011, 15:07     Вопрос по определению типа переменной #4
C++
1
double c;
86 строчка в сааааамом конце.
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 15:10  [ТС]     Вопрос по определению типа переменной #5
Виновата, не заметила) Глупый вопрос получился)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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()
(это целочисленная константа)
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
25.10.2011, 10:12     Вопрос по определению типа переменной #7
Цитата Сообщение от accept Посмотреть сообщение
EXIT_SUCCESS используется только для возврата из main()
(это целочисленная константа)
какая разница? в дабл преобрзуется ведь
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
25.10.2011, 10:18  [ТС]     Вопрос по определению типа переменной #8
Если убрать строку
C++
1
return EXIT_SUCCESS;
программа выдаст предупреждение warning C4715: 'p' : not all control paths return a value
Я не знаю каким еще образом можно учесть все варианты рекурсивной функции.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.10.2011, 10:31     Вопрос по определению типа переменной #9
Heidel, return 0 как бэ.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.10.2011, 01:44     Вопрос по определению типа переменной #10
Цитата Сообщение от vndtta
какая разница? в дабл преобрзуется ведь
оператор return должен возвращать тот же тип, что в определении функции
даже когда там есть неявное приведение

Цитата Сообщение от Heidel
Если убрать строку
когда пишешь оператор return, нужно смотреть на возвращаемое значение функции
C++
1
    return 0.0;
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
26.10.2011, 08:03  [ТС]     Вопрос по определению типа переменной #11
accept, ясно, спасибо)
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
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'
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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;
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
27.10.2011, 02:34     Вопрос по определению типа переменной #14
Цитата Сообщение от accept Посмотреть сообщение
0.0
Вообще-то это double, а не float.
И возвращать не обязательно именно такой тип, который указан в заголовке функции.
Главное, чтобы этот тип смог преобразоваться в тип, указанный в заголовке функции.
Т.е. 0.0 (double) преобразуется в float. 0( int ) преобразуется в float.
'a'( char ) преобразуется в float и т.д.

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

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

Цитата Сообщение от accept
оператор return должен возвращать тот же тип, что в определении функции
даже когда там есть неявное приведение
это вопрос оформления кода
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
27.10.2011, 02:44     Вопрос по определению типа переменной #16
Т.е. надо сперва поспорить, а только потом сказать про
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
?
Ну вы молодец.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2011, 05:37     Вопрос по определению типа переменной #17
Цитата Сообщение от Chelioss
Т.е. надо сперва поспорить, а только потом сказать про
если ей сказать про оформление кода, она это не воспримет
потому говорится сразу "нельзя писать без отступов, нельзя использовать goto, нельзя делать бесконечные циклы, функция должна возвращать соответствующее значение"
иначе появляется что-нибудь вроде "return EXIT_SUCCESS;" , что тоже сработает без ошибок
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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, то будет неявное приведение.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2011, 06:02     Вопрос по определению типа переменной #19
Цитата Сообщение от taras atavin
и если вместо 0.0f подсунуть 0.0
можно любую заюзать, главное, что не символ 'a', когда функция возвращает вещественное число
потому что есть такая вещь, как "самодокументированность кода", когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
значит, либо у функции поменяли возвращаемый тип и забыли переделать тело, либо в функцию копировали из другого места и тоже не всё проверили
а когда всё соответствует, тогда всё нормально
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2011, 07:03     Вопрос по определению типа переменной
Еще ссылки по теме:

C++ Удаление переменной типа класса
C++ Вопрос об области видимости переменной
Объявление переменной своего типа C++
C++ Шаблон типа переменной
C++ Определение типа переменной

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.10.2011, 07:03     Вопрос по определению типа переменной #20
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
Это вопрос контроля типов, ни чего общего с оформлением не имеющий.

Добавлено через 2 минуты
Цитата Сообщение от accept Посмотреть сообщение
когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
Нет. Надо только понимать, что под этим подразумевается приведение типа, а в вызывающей функции будет получен 0.0f.
Yandex
Объявления
27.10.2011, 07:03     Вопрос по определению типа переменной
Ответ Создать тему
Опции темы

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