Добро пожаловать в блог официального сайта www.cplus-plus.ru

Все представленные материалы в этом блоге находятся по адрусу www.cplus-plus.ru 
Сайт разработан с целью удобного изучения объектно-ориентированного программирования языка C++. Сайт содержит: большое количество cред разработки, видеоуроков, исходников, учебников C++ как для начинающих, так и для продвинутых!

Поиск по этому блогу

Каталог статей

вторник, 4 января 2011 г.

TIOBE: индекс популярности языков программирования за декабрь 2010 года

TIOBE: индекс популярности языков программирования за декабрь 2010 года
Представляю Вашему вниманию перевод доклада голландской компании TIOBE о индексе популярности языков программирования за октябрь 2010 года. Оригинальную статью можно найти по адресу – рейтинг языков программирования.

Заголовок декабря: рост популярности C# на фоне падения Visual Basic

C# безусловно стал языком номер один для платформы .NET. В этом месяце его популярность снова поднялась до уровня в 6,687%. Тем не менее, популярность языка C# не растет достаточно быстро для того, чтобы он могу получить звание «Язык программирования 2010″. Для этого титула осталось только два кандидата: Objective-C (2,08% рост в год) и Python (1,30% рост в год). TIOBE объявят победителя в своей следующей публикации.

Компания TIOBE составляет рейтинг популярности языков программирования, основываясь на данных о количестве программистов пишущих на рассматриваемом языке, интересе к языку на популярных сайтах Google, MSN, Yahoo, Wikipedia и YouTube и других показателях. Стоит отметить что это не рейтинг лучших языков программирования, это просто сводная таблица наиболее популярных и используемых языков.

Этот рейтинг может быть использован для проверки того, какие из Ваших навыков программирования сейчас востребованы. Это позволит повлиять на стратегическое решение о том, какой язык использовать в будущих проектах. Подробнее об определении этого рейтинга можно почитать здесь.
TIOBE: индекс популярности языков программирования за декабрь 2010 года
Источник: http://itandlife.ru

вторник, 7 декабря 2010 г.

C++0x: Конвертируем лямбда-выражение в указатель на функцию

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

В новом стандарте C++0x появились
зымыкания. Не вдаваясь в подробности, замыкания — это такие объекты,
которые позволяют создавать функции прямо в теле других функций. Если
подробнее — замыкания позволяют создавать функциональные объекты — то
есть объекты, для которых определён operator(). На хабре уже писали о
них: например тут.

Мне очень понравилось нововведение и я начал
им пользоваться. Но только вот незадача: по смыслу, замыкания и функции —
почти одно и то же, а использовать замыкания там, где должны
использоваться указатели на функции, сходу не получается. По стандарту,
замыкания без списка захвата должны свободно конвертироваться в
указатели на функции, но на практике такого не наблюдалось, видимо ещё
не реализовано. И я задался вопросом, можно ли использовать замыкания
там, где используются указатели на функции?

Рассмотрим пример.
Пусть у нас уже есть функция printFunctionTable, которая позволяет
распечатать таблицу значений функции, при этом аргумент пробегает
значения от 1 до 10.

Всю статью вы можете прочитать здесь

пятница, 3 декабря 2010 г.

Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего назначения

Предлагаем вниманию программистов новый инструмент для поиска ошибок в исходном коде приложений на языке Си/Си++. В рамках анализатора PVS-Studio реализован новый набор правил общего назначения. Эта функциональность на данный момент является бесплатной. Вы можете скачать PVS-Studio по адресу http://www.viva64.com/ru/pvs-studio-download/.

В статье кратко рассказывается о новых возможностях PVS-Studio. На примере статического анализа исходного кода проекта TortoiseSVN будет продемонстрировано использование новых диагностических возможностей.

PVS-Studio — современный

пятница, 26 ноября 2010 г.

Кодировки в C++




Всем рано или поздно приходится работать с различными кодировками. Заметив в коде своей команды различные, порой странные, подходы к решению этих проблем, пришлось провести разъяснительную беседу. Ниже поделюсь своим видением правильной работы с не-ASCII символами в коде. Буду рад конструктивной критике.


Принцип работы

Логика работы с различными кодировками в C++ проста и прозрачна. В общем виде она отражена в схеме. Программа работает в одной — своей внутренней кодировке, а правильно локализованные потоки отвечают за преобразование кодировки данных из внешнего кода во внутренний и обратно. Внутреннюю кодировку программы лучше всего зафиксировать раз и навсегда. Если программа работает с не-ASCII символами, то самый логичный выбор для внутренней кодировки — Юникод, причём использование UTF-8 и char для параметризации STL как правило неоправданно (хотя существуют ситуации, в которых это необходимо); более логично перейти на расширенные символы wchar_t и использовать UCS-2. За преобразование данных из внешней кодировки во внутреннюю отвечает фасет codecvt. Локализованные потоки сами вызовут соответствующие функции фасета при получении данных (о том кто такие фасеты я писал ранее).
Вышесказанное поясню комментированным примером, в котором прочитаем данные из cp1251 файла, покажем как boost::xpressive работает с юникодом и выведем кириллицу в cout в кодировке cp866 (консоль windows по умолчанию).

Кодировка исходников

Прежде чем приступить к рассмотрению примера, следует (на всякий случай) пару слов сказать о кодировке исходных текстов программы. Все свои исходники я держу в UTF-8 (если они содержат широкие строковые константы с не-ASCII символами, то в файлы добавляю BOM), что и всем советую. Современные компиляторы сами преобразуют «широкие» символы, помеченные в исходниках как L"" в UCS-2 (или UCS-4). Понятно, что правильное преобразование зависит от кодировки исходников. gcc по-умолчанию считает, что работает с UTF-8 текстом, чтобы его переубедить придётся специально указывать значение параметра -finput-charset. Компилятору от MS нужно немножечко помочь — добавить в UTF-8 файл BOM (Byte Order Mark). К сожалению у Borland C++ Compiler version 5.5 с UTF-8 проблемы.
Для тех, кто собрался кинуть в меня камень поясню два момента: первый — мне не удобно читать код с «unicode escape» типа:
std::wstring wstr(L"\u0410\u0411\u0412\u0413\u0413");
второй — речь идёт не только об интерфейсе пользователя, поэтому вынести все широкие строковые константы в отдельный модуль и как-то с ними работать (наподобие gettext), не вариант.
Итак решено — исходники в UTF-8 с BOM. Если кто не знает, в vim BOM можно добавить к файлу с помощью команды «set bomb». Если BOM в файле уже есть vim его никуда не денет.

Пример работы с различными кодировками

Ну вот и подобрались к самому интересному. Как я и говорил, код простой и понятный. Маленькое замечание по стандартным потокам — по умолчанию фасеты для них не задействуются так как они синхронизированы с stdio для производительности. Следует указать sync_with_stdio(false).

Остальное вы можете прочитать в этой теме 



пятница, 19 ноября 2010 г.

Опубликован рейтинг языков программирования за октябрь 2010 года

рейтинг языков программирования

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

Что нового в октябрьском рейтинге? В первую очередь это быстро набирающий обороты Objective-C от Apple, который набрал 2.54% за год, и стремится стать языком 2010 года. Появление в первой двадцатке языка Go уже было в начале этого года. И не просто появление — он стал языком 2009 года по версии TIOBE. Сейчас он сместился с 13 места (данные на январь 2010) на 20 место, но продолжает активно собирать последователей.

Помимо языков от Google и Apple в 2009 высокого уровня достигли C# от Microsoft и Actionscript от Adobe. Что касается Java, то он по прежнему остался на первой строчке, хотя его популярность продолжает падать, а Си снова медленно, но верно идёт к первому месту.

Интересно также неожиданное падение популярности PHP, и Javascript. Если ситуация с PHP еще более-менее понятна, то что касается повсеместно используемого Javascript — непонятно откуда такое падение рейтинга.

Пожалуй, самое удивительное — появление в двадцатке легендарного военного американского языка Ada, интерес к которому вознёс его аж на 17 строчку рейтинга (по сравнению с 29 местом год назад).

Позиция Язык программирования Рейтинг
1 Java 18.166% (-0.48%)
2 C 17.177% (+0.33%)
3 (+1) C++ 9.802% (-0.08%)
4 (-1) PHP 8.323% (-2.03%)
5 (Visual) Basic 5.650% (-3.04%)
6 C# 4.963% (+0.55%)
7 Python 4.860% (+0.96%)
8 (+4) Objective-C 3.706% (+2.54%)
9 (-1) Perl 2.310% (-1.45%)
10 Ruby 1.941% (-0.51%)
11 (-2) Javascript 1.659% (-1.37%)
12 (-1) Delphi 1.558% (-0.58%)
13 (+4) Lisp 1.084% (+0.48%)
14 (+10) Transact-SQL 0.820% (+0.42%)
15 Pascal 0.771% (+0.10%)
16 (+2) RPG (OS/400) 0.708% (+0.12%)
17 (+12) Ada 0.704% (+0.40%)
18 (-4) SAS 0.664% (-0.14%)
19 MATLAB 0.627% (+0.05%)
20 (new) Go 0.626% (+0.63%)

График изменения популярности первой десятки языков в рейтинге, начиная с середины 2001 года:



В 2009 году TIOBE предсказывала, что в недалёком будущем PHP и Ruby потеряют популярность, а Python, C# и Erlang станут лидерами. Вот как выглядит текущий прогноз на конец 2010 года от TIOBE: наберут популярность C++ (благодаря новому стандарту), C# (благодаря хорошей динамике развития) и JavaFX script, а вот для Java (не поспевающего за прогрессом) и Perl (в связи с большим количеством конкурентов) настанут не лучшие времена. Тем не менее, очевидно, что в лидеры вырываются языки от Apple и от Google, что в очередной раз подтверждает древнюю истину: прогнозы — неблагодарное дело.

Для информации, язык 2009 года — Go, 2008 — C, 2007 — Python, 2006 — Ruby, 2005 — Java, 2004 — PHP, 2003 — C++. Другая статистика по ссылке www.tiobe.com/index.php/content/paperinfo/tpci/index.html.

Другой рейтинг популярности языков программирования доступен на www.langpop.com/

Возможно, кому-то он покажется более интересным.

Автор материала: pandas
Источник: http://realcoding.net





понедельник, 15 ноября 2010 г.

Списки в C++

Массив — не единственный тип, способный играть роль контейнера для данных. Другим таким типом является связанный список. В отличие от массива, он реализуется не языком, а программистом.

Пример. Определить связанный список и операции над ним.

// Структура - элемент списка
struct Item {
int info;
Item* next;
};

void main ( )
{
Item *first = 0; //Указатель на начало списка
Item *p;
int i;
// Создать список
for (;;) {
// Вводить числа, пока не введем 0
сin » i;
if (!i) break;

// Создать новый элемент списка
р = new Item;
p->info = i;

// Присоединить новый элемент к началу списка
p->next = first ;
first = р;
}

// Пройти список и вывести элементы
р = first;
while (p) {
cout « p->info « " " ;
р = p->next;
}

// Пройти список и удалить элементы
while (first) {
р = first;
first = first->next ;
delete p;
}
}

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

Источник: http://www.cplus-plus.ru


воскресенье, 14 ноября 2010 г.

Структура в C++

Структура — это составной тип данных, который состоит из элементов разных типов. Объявление структуры следует рассматривать как объявление типа.

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

Пример. Объявление структуры, которая хранит сведения о журнале: название, год, номер.

struct magazin
{
char* tittle;
int year;
int number;
};

Ниже определена и инициализирована переменная структура mag.

magazin mag = {"Nature", 3, 1995);

Доступ к элементам структуры осуществляется по составному имени:

имя_структуры.имя_элемента.

Здесь точка обозначает оператор выбора, а составное имя дает еще один пример адресного выражения.

Если есть указатель на структуру, то доступ к элементу возмо¬жен при помощи операции косвенного выбора:

указатель_на_структуру->имя_элемента.

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

Структуры можно присваивать, передавать в виде параметров функции, возвращать в виде результата функции. Структуры нельзя сравнивать операциями ==, /=, < , > и т.п. Структуры, как и массивы, можно инициализировать списком значений.

Пример. Работа со структурой magazin.

// объявления и инициализация
magazin *pm, m = ("Nature", 2000, 4};
// доступ к элементам
cout « m.tittle « " " « m.number « endl;
// одна структура в свободной памяти
*pm = new magazin;
*pm = m;
pm->tittle = "Nature";
delete pm;

// массив структур в свободной памяти
pm = new magazin[10];
pm[0].tittle = "Природа";
delete[] pm;

Источник: http://www.cplus-plus.ru



четверг, 11 ноября 2010 г.

Строковые библиотечные функции в C++

Функции для работы со строками объявлены в заголовочном файле string.h. Приведем некоторые из них:

char *strcpy(char *dest, const char *src);

копирует второй аргумент в первый. Возвращает указатель на копию. Память для dest должна быть заранее зарезервирована.

char *strdup(const char *s);

копирует строку во вновь создаваемую функцией malloc() область памяти. Возвращает указатель на созданную копию или 0 при неудаче. Программист ответственен за освобождение памяти функцией free();

size_t strlen(const char *s);

подсчитывает размер строки. Возвращает количество символов строки без нулевого символа. Тип size_t определен в файле string.h и других заголовочных файлах как целое без знака: typedef unsigned size_t;

char *strcat(char *dest, const char *src);

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

char *strchr(const char *s, int c);

сканирует строку s в поисках первого вхождения заданного символа с. Нулевой символ можно искать наряду с другими. Возвращает указатель на найденный символ или 0, если символа нет.

char *strrchr(const char *s, int с);

то же, что strchr, но находит последнее вхождение символа с в строку s.

char *strstr(const char *s1, const char *s2);

находит первое вхождение подстроки s2 в строку s1. Возвращает указатель на место первого вхождения или 0, если такового нет.

int strcmp(const char *s1, const char*s2);

сравнивает две строки. Возвращает целое меньше нуля, если s1 < s2, равное нулю, если s1 == s2, и большее нуля, если s1 > s2.

char *strpbrk(const char *s1, const char *s2);

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

char *strtok(char *s1, const char *s2);

сканирует первую строку в поисках первого участка, не содержащего символов из s2. Первый вызов функции возвращает указатель на начало первого участка и записывает 0 в s1 сразу после конца участка. Последующие вызовы с 0 в качестве 1-го аргумента обрабатывают строку дальше, пока еще есть такие участки. Если их нет, возвращается 0. Функцию применяют для выделения слов из предложения si. В строке s2 находятся символы-разделители.

Пример. Ввод, клонирование и вывод строки.

#include <scring.h>
//. . .
char s1[80];
cin » s1;
char *s2 = st.rdup (s1) ;
cout « s1 « s2 « endl;
free (s2);

Замечание. Функция strdup() резервирует память для копии при помощи вызова функции malloc(size_t), поэтому программист должен освободить эту память вызовом функции freef(void*). Функции malloc() и free( ) составляют пару подобно операциям new и delete.

Пример. Заменить в строке s1 первое вхождение слова a словом b.

int main(int argc, char* argv[])
{
char *s1 = "I see nothing.";
char *a = "see", *b = "hear";
char s2 [100];
// для начала скопировать всю строку
strcpy(s2, s1);
// установить p1 на слово а в оригинале
char *p1 = strstr(s1, а);
// установить р2 на слово а в копии
char *р2 = s2 - s1 + p1;
// копировать слово b
strcpy(p2, b);
// сместить указатель в оригинале
p1 += strlen(a);
// сместить указатель в копии
р2 + = strlen(b);
// скопировать остаток строки
strcpy(р2, р1);
cout « s2 « endl ; return 0;
}

Источник: http://www.cplus-plus.ru


вторник, 9 ноября 2010 г.

Строки символов в C++

Строка языка С представляет собой массив символов, который завершается символом с кодом 0. Например, строка "QWERTY" имеет тип char[7], пустая строка "" — тип char[1].

Замечание. В стандартной библиотеке C++, кроме С-строк, определены строки типа string. Это средство более высокого уровня, и речь о нем пойдет позже.

Строковая константа — это последовательность символов, заключенная в двойные кавычки. В числе символов строки могут находиться любые символьные константы, например, "Звонок в конце сообщения\007\n".

Соседние строковые константы транслятором «склеиваются». Например, "АБВ""ГДЕ" означает то же, что "АБВГДЕ". При этом неважно, сколько разделителей (пробелов, знаков табуляции, переводов строк) стоит между константами.

Строковые константы можно использовать для инициализа¬ции символьных массивов.

Пример. Определить массив из 7 символов и инициализировать его.

char s[7]= "ABCDEF"; // вариант 1
char s [] = "ABCDEF"; // вариант 2
char *s = "ABCDEF" ; // вариант 3 то же , что 1

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

Пример. Скопировать строку s1 в s2.

char s1[ ] = "1234567890", s2[11];
for (int i = 0; s1[i]; i++)
s2[i] = s1[i];
s2[i] = 0; // ставим замыкающий 0

Источник: http://www.cplus-plus.ru


понедельник, 1 ноября 2010 г.

Строки. Встроенные тип char в C++

Значениями типа char являются целые числа со знаком (signed char) или без знака (unsigned char), которые помещаются в один байт. От других целых типов его отличает наличие символических констант вида: "А" — для изображаемых символов; "\ооо" и "\xhhh" — для всех символов без исключения, где ооо — 8-ичные, a hhh — 16-ичные цифры.
Несколько символов имеют собственные имена:
\n — новая строка;
\t — горизонтальная табуляция;
\v — вертикальная табуляция;
\b — возврат назад;
\r — возврат каретки;
\a — звонок (attention);
\\ — обратная косая черта;
\' — одинарная кавычка;
\" — двойная кавычка.

Замечание. Значения типа char, выводимые в выходной поток cout, выглядят как символы, а не как числа благодаря определению операции помещения в поток. 

Источник: http://www.cplus-plus.ru

Объектно-ориентированное программирование на языке C++