Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 16

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

05.08.2012, 00:35. Показов 2151. Ответов 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);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2012, 00:35
Ответы с готовыми решениями:

Синтаксическая ошибка при использовании шаблонов
Компилятор (VS) пишет: Ошибка (активно) E0304 отсутствуют экземпляры шаблон функции &quot;pus_sort&quot;, соответствующие списку...

Undefined reference при использовании шаблонов
Возникла проблема при использовании шаблонов: на этапе сборки повляется ошибка &quot;Undefined reference to 'Func(double)', как её можно...

Ошибка в main при использовании шаблонов в Header.h
Здравствуйте, подскажите, пожалуйста, есть проект из двух файлов. Header.h и main.cpp. Header.h содержит объявление классов и методов и их...

7
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
05.08.2012, 00:48
1
Цитата Сообщение от ovli Посмотреть сообщение
задача: написать перегруженные шаблоны функций для нахождения корней линейного и квадратного уравнений при этом в функции передаются коэффициенты уравнений.
А у вас в функцию передаются корни уравнений. Как так?
2
Цитата Сообщение от ovli Посмотреть сообщение
все переменные пришлось сделать глобальными иначе код не компилируется и выдает сообщение об ошибках.
Ошибки вылезают потому, что у вас не объявлены локальные переменные. В функции квадратного уравнения нет объявления переменных a,b,c,d (даже закомментированого, видимо, его там и не было).

Это пока так, навскидку. Подробнее могу посмотреть позднее.
1
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 16
05.08.2012, 00:58  [ТС]
Я писал по частям, чтобы два проекта не составлять, сначала написал для линейного, сделал переменные локальными, но в сообщении об ошибках появилось что данных переменных не объявлено, посему пришлось методом научного тыка выкинуть их в глобальные. после чего компилятор сработал, а потом когда уже дописывал для квадратного, я уже сразу объявлял их глобальными...Даже если в main объявлять все равно не работают
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
05.08.2012, 01:12
Чувствую, вы не знаете, что такое области видимости переменных.
Цитата Сообщение от ovli Посмотреть сообщение
Даже если в main объявлять все равно не работают
И не должны работать. Эти переменные используются в функции roots_linear_equation и roots_sqrt_equation. Там они и должны быть объявлены. Переменные, объявленные в main() не могут быть видны нигде, кроме main(), даже в вызываемых из main функциях.

Добавлено через 6 минут
Хотя по условию задачи, коэффициенты уравнений должны передаваться в функцию. Поэтому объявить и инициализировать их нужно всё таки в main, и передать функциям в качестве параметров. Сейчас они у вас не передаются.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2012, 10:35
Цитата Сообщение от ovli Посмотреть сообщение
написать перегруженные шаблоны функций
Раз перегруженные, то у этих функций должны быть одинаковые имена, и разный набор параметров. Ввод коэффициентов организовать в main() и вызывать функции с этими коэффициентами в качестве аргументов.
1
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 16
05.08.2012, 16:57  [ТС]
Всем спасибо за потраченное время, с учетом подсказок получилось так:
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";
}
0
 Аватар для Intel~lect
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
05.08.2012, 17:06
Цитата Сообщение от 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;
}
1
0 / 0 / 0
Регистрация: 01.07.2013
Сообщений: 3
09.07.2013, 22:58
Тоже прохожу эту тему. Вот что у меня получилось:

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;
}
Вышло как-то все громоздко. Есть ли варианты сократить код?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2013, 22:58
Помогаю со студенческими работами здесь

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

Template definition of non-template при использовании частичной спецификации шаблонов
Всем привет! Есть задача написать шаблон класса, принимающего в качестве параметров типа шаблон и некоторый тип. Собственно, вот код: ...

Подскажите, почему не видит переменные a и b? При использовании конструктора
#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
Подскажите пожалуйста, как вернуть строку в зависимости от условия, а то, что написал не работает и могли бы объяснить почему не хочет...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru