Professional Documents
Culture Documents
Practice 2
Practice 2
სააუდიტორიო სამუშაო:
ამოცანა 1:
1) მოიყვანეთ ფუნქციის კოდი, რომელიც დაადგენს არის თუ არა მოცემულ ვექტორში
მოცემული p თვისების მქონე ელემენტი. დადებითი პასუხის შემთხვევაში ალგორითმმა
უნდა პირველივე (p-დან დაწყებული) ასეთი ელემენტის ინდექსი, წინააღმდეგ შემთხვევაში
კი ვექტორის ზომა (ანუ კონკრეტული არარსებული ინდექსი) .
2) მოიყვანეთ ფუნქციის გამოძახების რამდენიმე ვარიანტი სხვადასხვა ტიპის
ვექტორებისთვის. p თვისებას შესაძლოა წარმოადგენდეს როგორც მომხმარებლის მიერ
შექმნილი ბულის ტიპის უნარული (ანუ ერთადგილიანი) ფუნქცია, ასევე ფუნქციის
ადაპტერი.
ამოხსნა: ფუნქციას შესაძლოა ჰქონდეს სახე:
template<typename T, typename Predicate>
int my_search_if(const vector<T>& v, Predicate p)
{
int i = 0;
while(i != v.size() && p( v[i]) == false )
++i;
return i;
}
შეგვეძლო ეს ფუნქცია დაგვეწერა როგორც წინა მეცადინეობაზე, for შეტყობინებით. მაგრამ
მომდევნო ამოცანაში განსხვავება ამ ორ შეტყობინებას შორის არსებითია. ამიტომ ცნობილ
ალგორითმზე გადავიმეოროთ ასეთი მიდგომა.
მაგალითად, თუ ძირითად ფუნქციას შესაძლოა ჰქონდეს სახე:
nt main()
{
int mas[] = {12,3,26,7,11,213,7,123,-31};
int dim(sizeof(mas)/sizeof(int));
vector<int> v(&mas[0],&mas[dim]);
if(k != v.size())
cout << "Found at index " << k << endl;
else
cout << "Not found!" << endl;
double masD[] = {18.2, 3.09, 26.21, 7.54, 11.1, 21.3,7.5, 123.54, -3.14};
int dimD(sizeof(masD)/sizeof(double));
vector<double> v1(&masD[0],&masD[dimD]);
k = my_search_if(v1, bind2nd(less<double>(),-1.0));
if(k != v.size())
cout << "Found at index " << k << endl;
else
cout << "Not found!" << endl;
return 0;
}
vector<int> v;
და
სტრიქონი
Page 1 of 4
int k = my_search_if(v, bind2nd(greater<int>(),100));
მაშინ კოდი
k = my_search_if(v, g);
if(k != v.size())
cout << "multiple of 3 found at index " << k << endl;
else
cout << "Not found!" << endl
ამოცანა 2:
შექმენით იტერაციული ფუნქცია ვექტორში ინდექსების [l,r) დიაპაზონში ელემენტების
ჯამის განსაზღვრისთვის. შემდეგ ეს ფუნქცია გარდაქმენით ეკვივალენტურ რეკურსიულ
ფუნქციად.
int init(0);
int sum = mySumRecursive(v, 0,5,init);
cout << "summ od ints = " << sum << endl;
cout << "initial_value = " << init << endl;
double masD[] = {18.2, 3.09, 26.21, 7.54, 11.1, 21.3,7.5, 123.54, -3.14};
int dimD(sizeof(masD)/sizeof(double));
vector<double> v1(&masD[0],&masD[dimD]);
return 0;
}
Page 3 of 4
*
6 . ამოცანა 1-ში კოდი იგივე რჩება, თუ თუ მოვინდომებთ დეკის გამოყენებას, როგორ
განვაზოგადოთ ალგორითმი ისე, რომ მან იმუშაოს ორივე აღნიშნულ კონტეინერთან?
Page 4 of 4