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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
ovli
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 16
#1

Переменные при использовании шаблонов. Оператор return - C++

05.08.2012, 00:35. Просмотров 1509. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
В домашнем задании на первом семестре обучения поставлена задача: написать перегруженные шаблоны функций для нахождения корней линейного и квадратного уравнений при этом в функции передаются коэффициенты уравнений.
Суть вопроса: все переменные пришлось сделать глобальными иначе код не компилируется и выдает сообщение об ошибках....Тогда возникает вопрос зачем вообще делать шаблон, какой тогда от него смысл?
И с return тоже не разберусь, почему нужно обязательно делать возврат к какой-то переменной(в данном случае x и root2, почему нельзя просто оборвать выполнение проги?
Вот сам код
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
#include<iostream>
#include<math.h>
using namespace std;
double a,b,c,x,d,root1,root2;
template <typename T> T roots_linear_equation(T x)
{
    //double a,b,x; 
    cout<<"input a\n";
    cin>>a;
    cout<<"input b\n";
    cin>>b;
    cout<<"\n"<<a<<"x+"<<b<<"=0";
     x=(-b)/a;
     cout<<"\nx="<<x;
    return x;
}
template <typename T> T roots_sqrt_equation(T root1, T root2)
{
cout<<"input a\n";
    cin>>a;
    cout<<"input b\n";
    cin>>b;
cout<<"input c\n";
    cin>>c;
    cout<<"\n"<<a<<"x2+"<<b<<"x+"<<c<<"=0\n";
    d=pow(b,2)-4*a*c;
    if(d<0)
        cout<<"no roots";
    if(d==0)
        cout<<"x="<<-b/(2*a);
    if(d>0)
root1=-b+sqrt(d);
    root2=-b-sqrt(d);
    cout<<"\nx1="<<root1<<"\nx2="<<root2;
     return root2;
}
void main()
{
//double a,b,c,x,d,root1,root2; 
cout<<"ax+b=0\n";
roots_linear_equation (x);
cout<<"\n";
roots_sqrt_equation (root1,root2);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2012, 00:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переменные при использовании шаблонов. Оператор return (C++):

Visual Studio не создаёт .lib файл при использовании шаблонов - C++
Здравствуйте, возникла проблема с .lib файлом. Я хочу создать Dll файл, выбираю в проекте Консольное приложение -&gt; и тип Dll. Для...

Подскажите, почему не видит переменные a и b? При использовании конструктора - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;locale&gt; using namespace std; class mas { private: double a,b,c,c1; ...

Оператор return - C++
Помогите пожалуйста разобраться как работает оператор return. Что происходит после return n и после return fibonacci (n-1) + fibonacci...

Оператор return - C++
Всем привет, мне необходимо передать полученный массив в другой файл, читала где-то, что это можно сделать при помощи оператора return, но...

Оператор return; - C++
В коде одного примера встретился оператор return; Который просто ничего не возвращает. Вот часть кода: void PartList::Iterate(void...

Как использовать оператор return? - C++
При запуске возникает ошибка, связанная с тем, что функция должна вернуть значение. Подскажите, что требуется подставить для return (строки...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
John Prick
778 / 711 / 131
Регистрация: 27.07.2012
Сообщений: 2,044
Завершенные тесты: 3
05.08.2012, 00:48 #2
1
Цитата Сообщение от ovli Посмотреть сообщение
задача: написать перегруженные шаблоны функций для нахождения корней линейного и квадратного уравнений при этом в функции передаются коэффициенты уравнений.
А у вас в функцию передаются корни уравнений. Как так?
2
Цитата Сообщение от ovli Посмотреть сообщение
все переменные пришлось сделать глобальными иначе код не компилируется и выдает сообщение об ошибках.
Ошибки вылезают потому, что у вас не объявлены локальные переменные. В функции квадратного уравнения нет объявления переменных a,b,c,d (даже закомментированого, видимо, его там и не было).

Это пока так, навскидку. Подробнее могу посмотреть позднее.
ovli
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 16
05.08.2012, 00:58  [ТС] #3
Я писал по частям, чтобы два проекта не составлять, сначала написал для линейного, сделал переменные локальными, но в сообщении об ошибках появилось что данных переменных не объявлено, посему пришлось методом научного тыка выкинуть их в глобальные. после чего компилятор сработал, а потом когда уже дописывал для квадратного, я уже сразу объявлял их глобальными...Даже если в main объявлять все равно не работают
John Prick
778 / 711 / 131
Регистрация: 27.07.2012
Сообщений: 2,044
Завершенные тесты: 3
05.08.2012, 01:12 #4
Чувствую, вы не знаете, что такое области видимости переменных.
Цитата Сообщение от ovli Посмотреть сообщение
Даже если в main объявлять все равно не работают
И не должны работать. Эти переменные используются в функции roots_linear_equation и roots_sqrt_equation. Там они и должны быть объявлены. Переменные, объявленные в main() не могут быть видны нигде, кроме main(), даже в вызываемых из main функциях.

Добавлено через 6 минут
Хотя по условию задачи, коэффициенты уравнений должны передаваться в функцию. Поэтому объявить и инициализировать их нужно всё таки в main, и передать функциям в качестве параметров. Сейчас они у вас не передаются.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2012, 10:35 #5
Цитата Сообщение от ovli Посмотреть сообщение
написать перегруженные шаблоны функций
Раз перегруженные, то у этих функций должны быть одинаковые имена, и разный набор параметров. Ввод коэффициентов организовать в main() и вызывать функции с этими коэффициентами в качестве аргументов.
ovli
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 16
05.08.2012, 16:57  [ТС] #6
Всем спасибо за потраченное время, с учетом подсказок получилось так:
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
#include<iostream>
#include<math.h>
using namespace std;
template <typename T> T roots_equation(T a, T b)
{
     -b/a;
    return -b/a;
}
template <typename T> T roots_equation(T a, T b, T c)
{
    pow(b,2)-4*a*c;
     return pow(b,2)-4*a*c;
}
void main()
{
    double k,y,f,k1,k2,k3,t,D;
cout<<"ky+f=0\n";
    cout<<"input k\n";
    cin>>k;
    cout<<"input f\n";
    cin>>f;
    cout<<k<<"y+"<<f<<"=0\n";
y=roots_equation(k,f);
cout<<"y="<<y<<"\n";
cout<<"k1t2+k2t+k3=0\n";
cout<<"input k1\n";
    cin>>k1;
    cout<<"input k2\n";
    cin>>k2;
cout<<"input k3\n";
    cin>>k3;
    cout<<"\n"<<k1<<"t2+"<<k2<<"t+"<<k3<<"=0\n";
    D=roots_equation(k1, k2, k3);
    if(D<0)
        cout<<"no roots\n";
    if(D==0)
        cout<<"t="<<-k2/(2*k1)<<"\n";
    if(D>0)
    cout<<"\nt1="<<-k2+sqrt(D)<<"\nt2="<<-k2-sqrt(D)<<"\n";
}
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
05.08.2012, 17:06 #7
Цитата Сообщение от ovli Посмотреть сообщение
-b/a;
return -b/a;
Цитата Сообщение от ovli Посмотреть сообщение
pow(b,2)-4*a*c;
return pow(b,2)-4*a*c;
Это строчки можно не дублировать а сразу в return записывать:
C++
1
2
3
4
5
6
7
8
9
template <typename T> T roots_equation(T a, T b)
{
    return -b/a;
}
 
template <typename T> T roots_equation(T a, T b, T c)
{
     return pow(b,2)-4*a*c;
}
Maithil
0 / 0 / 0
Регистрация: 01.07.2013
Сообщений: 3
09.07.2013, 22:58 #8
Тоже прохожу эту тему. Вот что у меня получилось:

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
//Написать перегруженные шаблоны функций для нахождения корней линейного (a*x + b = 0) и квадратного (a*x2+b*x + c = 0) уравнений. Замечание: в функции передаются коэффициенты уравнений.
 
#include <iostream>
#include<math.h>
using namespace std;
 
double a,b,c,D,x,x1,x2;
 
template <typename T> T funk(T a,T b);
template <typename T> T funk(T a,T b,T c);
 
void main()
{
    setlocale(LC_ALL,"");
 
    int vibor;
    
    cout<<"a*x + b = 0 - линейное ур-ние.\n";
    cout<<"a*x^2+b*x + c = 0 - квадратное ур-ние.\n\n";
 
    do
    {
        cout<<"Линейное или квадратное ур-ние? (1 или 2): ";
        cin>>vibor;
 
        if (vibor==1)
        {
            cout<<"Введите параметры значения a и b:\n";
            cin>>a>>b;
            cout<<endl;
            cout<<"a = "<<a<<endl;
            cout<<"b = "<<b<<endl;
 
            x=funk(a,b);
 
            if (x==100500||x==500100)
            {
                if (x==100500)
                {
                    cout<<"Уравнение имеет бесконечное множество решений."<<endl<<endl;
                }
                if (x==500100)
                {
                    cout<<"Уравнение не имеет решений."<<endl<<endl;
                }
            }
            if (x!=100500&&x!=500100)
            {
                cout<<"Решение линейного уравнения: a*x + b: "<<x<<endl<<endl;
            }
        }
        if (vibor==2)
        {
            cout<<"Введите параметры значения a, b и c:\n";
            cin>>a>>b>>c;
            cout<<endl;
            cout<<"a = "<<a<<endl;
            cout<<"b = "<<b<<endl;
            cout<<"c = "<<c<<endl<<endl;
 
            D=funk(a,b,c);
 
            if (D==0)
            {
                x=(-b)/2*a;
                cout<<"Решение квадратного уравнения: a*x^2+b*x + c = 0: "<<x<<endl<<endl;
            }
 
            if (D>0)
            {
                x1=(-b+(sqrt(D)))/2*a;
                x2=(-b-(sqrt(D)))/(2*a);
                cout<<"Уравнение a*x^2+b*x + c = 0 имеет два корня.\n";
                cout<<"Первый корень: "<<x1<<endl;
                cout<<"Второй корень: "<<x2<<endl<<endl;
            }
 
            if (D<0)
            {
                cout<<"Уравнение a*x^2+b*x + c = 0 вещественных корней не имеет.\n\n";
            }
        }
    }
    while(vibor==1&&vibor==2);
    if (vibor!=1&&vibor!=2)
    {
        cout<<"\nНеверное значение! До свидания!\n\n";
    }
}
 
template <typename T> T funk(T a,T b)
{
    x = -(b/a);
    if (b==0&&a!=0)
    {
        x=0;
    }
    if(a==0&&b==0)
    {
        x=100500;
    }
    if (a==0&&b!=0)
    {
        x=500100;
    }
 
    return x;
}
 
template <typename T> T funk(T a,T b,T c)
{
    return pow(b,2)-4*a*c;
}
Вышло как-то все громоздко. Есть ли варианты сократить код?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2013, 22:58
Привет! Вот еще темы с ответами:

Оператор запятая в return и задача - C++
Всем ДВС! Разъясните пожалуйста, почему тимус принимает #include &lt;cstdio&gt; #include &lt;cstdlib&gt; const int MAXN = 1 &lt;&lt; 5; ...

С++, оператор return. ПОдскажите, почему не работает? - C++
нужно, чтобы линейная программа завершалась, если выполняется условие. Но даже если условие не выполняется, совершается выход из...

Не работает оператор return в рекурсивной функции - C++
Писал курсач реализовать игру в калах. В коде в функции solve_computer() в 112 строчке не срабатывает оператор return. Понятия не имею...

Как работает оператор cout и return? - C++
Допустим есть функция: int show() { int g = 5; cout &lt;&lt; (g&gt;7)?1:2; return g&gt;7?1:2; }return на выражение g&gt;7?1:2...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.07.2013, 22:58
Ответ Создать тему
Опции темы

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