Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

информационных технологий» 2 глава




Логические переменные. Логическая переменная может содержать одно из двух значений: false или true. Кроме того, любое ненулевое число (и непустая строка) символизирует истину, тогда как 0, пустая строка – ложь.

echo false; // выводит пустую строку

echo true; // выводит 1

Действия с переменными. Вне зависимости от типа переменной, с ней можно делать три основных действия.

Присвоение значения (оператор =).

Проверка существования. Можно проверить существует ли (то есть, инициализирована ли) указанная переменная. Осуществляется это с помощью оператора IsSet(). Если такая переменная существует, функция возвращает значение истина, в противном случае – ложно.

if(IsSet($MyVar))

echo ”Такая переменая есть. Её значение $MyVar”;

Уничтожение. Уничтожение переменной реализуется оператором Unset(). После этого Действия переменная удаляется из внутренних таблиц интерпретатора, т.е. программы начинает выполняться так, как будто переменная еще не была инициализирована.

$a=”Hello”;

echo $a;

Unset($a); // теперь переменной а не существует

echo $a; // Ошибка: нет такой переменной

Применение Unset() для работы с обычными переменными нецелесообразно. Она используется для удаления элементов в ассоциативном массиве. Например, если в массиве $A нужно удалить элемент с ключом for_del:

Unset($A[”for_del”]);

Стандартные функции определения типа переменной:

is_integer($a) //возвращает true, если $a – целое число

is_double($a) //возвращает true,

//если $a – действительное число

is_string($a) //возвращает true, если $a – строка

is_array($a) //возвращает true, если $a – массив

is_object($a) //возвращает true, если $a – объект

is_boolean($a) //возвращает true,

// если $a – логическая переменная

is_gettype($a) //возвращает строки со значениями array, object,

//integer, double, string, boolean или unknown type

//в зависимости от типа переменной. Последнее

//значение возвращается для тех переменных,

//типы которых не являются встроенными в РНР.

Установка типа переменной

Функция settype(переменная,тип) пытается привести тип указанной переменной к одному из стандартных типов и возвращает значение false, если это не удалось.

settype($a,”integer”);

Оператор присваивания

$имя_переменной=значение;

В конце каждого оператора должна стоять;

Cсылочные переменные. Хотя в РНР нет такого понятия как указатель, все же можно создавать ссылки на другие переменные. Существует две разновидности ссылок: жесткие и символические.

Жесткая ссылка представляет собой просто переменную, которая является синонимом другой переменной. Многоуровневые ссылки (то есть ссылка на ссылку) не поддерживаются. Жесткие ссылки создаются с помощью оператора &.

$a=10;

$b=&$a; // теперь $b то же самое, что и $a

Жесткая ссылка и переменная (объект), на которую она ссылается, совершенно равноправны, изменение одной влечет изменение другой. Оператор Unset() выполненный для жесткой ссылки, не удаляет объект, на которую она ссылается, а всего лишь разрывает связь между ссылкой и объектом. Объект удаляется только тогда, когда на него никто уже не ссылается. Жесткие ссылки применяются при передаче параметров функции и возврате значения из нее.

Символическая ссылка – строковая переменная, хранящая имя другой переменной. Чтобы добраться до значения переменной, на которую ссылается символическая ссылка, необходимо применить оператор разыменования – дополнительный знак $ перед именем ссылки.

$a=10;

$p=”a”; // присваиваем $p имя другой перемнной

echo $$p;//выводим переменную, на которую ссылается $p, т.е. $a

$$p=100; // присваивает $a значение 100

Итак, для того, чтобы использовать обычную строковую переменную как ссылку, нужно перед ней поставить еще один знак $. Это говорит интерпретатору, что надо взять не значение самой $p, а значение переменной, имя которой хранится в переменной $p.

Использование символических ссылок лучший способ запутать программу, поэтому старайтесь их избегать!

Константы. Константа отличается от переменной тем, что ей нигде в программе нельзя присвоить значение более одного раза, и её имя не предваряется знаком $, как это делается для переменных. Константы бывают 2 типов: предопределенные (установленные самим интерпретатором) и определенные программистом.

Предопределенные константы:

_FILE_ – хранит имя файла программы, которая выполняется в данный момент

_LINE_ – содержит текущий номер строки, которую обрабатывает в текущий момент интерпретатор

PHP_VERSION – версия интерпретатора РНР

PHP_OS – имя операционной системы, под которой работает РНР

TRUE или true – истина

FALSE или false – ложно

Определенные пользователем константы задаются при помощи оператора define()

define(”pi”,3.14);

define (”str”,”Hello”);

echo sin(pi/4);

echo str;

Функция defined(имя константы) проверяет, существует ли константа с указанным именем и возвращает значение false, если такой константы нет.

Выражения

Числовые выражения

$a=5; // a=5

$a=($b=10); // $a=$b=10

$a=4*sin($b=$c+10)+$d; // $b=$c+10

// $a=4*sin($c+10)+$d

Следующие операторы преобразования типов используются как в функциональной, так и в префиксной операторной форме, т.е. следующие конструкции эквивалентны:

$a=intval($b);

$a=(int)$b;

Операторы преобразования типов:

$b=intval(выражение) или $b=(int) (выражение)

// переводит выражение в целое число

$b=doubleval(выражение) или $b=(double) (выражение)

// переводит выражение в действительное число

$b=strval(выражение) или $b=(string) (выражение)

// переводит выражение в строку

$b=(bool) (выражение)

// переводит выражение в логический тип.

Логические выражения. Логические операторы: <, >, == (равно), || (или),! (не), && (и). Переменным можно присваивать значения логических выражений:

$a=10<5; // a=false

$a=$b==1; // $a=true, если $b=1

$a=$b>1&&$b<=10 // $a=true, если $b в пределах от1 до 10

$a=!($b||$c)&&$d; //$a=true, если $b и $c ложны, а $d – истинно

$b=$a>=1&&a<=10; //присваиваем $b значение логического

// выражения

if ($b) echo ”a в нужно диапазоне значений”;

Cтроковые выражения. Строки могут содержать текст вместе с символами форматирования. Определение строки в кавычках или апострофах может начинаться на одной строке, а завершаться на другой.

Строка, заключенная в апострофы трактуется так же, как записана, за исключением двух последовательностей символов:

\’ трактуется как апостроф, предназначенный для вставки апострофа в строку, заключенную в апострофы;

\\ трактуется как обратный слэш и позволяет вставить в строку этот символ.

Строки в кавычках могут содержать набор специальных метасимволов:

\n – символ новой строки;

\r – символ возврата каретки;

\t – символ табуляции;

\$ – обозначает символ $, чтобы следующий за ним текст не был интерпретирован как переменная;

\” – кавычка;

\\ – обратный слэш;

\xNN символ с шестнадцатеричным кодом NN.

Для слияния строк используется операция конкатенации “.”. Операторы, выводящие текстовые строки.

echo ”Текущая дата: $dat года <br>\n”;

echo ”Текущая дата:”,$dat,” года <br>\n”;

echo ”Текущая дата:”.$dat.” года <br>\n”;

Плюс используется как числовой оператор, а точка – как строковый:

$a=”100”;

$b=”200”;

echo $a+$b; // выведет “300”

echo $a.$b; // выведет “100200”

Here–документ. Это способ записи строковых констант, который представляет собой альтернативу для записи многострочных констант.

$a=<<<MARKER

Далее идет какой-то текст, возможно,

с переменными $name значения которых будут

вставлены в документ

MARKER;

Строка MARKER может быть любым алфавитно-цифровым идентификатором. Синтаксис накладывает 2 ограничения на here-документы:

1) после <<<MARKER и до конца строки не должны идти никакие непробельные символы;

2) завершающая строка MARKER; должна оканчиваться точкой с запятой, после которой до конца строки не должно быть никаких инструкций. MARKER – это любой идентификатор.

Вызов внешней программы. Строка в обратных апострофах заставляет РНР выполнить команду операционной системы и то, что она вывела, подставить на место строки в обратных апострофах. Например, содержимое текущего каталога можно узнать так:

$st='command.com/c dir';

echo ”<pre>$st</pre>”;

Операции:

Арифметические: +, -, *, /, a%b (остаток от делении а на b, работает только с целыми числами), $a+=4; $b-=3;

Строковые: a.b – слияние строк; a[n] – символ строки в позиции n.

Присваивания (=).

Инкремента и декремента ($a++, $a--, --$a, ++$a).

Битовые операции. Предназначены для работы (установки/снятия/проверки) групп битов целой переменной. Биты целого числа – это отдельные разряды того же самого числа, записанного в двоичной системе счисления: a&b, a|b, `a, a<<b (сдвиг влево), a>>b (сдвиг вправо).

Операции сравнения: a==b, a!=b, a<b, a>b, a<=b, a>=b.

Операции эквивалентности: это тройной знак равенства = = =, или оператор проверки на эквивалентность. Это оператор не только сравнивает выражения, но и их типы. Есть антипод этого оператора (!= =) – не эквивалентны.

Логические операции.!a, a&&b, a||b

Оператор отключения предупреждений. В РНР-программах все ошибки выводятся в окно браузера вместе с указанием строки и файла, в которых они находятся. РНР ранжирует ошибки и предупреждения по четырем основным «уровням серьезности». Можно настроить PHP так, чтобы он выдавал только ошибки тех уровней, которые необходимы. Для отключения выдачи ошибок в окно браузера, существует оператор @(отключение ошибок). Если разместить этот оператор перед любым выражением, то сообщения об ошибках в этом выражении будут подавлены и в окне броузера не отображены.

<? if (@$doGo) echo ”Вы нажали кнопку!”;?>

 

Виды комментариев:

операторы // комментарий

# однострочный комментарий

/*

многострочные комментарии (ими лучше не пользоваться! так как они вступают в конфликт с русскими буквами)

*/

Замечания

1 Для вывода значений переменных, переданных из форм, нужно использовать оператор print и указывать метод передачи данных: print ”Ваше имя:”.$_GET[’name’];

print ”Ваше имя:”.$_POST[’name’];

2 Условные обозначения при использовании стандартных функций PHP:

· string – обычная строка, или тип, который можно перевести в строку;

· int, long – целое число, либо вещественное число (в последнем случае дробная часть отсекается), либо строка, содержащая число в одном из перечисленных форматов. Если строку не удается перевести в int, то вместо нее подставляется 0, и никаких предупреждений не генерируется!

· double, float – вещественное число, или целое число, или строка, содержащая одно из таких чисел.;

· bool– логический тип, который будет восприниматься либо как ложь (нулевое число, пустая строка или константа false), либо как истина (все остальное);

· array– ассоциативный массив;

· list– массив с целыми ключами, пронумерованными от 0 и следующими подряд. Так как список является разновидностью ассоциативного массива, то обычно вместо параметров функций типа list можно подставлять и параметры типа array;

· object– объект какой-то структуры;

· void– применяется только для определения возвращаемого функцией значения (не возвращает ничего);

· mixed– все, что угодно. Это может быть целое или дробное число, строка, массив или объект.

 


Тема 3 Работа с данными формы

 

3.1 Передача данных

3.2 Трансляция полей формы в переменные

3.1 Передача данных

Web-программирование в большей части (или хотя бы наполовину) представляет собой обработку различных данных, введенных пользователем – т. е., обработку форм.

Передача данных командной строкой. Напишем сценарий, который принимает в параметрах Имя и возраст пользователя и выводит: "Привет, <имя>! Я знаю, вам <возраст> лет!".

Рассмотрим способ передачи имени и возраста сценарию – непосредственный набор их в URL после знака? – например, в формате

http://www.script.php?name=имя&age=возраст

Пусть на сервере в корневом каталоге есть сценарий на РНР под названием hello.php. Наш сценарий распознает 2 параметра: name и аgе. Он должен отработать и вывести следующую HTML-страницу:

<html>

<body>

Привет, name! Я знаю, Вам age лет!

</body>

</html>

Нужно name и age заменить на соответствующие значения. Таким образом, если задать в адресной строке браузера

http://www.somehost.com/script.php?name=Vasya&age=20

мы должны получить страницу с требуемым результатом.

Чтобы в сценарии получить строку параметров, переданную после знака вопроса в URL при обращении к сценарию, можно проанализировать переменную окружения QUERY_STRING, которая в РНР доступна под именем $QUERY_STRING.

<html>

<body>

<?

print "Данные из командной строки: $QUERY_STRING";

?>

</body>

</html>

Если теперь мы запустим этот сценарий из браузера (перед этим сохранив его в файле test.php в корневом каталоге сервера) примерно следующим образом:

http://www.myhost.com/test.php?aaa+bbb+ccc+ddd

то получим документ следующего содержания:

Данные из командной строки: aaa+bbb+ccc+ddd

Обратите внимание на то, что URL-декодирование символов не произошло: строка $QUERY_STRING, как и одноименная переменная окружения, всегда приходит в той же самой форме, в какой она была послана браузером.

Так как РНР изначально создавался именно как язык для Web-программирования, то он дополнительно проводит некоторую работу с переменной $QUERY_STRING перед тем, как управление будет передано сценарию, а именно, он разбивает ее по пробельным символам (в нашем примере пробелов нет, их заменяют символы +, но эти символы РНР также понимает правильно) и помещает полученные кусочки в массив-список $argv, который впоследствии может быть проанализирован в программе.

Однако массив $argv используется при программировании на РНР крайне редко, что связано с гораздо большими возможностями интерпретатора по разбору данных, поступивших от пользователя. Однако в некоторых ситуациях его применение оправдано.

Формы. Для того, чтобы пользователь мог в удобной форме ввести свое имя и возраст, нужно создать обычный HTML-документ (например, form.html) с элементами этого диалога – текстовыми полями – и кнопкой, т.е. форму:

<html>

<form action=hello.php>

Введите имя:

<input type=text name="name" value="Елена"><br>

Ваш возраст:

<input type=text name="age" value="5"><br>

<input type=submit value="Отправить">

</form>

</body>

</html>

Загрузим наш документ в браузер. Теперь, если ввести в поле с именем свое имя, а в поле для возраста – свой возраст и нажать кнопку, браузер автоматически обратится к сценарию hello.php и передаст через? все атрибуты, расположенные внутри тэгов <INPUT> в форме и разделенные символом & в строке параметров. Заметьте, что в атрибуте action тэга <form> мы задали относительный путь, т.е. сценарий hello.php будет искаться браузером в том же самом каталоге, что и файл form.html.

Все перекодирования и преобразования, которые нужны для URL-кодирования данных, осуществляются браузером автоматически. В частности, буквы кириллицы превратятся в %xx, где хх – шестнадцатеричное число, обозначающее код символа.

Листинг hello.php – модель простого РНР-сценария

<html>

<body>

<?

print "Привет, ".$_GET['name'].

". Вам ".$_GET['age']." лет.";

?>

</body>

</html>

 

3.2 Трансляция полей формы в переменные

Интерпретатор все данные из полей формы преобразует в глобальные одноименные переменные. Значение поля name после начала работы программы будет храниться в переменной $name, а значениеполя age – в переменной $age.

Теперь сделаем так, чтобы при запуске без параметров сценарий выдавал документ с формой, а при нажатии кнопки – выводил нужный текст. Самый простой способ определить, был ли сценарий запущен без параметров – проверить, существует ли переменная с именем, совпадающим с именем кнопки отправки. Если такая переменная существует, то, очевидно, что пользователь запустил программу, нажав на кнопку.

<html>

<body>

<?if(!@$doGo)

{

?>

<form action=”<?=$SCRIPT_NAME?>”>

//<form action=hello.php>

Введите имя:

<input type=text name="name" value="Елена"><br>

Ваш возраст:

<input type=text name="age" value="5"><br>

<input type=submit name="doGo" value="Отправить">

</form>

<?

} else {

?>

 

Привет!<br>

<?

print "Привет, ".$_GET['name'].

". Вам ".$_GET['age']." лет.";

?>

<?

}

?>

</body>

</html>

Конструкция <?=выражение?> является более коротким обозначением для <?echo(выражение)?>, и предназначена для того, чтобы вставлять величины прямо в HTML-страницу.

Обратите внимание на полезный прием: в параметре action тэга <form> мы не задали явно имя файла сценария, а извлекли его из переменной SCRIPT_NAME (которая устанавливается автоматически перед запуском сценария). Это позволило нам не "привязываться" к имени файла, т.е. теперь мы можем его в любой момент переименовать без потери функциональности.

Если РНР установлен не как модуль Apache, а как отдельный обработчик, то переменная $SCRIPT_NAME будет содержать не то значение, на которое мы рассчитываем.

К тому же, теперь исчезла необходимость и в промежуточном файле form.html, его код встроен в сам сценарий.

Трансляция переменных окружения и Cookies. В переменные преобразуются не только все данные формы, но и переменные окружения (включая QUERY_STRING, CONTENT_LENGTH и многие другие), а также все Cookies.

Пример сценария, который печатает IP-адрес пользователя, который его запустил, а также тип его браузера (эти данные хранятся впеременных окружения REMOTE_USER и HTTP_USER_AGENT):

<html><body>

Ваш IP-адрес: <?=$REMOTE_USER?><br>

Ваш браузер: <?=$HTTP_USER_AGENT?>

</body></html>

По умолчанию, трансляция выполняется в порядке ENVIRONMENT-GET-POST-COOKIE, причем каждая следующая переменная как бы перекрывает предыдущее свое значение. Например, пусть у нас есть переменная окружения а=10, параметр, поступивший из GET-формы a=20 и Cookie а=30. В этом случае в переменную $а сценария будет записано 30, поскольку Cookie перекрывает GET, a GET перекрывает переменные окружения.

Трансляция списков. Механизм трансляции полей формы в РНР работает приемлемо, когда среди них нет полей с одинаковыми именами. Если же таковые встречаются, то в переменную записываются только данные последнего встретившегося поля. Это довольно-таки неудобно при работе, например, со списком множественного выбора <select multiple>:

<select name=Sel multiple>

<option>First

<option>Second

<option>Third

</select>

B таком списке вы можете выбрать (подсветить) не одну, а сразу несколько строчек, используя клавишу <Ctrl> и щелкая по ним кнопкой мыши. Пусть мы выбрали First и Third. Тогда после отправки формы сценарию придет строка параметров Sel=First&Sel=Third, и в переменной $Sel окажется только Third. Для решения подобных проблем в РНР предусмотрена возможность давать имена полям формы в виде имени массива с индексами:

<select name="Sel[]" multiple>

<option>First

<option>Second

<option>Third

</select>

Теперь сценарию придет строка Sel[]=First&Sel[]=Third, интерпретатор обнаружит, что мы хотим создать "автомассив" (то есть массив, который не содержит пропусков, и у которого индексация начинается с нуля), и, действительно, создаст переменную $Sel типа массив, содержимое которого следующее:

array (0=>"First", 1=>"Third").

Пример работы с автомассивами:

$A[]=10;

$А[]=20;

$А[]=30;

После отработки этих строк будет создан массив $A, заполненный последовательно числами 10, 20 и 30, с индексами, отсчитываемыми с нуля. То есть, если внутри квадратных скобок при присваивании элементу массива не указано ничего, то подразумевается элемент массива, следующий за последним.

Прием с автомассивом применим не только к этому элементу формы: автомассивы мы можем применять и в любых других полях.

Пример, создающий 2 переключателя (кнопки со значениями вкл/выкл), один редактор строки и одно текстовое (многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму, будут представлены в виде одного-единственного автомассива:

<input type=checkbox name=Arr[] value=chl>

<input type=checkbox name=Arr[] value=ch2>

<input type=text name=Arr[] value="Some string">

<textarea name=Arr[] >Some text</textarea>

Автомассивы можно использовать для любых элементов формы.

Трансляция массивов. Пусть имеется форма, содержащая следующие элементы:

Имя: <input type=text name=Data[name]><br>

Адрес: <input type=text name=Data[address]><br>

Город:<br>

<input type=radio name=Data[city]

value=Moscow>Mоcква<br>

<input type=radio name=Data[city]

value=Peter>Caнкт-Петербург<br>

<input type=radio name=Data[city]

value=Kiev>Kиeв<br>

После передачи подобных данных сценарию на РНР в нем будет инициализирован ассоциативный массив $Data с ключами name, address и city. То есть, имена полям формы можно давать не только простые, но и представленные в виде одномерных ассоциативных массивов.

В сценарии к отдельным элементам формы можно будет обратиться при помощи указания ключа массива: например, $Data[’city’] обозначает значение той радиокнопки, которая была выбрана пользователем, a $Data["name"] – введенное имя. В сценарии мы обязательно должны заключать ключи в кавычки или апострофы – в противном случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name полей формы мы, наоборот, должны их избегать. Многомерные массивы (то есть, массивы массивов) указывать нельзя.


Тема 4 Конструкции языка

4.1 Условные инструкции

4.2 Инструкции циклов

4.3 Инструкции включения

4.1 Условные инструкции

О терминологии. Термины «конструкция» и «инструкция» совершенно эквивалентны. Термины «оператор» и «операция» несут разную смысловую нагрузку: любая операция есть оператор, но не наоборот. Например, echo – оператор, но не операция, а ++ – операция.

Инструкция if–else.

Формат Альтернативный синтаксис
if (условие) инструкция_1; else инструкция_2; if (условие1): команды; elseif (условие2): другие__команды; else: иначе_команды; endif

Конструкция else может опускаться.

if ($a>=l&&$b<=10) echo "Все ОК";

else echo "Неверное значение в переменной!";

Если инструкция_1 или инструкция_2 должны состоять из нескольких команд, то они, заключаются в фигурные скобки:

if ($a>$b) { print "а больше b"; c=$b; }

else if {$а==$b) { print "а равно b"; $c=$a; }

else { print "а меньше с"; $с=$а; }

Замечание: elseif пишется слитно! Обратите внимание на расположение двоеточия (:)! Если его пропустить, будет сгенерировано сообщение об ошибке. Блоки elseif и else можноопускать.

Использование альтернативного синтаксиса. Для того чтобы вставить HTML-код в тело сценария, достаточно просто закрыть скобку?>, написать этот код, а затем снова открыть ее при помощи <?, и продолжать программу.

Чаще всего, однако, нужно бывает делать не вставки HTML внутрь программы, а вставки кода внутрь HTML. Поэтому целесообразно бывает отделять HTML-код от программы, например, поместить его в отдельный файл, который затем подключается к программе при помощи инструкции include.

Пример сценария с использованием альтернативного синтаксиса if-else:

<?if(@$go):?>

Привет, <?=$name?>!

<?else:?>

<form action=<?=$REQUEST_URL?> method=post>

Ваше имя: <input type=text name=name><br>

<input type=submit name=go value="Отослать!">

<?endif?>

Конструкция switch-case.

Формат Альтернативный синтаксис
switch (выражение) { case значение1: команды1; [break;] case значение2: команды2; [break;] … case значениеN: командыN; [break;] [default: команды_по_умолчанию; [break]] } switch (выражение): case значение1: команды1; [break;] case значение2: команды2; [break;] … case значениеN: командыN; [break;] [default: команды_по_умолчанию; [break]] endswitch;

 

4.2 Инструкции циклов

Цикл с предусловием while.

Формат Альтернативный синтаксис
while (условие) инструкция;   while (условие): команды; endwhile;

Цикл с постусловием do-while.

do

{ команды; }

while (логическое_выражение);

Альтернативного синтаксиса для do-while нет.

Универсальный цикл for.

Формат Альтернативный синтаксис
for (инициализирующие_команды; условие_цикла; команды_после_прохода) тело_цикла; for (инициализируюшие__команды; условие_цикла; команды_после_прохода): операторы; endfor;

Инструкции break и continue. Инструкция break осуществляет немедленный выход из цикла. Она может задаваться с одним необязательным параметром – числом, которое указывает, из какого вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из текущего цикла, но иногда применяются и другие значения:

for ($i=0; $i<10; $i++)

{

for($j=0; $j<10; $j++)

If($A[$i]==$A[$j]) break(2);

}

If ($i<10)

echo "Есть совпадающие элементы в матрице А!";

В этом примере инструкция break осуществляет выход не только из второго, но и из первого цикла, поскольку указана с параметром 2.

Инструкция continue так же, как и break, работает только «в паре» с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой. Так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления.

Цикл foreach. Данный тип цикла предназначен специально для перебора всех элементов ассоциативного массива. Формат:

foreach (массив as $key=>$value)

команды;

Здесь команды циклически выполняются для каждого элемента массива, при этом очередная пара ключ=>значение оказывается в переменных $key и $value.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...