Semenalidery.com

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

List point c

Список list в С++: полный материал

Всем привет! Не давно мы прошли вектор в C++, поэтому сегодня мы решили снова затронуть тему контейнеров и подготовили материал об еще одном контейнере — list.

Что такое список list

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

На картинке ниже показана, как это устроено:

У двусвязного списка нет индексов, но вместо их в C++ есть итераторы.

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

На примере выше в начале было два элемента, потом мы решили добавить один элемент между ними.

А так совершается удаление.

Как создать список list

Сначала подключаем библиотеку —
.

Далее используем конструкцию ниже:

  • тип данных > — сюда мы должны указать тип, который хотим использовать.
  • — это будет нашим именем контейнера. Лучше указывать такое имя, которое будет говорить, за что этот контейнер отвечает.

Вот пример создания списка с типом string :

Как добавить элементы при создании списка

Чтобы сразу после создания списка присвоить ему значения нужно сделать так:

Такой способ можно использовать только в C++ 11 и выше.

Методы списка list

Вот функции которые можно применять в своей программе вместе со списком (нажмите на их имена чтобы перейти на страницу с полным руководством):

Давайте с несколькими методами познакомимся подробнее.

insert

С помощью его можно добавить новый элемент в любую часть контейнера (в нашем случае для списка). Вот как он работает:

  • Первым аргументом передаем — местоположение. Оно указывается итератором, что это читайте вот здесь.
  • Вторым значение новой ячейки. Здесь может быть как переменная так и просто значение (5 например).

Вообще он имеет несколько видов применения:

  • Вывод элементов.
  • Запись элементов.
  • А также копирования какого-то количества ячеек и вставка их в позицию Y.

Чтобы его использовать дополнительно нужно подключить библиотеку — .

Но сейчас мы поговорим только о выводе элементов, если хотите узнать и о других функциях переходите вот сюда.

Первые два значения ( myspisok.begin() , myspisok.end() ) которые должны передать, — это итераторы начала и конца контейнера.

Дальше используем итератор вывода — ostream_iterator (cout,» «) . В кавычках указывается значение между элементами (в нашем случае это пробел).

unique

Удаляет все повторяющиеся элементы (дубликаты). Использовать его очень просто:

merge

Добавляет существующему списку еще один.

Новичкам может показаться что этих функций слишком много, но просты и почти все повторяются в остальных контейнерах. Поэтому их запоминание происходит быстро, ну конечно если практиковаться будете.

Если хотите познакомится с ними то перейдите по ссылкам.

Удаление элементов

Кроме удаления в начале и в конце с помощью методов pop_front() и pop_end() , также можно удалять:

  • Диапазон ячеек.
  • Одну произвольную ячейку.
  • Удалять по какому-то условию.
  • А также удалять все ячейки с значением X.

erase

Если вы хотите удалить какой-то промежуток элементов или всего лишь один элемент, то это функция справиться с этим на раз-два. Вот как она работает:

Все позиции, которые должны указываться в аргументах erase — должны являться итераторами.

Во второй строчке не опечатка, из-за удаление одной ячейки итератор, который на нее указывает требуется обновить вот таким способам, чтобы он стал указывать на следующую ячейку.

Про функцию adsense мы поговорим ниже.

remove

Чтобы удалить все элементы со значением X нужно использовать данную конструкцию .remove(X) :

Итераторы для list

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

Хотя имеется возможность использовать инкремент и декремент, они немного сглаживают отсутствия нормального перемещения итератора.

В скобках указываем два значения:

  • Первое — это имя итератора.
  • Второе — число, на которое нужно сдвинуть указанный итератор.

Так, если нам нужно его сдвинуть налево, простыми словами — уменьшить, то второй аргумент должен иметь знак минуса ( — ).

Вам нужно знать! Функция advance не знает к какому контейнеру принадлежит итератор, поэтому если итератор выйдет за диапазон, программа никак вас не оповестит.

Плюсы и минусы использования списков

Мы узнали о списке все, чтобы сделать вывод о о нем.

  • Добавление и удаление ячеек осуществляется быстро.
  • Кроме добавления и удаления в конец, мы также можем добавить и удалить элемент в начале контейнера.
  • Медленное обращение к элементам, находящимся в центре.

Если в вашей программе приходиться много раз обращаться к элементам, то лучшим выбором будет вектор.

Linked lists

Introduction

Linked lists are the best and simplest example of a dynamic data structure that uses pointers for its implementation. However, understanding pointers is crucial to understanding how linked lists work, so if you’ve skipped the pointers tutorial, you should go back and redo it. You must also be familiar with dynamic memory allocation and structures.

Essentially, linked lists function as an array that can grow and shrink as needed, from any point in the array.

Linked lists have a few advantages over arrays:

  1. Items can be added or removed from the middle of the list
  2. There is no need to define an initial size

However, linked lists also have a few disadvantages:

  1. There is no «random» access — it is impossible to reach the nth item in the array without first iterating over all items up until that item. This means we have to start from the beginning of the list and count how many times we advance in the list until we get to the desired item.
  2. Dynamic memory allocation and pointers are required, which complicates the code and increases the risk of memory leaks and segment faults.
  3. Linked lists have a much larger overhead over arrays, since linked list items are dynamically allocated (which is less efficient in memory usage) and each item in the list also must store an additional pointer.

What is a linked list?

A linked list is a set of dynamically allocated nodes, arranged in such a way that each node contains one value and one pointer. The pointer always points to the next member of the list. If the pointer is NULL, then it is the last node in the list.

A linked list is held using a local pointer variable which points to the first item of the list. If that pointer is also NULL, then the list is considered to be empty.

Let’s define a linked list node:

Notice that we are defining the struct in a recursive manner, which is possible in C. Let’s name our node type node_t .

Now we can use the nodes. Let’s create a local variable which points to the first item of the list (called head ).

We’ve just created the first variable in the list. We must set the value, and the next item to be empty, if we want to finish populating the list. Notice that we should always check if malloc returned a NULL value or not.

To add a variable to the end of the list, we can just continue advancing to the next pointer:

This can go on and on, but what we should actually do is advance to the last item of the list, until the next variable will be NULL .

Iterating over a list

Let’s build a function that prints out all the items of a list. To do this, we need to use a current pointer that will keep track of the node we are currently printing. After printing the value of the node, we set the current pointer to the next node, and print again, until we’ve reached the end of the list (the next node is NULL).

Читать еще:  Https mytakeda sharepoint com sites home

Adding an item to the end of the list

To iterate over all the members of the linked list, we use a pointer called current . We set it to start from the head and then in each step, we advance the pointer to the next item in the list, until we reach the last item.

The best use cases for linked lists are stacks and queues, which we will now implement:

Adding an item to the beginning of the list (pushing to the list)

To add to the beginning of the list, we will need to do the following:

  1. Create a new item and set its value
  2. Link the new item to point to the head of the list
  3. Set the head of the list to be our new item

This will effectively create a new head to the list with a new value, and keep the rest of the list linked to it.

Since we use a function to do this operation, we want to be able to modify the head variable. To do this, we must pass a pointer to the pointer variable (a double pointer) so we will be able to modify the pointer itself.

Removing the first item (popping from the list)

To pop a variable, we will need to reverse this action:

  1. Take the next item that the head points to and save it
  2. Free the head item
  3. Set the head to be the next item that we’ve stored on the side

Here is the code:

Removing the last item of the list

Removing the last item from a list is very similar to adding it to the end of the list, but with one big exception — since we have to change one item before the last item, we actually have to look two items ahead and see if the next item is the last one in the list:

Removing a specific item

To remove a specific item from the list, either by its index from the beginning of the list or by its value, we will need to go over all the items, continuously looking ahead to find out if we’ve reached the node before the item we wish to remove. This is because we need to change the location to where the previous node points to as well.

Here is the algorithm:

  1. Iterate to the node before the node we wish to delete
  2. Save the node we wish to delete in a temporary pointer
  3. Set the previous node’s next pointer to point to the node after the node we wish to delete
  4. Delete the node using the temporary pointer

There are a few edge cases we need to take care of, so make sure you understand the code.

Exercise

You must implement the function remove_by_value which receives a double pointer to the head and removes the first item in the list which has the value val .

List point c

C# для профессионалов

Для кого предназначена эта книга

Основные темы книги

Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.

В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.

Эта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.

• Все особенности языка C#

• C# и объектно-ориентированное программирование

• Приложения и службы Windows

• Создание web-страниц и web-служб с помощью ASP NET

• Доступ к данным при помощи ADO NET

• Создание распределённых приложений с помощью NET Remoting

• Интеграция с COM, COM+ и службой Active Directory

Книга: C# для профессионалов. Том II

Point и PointF

Рассмотрим сначала Point (точка) Эта структура концептуально является простейшей и математически полностью эквивалентна двумерному вектору. Она содержит два открытых целых свойства, которые представляют горизонтальное и вертикальное смещение от определенного места (возможно, на экране). Посмотрите на рисунок:

Чтобы перейти из точки А в точку В, необходимо сместиться на 20 единиц вправо и на 10 единиц вниз, помеченных как X и Y на рисунке, так как это обычное обозначение. Можно было бы создать структуру Point , которая представляет это, следующим образом:

Point АВ = new Point(20, 10);
Console.WriteLine(«Moved <0>across, <1>down», AB.X, AB.Y);

X и Y являются свойствами чтения-записи, а значит, можно также задать значения в Point следующим образом:

Point АВ = new Point();
AB.X = 20;
АВ.Y = 10;
Console.WriteLine(«Moved (0) across, (1) down», AB.X, AB.Y);

Отметим, что хотя обычно горизонтальные и вертикальные координаты обозначаются как координаты х и у (буквы нижнего регистра), соответствующие свойства Point обозначаются X и Y (буквами верхнего регистра), так как обычное соглашение в C# для открытых свойств требует, чтобы их имена начинались с букв верхнего регистра.

PointF по сути идентична Point , за исключением того, что X и Y имеют тип float вместо int . PointF используется, когда координаты не обязательно являются целыми значениями. Для этих структур определено преобразование типов, поэтому можно неявно преобразовывать из Point в PointF и явно из PointF в Point (последнее преобразование явное в связи с риском ошибок округления):

PointF ABFloat = new PointF(20.5F, 10.9F);
Point AB = (Point)ABFloat;
PointF ABFloat2 = AB;

Одно последнее замечание о координатах. В нашем обсуждении Point и PointF сознательно присутствует неопределенность в отношении единиц измерения. Можно говорить о 20 пикселях вправо и 10 пикселях вниз или о 20 дюймах, или 20 милях. Интерпретация координат полностью принадлежит разработчику.

По умолчанию GDI+ будет представлять единицы измерения как пиксели на экране (или принтере, в зависимости от графического устройства), именно таким образом методы объекта Graphics будут представлять любые координаты, которые передаются им в качестве параметров. Например, точка Point(20, 10) представляет 20 пикселей вправо по экрану и 10 пикселей вниз. Обычно эти пиксели измеряются от верхнего левого угла клиентской области окна, как было до сих пор в рассмотренных примерах. Но это не всегда так, в некоторых ситуациях может потребоваться нарисовать относительно верхнего левого угла всего окна (включая границу) или даже относительно верхнего левого угла экрана. В большинстве случаев, однако, если документация не говорит обратное, можно предполагать, что речь идет о пикселях относительно верхнего левого угла клиентской области.

Мы вернемся к рассмотрению этого вопроса после изучения прокрутки экрана, когда речь пойдет об использовании трех различных координатных систем: мировых, страницы и устройства.

Program to Reverse a Linked List in C++

In this tutorial we will be solving the problem of reversing a Linked List by completely reversing the order of the data nodes in it. In simpler words the data node present at the end should become the starting point of the Linked List.

Читать еще:  Tp link пропадает wifi

How can we do that?

Reversing of a linked list means that the head pointer will point to the terminal node of the linked list or the last node of the linked list and the existing head will be pointing towards NULL.

This can be easily done with the help of three pointers where in with each traversal through the linked list they keep on reversing the pointer to the next node in the linked list.

Algorithm:

Define a function to reverse the linked list with arguments as the reference to the head node and follow the steps below to get the desired output:

Step1: Define three nodes one with the reference to the head node, and other two nodes as NULL.

Step2: Now run a loop which will be used to traverse the linked list once until the next node does not become NULL.

Step3: Now inside the loop, the first NULL node is defined as the next node to the head node.

Step4: Secondly, the next node of the head node is defined as the second NULL node.

Step5: Now, the second NULL node in step 4 is again redefined as the node which holds the reference to the head node in step 1.

Step6: And finally, the node holding the reference to the head node in step 1 is made to hold the reference to the next node in the linked list and hence, the pointer now points to its previous node.

Implementation of the Algorithm:

For the above program the time complexity is: O(n)

Output of the above algorithm:

Now let’s try to understand what we actually did in the above program using the pictorial representation below.

Explanation of the Algorithm:

Let us take an example of the linked list as shown in the below diagram:

Now let’s follow the following steps to reverse the given linked list:

Let the first node be the current node which holds the reference to the head node as shown in the diagram below.

Now, we will traverse the whole linked list till the next of the head node does not become NULL. To do so, we will set the next node of the head node as temp, as shown in the diagram below.

Now, the temp node stores the reference to the next node of the head node as shown in the diagram above. Then, we will make the next node of current link to the previous(in this case NULL), to understand this see the arrow getting created to Null node on left of Node with data 100.

We will then set the prev pointer to the new NULL node created which is also the previous of the current node and then move the current node one node ahead and the loop will start again with the temp pointer getting moved to next of current pointer.

We will also make the next of current point to the previous which will change the direction of arrow, then move the current to next and the previous to next too.

And, finally the terminal node becomes the head node and the output is shown in the diagram above.

“What’s the point?” – выражения со словом Point в английском языке

Вам встречались выражения “What’s the point?”, “The point is”, “That’s a good point?” Поначалу я их не понимал, потому что знал, что point – это точка в геометрии, пункт, место, но в этих выражениях point – это смысл, суть или некая мысль. Подобные выражения встречаются часто в обычной повседневной речи, сегодня мы подробно их разберем.

Что значит Point в английском языке?

Прежде чем разбирать выражения, где point = смысл, суть, цель, мысль, давайте сначала разберем несколько других значений слова point.

  • Point – точка в геометрии и дробях

Point – это точка в геометрии или точка в десятичных дробях. В предложении точка – это full stop или period, а точка в адресах веб-сайтов – это dot. Сравните:

Point is an exact position in space that has no size. – Точка – это точное положение в пространстве, не имеющее размера.

The total number is seventy-six point eight. – Итого: 76 целых 8 десятых (76.8).

Don’t use a period in the end of a headline. – Не ставь точку в конце заголовка.

Go to google dot com. – Зайди на гугл точка ком.

  • Point – пункт, определенное место, точка в пространстве

You have reached the point of destination. – Вы достигли пункта назначения.

The ball should be placed at that point. – Мяч должен быть размещен на этом месте.

Сюда же отнесу point of view – точка зрения

Почитайте еще вот это!

I don’t share that point of view. – Я не разделяю эту точку зрения.

  • Point – определенный момент во времени или степень развития действия

At that point, I didn’t care about the rules. – На тот момент, мне уже было наплевать на правила.

The couple got to the point where they didn’t talk at all. – Семейная пара дошла до того (до такой степени развития действия), что вообще не разговаривала.

  • Point – очко при подсчете результатов

Ten points to Gryffindor! – Десять очков Гриффиндору!

The younger boxer won on points. – Молодой боксер выиграл по очкам.

Однако чаще всего слово point встречается в значениях: 1) суть, основной смысл, цель, 2) идея, мысль. Причем встречается в составе разговорных выражений, сейчас мы их разберем.

Выражения со словом Point в английском языке

Разберем выражения, когда под point подразумевается смысл чего-то. В данном случае понятие “смысл” иногда близко к понятиям “цель”, “польза”.

  • What’s the point? – В чем смысл? Какой в этом смысл? В чем толк?

Подразумевается “какой прок?”, а не “каково значение?”

– We are running late! Let’s get a cab! – Мы опаздываем! Давай найдем такси!

What’s the point? We’ve missed the flight already. – Какой в этом смысл? Мы уже опоздали на самолет.

Выражение “What’s the point?” можно расширить, достроить, прибавив of + герундий (именно герундий, а не инфинитив). Получится так:

What’s the point of taking a cab? We’ve missed the flight already. – Какой смысл в том, чтобы брать такси? Мы уже опоздали на самолет.

  • There is no point in + герундий – Нет никакого смысла (прока) в…

There is no point in pretending, we know you stole the cookies. – Притворяться бессмысленно, мы знаем, что ты украл печеньки.

Под “бессмысленно” подразумевается “в этом нет никакого прока”.

Выражение “There is no point” также используют без последующих in и др. слов в конце предложения. Например, вот так:

You can pretend you didn’t steal the cookies, but there is no point [in doing this]. – Ты можешь притвориться, что не украл печеньки, но это бессмысленно.

“In doing this” подразумевается, но опускается.

  • What’s your point? – Что ты имеешь в виду? К чему ты клонишь?

Вопрос “What’s your point?” можно понять так: что ты имеешь в виду? что ты пытаешься донести? что ты подразумеваешь? к чему ты клонишь? Типичная ситуация: я высказал какую-то идею, но намеками, неявно, меня переспрашивают: “What’s your point?” То есть смысл этого вопроса в том, чтобы получить прямой ответ.

Читать еще:  Как поднять скорость wifi

– I think your apartment is big enough for two, and I’ve got nowhere to stay, and we kinda went to school toghether… – Я думаю, у тебя квартира достаточно большая для двоих, а мне негде пожить, ну и мы как бы в школе вместе учились…

What’s your point?К чему ты клонишь?

– Can I stay at your place for a few weeks? – Можно у тебя пожить несколько недель?

  • The point is (that) … – Суть в том, что / Смысл в том, что… / Дело в том, что…

А вот здесь под point подразумевается не прок, польза, а суть, важнейшая часть.

Примечания: 1) союз that может опускаться, 2) часто перед этим выражением идет but: “but the point is”.

It’s not hard for us to win the match, but the point is, we need to lose it. – Нам нетрудно выиграть этот матч, но суть в том, что нам нужно его проиграть.

The speech was long. The point was, we have to keep working hard etc. – Речь была долгой. Суть в том, что мы должны продолжать работать изо все сих и т. д.

  • to get (straight) to the point – перейти (сразу) к сути, делу

Здесь point – это суть, важнейшая часть.

Let’s skip the formalities and get to the point. – Давайте пропустим формальности и перейдем к делу.

She skipped the introduction and got straight to the point. – Она пропустила вступление и перешла сразу к делу.

  • to get the point – уловить суть, понять, что имелось в виду

Не путайте это выражение с предыдущим: to get TO the point = переходить к сути, to get the point = улавливать, понимать суть.

I’ve read the article but didn’t get the point. – Я прочитал статью, но не понял сути (не понял, что имелось в виду).

Could you repeat it, please? I’m afraid I didn’t get your point. – Вы не могли бы повторить? Боюсь, я не понял, что вы имели в виду.

Частный случай этого выражения – это когда объясняют что-то, не могут подобрать слова, а затем, кивая, говорят: “You get the point” – “Ну, ты понял”. Например:

– Well, in Russia ‘dacha’ is a kind of… summer house plus garden… but it’s usually smaller than regular houses… well, you get the point. – Ну, в России “дача” – это вроде… летнего домика с садом… но обычно домика поменьше обычных домов… ну, вы меня понимаете.

  • to miss the point – не понять, что имелось в виду, не уловить сути

По сути, вместо “I missed the point” можно сказать “I didn’t get the point” – это синонимы.

I think you missed the point of the quote. – Я думаю, вы не уловили сути цитаты (не поняли, что в ней имелось в виду).

Sorry, I’m afraid I missed the point. – Извините, боюсь, я не понял, что имелось в виду.

  • That is not the point – суть не в этом, дело не в этом

Если вы говорите, что у вас сломался кондиционер, а вам предлагают проверить слив в раковине, пригодится выражение “That’s not the point” (не в этом дело). Обычно после него объясняют, в чем именно суть. Для этого можно использовать уже знакомое вам выражение “The point is”. Другой случай: если вы начали рассказывать про свою кошку, а отвлеклись на обсуждение сериала, вы можете прерваться, сказав, “But that’s not the point” (но суть не в этом, но речь не о том) и вернуться к рассказу про кошку.

– My uncle has five cats at his ranch. – У моего дяди на ранчо пять кошек.

– He really loves cats! – Он действительно любит кошек.

– Yeah, but that’s not the point. They catch mice. – Да, но суть не в этом. Они ловят мышей.

В следующих выражения слово point используется в значении “мысль, идея”.

  • That is a good point – Это хорошая мысль, хорошо подмечено

“That’s a good point” – это одобряющее выражение, которое используют, когда кто-то подметил важную мысль, сделал замечание, задав вопрос или уточнив что-то. В данном случае под point подразумевается не суть, значение, а просто некая мысль.

– We need to bury this treasure and burn the map so that no one could find it! – Нам нужно закопать эти сокровища и сжечь карту, чтобы никто их не нашел!

– But if we burn the map, how do WE find it? – Но если мы сожжем карту, как мы сами их найдем?

That’s a good point. – Хорошо подмечено.

  • You have a point – В этом есть смысл, резон

Другими словами: “Это звучит разумно”, то есть к этому стоит прислушаться, я, может и не полностью, но согласен с вами.

At first I thought that your theory was ridiculous, but now I see, you have a point. – Сначала я думал, что ваша теория – смехотворна, но сейчас я вижу, в этом есть резон.

Hey, don’t interrupt him. He has a point. – Эй, не перебивайте его. Он дело говорит.

  • I’ve made my point – Я высказал свою точку зрения, я все сказал, я сказал, что хотел

Вообще, выражение “to make (one’s) point” значит донести мысль, понятно высказаться, но именно в этой формулировке оно примерно равно русскому “я все сказал”. Так говорят после какой-нибудь длинной тирады, подчеркивая, что, мол, мнение мое окончательно и непоколебимо, и вообще разговор окончен.

– … and this is the last time when I see you drunk at work! I’ve made my point. – … и это последний раз, когда я вижу тебя пьяным на работе! Я все сказал.

  • to get the point across (to smb) – донести мысль (до кого-то)

Выражение to get the point across или to get one’s point across значит донести мысль, идею до собеседника. Можно добавить объект действия (to smb), чтобы уточнить до кого именно доносится мысль, хотя обычно это излишне.

I don’t speak English very well, but I can get my point across. – Я не говорю по-английски очень хорошо, но я могу донести мысль.

I wasn’t able to get my point across to him on phone, so I sent him an emai. – Я не смог донести до него мысль по телефону, поэтому написал ему на электронную почту.

  • Point taken – Мысль ясна, ваша позиция ясна

Мы говорим “Point taken” в ответ на высказывание или замечание. Говоря “Point taken”, вы даете знать, что поняли собеседника, но это не обязательно значит, что вы с ним согласны. Просто констатируете факт: ваша точка зрения предельно ясна.

– We must shut the plant down because it is bad for the environment. – Мы должны закрыть завод, потому что он вреден для окружающей среды.

– All right. Point taken. Does anybody else have better ideas? – Хорошо. Ваша мысль ясна. У кого-нибудь есть идеи получше?

Меня зовут Сергей Ним, я автор сайта langformula.ru и книг по английскому языку.

Друзья! Меня часто спрашивают, но я сейчас не занимаюсь репетиторством. Если вам нужен учитель, рекомендую этот чудесный сайт . Здесь вы найдете преподавателя, носителя языка или не носителя, на любой случай и карман Я сам прошел там более 100 занятий, рекомендую попробовать и вам!

Ссылка на основную публикацию
Adblock
detector