<! >

Первое знакомство

04.12.2017- понедельник(вечер)Я пришла с подругами на секцию по волейболу, там как всегда было много народу. Все занимались именно волейболом, как я и Богдан.После того, как распределили команды играть, Богдана и меня не выбрали, ну и осталось много девочек(моих подруг). Когда я пошла за своим телефоном, прихожу, и Богдан с друзьями начали ко мне "Клеиться". Это продолжалось до конца секции,после чего всё происходило в школьное время.Когда они начали за мной бегать, а их было 3, после 4 мне было приятно,но всё же такого отношения к себе не хотелось бы допускать.А что было дальше вы узнаете когда наступит следующий день...

11:20:20 7.06.2018

Газовое оборудование - заменять или диагностировать?

По статистике из открытых источников у нас в стране около 70% установленного газового оборудования, отработало нормативный срок эксплуатации, который составляет не более 10 лет. Сегодня всего в квартирах жилого фонда установлено более 45 млн газовых плит. И с каждым годом количество старого газового оборудования будет увеличиваться.И в Госдуме, и на местах правомерно задаются вопросом: а что делать дальше с таким оборудованием?Читать дальше...

21:19:44 4.06.2018

CPP FAQ Часть III

вопрос 32. Перегрузка инкремента и декремента. Перегрузка new и delete._______________________________________________________________________Перегрузка инкремента и декремента.___________________________________Предположим, мы хотим прибавить 1 к объекту с0 класса С. Когда компилятор встречает выражение с префиксным инкрементом ++c0, он генерирует вызов функции-элемента c0.operator++(), прототип которой должен иметь вид: C& operator++ ();Если префиксная форма инкремента реализуется как функция, которая не является функцией-членом класса, то, когда компилятор встречает выражение ++c0, он генерирует вызов функции operator++(c0). Прототип такой функции должен быть объявлен в классе С как дружественный: friend C& operator++(C&);По соглашению, принятому в С++, когда компилятор встречает выражение постфиксной формы инкремента c0++, он генерирует вызов функции с0.operator++(0), прототипом которой является C& operator++(int).Фиктивный параметр int никогда не используется, а лишь служит признаком того, что функция вызывается для выполнения операции ++ или -- в постфиксном варианте. Если постфиксная форма инкремента реализуется как функция, которая не является функцией-членом класса, то, когда компилятор встречает выражение c0++, он генерирует вызов функции operator++(c0, 0). Прототип такой функции должен быть объявлен в классе С как дружественный: friend C& operator++(C&, int);Перегрузка new и delete._______________________Имеется возможность перегрузить new и delete. Это можно сделать в том случае, если необходимо использовать какой-то особый способ выделения памяти. Например, нужно выделять память и, в случае отсутствия её, создавать дисковый файл, в который можно записывать информацию. Какой бы ни была причина, осуществить такую перегрузку очень просто.Для перегрузки операторов new и delete может использоваться следующий формат:void* operator new(size_t размер){     код оператора     return указатель_на_память;} void operator delete(void* p){     код оператора}Параметр размер будет содержать число в байтах, которое необходимо выделить для размещения объекта. Это  значение будет сформировано автоматически. У параметра размер тип данных size_t. Данный тип - это псевдоним, под которым скрывается unsigned int. В прототипе оператора new можно указать дополнительные параметры, которые будут передаваться  при вызове new. Самое главное, чтобы на первом месте в обьявлении функции находился параметр типа size_t. Перегруженная функция new должна возвращать указатель  на  выделенную память.  По отношению к классу перегруженный оператор new будет статической функцией-членом.Функция delete получает указатель на область памяти, которую необходимо освободить. Она обязана освободить эту память. Как в new, так и в delete можно передавать дополнительные параметры. Перегруженный оператор delete - статическая функция класса.Для перегрузки операторов new [] и delete [] может использоваться следующий формат:void* operator new[](size_t размер){     код оператора     return указатель_на_память;} void operator delete[](void* p){     код оператора}Всё вышесказанное о new и delete верно и по отношению к new [] , delete [].  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 33. Инкапсуляция.________________________Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то, и другое от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект.Можно сказать, что инкапсуляция подразумевает под собой скрытие данных (data hiding), что позволяет защитить эти данные. Cуть инкапсуляции можно определить следующим образом: Переменные состояния объекта скрыты от внешнего мира. Изменение состояния объекта (его переменных) возможно ТОЛЬКО с помощью его методов (операций).  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 34. Наследование. Определение, механизм, назначение.___________________________________________________________Наследование - это процесс, посредством которого, один объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для него.Итак, рассмотрев теоретические вопросы, переходим к практике. Класс можно сделать производным от существующего с использованием следующей формы: class имя_класса: (public| protected| private) имя_базового_класса   { объяления членов   };Синтаксис описания класса Вам уже знаком. А для создания наследника от базового класса необходимо после имени класса поставить двоеточие, записать спецификатор доступа и указать родителя (т.е. базовый класс).Теперь, давайте, обобщим правила доступа для классов и объектов закрытых, защищенных и открытых частей описания класса. 1. Элементы, объявленные как закрытые (private), могут использоваться любыми    функциями-членами своего класса. 2. Элементы, объявленные как защищенные (protected), могут использоваться любыми    функциями-членами своего класса, а также функциями-членами производных классов. 3. Элементы, объявленные как открытые (public), могут использоваться любой    функцией базового или производного класса. К ним, также, возможно обратиться    через экземпляры класса. 4. Когда класс используется как открытый базовый класс, его открытые элементы    становятся открытыми элементами производного класса, а защищенные элементы    становятся защищенными элементами производного класса. 5. Когда класс используется как закрытый базовый класс, его открытые и защищенные    элементы становятся закрытыми элементами производного класса. 6. Когда класс используется как защищенный базовый класс, его открытые и защищенные    элементы становятся защищенными элементами производного класса.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 35. Статические члены данных.____________________________________Модификатор static сообщает компилятору о необходимости статического выделения памятидля переменной или функции. При таком определении переменная существует в течениивсего времени выполнения программы. При объявлении статических данных - элементов класса, элементы класса становятсядоступными для всех объектов класса.Чтобы создать статический элемент данных, необходимо не только объявить его в классе,но также определить его в этом же модуле, как если бы это была глобальная переменная.Член класса,  в котором объект является экземпляром класса, может быть упомянут какclass::member или object.member Например:class Study{ public: static long number; Study(){++number;} //...};long Study::number=0;Пример объявления статической функции - элемента класса. Такая функция может обратиться к другому члену класса только в том случае, если он объявлен как статический.Функция не может использовать ключевое слово this, и в отличии от большинствафункций-членов класса она не допускает скрытый указатель this. Цель статическойфункций-члена заключается в создании способа обращения к статическим данным-членам. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 36. Указатели и массивы._______________________________В С++ существует тесная связь между указателями и массивами. Любой доступ к элементу массива, осуществляемый операцией индексирования, может быть выполнен при помощи указателя. Запись a[i] отсылает нас к i-му элементу массива. Если pa есть указатель на int, т.е. определен как int *pa; то в результате присваивания pa=&a[0]; pa будет указывать на нулевой элемент а; иначе говоря, ра будет содержать адрес элемента а[0]. Теперь присваивание x=*pa;будет копировать содержимое a[0] в х. Если ра указывает на некоторый элемент массива, то ра+1 по определению указывает на следующий элемент, ра+i - на i-ый элемент после ра, а ра-i - на i-ый элемент перед ра. Таким образом, если ра указывает на а[0], то *(ра+1) есть содержимое а[1], pa+i - адрес а[i], a *(pa+i) - содержимое a[i].По определению имя масива - это адрес его нулевого элемента. После присваивания  pa=&a[0]; pa и а имеют одно и то же значение.Поскольку имя массива есть не что иное, как адрес его начального элемента, присваивание ра=&a[0]; можно также записать в следующем виде: ра=a;Еще более удивительно то, что а[i] можно записать как *(a+i). Встречая запись a[i], компилятор сразу преобразует ее в * (а+i); указанные две формы записи эквивалентны. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 37. Массивы.___________________Массив — это последовательная группа ячеек памяти, имеющих одинаковое имя и одинаковый тип.Объявление массивов.Массивы занимают область в памяти. Программист указывает тип каждого элемента, количество элементов, требуемое каждым массивом, и компилятор может зарезервировать соответствующий объем памяти. Чтобы указать компилятору зарезервировать память для 6 элементов массива целых чисел A, используется объявлениеint A[6];Если размер массива не указан в объявлении со списком инициализации, то количество элементов массива будет равно количеству элементов в списке начальных значений. Например, объявлениеint n[ ] = {1, 2, 3, 4, 5};создало бы массив из пяти элементов. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 38. Потоки в С++.________________________Потоки ввода-вывода.Поток определяется как последовательность байтов (символов) и с точки зрения программы не зависит от устройств, с которыми ведется обмен данными (файл на диске, принтер, клавиатура, дисплей и т.п.). Описанные в файле iostream.h средства ввода-вывода обеспечивают программиста механизмами для извлечения данных из потоков и для включения (помещения) данных в потоки. При обмене с потоком часто используется вспомогательный участок основной памяти - буфер потока. В буфер потока помещаются выводимые программой данные перед тем, как они будут переданы внешнему устройству. При вводе данных они вначале помещаются в буфер и только затем передаются в область памяти выполняемой программы. Использование буфера повышает скорость передачи данных, т.к. реальные пересылки осуществляются только тогда, когда буфер уже заполнен (при выводе) или пуст (при вводе). Предопределенные потоки.Библиотека ввода-вывода имеет 4 предопределенных объекта-потока, ассоциированных со стандартным вводом и выводом: cin - объект класса istream, связанный со стандартным буферизированным входным потоком       (обычно с клавиатурой); cout - объект класса ostream, связанный со стандартным буферизированным выходным потоком        (обычно с дисплеем); cerr - объект класса ostream, связанный со стандартным небуферизированным выходным потоком        (обычно с дисплеем), в который направляются сообщения об ошибках; clog - то же, что cerr, но буферизирован. Операции помещения в поток и извлечения из потока.Библиотека потоков С++ предусматривает два основных класса для ввода и вывода:istream и ostream. Класс ostream использует для вывода переопределенную операцию левого сдвига (<<), которую называют операцией помещения в поток. Класс istream использует для ввода переопределенную операцию правого сдвига (>>), которую называют операцией извлечения из потока.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

13:36:21 3.05.2018

CPP FAQ Часть II

вопрос 15. Определение структур. Указатели на структуру.________________________________________________________Структура - это составной тип данных, построенный с использованием других типов.  Структура состоит из полей. Поля (элементы структуры) - переменные или массивы стандартного типа (int, char и т.п) или другие, ранее описанные структуры. Описанный тип данных можно использовать для объявления переменных типа структур. можно объявлять сколько угодно переменных с одной и той же структурой.В одной программе может быть множество разных структур. Из структур можно организовывать массивы. Объявление структуры осуществляется с помощью ключевого слова struct, за которым идет ее имя и далее список элементов, заключенных в фигурные скобки:  struct [имя] {                тип_элемента_1 имя_элемента_1;               тип_элемента_2 имя_элемента_2;                    ...               тип_элемента_n имя_элемента_n;     };Имя структуры используется при объявлении переменных данного типа. Именем элемента может быть любой идентификатор. Через запятую можно записывать несколько идентификаторов одного типа. Элементы одной и той же структуры должны иметь уникальные имена, но две разные структуры могут содержать элементы с одинаковыми именами. Каждое определение структуры должно заканчиваться точкой с запятой. Например, struct date { int day, month, year; };Переменные структуры объявляются так же, как переменные других типов. Например,  date days;Указатели на структуру._______________________Имя структуры обладает всеми правами имен типов, а следовательно, можно определять указатели на структуры: имя_структуры *имя_указателя на структуру;для доступа к элементам структуры мы использовали операцию точка (.). Операция точка обращается к элементу структуры по имени переменной объекта. Но, если у нас определен указатель на структуру, то появляется еще одна возможность доступак элементам структуры. Ее обеспечивает оператор стрелка (->).Формат соответствующего выражения следующий: имя_указателя->имя_элемента_структурыВыражение birthday->month эквивалентно (*birthday).month, которое разыменовывает указатель и делает доступным элемент month через оператор точка.Скобки нужны, т.к. оператор точка имеет более высокий приоритет, чем оператор разыменования указателя (*). Cсылки  на структуру._____________________Как и для других объектов, для структур могут быть определены ссылки: имя_структуры &имя_ссылки_на_структуру инициализатор;Например, для переменной my_date можно, так ввести ссылку: Date &now = my_date; После такого определения now является синонимом имени пременной my_date.Для доступа к элементам структуры используется оператор точка. Таким образом, следующие четыре выражения эквивалентны и обеспечивают доступ к элементу month переменной my_date типа Date. my_date.month      //по имени переменнойnow.month          // по ссылкеbirthday->month    // через указатель(*birthday).month  // через разыменованный указатель- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 16. Поиск в массивах. Сортировка.________________________________________Поиск в массивах._________________Линейный поиск сравнивает каждый элемент массива с ключом поиска. Поскольку массив не упорядочен, вполне вероятно, что отыскиваемое значение окажетсяпервым элементом массива. Но в среднем, программа должна сравнить с ключом поиска половину элементов массива. Метод линейного поиска хорошо работает для небольших или для несортированных массивов. Однако, для больших массивов линейный поиска неэффективен. Если массив отсортирован, можно использовать высокоэффективный метод двоичного поиска. Алгоритм двоичного поиска исключает половину еще непроверенных элементов массива послекаждого сравнения. Алгоритм определяет местоположение среднего элемента массива и сравнивает его с ключом поиска. Если они равны, то ключ поиска найден и выдается индекс этого элемента. В противном случае задача сокращается на половину элементов массива.Если ключ поиска меньше, чем средний элемент массива, то дальнейший поиск осуществляется в первой половине массива, а если больше, то во второй половине.Поиск продолжается до тех пор, пока ключ поиска не станет равным среднему элементу или пока оставшийся подмассив содержит хотя бы один элемент, не равный ключу поиска. Сортировка.____________Сортировка подробно описана в вопросе номер 10.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 17. Определение функции. return. Прототипы функций.__________________________________________________________В C++ код, описывающий, что делает функция, называется определением функции.Формально это выглядит так:   заголовок_функции  { инструкции }Все, что стоит перед первой фигурной скобкой, составляет заголовок определения функции,а то, что находится между фигурными скобками, является телом определе­ния функции. Заголовок функции — это:  тип имя(список_объявлений_параметров)Спецификация типа, стоящая перед именем функции, является возвращаемым ти­пом.Он определяет тип значения, возвращаемого функцией (если оно вообще воз­вращается). Имена функций подчиняются тем же ограничениям, что и имена переменных. return._______Инструкция return возвращает управление из тела функции. При обработке компилятороминструкции return выполнение функции завершается, а все ее последующие инструкциине выполняются.Синтаксис:return[expression];При задании инструкции  return с аргументом expression (который может быть выражением)значение этого аргумента может быть использовано вдругих функциях.Квадратные скобкипоказывают что аргумент не обязателен. Если аргумент опущен, инструкция  returnпросто выполняет выход из функции.Прототипы функций.__________________Прототип - определение функции, содержащее полную информацию о количестве и типахпараметров, а также о типе возвращаемого значения.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 18. Работа со строками в С++.____________________________________Строка определяется как последовательность (массив) символов, заключенных в двойныекавычки. Признаком конца строки является управляющий символ нуль-терминатор \0.В описании строки должна быть указана максимально возможная длинна плюс один(для нуль-терминатора). Объем памяти, выделенный для строки, остается неизменнымв облости ее видимости, но все символы, стоящие после признака конца строки, игнорируются.Строка символов, как и любой другой масив, может быть инициализированна при ее описании.char str[50];char str_start[]="START";Char start[7]={'S','T','A','R','T',' ','\0'};- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 19. Многомерные массивы. Двумерные массивы. Многомерные динамические массивы.____________________________________________________________________________________Чтобы разместить в памяти компьютера таблицу чисел, удобнее использовать двухмерныймассив. Описание двухмерного массива отличается от одномерного толко наличием ещоодного значения длинны в квадратных скобках. Первое значение - количество строк в таблице.Второе значение - количество столбцов.В памяти компьютера элементы распологаются построчно: сначала первая строка,затем вторая и т.д. Каждый элемент массива имеет два индекса: номер столбца иномер строки, в которых он находится. Все индексы начинаются с нуля.Пример:int a[3][4];a[0][0]=1; // 1-й элемент таблицыa[0][i]=i; // i-й элемент первой строкиa[j][i]=j*i; // i-й элемент j-й строкиЕсли имеется несколько одинаковых таблиц, их лучше организовать в трехмерный массив.При этом первым индексом будет номер таблицы, вторым - номер строки, третьим - номерстолбца.int tables[2][3][4]; //2 таблицы размером 3х4Многомерные динамические массивы._________________________________1. Определяем переменную array как адрес массива адресов:  float **array;2. Выделяем область памяти для массива из n указателей на тип float и присваиваем адрес начала этой памяти указателю аrray. Оператор, выполняющий эти действия выглядит так:  array = new float* [n];3. В цикле пробегаем по массиву адресов array[], присваивая каждому указателю array[i] адрес вновь выделяемой памяти под массив из n чисел типа float. for(int i=0;i<n;i++){ array[i] = new float[n]; }Захваченную для массива память следует вновь возвращать в распоряжение операционной системы. То есть освождать с помощью операции delete.  for(int i=0;i<n;i++){ delete [] array[i]; } delete [] array;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 20. Шаблоны функций. Шаблоны классов._____________________________________________С помощью шаблонов функций языка С++ можно создать единственное общее определение функции, использующееся с различными типами данных. Используя шаблон языка С++, можно создать единственное определение, которое будет автоматически обрабатывать значения типа int, double или любого подходящего другого типа. Такой шаблон выглядит следующим образом: template <typename T> T Abs (T N){  return N < 0 ? -N : N;}При определении шаблона нужно использовать спецификаторы template и typename вместе с угловыми скобками, как показано в приведенном выше примере. Для параметра типа Т можно использовать любой корректный идентификатор имени, а в угловые скобки можно включать несколько параметров типа. Чтобы передавать параметры различных типов, нужно определить шаблон функции. template <typename T1, typename T2> T2 Max(T1 A , T2 B){   return A > B ? A : B;}Шаблоны классов.________________Общая форма объявления параметризованного (обобщенного) класса. template <class Tтип_данных> class имя_класса { //....описание класса....... }; Рассомотрим это объявление. Здесь Tтип_данных представляет собой имя типа шаблона, которое в каждом случае конкретезации будет замещаться фактическим типом данных.При необходимости, можно определить более одного параметризовнного типа данных, используя список с разделителем-запятой, т.е. параметризованные классы могут иметь несколько аргументов шаблона. Заметим, что в пределах определения класса имя Tтип_данных можно использовать в любом месте.Вы можете создать конкретную реализацию этого класса, используя следующий синтаксис:  имя_класса <тип_данных> объект; В приведенном синтаксисе тип_данных представляет собою имя типа данных, над которыми фактически оперирует класс, и заменяет собой переменную Tтип_данныхПрактический пример:template <class T> class TestClass {private: T tempo;public: TestClass(){tempo=0;}        T testFunc(); };//Так как метод реализован вне класса, //используем явное упоминание templatetemplate <class T>T TestClass<T>::testFunc() {    cout<<"Type's size is: "<<sizeof(tempo)<<endl; return tempo;}void main(){ //создадим конкретные экземпляры класса TestClass //char TestClass<char> ClassChar; ClassChar.testFunc(); //int TestClass<int> ClassInt; ClassInt.testFunc(); //double TestClass<double> ClassDouble; ClassDouble.testFunc();}- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 21. Файловый ввод-вывод с применением потоков._____________________________________________________Потоки ввода-вывода.Поток определяется как последовательность байтов (символов) и с точки зрения программы не зависит от устройств, с которыми ведется обмен данными (файл на диске, принтер, клавиатура, дисплей и т.п.). Чтобы можно было использовать потоковые классы, а соответственно, их данные и методы необходимо включить в программу нужный заголовочный файл: iostream.h - для классов ios, istream, ostream, stream; fstream.h - для классов ifstream, ofstream, fstream; Бибилиотека потоков содержит три класса, предназначенных для ввода и вовода в файлы: ofstream - для вывода (записи) данных в файл; (наследник ostream)ifstream - для ввода (чтения) данных из файла; (наследник istream)fstream - для чтения и для записи данных (двунаправленный обмен, наследник iostream).ofstream outf; // определяется выходной файловый потокifstream inf;  // определяется входной файловый потокfstream iof;   // определяется файловый поток для ввода и вывода"Присоединить" файловый поток к конкретному файлу можно с помощью компонентной функции open(). Функция open() унаследована каждым из файловых классов ofstream, ifstream, fstream от класса fstreambase. Формат функции : void open(const char *fileName, int mode = значение_по_умолчанию,          int protection = значение_по_умолчанию);fileName - имя уже существующего или создаваемого заново файла.Параметр mode - определят режим работы с откываемым файлом (например, только запись).Флаги определяются в файле ios.h (см. перечислимая константа open_mode). enum open_mode {       in        = 0x01, // открыть только для чтения      out       = 0x02, // открыть только для записи      ate       = 0x04, // установить указатель на конец файла      app       = 0x08, // дописывать данные в конец файла      trunc     = 0x10, // усечь файл до нулевой длины      nocreate  = 0x20, // если файл не существует, ошибка открытия      noreplace = 0x40, // если файл уже существует, ошибка открытия      binary    = 0x80  // открыть файл для двоичного обмена};Пример:outf.open("d:\\temp\\file1.txt");inf.open("file2.txt");iof.open("file3", ios::app);- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 22. Форматированный вывод._________________________________Чтобы, например, указать ширину полей, левое или правое выравнивание и т.д. можно использовать printf(), а можно сделать то же самое при помощи средств форматирования ввода/вывода языка С++. Существуют два способа форматирования ввода/вывода, которые мы по очереди рассмотрим Первый способ предусматривает использование функций для установки определенных флаговформатирования, которые перечислены в классе ios_baseenum {  skipws     = 0x0001,        left       = 0x0002,        right      = 0x0004,        internal   = 0x0008,        dec        = 0x0010,        oct        = 0x0020,        hex        = 0x0040,        showbase   = 0x0080,        showpoint  = 0x0100,        uppercase  = 0x0200,        showpos    = 0x0400,        scientific = 0x0800,        fixed      = 0x1000,        unitbuf    = 0x2000,        stdio      = 0x4000        };Рассмотрим что делают перечисленные выше флаги.Флаг                                             Описание ____________________________________________________________________________________________skipws Следующие в начале символы-разделители  (пробелы, символы табуляции и новой строки) при выполнении ввода отбрасываются. ____________________________________________________________________________________________left Осуществляется ввод с левым выравниванием ____________________________________________________________________________________________right Осуществляется ввод с правым выравниванием (по умолчанию) ____________________________________________________________________________________________internal Знак или префикс системы счисления выравнивает слева, число выравнивает справа ____________________________________________________________________________________________dec Численные значения выводятся в десятичной форме ____________________________________________________________________________________________oct Численные значения выводятся в восьмеричной форме ____________________________________________________________________________________________hex Численные значения выводятся в шестнадцатиричной форме ____________________________________________________________________________________________showbase Позволяет при выводе указывать числовую базу  (десятичную, восьмеричную, шестнадцатиричную) ____________________________________________________________________________________________showpoint Приводит к выводу десятичной запятой и нулей справа для  всех чисел с плавающей запятой вне зависимости,  нужно это или нет ____________________________________________________________________________________________uppercase При выводе чисел с плавающей точкой при использовании  экспоненциальной формы выводится большая буква E.  Также при выводе чисел в шестнадцатиричной форме символ 'x'  выводится в верхнем регистре. ____________________________________________________________________________________________showpos Приводит к тому, что перед положительным числом будет  выводится знак "+" ____________________________________________________________________________________________scientific Числа с плавающей запятой выводятся с  использованием научной нотации ____________________________________________________________________________________________fixed Числа с плавающей запятой выводятся в нормальной нотации ____________________________________________________________________________________________unitbuf При каждой операции вставки вывода данные немедленно заносится в поток ____________________________________________________________________________________________Что делают флаги мы рассмотрели. Теперь необходимо познакомиться с функциями, которые устанавливают и сбрасывают эти флаги.Первая функция, которую мы рассмотрим, - это функция setf(), используемая для установки флаговlong setf(long flags);Функция принимает в качестве параметра рассмотренные выше флаг или флаги, соединенные между собой при помощи побитового ИЛИ. Она возвращает предыдущее значение флага. Рассмотрим пример:cout.setf(ios::hex); cout.setf(ios::showpos); cout<<123<<" "<<123.45<<"\n"; cout<<67<<" "<<678.9<<"\n";выведет на экран 7b +123.45 43 +678.9тоже самое будет на экране после выполнения следующего кода cout.setf(ios::hex | ios::showpos); cout<<123<<" "<<123.45<<"\n"; cout<<67<<" "<<678.9<<"\n";Для отключения установленных флагов нужно использовать функцию unsetf(). Она имеет следующий прототип:long unsetf(long flags);Функция возвращает значение предыдущей установки флага и сбрасывает флаги, определяемые параметром flags. Пример: cout.setf(ios::showpos | ios::hex); cout<<123<<" "<<123.45<<"\n"; cout.unsetf(ios::showpos | ios::hex); cout<<123<<" "<<123.45<<"\n";выведет на экран 7b +123.45 123 123.45Кроме флага форматирования также можно установить ширину поля потока, символ для заполнения и число цифр после десятичной запятой. Для этого используются следующие функции:int width(int len);char fill(char ch);int precision(int num);А теперь мы переходим к рассмотрению второго способа форматирования ввода/вывода. Второй способ - это использование манипуляторов.Манипуляторы являются специальными функциями, которые позволяют изменять флаги потока. Существуют манипуляторы с параметрами и без. Если Вы используете манипуляторы с параметрами, подключите файл iomanip.hРассмотрим манипуляторы без параметров:ends - помещает в выходной поток нулевой символ; endl - помещает в выходной поток символ конца строки и вызывает метод flush; flush - выгружает буфер потока; dec, hex, oct - устанавливают основания 10, 16 и 8 соответственно; ws - заставляет игнорировать ведущие пробелы при вводе. Манипуляторы с параметрамиsetbase(int b)  - задает основание системы счисления; resetiosflags(long f)  - сбрасывает флаги, указанные в параметре; setiosflags(long f)  - устанавливает флаги, указанные в параметре; setfill(int ch)  - задает заполняющий символ; setprecision(int n)  - задает точность вещественных чисел; setw(int n)  - задает ширину поля. Использование манипуляторов рассмотрим на примере cout<<setw(5)<<setfill('*')<<22<<endl; cout<<hex<<11<<endl;выведет на экран ***22 b- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 23. Операторы свободной памяти new и delete.___________________________________________________унарные операторы new и delete служат для управления свободной памятью. В С++ оператор new принимает следующие формы:                        new имя_типа;                        new имя_типа (инициализатор);                        new имя_типа [выражение];В каждом случае происходит по крайней мере два эффекта. Во-первых, выделяется надлежащий объем свободной памяти для хранения указанного типа. Во-вторых, возвращается базовый адрес объекта (в качестве значения оператора new ). Когда память недоступна, оператор new возвращает значение 0 (NULL). Следовательно, мы можем контролировать процесс успешного выделения памяти оператором new. Рассмотрим следующий пример использования оператора new:  int  *p, *q; p=new int (5);    //выделили память и инициализировали q=new int [10];   //получаем массив от q[0] до q[9]Оператор delete уничтожает объект, созданный с помощью new, отдавая тем самым распределенную память для повторного использования. Оператор delete может принимать следующие формы:  delete выражение; delete [] выражение;Первая форма используется, если соответствующее выражение new размещало не массив. Во второй форме присутствуют пустые квадратные скобки, показывающие, что изначально размещался массив объектов. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 24. Ввод-вывод в С.__________________________Файл заголовков: stdio.hВывод.К наиболее интересным функциям вывода данных в языке С относится функция printf();Она предназначена для форматированного вывода данных.Чтобы вывести некоторое сообщение на экран монитора, достаточно испоьзовать вызов функции: prinf("Интересное сообщение\n");Обычно printf служит для вывода значений переменных. Первым аргументом служит строкаформатов, а последующими, если они есть, - выводимые объекты.Строка форматов может включать обычные символы, просто копируемые при выводе испецификации преоброзования, которые начинаются со знака %, за ним следует символ преоброзования. Пример: printf("Значения  a, b, c равны:%d,%d,%d \n",a,b,c);Ввод.Функция scanf() обеспечивает форматированный ввод данных.В качестве параметров функция использует адреса переменных, а не их значения.Для этого перед параметром ставится знак & - символ взятия адреса переменной.Рассмотрим пример ввода целого числа i: scanf("%d",i);Спецификаторы формата для функций printf(), scanf(); %c -Ввод одного символа; %d -Ввод целого числа как десятичного; %u -Ввод беззнакового целого числа как десятичного; %o -Ввод целого числа как восмеричного; %x -Ввод целого числа как шестнадцатиричного; %e,%f,%g-Ввод вещественного числа; %s -Ввод строки текста до ближайщего пробела, табуляции или конца строки.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 25. Аргументы командной строки.______________________________________Имеется возможность передачи аргументов в функцию main из командной строки. Для этого нужно в список параметров функции main включить параметры int argc и char *argv[]  (названия общепринятые, но необязательные).Параметр argc получает значение, равное количеству аргументов командной строки. Параметр argv - это массив строк, в который помещаются значения аргументов командной строки (argv[0] - полный путь к самой программе). Обычно аргументы командной строки используются для задания опций выполнения программы и передачи программе имен файлов. Пример: int main(int argc, char *argv[]){ for(int i=0;i<argc;i++){ cout<<argv[i]<<endl; } return 0; }- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 26. Объектно-ориентированное программирование._____________________________________________________ООП позволяет разложить проблему на связанные между собой задачи. Каждая проблема  становится самостоятельным объектом, содержащим свои собственные коды и данные, которые относятся к этому объекту. В этом случае исходная задача в целом  упрощается,  и  программист получает возможность оперировать с большими по объему программами. С точки зрения программирования подобный подход значительно упрощает разработку и отладку программ. Объект - это совокупность отдельных информационных элементов и функций, которые им оперируют.Объект состоит из следующих трех частей: имя объекта; состояние (переменные состояния); методы (операции). Возможность управлять состояниями объекта посредством вызова методов в итоге и определяет поведение объекта. Эту совокупность методов часто называют интерфейсом объекта. Вместе данные и поведение представляют собой класс.Класс (class) - это группа данных и методов (функций) для работы с этими данными.Объект (object)- это конкретная реализация, экземпляр класса. В программировании отношения объекта и класса можно сравнить с описанием переменной, где сама переменная (объект) является экземпляром какого-либо типа данных (класса). Методы (methods)- это функции , принадлежащие классу.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 27. Классы. Указатель this.__________________________________Класс (class) - это группа данных и методов (функций) для работы с этими данными.Класс языка С++ позволяет определить не только семейство компонентов данных, но и функции, работающие с этими данными.Класс - это механизм для создания объектов.класс объявляется с помощю ключевого слова class.Синтаксис объявления класса похож на синтаксис объявления структуры.Оснавная форма: class имя_класса { закрытые функции и переменные класса public: открытые функции и переменные класса }список_объектов;В объявлении класса список объектов не обязателен.Функции обявленные в самом классе требуется определить. Для определения функции-членамы должны связать имя класса, частью которого является функция-член, с именемфункции. Это достигается путем написания имени функции вслед за именем класса с двумядвоеточиями (::). Два двоеточия называются оператором расширения области видимости.После того как объект класса создан, можно обращаться к открытым членам класса,используя оператор точка (.).this._____Ключевое слово this обозначает объявленный неявно указатель на себя. Другими словами, при реализации функций-членов класса, мы работаем с данными так, как будто они передаются через указатель this. Особенностью this является то, что он предоставляет встроенный не требующий объявления указатель. Другими словами, например, это то же самое, как если бы в классе Test неявно объявлялся закрытый член Test* const this. Заметим, что указатель this изменить нельзя. Обычно указатель this используется неявно, но в некоторых ситуациях желательно его явное использование, причем, использование this не отличается от использованиялюбого другого указателя.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 28. Конструкторы. Конструкторы копирования.Деструкторы.______________________________________________________________Часто во время создания объекта его элементам необходимо присвоить начальные значения. Сделать это непосредственно в определении класса нельзя, например, следующее описание приведет к ошибке компиляции: class my_Time {public: int hours = 0; // ошибка int minutes = 0; // ошибка};Для присваивания начальных значений элементам класса в языке С++ есть такой механизм как конструкторы.Конструктор (construct - создавать) - это специальная функция-член класса с тем же именем,что и класс. Таким образом, конструктор - это функция, но в соответствии с синтаксисом языка С++ для конструктора не определяется тип возвращаемого значения. Нельзя указывать даже void (конструктор никогда не возвращает значение). Пример конструктора: имя_класса()  {  // тело конструктора }Конструктор без параметров называют конструктором по умолчанию. Для каждого класса может существовать только один конструктор по умолчанию. Конструктор копирования.________________________Синтаксис конструктора копирования:имя_класса(const имя_класса & W){      тело конструктора   }Здесь W является ссылкой на обьект в правой части инициализации. Конструктор копирования может иметь также дополнительные параметры, если для них определены значения по умолчанию.Однако в любом случае первым параметром должна быть ссылка на объект выполняющий инициализацию.Памятка:Инициализация возникает в 3х случаях. 1. Когда один объект инициализирует другой,2. когда объект передаётся в функцию по значению и3. когда объект служит в качестве возвращаемого значения функцииДеструкторы.____________Деструктор решает задачу, обратную задаче конструктора. Деструктор (destruct - разрушать) - это специальная функция-член класса. Имя деструктора состоит из символа тильда (~) и имени класса. Пример деструктора: ~имя_класса()  {  // тело деструктора }Деструктор класса вызывается при уничтожении объекта - например, когда объект выходит из области видимости. Деструктор может выполнять любые задачи, необходимые для удаления объекта. Например, если в конструкторе была динамически выделена область памяти для хранения массива строк, то деструктор должен освободить эту память непосредственно перед удалением экземпляра класса. Деструктор не принимает никаких параметров и не возвращает никаких значений. Класс может иметь только один деструктор.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 29. Указатели на объекты. Перегруженные конструкторы.____________________________________________________________Указатели на объекты._____________________Как мы знаем в С++ для доступа к членам обьекта через сам обьект используется оператор " точка " ( . )Итак если мы работаем с обьектом класса необходимо использовать оператор " точка " ( . ) ,если же работа происходит через указатель на класс то " стрелка " ( -> ) единственно правильный выбор !!!Инкремент ( ++ ) или декремент ( -- ) указателя изменяют его таким образом, что он всегда указывает на следующий элемент базового типа. Тоже самое и справедливо и для указателей на класс.Пример:имя_класса * имя_обекта;//объявляем указатель на объект классаимя_обекта->элемент_класса;//получаем доступ к членам объектаПерегруженные конструкторы.___________________________Конструктор - тоже функция отсюда следует вывод !!! Его можно перегрузить . При этом на его перегрузку будут распостраняться все те же правила,которые используются при обычной перегрузке функций .Возникает вопрос , а зачем мне собственно говоря перегружать конструктор ? Для того чтобы при создании обьекта класса вы могли предусмотреть различные способы инициализации . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 30. Перегрузка операторов._________________________________Язык С++ дает возможность распространить действие практически любой стандартной операции на новые типы данных, вводимые пользователем. Сделать это позволяет механизм перегрузки стандартных операций. С перегрузкой операторов мы сталкиваемся практически с первых занятий. Например, операция сложения (+) выполняется для целых чисел, чисел с плавающей точкой и с удвоенной точностью совершенно по-разному. Тем не менее сложение прекрасно работает с любыми типами - int, float, double и многими другими встроенными типами, т.к. операция сложения (+) перегружена в самом С++. Чтобы появилась возможность использовать стандартную для языка С++ операцию (например, '+' или '*') с необычными для нее данными, необходимо специальным образом определить ее новое поведение. Механизм перегрузки функций во многом схож с механизмом определения функций. Чтобы определить действие некоторой операции для нового пользовательского типа данных, нужно описать специальную функцию, называемую "операция-функция" (operator function). Формат определения операции-функции: тип_возвращаемого_значения operator знак_операции  (список параметров операции-функции){   тело_операции-функции}Например, прототип операции-функции + для моего класса MyClass: MyClass operator+(MyClass);Теперь, чтобы сложить два объекта ob1 и ob2, достаточно просто записать выражение ob1 + ob2, которое интерпретируется как вызов функции ob1.operator+(ob2). Определенная таким образом операция называется перегруженной (по-английски - overload), а сам механизм - перегрузкой или расширением действия стандартных операций языка С++. Внимание! Операции, которые не могут быть перегружены: .   ::   ?:    sizeof  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 31. Дружественные функции и классы.__________________________________________Иногда необходимо получить прямой доступ к полям-данных класса,не используя его интерфейс. Т.е. чуть-чуть отступить от правил и обратиться к полям-данных класса через функцию или функцию-член другого класса. Зачем это может понадобиться? Одна из причин может быть следующей, например - при доступе к внутренним переменным класса через его функции уменьшается эффективность работы за счет затрат на вызов функции. В большинстве случаев это не критично, но не всегда.В некоторых случаях это может играть существенную роль. Конечно, можно добавить новый методк классу для получения прямого доступа к внутренним переменным. Однако, в большинстве случаев, интерфейс класса спланирован для выполнения определенного круга операций, и наша функция может оказаться как бы ни у дел. Или, еще один пример, нам необходимо получить прямой доступ к внутренним данным двух разных классов. Вот здесь-то и возникает проблемка... Для решения подобного круга задач в С++ и существует возможность описания функции, функции-члена другого класса как дружественной (friend). Класс может предоставлять особые привилегии определенным внешним функциям или функциям-членам другого класса. Вот эти функции и получили название дружественных. Рассмотрим как работает этот механизм. Для описания функции (функции-члена) дружественной тому или иному классу, необходимо в описании этого класса объявить дружественную функцию, используя ключевое слово friend. Причем, обратите внимание, не играет никакой роли в каком из разделов класса Вы разместите объявление дружественной функции. Если все функции-члены одного класса являются дружественными функциями другого класса, то это можно записать как: friend class имя_класса; Итак, если функция или функция-член объявлены как дружественные, то такие функции или функции-члены такого класса могут осуществлять непосредственный доступ ко всем (private, protected, public) данным (полям-данным и функциям-членам) класса, для которого они дружественны.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 32. Перегрузка инкремента и декремента. Перегрузка new и delete._______________________________________________________________________Перегрузка инкремента и декремента.___________________________________Предположим, мы хотим прибавить 1 к объекту с0 класса С. Когда компилятор встречает выражение с префиксным инкрементом ++c0, он генерирует вызов функции-элемента c0.operator++(), прототип которой должен иметь вид: C& operator++ ();Если префиксная форма инкремента реализуется как функция, которая не является функцией-членом класса, то, когда компилятор встречает выражение ++c0, он генерирует вызов функции operator++(c0). Прототип такой функции должен быть объявлен в классе С как дружественный: friend C& operator++(C&);По соглашению, принятому в С++, когда компилятор встречает выражение постфиксной формы инкремента c0++, он генерирует вызов функции с0.operator++(0), п

13:35:08 3.05.2018

CPP FAQ Часть I

вопрос 1. Вывод данных. Ввод данных.____________________________________Вывод данных.C помощью команды cout<< мы можем выводить на экран разные строчки. Однако, необходимо помнить, что компилятор поймет такую команду только в том случае, если в заголовке программы есть строка #include <iostream.h> Строку, которую мы хотим вывести на экран используя cout<<, мы обязательно записываем в кавычки. Например: cout<<”здесь пишем то, что хотим”; Команда cout<< не только выводит на экран строчки, но и позволяет их оформлять.Для оформления вывода строки используют специальные управляющие символы.Эти управляющие символы называются Escape-последовательностями.Приведу некоторые из них: \b Удаление последнего выведенного символа\n Перейти на начало новой строки \t Перейти к следующей позиции табуляции \\ Вывести обратную черту \ \" Вывести кавычку “ Ввод данных.Если нам нужно ввести данные в компьютер, то будем пользоваться командой cin. Как ею пользоваться? Синтаксис оператора ввода: cin>>имя_переменной;имя_переменной указывает на переменную, в которую нужно поместить данные, введенные с клавиатуры:Например:cin>>Number;Ввод сразу нескольких переменных, записывают таким образом:cin>>имя_переменной1>>имя_переменной2>>...>>имя_переменнойN;Список имен переменных должен содержать имена всех переменных, в которые Вы хотите ввести данные с клавиатуры.Список имен может состоять из любого количества имен переменных,разделенных комбинацией символов >>.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 2. Типы данных. Переменные и константы. Литералы. ________________________________________________________Язык с++ поддерживает несколько базовых типов данных,Эти типы определены в самом языке, и все остальные типы строятся на их основе.____________________________________________________________________________________________Пояснение    Тип     Размер в байтах    Диапазон значений  Пример объявления и инициализации ____________________________________________________________________________________________описывает                                                     целые        int         4              от -2147483648              int Vozrast;Vozrast=16; числа                                   до 2147483647 ____________________________________________________________________________________________                     описываеткороткие     short       2              от -32768                short Kol_Cats;Kol_Cats=9; целые числа                             до 32767 ____________________________________________________________________________________________описываетдлинные      long        4              от -2147483648     long Kol_Peska;Kol_Peska=214748;Целые числа                             до 2147483647 ____________________________________________________________________________________________описывает                               от  -128 до 127символы      char        1              или от 0 до 256                 char Mark;Mark='C'; ____________________________________________________________________________________________описываетлогические   bool        1              true false                 bool Cloudy;Cloudy=true; значения ____________________________________________________________________________________________описывает вещественные числа        float       4                                     float Weight;Weight=12.3452; одинарной точности ____________________________________________________________________________________________описываетвещественныечисла        double      8                                              double weight_atom;двойной                                                               weight_atom= 0.1E-33; точности ____________________________________________________________________________________________Переменная — это область в памяти компьютера, где может хранится некоторое значение для использования его в программе.Прежде чем использовать переменную в программе ее нужно объявить. Если при описании переменной не использовалось ключевое слово const,то в переменной можно хранить различные данные (в противном случае невозможно изменитьзанесенное при инициализации значение). Для обозначения переменной допускаются практическилюбые имена не совпадающие с ключевыми словами.Литералы (literals) — это постоянные значения, такие как 1 или 3.14159 Для каждого типа С++ существуют литералы, включая символьный и булевский типы,целые числа и числа с плавающей точкой. Возможны строковые литералы, хотя типа для хранения строк в С++ не существует.Некоторые примеры:5  целая константа true логическая константа 5.0 константа с плавающей точкой, понимается как double 5.0f f или F — с плавающей точкой, понимается как float 0.3е-2 константа с плавающей точкой double, e или E отделяют экспоненциальную часть 'd' символьная константа "Visual" строковая константа - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 3. Арифметические операции с числами. Выражения. _______________________________________________________таблица.___________________________________________________________________________________________операция     Так она выглядит в С++     Алгебраическое выражение       Как это же выражение                      выглядит в С++ ___________________________________________________________________________________________Сложение            +                          A+34+t                       A + 34 + t ___________________________________________________________________________________________Вычитание           -                          A-34-t                       A - 34 - t ___________________________________________________________________________________________Умножение           *                           3·t                           3 * t ___________________________________________________________________________________________Деление             /                           25:y                          25 / y ___________________________________________________________________________________________остаток от          %                         d mod 2                         d % 2 деления ___________________________________________________________________________________________Операцией нахождения остатка от целочисленного деления % используется только для целых чисел. Кроме перечисленных выше стандартных операций существуют еще и специальные. Например, в программировании часто встречаются ситуации,когда надо увеличить или уменьшить значение переменной на единицу.Чтобы не писать строкуNumb=Numb+1;которая выполняет увеличение переменной Numb на единицу,можно использовать оператор инкремент (++):Numb++;Аналогично работает оператор декремент (--),который уменьшает значение переменной на единицу:Numb--;Однако «тонкости» математических операций на этом не исчерпываются. С++ позволяет использовать по две модификации каждой из приведенных выше операций: префиксную (++Number) и постфиксную (Number++). Префиксные операторы сперва изменяют значение переменной, а потом уже используют ее. Постфиксные — наоборот.Выражение - это то, что приводит к некоторому значению. Уникальным свойством С++является то, что любое выражение можно превратить в инструкцию, добавив после неготочку с запятой (;).Операции присваивания также являются выражениями, так как они возвращают те значения, которые присваиваются.Все последующие примеры являются правельными выражениями:x;y=x;y=x=z=0;y=(x*n+1)/y2k;funk();y=funk();- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 4. Преобразование типов._______________________________Любое арифметическое выражение вроде х+у имеет тип и значение.Например, если обе переменные х и у одного типа (скажем int), то х+у — тоже целое. Если х и у различных типов, то х+у называется смешанным выражением.Предположим, х типа short, a y типа int. Тогда значение х будет преобразовано к целому, и выражение х+у получит тип int. Заметьте, что значение х в памяти остается неизменным. Преобразуется только временная копия х при вычислении значения выражения. Теперь предположим, что обе переменные х и у имеют тип short. Хотя х+у и не является смешанным выражением, все равно произойдет автоматическое преобразование; х и у будут повышены до int и выражение будет целым.Общие правила просты:Автоматическое преобразование выражения “х операция у”  1) Bce bool, char, short или enum повышаются до int.    Целые типы, которые не могут быть представлены как int, повышаются до unsigned int.  2) Если после первого шага выражение остается смешанным,     то в соответствии с иерархией типов,       int < unsigned int< long <unsigned long < float < double < long double операнд более низкого типа повышается до более высокого типа,и значение выражения получает этот тип.Заметьте, что unsigned int повышается до unsigned long,если long не может содержать все значения unsigned int. Чтобы проиллюстрировать неявные преобразования,мы сделаем следующие объявления и перечислим различные смешанные выражения вместе с соответствующими типами: Объявления: char c; long lg; double d; int i;short s; float f; unsigned u; ____________________________________________________________________________________________Выражение           Тип                  Выражение  Тип____________________________________________________________________________________________с - s / i           int                  u * 3 – i unsigned____________________________________________________________________________________________u * 3.0 – i        double                  f * 3 – i float____________________________________________________________________________________________с + 1             int                  3 * s * lg long____________________________________________________________________________________________с + 1.0            double                         d + s double____________________________________________________________________________________________Автоматическое преобразование может происходить при присваивании. Например: d = i переведет целое значение i в double и затем присвоит его d; тип всего выражения будет double. Повышение (или расширение) типа,как в выражении d = i, обычно будет выполнено правильно, а вот понижение (или сужение) типа, как в выражени i = d, может привести к потере информации. Здесь дробная часть d будет отброшена. Что именно произойдет, в каждом случае зависит от машины. В дополнение к неявным преобразованиям, которые могут происходить при присваиванияхи в смешанных выражениях, существует явное преобразование, называемое приведением (cast).Пусть i — целое, тогда (double)i выполнит приведение значения i так, что выражение будет иметь тип double. Сама переменная i остается неизменной. Примеры: (char) (' А' +1.0) Вот некоторые примеры: double у = i/(double)7; //разделит с двойной точностью char ptr = (char)(i + 88); //целое к значению символа  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 5. Перечисляемые типы. Логические операции. __________________________________________________Перечисляемые типы.В программах на с++ перечисление - это быстрый и легкий способ создать список целыхконстант. Вот простой пример (здесь названия совпадают с их числовыми значениями,так как перечисление начинаетя с нуля):enum number{zero,one,two,three;};//...cout<<two<<endl;//напечатает "2"Логические операции.____________________операций отношения :                  >, <, >=, <=;операций проверки на равенство:      ==, !=;Логические операции:   &&  - (логическое И), ||  - (логическое ИЛИ) и !  - (логическое НЕ, называемое также логическое отрицание).  Таблица истинности для &&____________________________________________________________________________________________выражение 1                    выражение 2                   выражение 1 & & выражение 2 ____________________________________________________________________________________________true                             true                                   true true                             false                                  false false                            true                                   false false                            false                                  false ____________________________________________________________________________________________Таблица истинности для ||____________________________________________________________________________________________выражение 1                    выражение 2                   выражение 1 || выражение 2 ____________________________________________________________________________________________true                             true                                   true true                             false                                  true false                            true                                   true  false                            false                                  false ____________________________________________________________________________________________Таблица истинности для !____________________________________________________________________________________________выражение                                                                   ! выражение ____________________________________________________________________________________________true                                                                            false false                                                                           true ____________________________________________________________________________________________- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 6. Управляющие структуры (if-else). Структура множественного выбора switch.__________________________________________________________________________________Инструкция выбора switch реализует условный переход с множественным ветвлением.Инструкция switch сравнивает значения аргумента с константами. Когда значениеравно константе, выполняется следующая за константой последовательность инструкцийдо тех пор , пока не встретится инструкция break, после которой завершается выполнениевсех инструкций блока switchСинтаксис:switch(значения аргумента)  case constanta_1: инструкция;break; case constanta_2: инструкция;break; ... case constanta_N: инструкция;break; default: инструкция;Управляющие структуры (if-else).Инструкция if - первая часть инструкции ветвления.Синтаксис:if(выражение){ block_1;}else{ block_2;}Если значение выражения истино (true) то выполняются инструкции первого блока,иначе - второго (если он имеется). Вторая часть условной инструкции,начинающаяся со слова else, не обязательна. Если после инструкции if или elseстоит всего одна инструкция, то фигурные скобки можно опустить.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 7. Циклы. break и continue.__________________________________1)Цикл for:Инструкция цикла for позволяет осуществить проверку условия выполнения цикла,инициализировать и изменять переменные.Синтаксис:for(инициализация;условие;инструкции изменения переменных){тело цикла;}2)Цикл while:Инструкция while позволяет создать циклы с предусловием.Так как проверка условия осуществляется перед выполнением тела цикла,возможна ситуация,когда ни одной инструкции тела цикла выполнено не будет.Синтаксис:while(условие){тело цикла;}Цикл выполняется до тех пор, пока условие цикла равно true.Если в теле цикла стоит толко одна инструкция, то фигурные скобки можно опустить.3)Цикл do:Инструкция do является началом инструкций цикла с постусловием.Так как условие проверяется в конце тела цикла, эта инструкция выполняется не менееодного раза.Синтаксис:do{тело цикла;}while(условие);Цикл выполняется до тех пор, пока условие цикла равно true.Если в теле цикла стоит толко одна инструкция, то фигурные скобки можно опустить.break и continue._________________Инструкция  break применяется для немедленного выхода из циклов for  и  while, а также инструкции выбора  switch.После выполнения инструкции  break управление будет передано первой инструкции,расположенной следом за последней инструкцией прерванного цикла.Инструкция  continue  используется для игнорирования оставшихся инструкций в телецикла и перехода к очередной проверки условия выполнения тела цикла.То есть в отличии от инструкции  break управление передается не на следующуюпосле цикла инструкцию а на следующий шаг итерации.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 8. Область видимости. Указатели на функции.__________________________________________________Указатели на функции._____________________Каждая функция характеризуетсятипом возвращаемого значения, именем, количеством, порядком следования и типами параметров.При использовании имени функции без последующих скобок и параметров имя функции выступает вкачестве указателя на эту функцию, и его значением служит адрес размещения функции в памяти.Это значение адреса может быть присвоено другому указателю, и затем уже этот новый указательможно применять для вызова функции. Однако в определении нового указателя должен быть тот жетип, что и возвращаемое функцией значение, то же количество, порядок следования и типыпараметров. Указатель на функцию определяется следующим образом:тип функции (*имя_указателя)(спецификация_параметров);Например: int(*func1ptr) (char);— определение указателя func1ptr на функцию с параметром типа char,возвращающую значение типа int. Область видимости.__________________Область видимости переменной или функции - это та область, где соответствующий объектопределен. Наиболее важны две категории области видимости: локальная и глобальная.Локальная переменная видна только в той функции, где она определена.Глобальная переменная определяется в самом начеле программы вне всяких функций,в том числе и функции main().- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 9. Аргументы по умолчанию. Встраивание. Перегрузка функций.__________________________________________________________________Аргументы по умолчанию._______________________Формальному параметру функции может быть задан аргумент по умолчанию (default argument).Обычно это константа, которая часто встречается при вызове функции. Использование аргумента по умолчанию позволяет не писать его значение при каждом вызове.Следующая функция вычисления степени целого числа демонстрирует сказанное: int sqr_or_power(int n, int k = 2) //k = 2 по умолчанию { if (k == 2) return (n * n) ; else return pow(n,k) ; }Здесь предполагается, что чаще всего эта функция применяется для вычисления значения квадрата целого числа n .Вызовы этой функции могут выглядеть следующим образом: sqr_or_power(i + 5);  //вычислит (i + 5) * (i + 5) sqr_or_power (i + 5, 3); //вычислит (i + 5) в кубеОбратите внимание, что в первом случае при вызове функции sqr_or_power указан только одинпараметр, поэтому второму параметру автоматически присвоится значение 2,  так как онобъявлен по умолчанию равным 2. Только несколько последних параметров функции могут иметь значения по умолчанию: void foot (int i, int j = 7) ;               //допустимо void foot (int i, int j = 2, int k) ;        //недопустимо void foot (int i, int j = 3, int k = 7) ;    //допустимо void foot (int i = 1, int j = 2, int k = 3); //допустимо void foot (int i=- 3, int j);                //недопустимоТо есть аргументами по умолчанию могут быть аргументы, начиная с правого конца спискапараметров функции и далее последовательно слева направо без перерывов. Во втором примере недопустимое использование параметров по умолчанию, так как крайний правый параметр не является параметром по умолчанию,а следующий за ним параметр при движении справа налево пытаемся объявить как параметрпо умолчанию - получаем разрыв,а это недопустимо. Похожая ситуация наблюдается и в последнем примере - также разрыв параметров по умолчанию. Использование аргументов по умолчанию, как и многих других возможностей по умолчанию,позволяет уменьшить труд программистов по набиранию текста программы.Встраивание.____________Модификатор inline используется при описании встраиваемых функций.Такие функции уменьшают число операций процессора, выполняемых при их вызове,в связи с чем повышается быстродействие программы. Однако при этом увеличивается размер программы, поэтому встраиваемыми следует определятьтолько очень короткие функции.Пример:inline double cube(double x){ return ... компилятора не позволяют встраивать сложные функции, то есть функции содержащие циклы, инструкции switch, if и тому подобные. Попытка объявить такую функцию как inline ошибкой не будет, просто компилятор не может встроить эту функцию.Перегрузка функций.___________________Перегрузка (от англ. overloading) использует одно и то же имя для несколькихвариантов функции.Другими словами, несколько функций могут иметь одинаковые имена.Выбор конкретного варианта зависит от типов аргументов, используемых функцией. Другими словами, компилятор различает функции с одинаковыми именами по параметрам, которые передаются в эту функцию. Программисты говорят, что компилятор отличает одну функцию от другой по ее сигнатуре.Под сигнатурой понимается список типов, который используется в объявлении функции. Сигнатура функции задается числом, порядком следования и типами параметров. Имена функций могут быть перегружены в пределах одной и той же области видимости.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 10. Сортировка массивов._______________________________Хотя существует множество методов сортировки данных, все эти методы можно отнестик одному из следующих классов:* Перестановка (пузырьковая сортировка);* Отбор;* Вставка;пузырьковая сортировка______________________Программа сортирует значения массива следующим образом: сначала она сравнивает элементы массива a[0] и а[1], меняя местами их значения, если они не упорядочены, затем проделывает то же самое с элементами а[1] и а[2], а[2] и а[3] и т.д.. Главное достоинство пузырьковой сортировки заключается в простоте ее программирования. Однако, выполняется она медленно. Это становится очевидным при сортировке больших массивов.void F(int *mas, int count){ int i,j; int temp; for(i=1;i<count;++i){ for(j=count-1;j>=i;--j){ if(mas[j-1]>mas[j]){ temp=mas[j-1]; mas[j-1]=mas[j]; mas[j]=temp; } } }}Ее смысл заключается в постоянном сравнении смежных элементов и при необходимостиих перестановке.Сортировка выбором.___________________Алгоритм сортировки выбором основан на использовании элементов в качестве ключей для сравнения, при этом в конце каждого просмотра только один элемент помещается в свою правильную позицию. Этот алгоритм прост, но неэффективен, так как он не учитывает частично или полностью отсортированных наборов данных. Это означает, что число проводимых сравнений зависит только от количества элементов, и не зависит от содержимого набора данных.Алгоритм:1.Считаем, что i-ый элемент цепочки является минимальным среди элементов, идущих после него.2.Для элементов от X[i + 1] до X[N - 1] выполнить сравнение по ключам и найти наименьший   элемент. Назовем его X[min]. 3.Поменять местами X[min] и X[i]. X[min] теперь находится в своей отсортированной позиции.После окончания цикла массив отсортирован. Сортировка вставками._____________________Сортировка вставками - простой и достаточно эффективный метод сортировки, при котором элементы данных используются в качестве ключей для сравнения. Алгоритм сначала упорядочивает элементы X[0] и X[1], вставляя X[1] перед X[0], если X[0] > X[1]. Затем оставшиеся элементы данных по очереди вставляются в этот упорядоченный набор. После i-й итерации элемент X[i] оказывается в своей правильной позиции и элементы от X[0] до X[i] уже отсортированы. После каждой итерации только один элемент помещается в свою правильную позицию. При сортировке вставками выполняется меньше перестановок, чем в "пузырьковой" сортировке.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 11. Указатели._____________________В языке с++ одним из центральных является понятие указатель.Указатель - это переменная, которая содержит адрес.Для определения указателя используется символ * в определении или объявлении объекта.Приведем несколько примеров:int *iptr;   //Определяет указатель на целое значениеfloat *fvals;   //Определяет указатель на значение с плавающей точкойchar *cp;  //Описывает указатель на символПрименение указателей позволяет упростить алгоритм или повысить его эффективность. Каким образом? Указатели могут обесечить простые способы ссылок на массивы, списки илиблоки данных. Для таких ссылок достаточно иметь простой элемент данных: указатель.Нередко бывает проще и эффективнее манипулировать простым указателем, чем управлять полным списком данных. Управление памятью компьютера - это еще одно из важнейших   применений указателей. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 12. Указатели - аргументы функций. Ссылки. Ссылочные параметры.______________________________________________________________________Указатели - аргументы функций.______________________________Для того, чтобы разобраться с механизмом передачи аргументов в функцию,с последующим изменением их значений внутри вызванной функции, рассмотрим функцию my_swap, которая меняет местами значения своих параметров. Другими словами, если объявлены две переменные типа int a, b; причем, a=7 и b=10, то после вызова функции my_swap(&a, &b) результат будет следующим: а=10 и b=7. В самой функции my_swap параметры должны быть описаны как указатели, при этом доступ к значениям параметров будет осуществляться через них косвенно. Такой вызов функции называется вызовом функции с передачей параметров по ссылке, причем, при обращении к функции адреса переменных должны передаваться как аргументы.void my_swap(int *px,  int *py)  {  int  temp; temp=*px; //переменной temp писвоили 7 *px=*py; //переменная а приняла значение 10 *py=temp; //переменная b приняла значение 7}Теперь, вызов функции из main() будет выглядеть следующим образом:  my_swap(&a, &b); Давайте, подведем итоги: аргументы-указатели позволяют функции осуществлять доступ к объектам вызвавшей ее функциии дают ей возможность изменить эти объекты. Если Вы хотите произвести вызов функции с передачей параметров по ссылке с ипользованием указателей, придерживайтесь следующих инструкций: 1.Объявите параметры-указатели в заголовке функции. 2.Используйте разыменованный указатель в теле функции. 3.Передавайте адреса в качестве аргументов при вызове функции.Ссылки._______ссылка есть другое имя для объекта. Например:  int L = 999; int& RL = L;Здесь RL является ссылкой. Теперь к L можно обращаться как по имени L, так и по имени RL. Т.е. по сути ссылка является синонимом, псевдонимом переменной L. Итак, давайте запишем в общем виде, как определяется ссылка:  тип& имя_ссылки = инициализирующее_выражение;Для определения ссылки используется оператор ссылки & (символ амперсанд). При определении ссылки необходимо обязательно задать инициализирующее_выражение,псевдонимом которого и будет ссылка. Например: float& ref;  // ошибкаint Count = 0;int &RefCount = Count;   // правильноСсылочные параметры.____________________В случае передачи параметров по ссылке вызываемая функция получает возможность прямогодоступа к передаваемым данным, а значит возможность изменения этих данных. Вызов по ссылке имеет преимущество в смысле производительности перед вызовом по значению, поскольку он исключает накладные расходы на копирование больших объемов данных, однако следует помнить что при вызове по ссылке вызываемая функция может изменить передаваемые в нее данные, а это может быть нежелательно. Итак, ссылочный параметр - это псевдоним соответствующего аргумента (параметра). Чтобы показать, что параметр функции передан по ссылке, после типа параметра в прототипе функции ставится символ амперсанда &, такое же обозначение используется в списке типов параметров в заголовке функции.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 13. Функции работы со строками из библиотеки обработки строк.____________________________________________________________________включить заголовочный файл string.h 1. Функция int strlen (const char* s); - определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается.2. Функция char *strcpy(char *s1, const char *s2); - копирует строку s2 в массив символов s1. Возвращает значение s1. Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. 3. Функция int *strcmp(const char *s1, const char *s2); - сравнивает строки s1 и s2 (по ASCII-кодам). Функция возвращает значение 0, если строки s1 и s2 равны, значение меньше ноля, если строка s1 меньше s2, и значение больше ноля, если s1 больше s2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по ASCII-кодам ( т.е. "g" больше "ff"). 4. Функция char *strcat(char *s1, const char *s2); - добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх ноль-символа строки s1. Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1). 5. Функция char *strncpy(char *s1, const char *s2, int n); - копирует не болеее n символов строки s2 в массив символов s1. Возвращает s1.6. Функция char *strncmp(char *s1, const char *s2, int n); - сравнивает до n символов строки s1 со строкой s2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s1 соответственно равн, меньше или больше s2.7. Функция char *strncat(char *s1, const char *s2, int n); - присоединяет первые n символов строки s2 в строку s1. Возвращает s1.8. Функция char *strchr(const char *s, int c); - проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку s. Если символ не найден, возващается NULL.9. Функция char *strstr(const char *s1, const char *s2); - проверяет строку s1 на содержание подстроки s2. Результатом функции является адрес первого вхождения подстроки s2 в строку s1.Если подстрока не найдена, возващается NULL.10. Функция char *strlwr(char *s); - конвертирует строку к нижнему регистру (т.е. переводит строку в строчные символы). 11. Функция char *strupr(char *s); - конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы).12. Функция char *strset(char *s, int ch); - заменяет ВСЕ символы в строке s на символ ch.13. Функция char *strrev(char *s);- меняет порядок следования символов в строке на противоположный (меняет первый символ с последним, второй символ с предпоследним и т.д.). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 14. Рекурсия. Рекурсии или итерации.___________________________________________Рекурсивная функция - это функция, которая вызывает сама себялибо непосредственно, либо косвенно с помощью другой функции.  /*Рекурсивная функция факториала*/  #include<iostream.h>  unsigned factorial(int);  void main(void)  {  for (int i = 0; i <= 10; i++)  cout << i << "! = " << factorial(i) << '\n';  }  unsigned factorial ( int number)  {  if (number <= 1) return 1;  else return number * factorial(number - 1);  } Рекурсия имеет много недостатков. Повторный запуск рекурсивного механизма вызовов функции приводит к росту накладных расходов:к нарастающим затратам процессорного времени или требуемого объема памяти. Каждый рекурсивный вызов приводит к созданию новой копии функции (в самом деле копируются только переменные данной функции); для этого может потребоваться значительная память. Итерации обычно не связаны с функциями, так что в них отсутствуют накладные расходы наповторные вызовы функции и дополнительные затраты памяти.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - вопрос 15. Определение структур. Указатели на структуру.________________________________________________________Структура - это составной тип данных, построенный с использованием других типов.  Структура состоит из полей. Поля (элементы структуры) - переменные или массивы стандартного типа (int, char и т.п) или другие, ранее описанные структуры. Описанный тип данных можно использовать для объявления переменных типа структур. можно объявлять сколько угодно переменных с одной и той же структурой.В одной программе может быть множество разных структур. Из структур можно организовывать массивы. Объявление структуры осуществляется с помощью ключевого слова struct, за которым идет ее имя и далее список элементов, заключенных в фигурные скобки:  struct [имя] {                тип_элемента_1 имя_элемента_1;               тип_элемента_2 имя_элемента_2;                    ...               тип_элемента_n имя_элемента_n;     };Имя структуры используется при объявлении переменных данного типа. Именем элемента может быть любой идентификатор. Через запятую можно записывать несколько идентификаторов одного типа. Элементы одной и той же структуры должны иметь уникальные имена, но две разные структуры могут содержать элементы с одинаковыми именами. Каждое определение структуры должно заканчиваться точкой с запятой. Например, struct date { int day, month, year; };Переменные структуры объявляются так же, как переменные других типов. Например,  date days;Указатели на структуру._______________________Имя структуры обладает всеми правами имен типов, а следовательно, можно определять указатели на структуры: имя_структуры *имя_указателя на структуру;для доступа к элементам структуры мы использовали операцию точка (.). Операция точка обращается к элементу структуры по имени переменной объекта. Но, если у нас определен указатель на структуру, то появляется еще одна возможность доступак элементам структуры. Ее обеспечивает оператор стрелка (->).Формат соответствующего выражения следующий: имя_указателя->имя_элемента_структурыВыражение birthday->month эквивалентно (*birthday).month, которое разыменовывает указатель и делает доступным элемент month через оператор точка.Скобки нужны, т.к. оператор точка имеет более высокий приоритет, &

13:32:32 3.05.2018

Что делать если не включаться общий доступ к файлам и принтерам в операционной системе Windows 7 Pro

Что делать если не включаться общий доступ к файлам и принтерам в центре управления сетями в операционной системе Windows 7 Pro, т.е. выбираешь соответствующий радиобаттон, нажимаешь «Сохранить изменения», а сохранения не происходит.1. Проверяем работает ли служба "Рабочая станция"Нажмите «Win+R» -> введите «services.msc» -> служба "Рабочая станция"  Пробуем запустить службу.Если при запуске службы видим вот такое окно:то следуем по пунктам  далее.2. Далее, в свойствах сетевого подключения посмотрите, включен ли флажок «Клиент для сетей Microsoft».(Панель управления->Сеть и Интернет->Центр управления сетями и общим доступом -> Изменение параметров адаптера -> нажать свойства "Подключение по локальной сети" -> флажок «Клиент для сетей Microsoft»)3. Исправьте тип запуска: «Win+R» -> Выполнение: "sc config mrxsmb10 start= demand" или "sc config mrxsmb10 start= auto" даёт возможность запустить сервис "Рабочая станция" и восстановить доступ к сетевым ресурсам в т.ч. к серверам с принудительно заблокированным SMB v1.x4. Запустить службу "Рабочая станция" (см. пункт 1.)

13:18:25 3.03.2018

Где найти грузчиков на переезд

Часто, люди при переезде квартиры не знают к кому обратиться, где найти ответственных людей, надёжных перевозчиков. Рынок богат разными фирмами, диспетчерами и частными лицами, которые хорошо подают рекламу своих услуг, но так ли это на деле? Как правило половина являются мошенниками и не профессионалами, которые сдерут с вас много денег и кое-как перевезут мебель. Что же делать, как найти нужных ребят и по адекватной цене? Для начала необходимо поинтересоваться стажем и опытом, наличие договора об услугах и материальной ответственности, а также как эти организаторы подходят к своей работе, насколько они пунктуальные и что предлагают, исходя из вашей ситуации. Вам, как к клиенту, будет много внимания и ваш переезд рассмотрят в индивидуальном порядке. Настоящие организаторы переездов дорожат своими клиентами и репутацией, а значит дадут вам пару советов и максимально грамотно осуществят задуманную перевозку. Переезд с грузчиками, например в Волгограде, всегда готовы сделать честные грузчики переезд квартиры, вот таким профессионалам смело можно доверить ценные вещи и мебель.

22:19:03 18.01.2018

Возможна ли слежка через выключенный телефон — и как ей противостоять?

Возможна ли слежка через выключенный телефон — и как ей противостоять?Мы не собираемся ни пытать, ни приговаривать его к смерти; он предстанет перед гражданским судом и даже получит адвоката. Таков общий смысл письма генпрокурора США Эрика Холдера в наше Министерство юстиции по поводу томящегося в Шереметьевo Эдварда Сноудена. Не совсем ясно, кто надоумил американского политика написать такое послание (можно подумать, мы тут, сидя в обнимку с медведями, считаем, что в колыбели свободы ущемляют гражданские права заключённых!), но в любом случае спектакль продолжается.Для параноиков-конспирологов это давно уже не вопрос: мол, даже выключенный мобильник может быть активирован спецслужбами удалённо для использования в качестве подслушивающего устройства, определения текущих координат и т. п. Но до сих пор подозрения питались лишь слухами. Пока 20 июля авторитетная Washington Post не подтвердила прямо: благодаря АНБ в течение почти десятилетия американская армия, ФБР и ЦРУ имели возможность отслеживать подозреваемых в терроризме лиц с помощью именно отключённых мобильников. Сотовый телефон не всегда служит единственным источником информации: отдел Geolocation Cell в АНБ в реальном времени собирает данные от множества «сенсоров» и так ведёт индивида по планете. Однако именно сотовый чаще всего является ключевым элементом, определяющим успех слежки с целью последующего физического устранения опасных персон. Честно говоря, в обычной жизни пользователю полезней думать не о том, следит ли за его смартфоном АНБ, а о том, какие метаданные утекают через сделанные на тот же смартфон фотографии. Что iOS, что Android, например, по умолчанию метят снимки GPS-координатами.Понятное дело, после таких признаний паранойя в прессе разгорелась с новой силой, но ещё важнее то, что к вопросу подключились специалисты, выдавшие перечень интересных и в общем успокаивающих идей. Если вкратце — волноваться среднестатистическому владельцу мобильника не о чем, а если всё-таки волнуешься, есть простой способ слежки избежать. Но давайте по порядку.Для технарей «выключенный» означает «обесточенный». Чтобы привести мобильный телефон в такое состояние, необходимо извлечь из него аккумулятор — и использовать его как подслушивающее устройство в таком случае становится невозможно: среди здравомыслящей публики на этот счёт сомнений нет ни у кого. Всё, чем рискует человек с по-настоящему отключенным телефоном, — это стать жертвой непрактично сложной методики радиопеленгации. Вспомните, как работают антиворовские чипы, укрепляемые на товарах в розничной торговле: собственного элемента питания у таких чипов нет, они «сигналят» за счёт энергии, наведённой стационарным сканером в миниатюрной антенне. Очень похожим образом и антенную часть мобильника можно заставить «откликнуться», облучив её радиосигналом с частотой в десятки мегагерц. Конечно, электроника телефона от этого не включится, так что узнать, например, IMEI или задействовать микрофон подобным способом невозможно. Но, зная характерные особенности конкретного экземпляра или модели телефона, можно определить, что он находится в радиусе нескольких метров (а пеленгатор может быть установлен, к примеру, на автомобиле, разъезжающем по району). По крайней мере в лабораториях этот метод работает, а потому нельзя исключать, что им пользуются и спецслужбы.Задача упрощается, если взглянуть на проблему глазами обывателя, то есть предположить, что «выключенный» понимается как «находящийся в режиме ожидания». В этом случае источник питания в телефоне имеется, операционная система и приложения работают — а значит, появляется несколько лёгких способов получить к ним доступ. Легче всего определить местонахождение телефона по сигналам близлежащих сотовых станций. Если же модифицировать мобильник — скажем, имплантировать в него дополнительный чип или приложение (в последнем случае можно обойтись и без непосредственного доступа к аппарату) — можно использовать его для подслушивания, скрытого фотографирования и прочих подобных действий.Общая проблема перечисленных методов — дороговизна. Их можно применить (и есть сведения, позволяющие утверждать, что применяли) для наблюдения за отдельными лицами, но массовая эксплуатация кажется нерентабельной. Однако поиск объяснений выявляет ещё одну — и самую интересную — возможность. Она связана с компонентом, известным как baseband processor (BBP).На русский язык этот термин переводят устоявшимся, но мало что объясняющим «baseband-процессор», а стандартизованного русского варианта, видимо, нет вообще. Поэтому, если позволите, я рискну называть его радиопроцессором, что по крайней мере облегчит понимание. Идея в общих чертах следующая: параллельно с центральным и графическим процессорами, RAM и прочей аппаратной обвеской, доступной и используемой основной операционной системой (Android, iOS и пр.), в цифровых мобильных устройствах всегда имеется крохотный, невидимый пользователю, обособленный микрокомпьютер (правильней будет назвать его пикокомпьютером), отвечающий за радиочасть. Основа его — тот самый радиопроцессор, у которого есть и своя память, и даже своя операционная система — как правило, реального времени. Скажем, на большинстве Android- и iOS-устройств это операционные системы Nucleus RTOS и ThreadX. Baseband-операционка занимает считанные килобайты («пикоядро») и для своих размеров творит чудеса: там и криптография, и файловые системы, и даже оконная графика, если понадобится. Но в подавляющем большинстве случаев мы, конечно же, baseband-компонентов не видим: они работают незримо, независимо, беря на себя задачу непосредственного общения с сотовыми станциями.Радиопроцессор и его обвеска — тема настолько же интересная, насколько и малоизученная: даже сделать дамп памяти здесь — задача нетривиальная, что уж говорить про анализ кода и его модификацию. Та же Nucleus RTOS работает почти на трёх миллиардах устройств (простых сотовых телефонах, смартфонах, USB-радиобрелоках и т. п.), но сколько раз вы о ней слышали? Лишь редкое стечение обстоятельств порой даёт пользователю подсказку, что смартфон, вероятно, устроен намного сложней, чем кажется: так, если во время телефонного звонка основная ОС «виснет» (на моём перегруженном андроидовском LG Optimus One это, увы, случается частенько), звонок почему-то не прерывается. Кроме того, именно программное обеспечение для радиопроцессора приходится менять, чтобы «разлочить» мобильник, оборвать привязку к конкретному оператору.С внешним миром baseband-процессор общается через несколько низкоуровневых интерфейсов вроде звукового I2S, сетевого SPI и древнего языка AT-команд (вероятно, памятного тем из вас, кто имел дело с модемами). Впрочем, повторю: информация по этой теме чрезвычайно скудна — и будет здорово, если знатоки среди читателей уточнят и добавят деталей. В контексте сегодняшней темы важны два факта. Во-первых, baseband-компьютер живёт собственной жизнью, о которой владелец телефона может и не подозревать (скажем, он в состоянии периодически просыпаться и связываться с сотовой станцией, не выдавая своей активности). Во-вторых, радиопрошивку можно менять — как минимум с телефона, но может быть, и дистанционно (никто, кроме производителей, обычно не знает всех тонкостей baseband-софта, работающего на конкретном устройстве).Кстати, первый фильм про Сноудена уже снят — любительский, с бюджетом в 650 долларов . Актёры играли бесплатно, деньги потребовались только для оплаты того самого номера в отеле, где Эдвард останавливался на время своего пребывания в Гонконге. Главный герой (в жизни — простой учитель) и правда похож на прототипа, хотя, конечно, Безруков сыграл бы лучше.Таким образом, не остаётся сомнений: в лице BBP спецслужбы имеют, пожалуй, самый мощный шпионский инструмент; оценить его потенциал широкой общественности ещё только предстоит. Прямо сейчас хорошая новость в том, что и этот соглядатай становится беспомощным, если банально вынуть из телефона аккумулятор. Беспокоитесь о приватности? Извлеките батарейку и перестаньте нервничать. Это не спасёт вас от дорогостоящих атак, но они вряд ли будут против вас применены: АНБ передавала полученные таким образом данные другим спецслужбам, чтобы те наводили дроны...Возвращаясь же к Эдварду Сноудену, следует с сожалением признать: сбывается самое страшное его предсказание. Когда о нём только-только стали говорить, Эдвард рассказал в интервью о своих опасениях: ничего не изменится; публика послушает, поохает, но не рискнёт давить на правительство. Так и получилось, увы. Ни одна программа широкомасштабной слежки из эксплуатируемых АНБ не отменена, а для самого Эдварда родина, похоже, готовит уютные нары и пару-другую пожизненных сроков.

14:44:25 15.12.2017

​Экономьте,покупая косметику,продукты для дома и здоровья.

Экономьте,покупая косметику,продукты для дома и здоровья.Скидки от 26 %.Вы любите учавствовать в акциях,получать подарки?У нас их много!!!Приглашаю людeй, которыe хотят стать лидeрами и зарабатывать в сeти интeрнeт.Вы можете начать свой собственный бизнес без стартового капитала и финансовых рисков,приглашая в свою командуновых консультантов или просто покупая для себя.Вы можете участвовать в обучающих программах,не выходя из дома.Бонусы,путешествия,бонус материнства.Купить в магазине:shop.faberlic.comРегистрация:https://faberlic.com

18:58:31 25.09.2017

МАЙНИНГ КРИПТОВАЛЮТ

1.МАЙНИНГ КРИПТОВАЛЮТ https://rapidminers.com/?ref=kowka2.МАЙНИНГ КРИПТОВАЛЮТ https://hashflare.io/r/C2AEE0B23.НОВЫЙ МАЙНИНГ https://xviata.com/?r=1117684.МАЙНИНГ КРИПТОВАЛЮТ https://www.eobot.com/user/30111

17:56:17 25.09.2017

Посты :: FriendsFree

Лента пользовательских постов


http://friendsfree.ru/rss/feed/posts Получить информер из RSS-канала:  http://friendsfree.ru/rss/feed/posts http://friendsfree.ru/rss/feed/posts http://friendsfree.ru просмотрен 85 раз

 

Добавить RSS к себе в ленту:


Добавить в список для экспорта в список для экспорта



 

<! >

Вернуться в раздел: Блоги блог.ру

страницы(10):


Реклама

Каталог RSS новостей:

Авто/мото/вело Администрации Безопасность Бизнес, финансы Благотворительность Блоги @Mail.Ru Блоги blogspot.com Блоги intwayblog.net Блоги wordpress.com Блоги ya.ru Блоги блог.ру Блоги, дневники Веб-разработка Города, регионы Деньги Дизайн Дневники LiveInternet Дневники@Diary.ru Дом, семья Женщинам Живой журнал Животные Законодательство Записи Twitter Знакомства Игры, игрушки Интернет Каталоги Кино, видео Компании Компьютеры Консультации Красота, здоровье Кредиты Кулинария Культура, искусство Литература Медицина Мобильная техника Мобильный контент Мода, стиль Мужчинам Музыка Недвижимость Новости Образование, наука Общество Объявления Оптимизация Отдых, туризм Подкасты Политика Порталы Пресс-релизы Природа, экология Программы Происшествия Промышленность Работа Радио, телевидение Развлечения Рамблер-Планета Реклама Религия Рукоделие СМИ, периодика Связь События Спорт Стена Facebook Страхование Строительство, ремонт Техника Технологии Товары, услуги Торговля Транспорт Файлы Форекс Форумы, сообщества Фото Электроника Юмор

<! >