Примери - задачи со функциски шаблони

#include <iostream>

template <typename T>
T addOne(T x)
{
    return x + 1;
}

int main()
{
    std::cout << addOne(1) << '\n';
    std::cout << addOne(2.3) << '\n';

    return 0;
}

The compiler will effectively compile and execute this:

#include <iostream>

template <typename T>
T addOne(T x);

template<>
int addOne<int>(int x)
{
    return x + 1;
}

template<>
double addOne<double>(double x)
{
    return x + 1;
}

int main()
{
    std::cout << addOne(1) << '\n';   // calls addOne<int>(int)
    std::cout << addOne(2.3) << '\n'; // calls addOne<double>(double)

    return 0;
}

which will produce the result:

2
3.3
Напиши функциски шаблон zameni кој ги менува вредностите на две променливи (Swap). Функцијата треба да работи за било кој тип (int, double, char, string). Помош: Користи референци (T &a, T &b).

#include <iostream>
#include <string>
using namespace std;

template <typename T>
void zameni(T &a, T &b) {
    T privremena = a;
    a = b;
    b = privremena;
}

int main() {
    int x = 10, y = 20;
    zameni(x, y);
    cout << "x = " << x << ", y = " << y << endl; // x = 20, y = 10

    string str1 = "Здраво", str2 = "Свет";
    zameni(str1, str2);
    cout << str1 << " " << str2 << endl; // Свет Здраво
return 0;
}

Напиши систем од функции кој го наоѓа максимум од два елементи:

Креирај функциски шаблон maksimumpozitiv кој враќа поголем од два броја.

Преоптовари ја истата функција со конкретна верзија за string, каде наместо лексикографска споредба, функцијата ќе го врати оној string кој е подолг (има повеќе букви).

Оваа задача е одлична за учениците конечно да сфатат кога се користи шаблон, а кога мора да се преоптовари со посебна верзија

#include <iostream>
#include <string>
using namespace std;

// 1. Општ шаблон со if-else за сите стандардни типови
template <typename T>
T maksimumpozitiv(T a, T b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}Што ќе се случи ако за string искористиме обичен шаблон со a > b наместо преоптоварена функција со a.length()
Обичниот шаблон ќе ги споредува зборовите по азбучен ред ('Б' > 'А'), додека со преоптоварувањето ја менуваме логиката за да ги споредуваме по должина!

// 2. Преоптоварена верзија специјално за string со if-else
string maksimumpozitiv(string a, string b) {
    if (a.length() >= b.length()) {
        return a;
    } else {
        return b;
    }
}

int main() {
    cout << "Поголем број: " << maksimumpozitiv(12, 45) << endl; // 45

    string s1 = "Петар";
    string s2 = "Александар";
    cout << "Подолг збор: " << maksimumpozitiv(s1, s2) << endl; // Александар

    return 0;
}

// Програма која користи функциски шаблон за одредување најмал елемент во низа.
#include <iostream>
#include <string>
using namespace std;
template <typename tipel, typename celbroj>
int najmal(tipel x[], celbroj a)
{
 tipel najm=x[0];
 int i;
 for(i=1;i<a;i++)
 {
 if(x[i]<najm) najm=x[i];
 }
 return najm;
}
int main()
{
 int a[100],i,n;
 cout<<"niza so elementi celi broevi"<<endl;
 cout<<"vnesi broj na elementi"<<endl;
 cin>>n;
 cout<<"vnesi gi elementite "<<endl;
for(i=0;i<n;i++)
 cin>>a[i];
 cout<<"najmal element e "<<najmal(a,n);
}

// Програма која користи функциски шаблон за подредување на низа по растечки редослед.

#include <iostream>
#include <string>
using namespace std;

template <typename tipel, typename celbroj>
void zamena(tipel x[], celbroj a, celbroj b)
{
tipel pom;
pom=x[a];
x[a]=x[b];
x[b]=pom;
}

template <typename tipel, typename celbroj>
void sortiranje(tipel x[], celbroj n)
{
celbroj i,j;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
   if(x[i]>x[j]) zamena(x,i,j);
}
}
}

template <typename tipel, typename celbroj>
void pecati(tipel x[], celbroj n) {
celbroj i;
for(i=0;i<n;i++)
cout<<x[i]<<" ";
cout<<endl; }

int main() {
int i, a[100],n;
float b[100];
char c[100];
string d[100];
cout<<"niza so elementi celi broevi"<<endl;
cout<<"vnesi broj na elementi"<<endl;
cin>>n;
cout<<"vnesi gi elementite "<<endl;
for(i=0;i<n;i++)
cin>>a[i];
sortiranje(a,n);
cout<<"podredena nizata e "<<endl;
pecati(a,n);
cout<<"niza so elementi realni broevi"<<endl;
cout<<"vnesi broj na elementi"<<endl;
cin>>n;
cout<<"vnesi gi elementite "<<endl;
for(i=0;i<n;i++)
cin>>b[i];
sortiranje(b,n);
cout<<"podredena nizata e "<<endl;
pecati(b,n);
cout<<"niza so elementi znaci"<<endl;
cout<<"vnesi broj na elementi"<<endl;
cin>>n;
cout<<"vnesi gi elementite "<<endl;
for(i=0;i<n;i++)
cin>>c[i];
sortiranje(c,n);
cout<<"podredena nizata e "<<endl;
pecati(c,n);
cout<<"niza so elementi string"<<endl;
cout<<"vnesi broj na elementi"<<endl;
cin>>n;
cout<<"vnesi gi elementite "<<endl;
for(i=0;i<n;i++)
cin>>d[i];
sortiranje(d,n);
cout<<"podredena nizata e "<<endl;
pecati(d,n);
}


No comments: