Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София
|
|
- Ваня Жекова
- преди 4 години
- Прегледи:
Препис
1 Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Revision : март 2005 г. template< class T > class stack { T data_ [128]; public : const T& //... }; pop ( void ) const; Префиксът template<class T> се използва за дефиниране на шаблон (template). При използване на шаблона на мястото на формалния параметър class T се предава фактическият тип. В дефиницията на шаблона T точно по същия начин, по който се използват и имената на другите типове. Областта на видимост за T завършва в края на обявата, започнала с template<class T>. В дефиницията template<class T> T е име на произволен тип; не е задължително T да бъде име на клас. 2 Екземпляри на шаблона Шаблони Шаблоните обезпечават непосредствената поддръжка на така нареченото обобщено програмиране, т.е. програмиране, при което като параметри се използват типове. Механизмът на шаблоните в C++ позволява използването на типове в качеството на параметри при дефинирането на функции и класове. Шаблонът зависи само от тези свойства на параметъратип, които той явно използва; поради това не е необходимо различните типове, които се използват като параметри на шаблона да бъдат свързани по какъвто и да било начин. stack <double> doublestack ; stack < int > intstack; Процесът на генериране на клас от (1) шаблон на клас и (2) аргумент на шаблона се нарича създаване на екземпляр на шаблона (template instantiation). Генерирането на клас от шаблон на клас се изпълнява от компилатора; Класът, генериран от шаблон на клас, е обикновен C++ клас. Използването на шаблони не предполага допълнителни механизми по време на изплънение на кода. Шаблоните обезпечават ефективен начин за генериране на код. 1
2 Параметри на шаблона Като параметри на даден шаблон могат да се използват и параметри, които не са типове: Пример: template< class T, int size > class Buffer { T data_ [ size ]; int size_ ; public : Buffer (void ) : size_ ( size ) {} //... }; Проверка на типовете: пример 1 template< class T > class stack { 2 T data_ [128]; int top_ ; 4 public : 5 stack (void ) : top_ ( -1) {} 6 //... 7 void print_ all ( void ) { 8 for ( int i =0;i <= top_ ;++ i) 9 cout << data_ [i] < < ; 10 cout < < endl ; 11 } 12 }; 1 class Rec { /*... */ }; 1 stack < int > intstack; 2 stack <Rec > recstack ; //?? error ; recstack. print_all (); // error ; Проверка на типовете Проверка в точката на дефиниция: проверка за синтактични грешки и грешки, които не зависят от фактическите параметри-типове на шаблона. Проверка при създаване на екземпляр на шаблона: проверка за съответствие на фактическите типове, предадени на шаблона. Проверка в момента на свързване. 4 5 Пример: стек 1 #ifndef STACK_ HPP 2 #define STACK_ HPP #include < exception > 4 template< class T > 5 class stack { 6 static const unsigned size_ =128; 7 T data_ [ size_ ]; 8 int top_ ; 9 public : 10 stack (void ); 11 const T& top ( void ) const; 12 void pop ( void ); 1 void push (const T& val ); 14 bool empty ( void ) const; 15 }; 16 template< class T > 17 stack <T >:: stack (void) 18 : top_ ( -1) 19 {} 20 template< class T > const T& 21 stack <T >:: top (void ) const { 22 i f ( top_ < 0) { 6 7
3 2 throw std :: exception (); 24 } 25 return data_ [ top_ ]; 26 } 27 template< class T > void 28 stack <T >:: pop (void ) { 29 i f ( top_ <0){ 0 throw std :: exception (); 1 } 2 top_ - -; } 4 template< class T > void 5 stack <T >:: push (const T& val ){ 6 i f ( size_ <= top_ +1 ) { 7 throw std :: exception (); 8 } 9 data_ [++ top_ ]= val ; 40 } 41 template< class T > bool 42 stack <T >:: empty (void ) const { 4 return top_ <0; 44 } 45 #endif 2 24 stack < stack < int > > ssi ; 25 for ( int i =0;i <5;++ i ){ 26 stack < int > temp ; 27 for ( int j =0;j <10;++ j){ 28 temp. push (i); 29 } 0 ssi. push ( temp ); 1 } 2 while (! ssi. empty ()){ 4 stack < int > ts= ssi. top (); 5 while (! ts. empty ()){ 6 std :: cout << ts. top () < < " "; 7 ts. pop (); 8 } 9 std :: cout << std :: endl ; 40 ssi. pop (); 41 } 42 4 return 0; 44 } Пример: стек 1 #include < iostream > 2 #include " stack. hpp " 4 int main (void ) { 5 stack < int > si; 6 for ( int i =0;i <10; ++ i){ 7 si. push (i); 8 } 9 while (! si. empty () ){ 10 std :: cout << si. top () < < " "; 11 si. pop (); 12 } 1 std :: cout << std :: endl ; 14 stack < float > sf; 15 for ( int i =0; i <10; ++ i){ 16 sf. push (10.0* i ); 17 } 18 while (! sf. empty () ){ 19 std :: cout << sf. top () < < " "; 20 sf. pop (); 21 } 22 std :: cout << std :: endl << std :: endl ; 8 Пример: стек Резултати:
4 Шаблони на функции Шаблони на функции Механизмът на шаблоните може да се ползва за обобщено дефиниране на фунции; Пример: 1 template< class R, class T > 2 const R & fun (T& a){ //... 4 } 1 template< class T > 2 void sort ( vector <T >& v){ //... 4 } 10 При шаблоните на функции съществен момент се явява възможността за извеждане (deduction) на типа на аргументите на шаблона. Пример: template< class T > T& fun (const T & val ) { /*... */} int i=0, p =10; i= fun (p ); template< class T > const T& fun1 (void ) { /*... */} int x= fun1 (); // error int y=fun1 < int >(); template< class R, class T > R fun2 (T& v ) { /*... */} int z =0; double w =0; w=fun2 <double, int >(z); w=fun2 <double>(z); w= fun2 (z ); // error!! 12 Използване на шаблони: масив с проверка на границите Шаблони на функции 1 template< class T > 2 void swap (T& a, T& b ) { T tmp =a; 4 a=b; 5 b= tmp ; 6 } 11 1 #include < iostream > 2 using namespace std ; class IndexOutOfBounds {}; 4 5 template< class T > 6 class Array { 7 unsigned int size_ ; 8 T* data_ ; 9 public : 10 Array (unsigned int size =10) 11 : size_ ( size ), data_ (new T[ size_ ]) 12 {} 1 Array (const Array & other ) 14 : size_ ( other. size_ ), data_ (new T[ size_ ]) 15 { 16 for (unsigned int i =0; i < size_ ; i ++) 17 data_ [i]= other. data_ [i]; 18 } 19 ~ Array (void ) { 20 delete [] data_ ; 21 } 1
5 22 unsigned size () const { 2 return size_ ; 24 } 25 Array & operator=( const Array & other ) { 26 i f ( this!=& other ) { 27 delete [] data_ ; 28 size_ = other. size_ ; 29 data_ =new int [ size_ ]; 0 for (unsigned i =0;i< size_ ;i ++) 1 data_ [i ]= other. data_ [i]; 2 } return * this ; 4 } 5 T& operator[]( unsigned int index ) 6 throw ( IndexOutOfBounds) 7 { 8 i f ( index >= size_ ) { 9 throw IndexOutOfBounds (); 40 } 41 return data_ [ index ]; 42 } 4 }; Използване на шаблони: динамичен стек 1 #include < iostream > 2 using namespace std ; class StackEmptyException {}; 4 5 template< class T > 6 class Stack { 7 const static unsigned int chunk_ =2; 8 int size_ ; 9 T * data_ ; 10 int top_ ; 11 public : 12 Stack (void) 1 : size_ ( chunk_ ), 14 data_ (new T[ size_ ]), 15 top_ ( -1) 16 {} 17 ~ Stack (void ) { 18 delete [] data_ ; 19 } 44 int main ( void ) { 45 Array < int > a1 (), a2; 46 for ( int i =0;i <;++ i ) { 47 a1[i]=i; 48 } 49 a2=a1; 50 for ( int i =0;i <; i ++) { 51 cout << "a2[" << i << "]=" << a2[i] < < endl ; 52 } 5 try { 54 cout << "a2[" < < < < "]=" << a2 [] < < endl ; 55 } catch( IndexOutOfBounds tocatch ) { 56 cerr < < " IndexOutOfBounds exception catched... " 57 << endl ; 58 } 59 return 0; 60 } lubo@dobby:~/school/cpp/notes>./a.out a2[0]=0 a2[1]=1 a2[2]=2 IndexOutOfBounds exception catched Stack (const Stack & other ) 21 : size_ ( other. size_ ), 22 data_ (new T[ size_ ]), 2 top_ ( other. top_ ) 24 { 25 for ( int i =0; i <= top_ ; i ++) 26 data_ [i]= other. data_ [i]; 27 } 28 Stack & operator=( const Stack & other ) { 29 i f ( this!=& other ) { 0 delete [] data_ ; 1 size_ = other. size_ ; 2 top_ = other. top_ ; data_ =new T[ size_ ]; 4 for ( int i =0;i <= top_ ;i ++) 5 data_ [i ]= other. data_ [i]; 6 } 7 return * this ; 8 } 14
6 9 void push (const T& v ) { 40 i f ( top_ >=( size_ -1)) { 41 resize (); 42 } 4 data_ [++ top_ ]=v; 44 } 45 T pop (void ) { 46 i f ( top_ <0){ 47 throw StackEmptyException (); 48 } 49 return data_ [top_ - -]; 50 } 51 private: 52 void resize ( void ) { 5 T * olddata = data_ ; 54 data_ =new T[ size_ + chunk_ ]; 55 for ( int i =0;i< size_ ;i ++) 56 data_ [i]= olddata [i]; 57 delete [] olddata ; 58 size_ += chunk_ ; 59 } 60 }; lubo@kid:~/school/cpp/notes$./a.out StackEmptyException catched int main ( void ) { 62 Stack < int > st; 6 st. push (1); 64 st. push (2); 65 st. push (); Stack < int > st1 =st; cout << st.pop () < < endl ; 70 cout << st.pop () < < endl ; 71 cout << st.pop () < < endl ; 72 7 cout << st1. pop () < < endl ; 74 cout << st1. pop () < < endl ; 75 cout << st1. pop () < < endl ; try { 78 cout << st1. pop () < < endl ; 79 } catch(const StackEmptyException & tocatch ) { 80 cout < < " StackEmptyException catched... " < < endl ; 81 } 82 return 0; 8 }
Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София
Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision : 1.3 16 ноември 2004 г. Пример:
ПодробноОбработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Re
Обработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision : 1.1 27 февруари 2005 г. 1 #include < cstdio
ПодробноПредефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве
Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision :
ПодробноКласове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1
Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1 1.1 Модулност............................ 1 1.2 Обектно-ориентирана
ПодробноУказатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23
Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23 Указатели! Калин Георгиев Увод в програмирането 21
ПодробноBlack and White
Advanced C++ Memory Management Йордан Димитър Зайков Трендафилов Memory Management Effective C++ 2 nd ed: 3, 5, 7, 8, 9, 10 More Effective C++: 1, 3, 8 Exceptional C++: 35, 36 Какво всъщност прави new?
ПодробноLush Green
Класове Какво са класовете? Основен инструмент на ООП Средство за дефиниране на абстрактни типове данни Синтактична конструкция, която позволява логическо групиране на данни и операциите над тях Дефиниция
ПодробноМасиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф
и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Трифон Трифонов (УП 16/17) и низове 9 ноември 2016 г. 1 / 5 Логическо
ПодробноВиртуални функции
Виртуални функции Статично свързване Как компилаторът избира кой метод или коя функция да бъде извикана? Прави се сравнение между формални и фактически параметри и се избира най-точното съвпадение в случай,
ПодробноПотоци (Rev: 1.1)
Потоци (Rev: 1.1) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 1 Технологическо училище Електронни системи Технически университет, София 8 май 2007 г. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007
ПодробноСериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23
Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23 f «data; f» data; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 2 / 23 Първо изискване:
ПодробноСтруктура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор
Структура на програма в C Част 7 - масиви, оператор за индексиране, sizeof оператор Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София
Подробно2. Наследяване в C++ Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 1 февруари 2007 г. 1 Наследяване 1 2
2. Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 1 февруари 2007 г. 1 Наследяване 1 2 2 3 Полиморфизъм 9 1. Наследяване Наследяване UML UML unified modeling
ПодробноДинамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр
Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Трифон Трифонов (УП 16/17) Динамична памет 21 декември
ПодробноLush Green
Конструктори Жизнен цикъл на обект За обекта се заделя памет и се свързва с неговото име Извиква се подходящ конструктор на обекта... (достъп до компоненти на обект, изпълняване на операции) Достига се
ПодробноВ тази част, ще разгледаме аритметичните и логически операции, както, и включването им в изрази. В следващата таблица са дадени всички възможни операц
В тази част, ще разгледаме аритметичните и логически операции, както, и включването им в изрази. В следващата таблица са дадени всички възможни операции в езикът C и С++. Символ Предназначение Аритметични
ПодробноВходно/изходните операции са разширяеми. Лесно се реализират входно/изходни операции за типове, дефинирани от потребителя. Потоци (Rev: 1.1) Любомир Ч
Входно/изходните операции са разширяеми. Лесно се реализират входно/изходни операции за типове, дефинирани от потребителя. Потоци (Rev: 1.1) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 8 май 2007 г.
ПодробноПри изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) и
При изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) или изменящи се (променливи). Тези данни най-често бива
ПодробноМаисви
МАСИВИ 1. Структурни типове данни Структура от данни - организирана информация, която може да бъде описана, създадена и обработена с помощта на програма. Скаларни типове данни: Целочислен int Реален double
ПодробноC++
Управляващи оператори в C++ Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 18 30 октомври 2018 г. Трифон Трифонов (УП 18/19) Управляващи оператори в C++ 18 30 октомври
ПодробноПрограмиране на Паскал
Поради връзката на С++ с езика С в голяма част от литературата е прието записването С/С++. Това е найизползваният език за програмиране в света, поради което синтаксисът на някои от по-новите езици като
ПодробноМасиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма
Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 29 ноември 2018 г. Трифон Трифонов (УП 18/19) Масиви и низове 15 29 ноември 2018 г. 1 / 16 Масиви Логическо
ПодробноСтруктура на програма в C - Част 2 - типове, функции
Структура на програма в C Част 2 - типове, функции Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София 10 март 2019 г. И. Георгиев, Х.
Подробно2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет
2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнението представя кратко въведение в теорията на лексическия
ПодробноСтруктура на програма в C - Част 6 - goto, switch, break и continue клаузи
Структура на програма в C Част 6 - goto, switch, break и continue клаузи Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София 21 април
ПодробноМасиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1
Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 18/19) Масиви и низове 15.11-6.12.2018 г. 1 / 17 Масиви
ПодробноСтруктура на програма в C - Част 9 - низове от символи, C-string
Структура на програма в C Част 9 - низове от символи, C-string Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София 15 май 2019 г. И. Георгиев,
ПодробноАнализ и оптимизация на софтуерни приложения
Анализ и оптимизация на софтуерни приложения Александър Пенев Васил Василев (от гледна точка на производителността) Съдържание 1. Видове транслатори 2.Фази по време на компилация 3. Оптимизационна фаза
ПодробноПрограмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5
Програмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5 Литература Необходими програми Kernighan & Ritchie - The C Programming
ПодробноИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври
JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври 2008 JAVA ОБЕКТИ Забележка: Тази лекция е адаптация на лекция от курса: 6.092 Java
Подробно4
Наследяване и 4 Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 11 май 2017 г. Трифон Трифонов (ООП 16/17) Наследяване и голямата
ПодробноСинтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/
Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/16) Синтаксис за дефиниране на функции 6 януари 2016
ПодробноЛекции по Програмиране първа част I. Въведение в компютрите и програмирането КОМПЮТЪР = АПАРАТУРА + ПРОГРАМНО ОСИГУРЯВАНЕ Апаратна част Hardware(Харду
Лекции по Програмиране първа част I. Въведение в компютрите и програмирането КОМПЮТЪР = АПАРАТУРА + ПРОГРАМНО ОСИГУРЯВАНЕ Апаратна част Hardware(Хардуер)Програмна част Software(Софтуер) Хардуерът включва:
ПодробноРекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари
Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари 2017 г. Трифон Трифонов (УП 16/17) Рекурсия 21.12.16
Подробно3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението
3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението представя кратко въведение в синтактичния анализ.
ПодробноАнализ и оптимизация на софтуерни приложения
Анализ и оптимизация на софтуерни приложения Александър Пенев Васил Василев Съдържание 1. Какво е векторизация? 2. Примери 3. на цикли 4. Масиви от структури или структури от масиви 5. на при различни
ПодробноКОНСПЕКТ ЗА ДЪРЖАВЕН ИЗПИТ
БУРГАСКИ СВОБОДЕН УНИВЕРСИТЕТ ЦЕНТЪР ПО ИНФОРМАТИКА И ТЕХНИЧЕСКИ НАУКИ Учебно помагало за държавен изпит спец Информатика и компютърни науки теми: - част автори: проф Лазаров теми - доц Гичев теми 3 -
ПодробноSlide 1
Въведение в VHDL Паралелни оператори Паралелни оператори Паралелен оператор оператор, който се изпълнява едновременно с другите оператори от този тип. Process - Процес
ПодробноЛабораторно упражнение 4 Тема : Реализиране на линейни програми.. I. Цел на лабораторното упражнение Аритметични и логически операции в програмният ез
Лабораторно упражнение 4 Тема : Реализиране на линейни програми.. I. Цел на лабораторното упражнение Аритметични и логически операции в програмният език С. Реализиране на линейни програми. Математически
ПодробноOpenGL
OpenGL Изграждане на Геометрични обекти 2 гл. ас. А. Пенев Анимация (1/3) gluttimerfunc glutidlefunc glutpostredisplay glutpostwindowsredisplay + Промяна на визуализацията в display 2/32 Анимация (2/3
ПодробноHomework 2
Домашна работа 2 по Дизайн и анализ на алгоритми за специалност Компютърни науки, 2. курс, 1. поток СУ, ФМИ, летен семестър на 2017 / 2018 уч. г. СЪСТАВЯНЕ НА АЛГОРИТМИ Задача 1 2 3, а 3, б 3, в Общо получен
Подробно