Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

ISВN 966-0000-00-0 6 страница




Функції можна передати одне або декілька значень. Значення, що передається функції, називають аргументом. Хоча у програмах, які ми розглядали дотепер, жодна з функцій (ні main (), ні fun_c()) не отримувала ніяких значень, функції у мові програмування C++ можуть приймати один або декілька аргументів. Верхня межа кількості аргументів, що приймаються, визначається конкретним компілятором. Згідно з стандартом мови програмування C++, він дорівнює 256.

Аргумент – це значення, що передається функції під час виклику.

Розглянемо коротку програму, яка для відображення абсолютного значення числа використовує стандартну бібліотечну (тобто вбудовану) функцію abs (). Ця функція приймає один аргумент, перетворює його в абсолютне значення і повертає результат.

Код програми 2.7. Демонстрація механізму використання функції abs()

#include <iostream> // Для потокового введення-виведення

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

 

int main ()

{

cout << abs (-10);

 

getch (); return 0;

}

У цій програмі функції abs () як аргументу передається число -10. Функція abs () приймає цей аргумент під час виклику і повертає його абсолютне значення, яке у цьому випадку дорівнює числу 10. Важливо запам'ятати: якщо функція приймає аргумент, то його вказують усередині круглих дужок, розташованих відразу після імені функції.

Значення, що повертається функцією abs (), використовується настановою cout для відображення на екрані абсолютного значення числа -10. Йдеться про те, що якщо функція є частиною виразу, то вона автоматично викликається для отримання значення, що повертається нею. У цьому випадку значення, що повертається функцією abs (), виявляється праворуч від оператора "<<" і тому законно відображається на екрані.

Зверніть також увагу на те, що дана програма містить заголовок < cstdlib >. Цей заголовок необхідний для забезпечення можливості виклику функції abs (). Кожного разу, коли Ви використовуєте бібліотечну функцію, у програмі необхідно помістити відповідний заголовок. Заголовок, окрім іншої інформації, повинен містити прототип бібліотечної функції.

Параметр – це визначена функцією змінна, яка приймає аргумент, що передається функції.

Під час розроблення функції, яка приймає один або декілька аргументів, іноді необхідно оголосити змінні, які зберігатимуть значення аргументів. Ці змінні називають параметрами функції. Наприклад, наступна функція виводить добуток двох цілочисельних аргументів, що передаються функції під час її виклику:

void fun_z(int x, int y)

{

cout << x * y << " ";

}

Під час кожного виклику функції fun_z() виконується множення значення, що передається параметру х, на значення, передане параметру y. Проте пам'ятайте, що х і y – це просто змінні, які приймають значення, які передаються під час виклику функції. Розглянемо таку коротку програму, яка демонструє використання функції fun_z().

Код програми 2.8. Демонстрація механізму використання функції fun_z()

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

void fun_z(int x, int y); // Прототип функції fun_z().

 

int main ()

{

fun_z(10, 20);

fun_z(5, 6);

fun_z(8, 9);

 

getch (); return 0;

}

 

void fun_z(int x, int y)

{

cout << x * y << " ";

}

Ця програма виведе на екран числа 200, 30 і 72. Під час виклику функції fun_z() С++-компілятор копіює значення кожного аргументу у відповідний параметр. У цьому випадку під час першого виклику функції fun_z() число 10 копіюється в змінну х, а число 20 – в змінну y. Під час другого виклику 5 копіюється в х, а 6 – в y. Під час третього виклику 8 копіюється в х, а 9 – в y.

Якщо Ви ніколи не працювали з мовою програмування, у якій дозволені функції, які параметризуються, то описаний вище процес може видатися дещо дивним. Проте хвилюватися не варто: у міру перегляду інших С++-програм принцип використання функцій, їх аргументів і параметрів стане зрозумілішим.

Варто знати! Термін аргумент належить до значення, яке використовується під час виклику функції. Змінна, яка приймає цей аргумент, називається параметром. Функції, які приймають аргументи, називаються параметризованими функціями.

Якщо С++-функції мають два або більше аргументів, то вони розділяються між собою комами. У цьому навчальному посібнику під терміном перелік аргументів необхідно розуміти аргументи, розділені між собою комами. Для розглянутої вище функції fun_z() перелік аргументів виражений у вигляді х, y.

2.3.4. Повернення функціями аргуметів

У мові програмування C++ багато бібліотечних функцій повертають значення. Наприклад, вже знайома нам функція abs () повертає абсолютне значення свого аргументу. Функції, які написані програмістом, також можуть повертати значення. У мові програмування C++ для повернення значення використовують настанову return. Загальний формат цієї настанови є таким:

return значення;

Неважко здогадатися, що тут елемент значення є значенням, що повертається функцією.

Щоб продемонструвати процес повернення функціями значень, переробимо попередню програму так, як це показано нижче. У цій версії функція fun_z() повертає добуток своїх аргументів. Звернемо Вашу увагу на те, що розташування функції праворуч від оператора присвоєння означає присвоєння змінній (розташованій зліва) значення, що повертається цією функцією.

Код програми 2.9. Демонстрація повернення функціями значень

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int fun_z(int x, int y); // Прототип функції fun_z().

 

int main ()

{

int rezult;

rezult = fun_z(10, 11); // Присвоєння значення

// що повертається функцією.

cout << "Відповідь дорівнює " << rezult;

 

getch (); return 0;

}

 

// Ця функція повертає значення.

int fun_z(int x, int y)

{

return x * y; // Функція повертає добуток x і y.

}

У наведеному прикладі функція fun_z() повертає результат обчислення виразу x * y за допомогою настанови return. Потім значення цього результату присвоюється змінній rezult. Таким чином, значення, що повертається настановою return, стає значенням функції fun_z() у програмі, яка її викликає.

Оскільки у цій версії програми функція fun_z() повертає значення, то її ім'я у визначенні не передує слов void [10]. Оскільки існують різні типи змінних, існують і різні типи значень, що повертаються функціями. Тут функція fun_z() повертає значення цілочисельного типу. Тип значення, що повертається функцією, передує її імені як у прототипі, так і у визначенні.

У попередніх версіях мови програмування C++ для типів значень, що повертаються функціями, існувала домовленість, що діє за замовчуванням. Якщо тип значення, що повертається функцією, не вказано, то передбачалося, що ця функція повертає цілочисельне значення. Наприклад, функція fun_z(), згідно з тією домовленістю, могла бути записана так:

fun_z(int x, int y) // За замовчуванням як тип значення,

// що повертається функцією, використовується тип int.

{

return x * y; // Функція повертає добуток x і y.

}

У цьому записі за замовчуванням передбачається цілочисельний тип значення, що повертається функцією, оскільки не задано ніякого іншого типу. Проте правило встановлення цілочисельного типу за замовчуванням було знехтувано стандартом мови програмування C++. Незважаючи на те, що більшість компіляторів підтримують це правило заради зворотної сумісності, програміст повинен безпосередньо задавати тип значення, що повертається кожною функцією, яку він пише. Але, якщо Вам доведеться мати справу зі старими версіями С++-програм, то цю домовленість необхідно мати на увазі.

Досягши настанови return, функція негайно завершується, а увесь решта програмний код ігнорується. Функція може містити декілька настанов return. Повернення з функції можна забезпечити за допомогою настанови return без вказання значення, що повертається, але таку її форму допустимо застосовувати тільки для функцій, які не повертають ніяких значень і оголошені з використанням ключового слова void.

2.3.5. Спеціальна функція main()

Як зазначалося вище, функція main () – спеціальна, оскільки це перша функція, яка викликається у процесі виконання програми. На відміну від деяких інших мов програмування, у яких виконання завжди починається "зверху", тобто з першого рядка коду програми, кожна С++-програма завжди починається з виклику функції main () незалежно від її розташування у програмі[11].

У програмі може бути тільки одна функція main (). Якщо спробувати залучити до програми декілька функцій main (), то вона "не знатиме", з якої з них почати роботу. Насправді більшість компіляторів легко виявить помилку цього типу і повідомить про неї. Як ми вже зазначали вище, оскільки функція main () вбудована у мову програмування C++, то вона не вимагає прототипу.

2.4. Поняття про логічну та циклічну настанови

Для аналізу більш реальних прикладів конкретних програм нам необхідно познайомитися з двома простими С++-настановами: if і for. [12]

2.4.1. Логічна настанова if

Логічна настанова if дає змогу зробити вибір між двома виконуваними гілками програми.

Настанова if у мові програмування C++ діє подібно до настанови if, визначеної в будь-якій іншій мові програмування. Її простий формат є таким:

if (умова) настанова;

У цьому записі елемент умова – це вираз, який під час обчислення може виявитися значенням, що дорівнює ІСТИНІ або ФАЛЬШІ. У мові програмування C++ ІСТИНА представляється ненульовим значенням, а ФАЛЬШ – нулем. Якщо умова, або умовний вираз, є істинним, елемент настанова виконається, інакше – ні. У процесі виконання такої настанови

if (10 < 11) cout << "10 менше ніж 11";

на екрані відобразиться фраза: 10 менше ніж 11.

Такі оператори порівняння, як "<" (менше) і ">=" (більше або дорівнює), використовуються в багатьох інших мовах програмування. Але необхідно пам'ятати, що у мові програмування C++ як оператор рівності застосовується подвійний символ "дорівнює" (==). У наведеному нижче прикладі cout -настанова не виконається, оскільки умовний вираз дає значення ФАЛЬШ. Іншими словами, оскільки 10 не дорівнює 11, то cout -настанова не відобразить на екрані вітання:

if (10 == ll) cout << "Привіт";

Безумовно, операнди умовного виразу необов'язково мають бути константами. Вони можуть бути змінними і навіть містити звернення до функцій.

У наведеному нижче коді програми показано приклад використання if -настанови. У процесі виконання цієї програми користувачу пропонується ввести два числа, а потім повідомляється результат їх порівняння.

Код програми 2.10. Демонстрація механізму використання if-настанови

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int a, b;

cout << "Введіть перше число: ";

cin >> а;

cout << "Введіть друге число: ";

cin >> b;

if (а < b) cout << "Перше число менше від другого.";

if (а == b) cout << "Перше число збігається з другим.";

if (а > b) cout << "Перше число більше від другого.";

getch (); return 0;

}

2.4.2. Циклічна настанова for

for – одна з циклічних настанов, визначених мовою програмування C++.

Цикл for повторює вказану настанову задану кількість разів. Настанова for у мові програмування C++ діє практично так само, як настанова for, визначена в таких мовах програмування, як Java C#, Pascal і Visual Basic. Її простий формат такий:

for (ініціалізація; умова; інкремент) настанова;

У цьому записі елемент ініціалізація є настанова присвоєння, яка встановлює керівній змінній циклу початкове значення. Ця змінна діє як лічильник, який керує роботою циклу. Елемент умова є виразом, у якому тестується значення керівної змінної циклу. Результат цього тестування визначає, виконається цикл for ще раз чи ні. Елемент інкремент – це вираз, який визначає, як змінюється значення керівної змінної циклу після кожної ітерації. Цикл for виконуватиметься доти, доки обчислення елемента умова дає істинний результат. Як тільки умова стане помилковою, виконання програми продовжиться з настанови, що знаходиться наступною за циклом for.

Наприклад, наведений нижче код програми за допомогою циклу for виводить на екран числа від 1 до 100.

Код програми 2.11. Демонстрація механізму використання for-циклу

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int pm;

for (pm=1; pm<=100; pm=pm+1) cout << pm << " ";

 

getch (); return 0;

}

На рис. 2.1 схематично показано виконання циклу for у наведеному прикладі. Як бачимо, спочатку змінна pm ініціалізується числом 1. Під час кожного повторення циклу перевіряється умова pm<=100. Якщо результат перевірки виявляється істинним, cout -настанова виводить значення змінної pm, після чого її вміст збільшується на одиницю. Коли значення змінної pm перевищить значення 100, то умова, що перевіряється, видасть значення ФАЛЬШ, і виконання циклу припиниться.

Рис. 2.1. Виконання циклу for

У професійно написаному С++-коді програми рідко трапляються настанови pm = pm+1, оскільки для настанов такого роду у мові програмування C++ передбачена спеціальна скорочена форма: pm++ (див. розд. 3.5.3). Оператор "++" називається оператором інкремента. Він збільшує операнд на одиницю. Оператор "++" доповнюється оператором "--" (оператором декремента), який зменшує операнд на одиницю. За допомогою оператора інкремента використану в попередній програмі настанову for можна переписати так:

for (pm=1; pm<=100; pm++) cout << pm << " ";

2.5. Структуризація С++-програми

2.5.1. Поняття про блоки програми

Оскільки мова програмування C++ структурована (а також об'єктно-орієнтована), то вона підтримує розроблення блоків програми. Блок – це логічно пов'язана група програмних настанов, які обробляються як єдине ціле. У мові програмування C++ програмний блок створюється шляхом розміщення послідовності настанов між фігурними відкритою і закритою дужками. У наведеному нижче прикладі

if (x<10) {

cout << "Дуже мало, спробуйте ще раз.";

cin >> х;

}

обидві настанови, розташовані після if -настанови (всередині фігурних дужок) виконаються тільки у тому випадку, якщо значення змінної х менше 10. Ці дві настанови (разом з фігурними дужками) представляють блок коду програми. Вони становлять логічно неподільну групу: жодна з цих настанов не може виконатися без іншої. З використанням блоків коду програми багато алгоритмів реалізуються чіткіше і більш ефективно. Вони також дають змогу краще зрозуміти дійсну природу алгоритмів.

Блок – це набір логічно взаємопов'язаних настанов.

У наведеному нижче коді програми використано блок коду програми. Введіть цю програму і виконайте її, і тоді Ви зрозумієте, як працює блок коду програми.

Код програми 2.12. Демонстрація механізму використання блоку коду програми

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int a, b;

cout << "Введіть перше число: ";

cin >> а;

cout << "Введіть друге число: ";

cin >> b;

if (а < b) {

cout << "Перше число менше від другого.\n";

cout << "Їх різниця дорівнює: " << b-a;

}

if (а >= b) {

cout << "Перше число більше від другого, або дорівнює йому.\n";

cout << "Їх сума дорівнює: " << a+b;

}

 

getch (); return 0;

}

Ця програма пропонує користувачу ввести два числа з клавіатури. Якщо перше число менше від другого, то буде виконано обидві cout -настанови. Інакше обидві вони будуть пропущені, після чого перевіриться друга умова. Якщо перше число більше від другого, то буде виконано наступні дві cout -настанови. У будь-якому з випадків ні за яких умов не виконається тільки одна з cout -настанов.

2.5.2. Використання крапки з комою і розташування настанов

У мові програмування C++ крапка з комою означає кінець настанови. Іншими словами, кожна окрема настанова повинна завершуватися крапкою з комою.

Як було зазначено в попередніх розділах, блок – це набір логічно взаємопов'язаних настанов, які поміщені всередині фігурних дужок. Блок не завершується крапкою з комою. Оскільки блок складається з настанов, кожна з яких завершується крапкою з комою, то в додатковій крапці з комою немає ніякого сенсу. Ознакою ж кінця блоку слугує закрита фігурна дужка (навіщо ще одна ознака?).

Мова програмування C++ не сприймає кінець рядка як ознаку кінця настанови. Тому для компілятора не має значення, у якому місці рядка розташовується настанова. Наприклад, з погляду С++-компілятора, такий фрагмент програмного коду

х = y;

y = y + 1;

fun_z(x, y);

аналогічний такому рядку:

х = y; y = y + 1; fun_z(x, y);

2.5.3. Практика застосування відступів

Розглядаючи попередні приклади, Ви, ймовірно, помітили, що деякі настанови зміщені дещо до правого краю. Мова програмування C++ – мова вільної форми запису настанов, тобто її синтаксис не пов'язаний позиційними або форматними обмеженнями. Це означає, що для С++-компілятора не важливо, як будуть розташовані настанови стосовно одна до одної. Але у програмістів з роками виробився стиль застосування відступів, який значно підвищує читабельність програм. У цьому навчальному посібнику ми дотримуємося цього стилю і Вам радимо чинити так само. Згідно з цим стилем, після кожної відкритої дужки робиться черговий відступ вправо, а після кожної закритої дужки початок відступу повертається до колишнього рівня. Існують також деякі певні настанови, для яких передбачаються додаткові відступи (про них буде сказано дещо попереду).

2.6. Елементи визначення мови програмування C++

2.6.1. Поняття про ключові слова

У стандарті мови програмування C++ визначено 63 ключових слова, які показано в табл. 2.1. Ці ключові слова (у поєднанні з синтаксисом операторів і роздільників) утворюють визначення мови програмування C++. У ранніх версіях мови програмування C++ визначено ключове слово overload, але тепер воно застаріло.

Табл. 2.1. Ключові слова мови програмування C++

asm auto bool break
case catch char class
const const_class continue default
delete do double dinamic_cast
else enum explicit export
extern false float for
friend goto if inline
int long mutable namespace
new operator private protected
public register reinterpret_cast return
short signed sizeof static
static_cast struct switch template
this throw true try
typedef typeid typename union
unsigned using virtual void
volatile wchar_t while  

Необхідно мати на увазі, що у мові програмування C++ розрізняється рядкове і прописне написання букв. Ключові слова не є винятком, тобто всі вони мають бути написані рядковими буквами. Наприклад, слово RETURN не буде розпізнано як ключове слово return.

2.6.2. Розроблення ідентифікаторів користувача

У мові програмування C++ ідентифікатором є ім'я, яке надається функції, змінній або іншому елементу, визначеному користувачем. Ідентифікатори можуть складатися з одного або декількох символів (значущими мають бути перші 1024 символи). Імена змінних повинні починатися з букви або символу підкреслення. Подальшим символом може бути буква, цифра і символ підкреслення. Символ підкреслення можна використовувати для поліпшення читабельності імені змінної, наприклад first _name. У мові програмування C++ прописні і рядкові букви сприймаються як різні символи, тобто myvar і MyVar – це різні імена. Ось декілька прикладів допустимих ідентифікаторів:

first x Addrl MaxLoad

name23 top my_var sample13

У мові програмування C++ не можна використовувати як ідентифікатори ключові слова. Не можна також використовувати як ідентифікатори імена стандартних функцій (наприклад, abs). Необхідно пам'ятати, що ідентифікатор не повинен починатися з цифри. Так, 12х – неприпустимий ідентифікатор. Зазвичай, програміст має можливість самостійно називати змінні та інші програмні елементи на свій розсуд, але переважно ідентифікатор повинен відображати призначення або смислову характеристику елемента, якому він належить.

2.6.3. Використання стандартної бібліотеки

У прикладах програм, представлених у цьому розділі, використовувалася функція abs (). По суті функція abs () не є частиною мови програмування C++, але її "знає" кожен С++-компілятор. Ця функція, як і багато інших, входить до складу стандартної бібліотеки. У прикладах цього навчального посібника ми детально розглянемо використання багатьох бібліотечних функцій мови програмування C++.

Стандартна бібліотека мови програмування C++ містить багато вбудованих функцій, які програмісти можуть використовувати у своїх програмах.

У мові програмування C++ визначено достатньо великий набір функцій, які містяться в стандартній бібліотеці. Ці функції призначені для виконання різних задач, що часто трапляються у процесі програмування, в т.ч. операції введення-виведення даних, математичні обчислення і оброблення рядків. Під час використання програмістом бібліотечної функції компілятор автоматично зв'язує об'єктний код цієї функції з об'єктним кодом програми.

Оскільки стандартна бібліотека мови програмування C++ достатньо велика, то в ній можна знайти багато корисних функцій, якими дійсно часто користуються програмісти. Бібліотечні функції можна застосовувати подібно до будівельних блоків, з яких зводиться будівля. Щоб не "винаходити велосипед", ознайомтеся з документацією на бібліотеку використовуваного Вами компілятора. Якщо Ви самі напишете функцію, яка "переходитиме" з Вами від програми у програму, її також можна помістити в бібліотеку.

Крім бібліотеки функцій, кожен С++-компілятор також містить бібліотеку класів, яка є об'єктно-орієнтованою бібліотекою. Нарешті, у мові програмування C++ визначено стандартну бібліотеку шаблонів (Standard Template Library – бібліотека STL). Вона надає процедури "багатократного використання", які можна налаштовувати відповідно до конкретних вимог. Але, перш ніж застосовувати бібліотеку класів або бібліотеку STL, нам необхідно познайомитися з класами, об'єктами і зрозуміти, у чому полягає суть шаблона.


Розділ 3. Основні типи даних| у мові програмування C++

Як зазначалося у розд. 2, всі змінні у мові програмування C++ мають бути оголошені до їх використання. Це необхідно для компілятора, якому потрібно мати інформацію про типи даних, що містяться в змінних. Тільки у цьому випадку компілятор зможе належним чином скомпілювати настанови, у яких використовуються змінні. У мові програмування C++ визначено сім основних типів даних: символьний, символьний двобайтовий, цілочисельний, з плинною крапкою, з плинною крапкою подвійної точності, логічний (або булевий) і такий, що "не має значення". Для оголошення змінних цих типів використовують ключові слова char wchar_t, int, float, double, bool і void відповідно. Типи і розміри значень в бітах і діапазони представлення для кожного з цих семи типів наведено в табл. 3.1. Необхідно пам'ятати, що розміри і діапазони, які використовуються Вашим компілятором, можуть відрізнятися від наведених у цьому навчальному посібнику. Найбільша відмінність існує між 16- і 32-розрядними середовищами: для представлення цілочисельного значення в 16-розрядному середовищі використовується, як правило, 16 біт, а в 32-разрядному" – 32.

Змінні типу char використовуються для зберігання 8-розрядних ASCII-символів (наприклад букв Л, Б або В) або будь-яких інших 8-розрядних значень. Щоб задати символ, необхідно помістити його в одинарні лапки. Тип wchar_t призначений для зберігання символів, що входять до складу великих символьних наборів. Ймовірно, Вам відомо, що в деяких природних мовах (наприклад китайській) визначено дуже велику кількість символів, для яких 8-розрядного представлення (забезпечуване типом char) зовсім недостатньо. Для вирішення проблем такого роду у мові програмування C++ і був доданий тип wchar_t, який Вам стане у пригоді, якщо Ви плануєте виходити з своїми програмами на міжнародний ринок.

Змінні типу int дають змогу зберігати цілочисельні значення (що не містять дробових компонентів). Змінні цього типу часто використовують для керування циклами і в умовних настановах. До змінних типу float і double звертаються або для оброблення чисел з дробовою частиною, або у разі потреби виконання операцій над дуже великими чи дуже малими числами. Типи float і double відрізняються значенням найбільшого (і найменшого) числа, які можна зберігати за допомогою змінних цих типів. Як це показано в табл. 3.1, тип double у мові програмування C++ дає змогу зберігати число, що приблизно вдесятеро перевищує значення типу float.




Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 426; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.114 сек.