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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
#1

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

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

В основной программе вычисляется с
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

Что неправильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 14:44     Вопрос по определению типа переменной
Посмотрите здесь:
Переменной d присвоить первую цифру после запятой некоторой переменной x типа float C++
Записать адрес переменной произвольного типа в переменную типа int C++
C++ Вопрос об области видимости переменной
C++ Определение типа переменной
C++ Шаблон типа переменной
C++ Преобразование типа переменной
C++ проблема с переменной типа char
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
24.10.2011, 14:53     Вопрос по определению типа переменной #2
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
24.10.2011, 15:07     Вопрос по определению типа переменной #4
C++
1
double c;
86 строчка в сааааамом конце.
Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
24.10.2011, 15:10  [ТС]     Вопрос по определению типа переменной #5
Виновата, не заметила) Глупый вопрос получился)
accept
4820 / 3240 / 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
83 / 60 / 9
Регистрация: 17.10.2011
Сообщений: 194
Завершенные тесты: 1
25.10.2011, 10:12     Вопрос по определению типа переменной #7
Цитата Сообщение от accept Посмотреть сообщение
EXIT_SUCCESS используется только для возврата из main()
(это целочисленная константа)
какая разница? в дабл преобрзуется ведь
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.10.2011, 10:31     Вопрос по определению типа переменной #9
Heidel, return 0 как бэ.
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.10.2011, 01:44     Вопрос по определению типа переменной #10
Цитата Сообщение от vndtta
какая разница? в дабл преобрзуется ведь
оператор return должен возвращать тот же тип, что в определении функции
даже когда там есть неявное приведение

Цитата Сообщение от Heidel
Если убрать строку
когда пишешь оператор return, нужно смотреть на возвращаемое значение функции
C++
1
    return 0.0;
Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
26.10.2011, 08:03  [ТС]     Вопрос по определению типа переменной #11
accept, ясно, спасибо)
vndtta
83 / 60 / 9
Регистрация: 17.10.2011
Сообщений: 194
Завершенные тесты: 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
4820 / 3240 / 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,133
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
4820 / 3240 / 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,133
27.10.2011, 02:44     Вопрос по определению типа переменной #16
Т.е. надо сперва поспорить, а только потом сказать про
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
?
Ну вы молодец.
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2011, 05:37     Вопрос по определению типа переменной #17
Цитата Сообщение от Chelioss
Т.е. надо сперва поспорить, а только потом сказать про
если ей сказать про оформление кода, она это не воспримет
потому говорится сразу "нельзя писать без отступов, нельзя использовать goto, нельзя делать бесконечные циклы, функция должна возвращать соответствующее значение"
иначе появляется что-нибудь вроде "return EXIT_SUCCESS;" , что тоже сработает без ошибок
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
4820 / 3240 / 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++ Вывод переменной типа char
C++ Действовать в зависимости от типа переменной
Объявление переменной своего типа C++
C++ Проверка типа вводимой переменной

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

Или воспользуйтесь поиском по форуму:
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     Вопрос по определению типа переменной
Ответ Создать тему
Опции темы

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