Глава 15. Разработка приложений с графическим интерфейсом
Рис. 15.13: Пример: программа для вывода графика функции.
2. Добавьте к настройкам опцию для сохранения геометрии главного окна
после закрытия программы. Если флажок опции включен, то после запуска
главное окно будет на той же позиции и тех же размеров, как и в момент
перед закрытием программы.
3. Создайте проект с графическим интерфейсом. Разместите на окне в ком-
поновщиках 5 различных виджетов. Соедините их (по 2–3 между собой)
сигнально-слотовыми соединениями, таким образом, чтобы они реагирова-
ли на изменения состояния друг друга. Выполните это задание исключи-
тельно с помощью редактора форм. Все виджеты должны быть расположе-
ны в компоновщиках и пропорционально изменять размеры при изменении
размеров окна.
4. Попробуйте добавить вывод простого графика функции приведенному вы-
ше примеру использования компоненты Qwt.
5. Запрограммируйте вывод протабулированной функции на график из фай-
ла. Для этого добавьте пункт главного меню «File-> Load...», который будет
показывать диалог открытия файла. После того, как пользователь выберет
файл, программа должна загрузить данные из него и построить график
функции.
6. Попробуйте использовать в качестве посторонней компоненты для вывода
графика — QCustomPlot (сайт проекта : http://www.qcustomplot.com/, ли-
цензия GPL). Использование этого проекта не требует компиляции библио-
теки — просто добавьте файлы qcustomplot.h и qcustomplot.cpp в проект.
Обратите внимание на документацию и примеры, которые поставляются
вместе с проектом.
Программирование на языке С++ в среде Qt Creator
Приложение A
Использование компилятора командной
строки и текстового редактора Geany
Одним из самых мощных современных кроссплатформенных компиляторов
языка C++ является свободно-распространяемый компилятор g++. Для его уста-
новки в debian-подобных ОС семейства Linux (Debian, Ubuntu, Mint и их кло-
ны) достаточно выполнить команду терминала apt-get install g++ с правами
суперпользователя (администратора) или воспользоваться менеджером пакетов
synaptic
.
Установка компилятора g++ в ОС семейства Windows несколько сложнее, по-
этому рассмотрим этот процесс более подробно.
1. На сайте mingw.org переходим в раздел Download (Загрузки), в появив-
шемся окне щёлкаем по ссылке Download mingw-get-setup.exe (рис. A.1).
Загружаем установочный файл и запускаем его.
2. На первом этапе установки необходимо выбрать команду Install (см.
рис. A.2), затем папку для установки (рис. A.3).
3. После этого начнётся процесс доустановки инсталлятора (рис. A.4).
4. Далее выбираем компиляторы для установки (C++, Fortran, Ada) (рис. A.5)
и ждём пока будут скачаны и установлены необходимые компиляторы. По-
сле завершения процесса установки компиляторы (в нашем случае компи-
лятор C++) готовы к использованию. Но для вызова их (из командной стро-
ки Windows, из текстового редактора Geany) необходимо указывать пол-
ное имя файла с компилятором. При установке компилятора C++ в стан-
дартный каталог C:\MinGW — полное имя компилятора C++ будет таким:
C:\MinGW\bin\g++
. Для того, чтобы каждый раз не писать полное имя ком-
пилятора, можно добавить путь C:\MinGW\bin в список путей системной
переменной Path.
5. Для изменения значения системной переменной Path необходимо в пане-
ли управления выбрать Система -> Дополнительные параметры систе-
мы -> Дополнительно -> Переменные среды -> Системные переменные
420
Приложение А. Использование компилятора командной строки
-> Path -> Изменить
. В открывшемся диалоговом окне добавить путь
C:\MinGW\bin\
.
Рис. A.1: Окно загрузки mingw.
После перезагрузки ОС Windows для обращения к компилятору достаточно
будет указывать его имя — g++.
Таким образом, в ОС Linux для работы с компилятором в командной строке
необходимо запустить Терминал, а в ОС Windows – командную строку. После
чего работа с компилятором g++ с ОС Windows и Linux идентична.
Рассмотрим опции компилятора командной строки, необходимые для компи-
ляции и запуска простейших программ.
Для того, чтобы создать исполняемый файл из текста программы на C++,
необходимо выполнить команду
g++ name.cpp
Здесь name.cpp — имя файла с текстом программы. В результате будет со-
здан исполняемый файл со стандартным именем a.out. Для того, чтобы создать
исполняемый файл с другим именем, необходимо выполнить команду
g++ -o nameout name.cpp
Здесь name.cpp — имя файла с текстом программы, nameout — имя исполня-
емого файла.
При использовании компилятора g++ после компиляции программы автома-
тически происходит компоновка программы (запуск компоновщика make). Что-
Программирование на языке С++ в среде Qt Creator
Приложение А. Использование компилятора командной строки
421
Рис. A.2: Первое окно установки mingw.
Рис. A.3: Выбор папки для установка компилятора.
бы исключить автоматическую компоновку программы, следует использовать
опцию -c. В этом случае команда будет иметь вид g++ -c name.cpp
Технология работы с компилятором g++ может быть такой: набираем текст
программы в стандартном текстовом редакторе, потом в консоли запускаем ком-
пилятор, после исправления синтаксических ошибок запускаем исполняемый
файл. После каждого изменения текста программы надо сохранить изменения
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
422
Приложение А. Использование компилятора командной строки
Рис. A.4: Загрузка инсталлятора.
Рис. A.5: Выбор устанавливаемых компиляторов.
в файле на диске, запустить компилятор, и только после этого запускать про-
грамму (исполняемый файл). Очень важно не забывать сохранять текст про-
граммы, иначе при запуске компилятора будет компилироваться старая версия
текста программы.
Компилятор g++ эффективен при разработке больших комплексов программ,
он позволяет собирать приложения из нескольких файлов, создавать библиотеки
программ. Рассмотрим процесс создания и использования библиотеки решения
задач линейной алгебры (см. п. 6.4, задачи 6.10 — 6.12):
int SLAU(double ∗∗matrica_a, int n, double ∗massiv_b, double ∗x)
— функция решения
системы линейных алгебраических уравнений;
int INVERSE(double ∗∗a, int n, double ∗∗y)
— функция вычисления обратной мат-
рицы;
double determinant(double ∗∗matrica_a, int n)
— функция вычисления определителя.
Программирование на языке С++ в среде Qt Creator
Приложение А. Использование компилятора командной строки
423
Для создания библиотеки создадим заголовочный файл slau.h и файл
slau.cpp
, в который поместим тексты всех трёх функций решения задач ли-
нейной алгебры.
Текст файла slau1.h:
i n t SLAU( double ∗∗ matrica_a ,
i n t n , double ∗ massiv_b , double ∗x ) ;
i n t INVERSE( double ∗∗ a , i n t n , double ∗∗ y ) ;
double d e t e r m i n a n t ( double ∗∗ matrica_a , i n t n ) ;
Текст файла slau1.cpp:
#include
424
Приложение А. Использование компилятора командной строки
}
}
i n t INVERSE( double ∗∗ a , i n t n , double ∗∗ y )
{
i n t i , j , r e s ;
double ∗b , ∗x ;
b=new double [ n ] ;
x=new double [ n ] ;
f o r ( i =0; i {
f o r ( j =0; j i f ( j==i )
b [ j ] = 1 ;
e l s e b [ j ] = 0 ;
r e s=SLAU( a , n , b , x ) ;
i f ( r e s !=0)
break ;
e l s e
f o r ( j =0; j y [ j ] [ i ]=x [ j ] ;
}
i f ( r e s !=0)
return
−1;
e l s e
return 0 ;
}
double d e t e r m i n a n t ( double ∗∗ matrica_a , i n t n )
{
i n t i , j , k , r ;
double c ,M, max , s , d e t =1;
double ∗∗ a ;
a=new double ∗ [ n ] ;
f o r ( i =0; i a [ i ]=new double [ n ] ;
f o r ( i =0; i f o r ( j =0; j a [ i ] [ j ]= matrica_a [ i ] [ j ] ;
f o r ( k =0;k{
max=f a b s ( a [ k ] [ k ] ) ;
r=k ;
f o r ( i=k +1; i i f ( f a b s ( a [ i ] [ k ] )>max)
{
max=f a b s ( a [ i ] [ k ] ) ;
r=i ;
}
i f ( r !=k ) d e t=
−d e t ;
f o r ( j =0; j {
c=a [ k ] [ j ] ;
a [ k ] [ j ]= a [ r ] [ j ] ;
a [ r ] [ j ]= c ;
}
f o r ( i=k +1; i f o r (M=a [ i ] [ k ] / a [ k ] [ k ] , j=k ; j a [ i ] [ j ]−=M∗a [ k ] [ j ] ;
}
f o r ( i =0; i d e t∗=a [ i ] [ i ] ;
return d e t ;
f o r ( i =0; i delete [ ] a [ i ] ;
delete [ ] a ;
}
Программирование на языке С++ в среде Qt Creator
Приложение А. Использование компилятора командной строки
425
В качестве тестовой задачи напишем главную функцию, которая предназна-
чена для решения системы линейных алгебраических уравнений.
#include
#include
426
Приложение А. Использование компилятора командной строки
При разработке программ с большим количеством вычислений, компилятор
g++
позволяет оптимизировать программы по быстродействию. Для получения
оптимизированных программ можно использовать ключи -O0, -O1, -O2, -O3, -Os:
• при использовании ключа -O0 оптимизация отключена, достигается макси-
мальная скорость компиляции, опция задействована по умолчанию;
• при использовании ключа «мягкой» оптимизации -O1 происходит некото-
рое увеличение времени компиляции, этот ключ оптимизации позволяет од-
новременно уменьшать занимаемую программой память и уменьшить вре-
мя выполнения программы;
• при использовании ключа -02 происходит существенное уменьшение вре-
мени работы программы, при этом не происходит увеличение памяти, за-
нимаемой программой, не происходит развёртка циклов и автоматическое
встраивание функций;
• ключ «агрессивной» оптимизации -O3 нацелен в первую очередь на умень-
шение времени выполнения программы, при этом может произойти увели-
чение объёма кода и времени компиляции, в этом случае происходит раз-
вёртка циклов и автоматическое встраивание функций;
• ключ -Os ориентирован на оптимизацию размера программы, включаются
те опции из набора -O2, которые обычно не увеличивают объём кода, при-
меняются некоторые другие оптимизации, направленные на снижение его
объёма.
Для разработки программ на различных языках программирования можно
использовать текстовый редактор Geany. Редактор Geany входит в репозитории
большинства дистрибутивов Linux, его установка осуществляется стандартным
для вашего дистрибутива образом (в debian-подобных ОС с помощью команды
apt-get install geany
). Для установки его в Windows необходимо скачать со
страницы http://www.geany.org/Download/Releases инсталляционный файл и
установить программу стандартным способом.
Разработка программ с использованием Geany более эффективна. Окно
Geany представлено на рис. A.6.
Последовательно рассмотрим основные этапы разработки программы с ис-
пользованием Geany.
1. Необходимо создать шаблон приложения на C/C++ (или другом языке про-
граммирования) с помощью команды Файл -> Создать из шаблона ->
main.cxx
. После чего необходимо ввести текст программы и сохранить его.
2. Для компиляции и запуска программы на выполнение служит пункт меню
Сборка
. Для компиляции программы следует использовать команду Сбор-
ка -> Скомпилировать
(F8). В этом случае будет построен объектный код
программы (файл с расширением .o или .obj). Для создания исполняемого
кода программы служит команда Сборка -> Собрать (Shift+F9). Для за-
пуска программы следует выполнить команду Сборка -> Выполнить (F5).
Параметры компилятора определяются автоматически после выбора шабло-
на (Файл -> Создать из шаблона). Однако команды компиляции и сборки по
Программирование на языке С++ в среде Qt Creator
Приложение А. Использование компилятора командной строки
427
Рис. A.6: Окно Geany.
умолчанию можно изменить, используя команду Сборка -> Установить пара-
метры сборки
(см. рис. A.7). Здесь %f — имя компилируемого файла, %e — имя
файла без расширения.
Рис. A.7: Настройка компиляции программ на языке C++ в Geany.
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
Приложение B
Общие сведения о библиотеке MathGL
При решении различных задач возникает необходимость графического отоб-
ражения данных (графики, диаграммы, поверхности). Одним из универсальных
способов построения различных графиков является кросс-платформенная биб-
лиотека MathGL.
Mathgl
— свободная кросс-платформенная библиотека для построения двух-
и трёх-мерных графиков функций. Её использование позволит построить гра-
фик с помощью нескольких операторов. Синтаксис функций, используемых
в MathGL, подобен синтаксису MathLab, Octave, Scilab, GnuPlot. Официаль-
ный сайт — http://mathgl.sourceforge.net/doc_ru/Website.html#Website,
на странице загрузки http://mathgl.sourceforge.net/doc_ru/Download.html#
Download
можно скачать последнюю версию программы для различных опе-
рационных систем, англоязычную документацию в формате pdf. Группа
в Google — https://groups.google.com/forum/#!forum/mathgl. Русскоязыч-
ная страница с описанием — http://mathgl.sourceforge.net/doc_ru/index.
html#SEC_Contents
, англоязычная — http://mathgl.sourceforge.net/doc_en/
index.html#SEC_Contents
. Кроме С(С++) поддерживаются Fortran, Python,
Octave
, скриптовый язык MGL.
Рассмотрим особенности установки и примеры использования библиотеки для
построения графиков.
B.1
Установка MathGL в Linux.
Библиотека входит в репозитории большинства современных дистрибутивов
Linux. Её можно установить из репозитория стандартным для вашего дистрибу-
тива способом, однако в репозитории зачастую находится не самая новая версия.
Для установки самой новой версии необходимо:
1. Скачать исходники последней версии с официального сайта.
2. Распаковать.
B.2. Использование MathGL при построении двух- и трёхмерных графиков
429
3. Последовательно выполнить команды
1
cmake -Denable-qt=ON
cmake
make
sudo make install
4. Скопировать файлы libmgl-qt.so.7.1.0 и libmgl.so.7.1.0
2
из ка-
талога /usr/local/lib в каталог /lib (нужны права администрато-
ра(суперпользователя)).
После этого для компиляции программы с использованием библиотеки
MathGL
необходимо использовать ключи -L/usr/local/lib -L/usr/lib -lmgl
-lmgl-qt
, например для компиляции файла с именем 1.cpp можно использо-
вать команду
g++ -o 1
1.cpp -L/usr/local/lib -L/usr/lib -lmgl -lmgl-qt
B.2
Использование MathGL при построении двух- и
трёхмерных графиков
Рассмотрим возможности библиотеки на конкретных примерах.
Задача B.1.
Построить график функции f(x) = sin(x)+
1
3
·sin(3·x)+
1
5
·sin(5·x).
Следующий программный код позволит построить линию графика (рис. B.1)
на интервале [−1; 1].
#include
i n t sample ( mglGraph ∗ g r )
{
gr−>T i t l e ( "График функции y = f ( x ) " ) ; //Заголовок графика
//График заданной функции. Линия графика изображена красным цветом — " r " .
gr−>FPlot ( " sin ( x ) + 1 / 3 * sin (3* x ) + 1 / 5 * sin (5* x ) " , " r " ) ;
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " P l o t " ) ;
return g r . Run ( ) ;
}
Далее представлен текст программы, с помощью которого можно усовершен-
ствовать график, показанный на рис. B.1. На рис. B.2 видно, что был увеличен
диапазон построения графика, добавлены оси координат, подписи под ними и
линии сетки.
#include
i n t sample ( mglGraph ∗ g r )
{
gr−>T i t l e ( "График функции y = f ( x ) " ) ; //Заголовок графика
gr−>S e t O r i g i n ( 0 , 0 ) ; //Установка центра координатных осей
1
Перед выполнением команды cmake, возможно, придётся доставлять необходимые пакеты.
При работе в debian (6, 7), ubuntu (12.04, 12.10, 13.04, 13.10) авторам пришлось доставить
пакеты cmake, zlib1g-dev, libpng12-dev, libqt4-opengl-dev, libqtwebkit-dev. Кроме того,
должен быть устанвлен компилятор g++.
2
Версии библиотек libmgl указаны применительно к mathgl 2.2, в вашем конкретном случае
могут быть другие библиотеки.
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
430
Приложение B. Общие сведения о библиотеке MathGL
Рис. B.1: График функции к задаче B.1
//Границы по оси абсцисс от -10 до 10, по оси ординат от -1 до 1.
gr−>SetRanges ( −10 ,10 , −1 ,1) ;
gr−>Axis ( ) ; //Вывод значений возле осей
gr−>Grid ( ) ; //Линии сетки
//График заданной функции.
gr−>FPlot ( " sin ( x ) + 1 / 3 * sin (3* x ) + 1 / 5 * sin (5* x ) " , " r " ) ;
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ; //Поддержка кириллицы в С++
mglQT g r ( sample , " P l o t " ) ; //Вывод графика на экран в окно с именем Plot
return g r . Run ( ) ;
}
Задача B.2.
Построить графики функций f(x) = sin(2 · x) и y(x) =
4·cos(x)
3
в
одной графической области.
Далее приведён текст программы, реализующий решение поставленной зада-
чи. Результаты работы программы показаны на рис. B.3.
#include
#include
B.2. Использование MathGL при построении двух- и трёхмерных графиков
431
Рис. B.2: Форматирование линии и области построения графика к задаче B.1
gr−>FPlot ( " 4* cos ( x ) /3 " , " k . " ) ; //График функции y(x), чёрная (k) линия и точки (.).
gr−>AddLegend ( " 4* cos ( x ) /3 " , " k . " ) ; //Добавление легенды
gr−>Legend ( 3 ) ; //Вывод легенды на экран в правом верхнем углу
gr−>Label ( ’ x ’ , " OX " , 0 ) ; //Вывод подписи по оси абсцисс
gr−>Label ( ’ y ’ , " OY " ) ; //Вывод подписи по оси ординат
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " P l o t " ) ;
return g r . Run ( ) ;
}
Задача B.3.
Построить в одном графическом окне графики функций:
• f(x) = sin(x) на интервале [−10; 10],
• f(x) = cos(x) на интервале [−6; 6],
• f(x) = e
cos(x)
на интервале [−6; 6],
• f(x) = e
sin(x)
на интервале [−12; 12].
Результаты вывести на экран и в файл.
Далее приведён программный код и результат его работы (рис. B.4).
#include
#include
#include
using namespace s t d ;
i n t sample ( mglGraph ∗ g r )
{
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
432
Приложение B. Общие сведения о библиотеке MathGL
Рис. B.3: Графики к задаче B.2
//График функции sin(x) на интервале [−10; 10]
gr−>SubPlot ( 2 , 2 , 0 ) ;
gr−>T i t l e ( "График функции sin ( x ) " ) ;
gr−>S e t O r i g i n ( 0 , 0 ) ;
gr−>SetRanges ( −10 ,10 , −1 ,1) ;
gr−>Axis ( ) ;
gr−>Grid ( ) ;
gr−>FPlot ( " sin ( x ) " , " k -. " ) ;
//График функции cos(x) на интервале [−6; 6]
gr−>SubPlot ( 2 , 2 , 1 ) ;
gr−>T i t l e ( "График функции cos ( x ) " ) ;
gr−>S e t O r i g i n ( 0 , 0 ) ;
gr−>SetRanges ( −6 ,6 , −1 ,1) ;
gr−>Axis ( ) ;
gr−>Grid ( ) ;
gr−>FPlot ( " cos ( x ) " , " k . " ) ;
//График функции exp(cos(x)) на интервале [−6; 6]
gr−>SubPlot ( 2 , 2 , 2 ) ;
gr−>T i t l e ( "График функции e ^{ cos ( x ) } " ) ;
gr−>S e t O r i g i n ( 0 , 0 ) ;
gr−>SetRanges ( − 6 , 6 , 0 , 3 ) ;
gr−>Axis ( ) ;
gr−>Grid ( ) ;
gr−>FPlot ( " exp ( cos ( x ) ) " , " r o " ) ;
//График функции exp(sin(x)) на интервале [−12; 12]
gr−>SubPlot ( 2 , 2 , 3 ) ;
gr−>T i t l e ( "График функции e ^{ sin ( x ) } " ) ;
gr−>S e t O r i g i n ( 0 , 0 ) ;
gr−>SetRanges ( − 1 5 , 1 5 , 0 , 3 ) ;
gr−>Axis ( ) ;
gr−>Grid ( ) ;
Программирование на языке С++ в среде Qt Creator
B.2. Использование MathGL при построении двух- и трёхмерных графиков
433
gr−>FPlot ( " exp ( sin ( x ) ) " , " r - o " ) ;
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
//Вывод на экран или в файл
i n t k ;
cout<<"Введите 1, если будете выводить на экран, 2 - если в файл\ nk = " ;
c i n >>k ;
i f ( k==1)
{
//Поддержка кириллицы в С++
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
//Вывод на экран
mglQT g r ( sample , " P l o t s " ) ;
return g r . Run ( ) ;
}
e l s e
{
mglGraph g r ;
g r . Alpha ( true ) ;
g r . L i g h t ( true ) ;
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
//Обращение к функции вывода
sample (& g r ) ;
//Запись изображения в файл
g r . WriteEPS ( " t e s t . e p s " ) ;
return 0 ;
}
}
Рис. B.4: График функций к задаче B.3
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
434
Приложение B. Общие сведения о библиотеке MathGL
Задача B.4.
Построить график функций f(x) = 1 −
0.4
x
+
0.05
x
2
.
Нетрудно заметить, что функция f (x ) не существует в точке ноль. Поэтому
построим её график на двух интервалах [-2;-0.1] и [0.1;2], исключив точку раз-
рыва из диапазона построения. Текст программы с подробными комментариями
приведён далее. Решение задачи представлено на рис. B.5.
#include
#include
using namespace s t d ;
i n t sample ( mglGraph ∗ g r )
{
mglData x1 ( 1 9 1 ) , x2 ( 1 9 1 ) , y1 ( 1 9 1 ) , y2 ( 1 9 1 ) ;
i n t i ; f l o a t h , a1 , b1 , a2 , b2 ;
//График точечной разрывной функции
//Первый интервал
a1=−2;b1 = −0.1;
h = 0 . 0 1 ;
f o r ( i =0; i <191; i ++)
{
x1 [ i ]= a1+i ∗h ;
y1 [ i ]=1 −0.4/ x1 [ i ] + 0 . 0 5 / x1 [ i ] / x1 [ i ] ;
}
//Второй интервал
a2 = 0 . 1 ; b2 =2;
h = 0 . 0 1 ;
f o r ( i =0; i <191; i ++)
{
x2 [ i ]= a2+i ∗h ;
y2 [ i ]=1 −0.4/ x2 [ i ] + 0 . 0 5 / ( x2 [ i ] ∗ x2 [ i ] ) ;
}
gr−>SetRanges ( a1 , b2 , 0 , 1 0 ) ; //Границы по оси абсцисс и ординат
gr−>Axis ( ) ; //Оси координат
gr−>Grid ( ) ; //Сетка
gr−>P l o t ( x1 , y1 , " k " ) ; //График функции на первом интервале, чёрный (k) цвет.
gr−>P l o t ( x2 , y2 , " k " ) ; //График функции на втором интервале, чёрный (k) цвет.
gr−>S e t F o n t S i z e ( 2 ) ; //Размер шрифта
gr−>T i t l e ( "График разрывной функции" ) ; //Заголовок
gr−>S e t F o n t S i z e ( 4 ) ; //Размер шрифта
gr−>Label ( ’ x ’ , " OX " , 0 ) ; //Подпись по оси абсцисс
gr−>Label ( ’ y ’ , " OY " ) ; //Подпись по оси ординат
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " P l o t " ) ;
return g r . Run ( ) ;
}
Задача B.5.
Построить график функции y(x) =
1
x
2
−2·x−3
на интервале [−5; 5].
Функция y(x) имеет разрыв в точках −1 и 3. Построим её график на трёх
интервалах [−5; −1.1], [−0.9; 2.9] и [3.1; 5], исключив точки разрыва из диапазо-
на построения. Текст программы с подробными комментариями приведён далее.
Решение задачи представлено на рис. B.6.
#include
#include
using namespace s t d ;
i n t sample ( mglGraph ∗ g r )
{
mglData x1 ( 3 9 1 ) , x2 ( 3 8 1 ) , x3 ( 1 9 1 ) , y1 ( 3 9 1 ) , y2 ( 3 8 1 ) , y3 ( 1 9 1 ) ;
i n t i ; f l o a t h , a1 , b1 , a2 , b2 , a3 , b3 ;
//График точечной разрывной функции
Программирование на языке С++ в среде Qt Creator
B.2. Использование MathGL при построении двух- и трёхмерных графиков
435
Рис. B.5: График функции к задаче B.4
a1=−5;b1 = −1.1; //Первый интервал
h = 0 . 0 1 ;
f o r ( i =0; i <391; i ++)
{
x1 [ i ]= a1+i ∗h ;
y1 [ i ] =1/( x1 [ i ] ∗ x1 [ i ] −2∗ x1 [ i ] −3) ;
}
a2 = −0.9; b2 = 2 . 9 ; //Второй интервал
h = 0 . 0 1 ;
f o r ( i =0; i <381; i ++)
{
x2 [ i ]= a2+i ∗h ;
y2 [ i ] =1/( x2 [ i ] ∗ x2 [ i ] −2∗ x2 [ i ] −3) ;
}
a3 = 3 . 1 ; b3 =5; //Третий интервал
h = 0 . 0 1 ;
f o r ( i =0; i <191; i ++)
{
x3 [ i ]= a3+i ∗h ;
y3 [ i ] =1/( x3 [ i ] ∗ x3 [ i ] −2∗ x3 [ i ] −3) ;
}
gr−>SetRanges ( −6 ,6 , −3 ,3) ; //Границы по оси абсцисс и ординат
gr−>Axis ( ) ; //Оси координат
gr−>Grid ( ) ; //Сетка
gr−>P l o t ( x1 , y1 , " k " ) ; //График функции на первом интервале, чёрный (k) цвет.
gr−>P l o t ( x2 , y2 , " k " ) ; //График функции на втором интервале, чёрный (k) цвет.
gr−>P l o t ( x3 , y3 , " k " ) ; //График функции на третьем интервале, чёрный (k) цвет.
gr−>S e t F o n t S i z e ( 2 ) ; //Размер шрифта
gr−>T i t l e ( "График функции c двумя разрывами" ) ; //Заголовок
gr−>S e t F o n t S i z e ( 4 ) ; //Размер шрифта
gr−>Label ( ’ x ’ , " OX " , 0 ) ; //Подпись по оси абсцисс
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
436
Приложение B. Общие сведения о библиотеке MathGL
gr−>Label ( ’ y ’ , " OY " ) ; //Подпись по оси ординат
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " P l o t " ) ;
return g r . Run ( ) ;
}
Рис. B.6: График функции к задаче B.5
Задача B.6.
Построить график функции x(t) = 3 · cos(t), y(t) = 2 · sin(t).
График задан в параметрической форме и представляет собой эллипс. Вы-
берем интервал построения графика [0; 2 · π], ранжируем переменную t на этом
интервале, сформируем массивы x и y и построим точечный график. Текст про-
граммы и результаты её работы (рис. B.7) представлены далее.
#include
#include
#include
B.2. Использование MathGL при построении двух- и трёхмерных графиков
437
{
t=a+i ∗h ;
x [ i ]=3∗ c o s ( t ) ;
y [ i ]=2∗ s i n ( t ) ;
}
gr−>SetRanges ( −3 ,3 , −2 ,2) ; //Границы по осям координат
gr−>Axis ( ) ; //Оси координат
gr−>Grid ( ) ; //Сетка
gr−>P l o t ( x , y , " k " ) ; //График функции
gr−>S e t F o n t S i z e ( 2 ) ;
gr−>T i t l e ( "График эллипса" ) ;
gr−>S e t F o n t S i z e ( 4 ) ;
gr−>Label ( ’ x ’ , " OX " , 0 ) ;
gr−>Label ( ’ y ’ , " OY " ) ;
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " P l o t " ) ;
return g r . Run ( ) ;
}
Рис. B.7: График к задаче B.6
Задача B.7.
Построить график функции:
z(x, y) = 0.6 · sin(2 · π · x) · cos(3 · π · y) + 0.4 · cos(3 · π · x · y).
В данном случае необходимо построить график функции двух аргументов.
Для этого нужно сформировать матрицу z при изменении значений аргументов
x и y и отобразить полученные результаты.
Далее приведён текст программы и результаты её работы (рис. B.8).
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
438
Приложение B. Общие сведения о библиотеке MathGL
#include
#include
using namespace s t d ;
i n t sample ( mglGraph ∗ g r )
{
//Изображение поверхности
gr−>SetRanges ( −5 ,5 , −5 ,5 , −1 ,2) ; //Диапазон изменения x, y, z.
mglData z ( 5 0 0 , 4 0 0 ) ; //Размер матрицы z по х и по y
//Формирование матрицы z.
z . Modify ( " 0 . 6 * s i n ( 2 * pi * x ) * s i n ( 3 * pi * y ) + 0 . 4 * c o s ( 3 * pi *( x * y ) ) " ) ;
gr−>Rotate ( 4 0 , 6 0 ) ; //Вращение осей
gr−>Box ( ) ;
gr−>Axis ( ) ;
gr−>Grid ( ) ;
gr−>Mesh ( z ) ; //График функции
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " M a t h G L e x a m p l e " ) ;
return g r . Run ( ) ;
}
Рис. B.8: График к задаче B.7
Задача B.8.
Построить эллипсоид.
Текст программы и результаты её работы (рис. B.9).
#include
#include
#include
using namespace s t d ;
i n t sample ( mglGraph ∗ g r )
Программирование на языке С++ в среде Qt Creator
B.2. Использование MathGL при построении двух- и трёхмерных графиков
439
{
gr−>T i t l e ( "Эллипсоид" ) ;
mglData x ( 5 0 , 4 0 ) , y ( 5 0 , 4 0 ) , z ( 5 0 , 4 0 ) ;
gr−>F i l l ( x , " 0 . 1 + 0 . 8 * sin (2* pi * x ) * sin (2* pi * y ) " ) ;
gr−>F i l l ( y , " 0 . 1 5 + 0 . 7 * cos (2* pi * x ) * sin (2* pi * y ) " ) ;
gr−>F i l l ( z , " 0 . 2 + 0 . 6 * cos (2* pi * y ) " ) ;
gr−>Rotate ( 5 0 , 6 0 ) ;
gr−>Box ( ) ;
gr−>S u r f ( x , y , z , " B b w r R " ) ;
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " E l l i p s e " ) ;
return g r . Run ( ) ;
}
Рис. B.9: График к задаче B.8
В завершении приведём решение реальной инженерной задачи с использова-
нием MathGL.
Задача B.9.
В «Основах химии» Д. И. Менделеева приводятся данные о рас-
творимости азотнокислого натрия NaNO
3
в зависимости от температуры воды.
Число условных частей NaNO
3
, растворяющихся в 100 частях воды при соот-
ветствующих температурах, представлено в таблице.
0
4
10
15
21
29
36
51
68
66.7
71.0
76.3
80.6
85.7
92.9
99.4
113.6
125.1
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
440
Приложение B. Общие сведения о библиотеке MathGL
Требуется определить растворимость азотнокислого натрия при температу-
рах 25, 32 и 45 градусов в случае линейной зависимости и найти коэффициент
корреляции.
Параметры линейной зависимости (линии регрессии) y = a + bx подбираются
методом наименьших квадратов и рассчитываются по формулам
a =
n
P
i=1
y
i
−b·
n
P
i=1
x
i
n
b =
n·
n
P
i=1
y
i
·x
i
−
n
P
i=1
y
i
·
n
P
i=1
x
i
n
n
P
i=1
x
2
i
−
¡
n
P
i=1
x
i
¢
2
Этапы решения задачи:
1. Ввод исходных данных из текстового файла.
2. Вычисление параметров a и b.
3. Расчёт значений линейной зависимости y = a + bx в точках 25, 32, 45.
4. Изображение графиков: экспериментальных точек, линии регрессии и рас-
считанных значений.
Исходные данные задачи хранятся в текстовом файле input.txt (см. рис. B.10).
Рис. B.10: Файл исходных данных к задаче B.9
В первой строке файла хранится количество экспериментальных точек, в сле-
дующих двух строках — массивы абсцисс и ординат экспериментальных точек.
В четвёртой строке хранится количество (3) и точки (25, 32, 45), в которых необ-
ходимо вычислить ожидаемое значение.
Текст программы решения задачи с комментариями приведён ниже.
#include
#include
#include
using namespace s t d ;
i n t sample ( mglGraph ∗ g r )
{
mglData x2 ( 7 0 ) , y2 ( 7 0 ) ;
i n t i , n , k ;
f l o a t h , a , b , sx =0 , sy =0 , syx =0 , s x2 =0;
i f s t r e a m F ; //Поток для чтения файла исходных данных
F . open ( " i n p u t . t x t " ) ;
Программирование на языке С++ в среде Qt Creator
B.2. Использование MathGL при построении двух- и трёхмерных графиков
441
F>>n ; //Чтение исходных данных, n — количество экспериментальных точек.
mglData x ( n ) , y ( n ) ; //x(n),y(n) — координаты экспериментальных точек
cout<<" X \ n " ;
f o r ( i =0; i {
F>>x [ i ] ;
cout< }
cout< cout<<" Y \ n " ;
f o r ( i =0; i {
F>>y [ i ] ;
cout< }
cout< F>>k ;
cout<<" k = "< mglData x r ( k ) , y r ( k ) ;
//xr, yr — ожидаемые значения,
f o r ( i =0; i F>>x r [ i ] ;
cout< f o r ( i =0; i {
s x+=x [ i ] ;
s y+=y [ i ] ;
syx+=y [ i ] ∗ x [ i ] ;
s x 2+=x [ i ] ∗ x [ i ] ;
}
//Расчёт коэффициентов линии регрессиии.
b=(n∗ syx−sy ∗ sx ) / ( n∗ sx2−sx ∗ sx ) ;
a=(sy−b∗ sx ) /n ;
cout<<" a = "< //Формирование массивов для изображения линии регрессии на графике.
f o r ( i =0; i <70; i ++)
{
x2 [ i ]=x [ i ] + 1 ;
y2 [ i ]= a+b∗ x2 [ i ] ;
}
//Вычисление ожидаемых значений — растворимость азотнокислого натрия
//при температурах 25, 32 и 45 градусов.
cout<<" Xr
Y r \ n "
;
f o r ( i =0; i {
y r [ i ]= a+b∗ x r [ i ] ;
cout< }
gr−>SetRanges ( x [ 0 ] , 8 0 , 7 0 , 1 4 0 ) ;
gr−>S e t F o n t S i z e ( 3 ) ;
gr−>Axis ( ) ; //Оси координат
gr−>Grid ( ) ; //Сетка
//Первая легенда
gr−>AddLegend ( "Эксперимент" , " b o " ) ;
gr−>P l o t ( x , y , " b o " ) ; //График экспериментальных точек, голубой (b) цвет.
//Вторая легенда
gr−>AddLegend ( "Расчёт" , " r * " ) ;
gr−>P l o t ( xr , yr , " r * " ) ; //График ожидаемых значений.
//Третья легенда
gr−>AddLegend ( "Линия регрессии" , " k - " ) ;
gr−>P l o t ( x2 , y2 , " k - " ) ; //Изображение линиии регрессии.
gr−>T i t l e ( "Задача Менделеева" ) ; //Заголовок
gr−>Label ( ’ x ’ , " t " , 0 ) ; //Подпись по оси абсцисс
gr−>Label ( ’ y ’ , " N a N O _ 3 " ) ; //Подпись по оси ординат
gr−>Legend ( 2 ) ; //Вывод легенды
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
442
Приложение B. Общие сведения о библиотеке MathGL
return 0 ;
}
i n t main ( i n t argc , char ∗∗ a r g v )
{
s e t l o c a l e (LC_CTYPE, " r u _ R U . u t f 8 " ) ;
mglQT g r ( sample , " P l o t " ) ;
return g r . Run ( ) ;
}
После запуска программы на экране пользователь увидит следующие значе-
ния
X
0 4 10 15 21 29 36 51 68
Y
66.7 71 76.3 80.6 85.7 92.9 99.4 113.6 125.1
k=3
a=67.5078 b=0.87064
Xr
Yr
25 89.2738
32 95.3683
45 106.687
Графическое решение задачи, полученное с помощью средств библиотеки
MathGL
, представлено на рис. B.11.
Рис. B.11: График к задаче B.9
Для изучения всех возможностей MathGL, авторы советуют обратиться к до-
кументации по MathGL. При освоении библиотеки MathGL следует помнить, что
логика и синтаксис библиотеки напоминает синтаксис Scilab и Octave.
Программирование на языке С++ в среде Qt Creator
Список литературы
[1] Алексеев Е.Р. Программирование на Microsoft Visual C++ и Turbo C++
Explorer. — М.: НТ Пресс, 2007. – 352 с.
[2] Алексеев Е.Р., Чеснокова О.В, Кучер Т.В. Самоучитель по программирова-
нию на Free Pascal и Lazarus. Донецк: Унитех, 2009. – 502 с.
[3] Б.П. Демидович, И.А. Марон. Основы вычислительной математики. — М.:
Наука, 1966. – 664 с.
[4] Керниган Б., Ритчи Д. Язык программирования Си. — М.: Вильямс, 2013. –
304 с.
[5] Лаптев В.В. С++. Объектно-ориентированное программирование. — СПб.:
Питер, 2008. – 464 с.
[6] Лаптев В.В. Морозов А.В., Бокова. С++. Объектно-ориентированное про-
граммирование. Задачи и упражнения. — СПб.: Питер, 2007. – 288 с.
[7] Подбельский В.В. Язык С++. — М.: Финансы и статистика, 2001. – 560 с.
[8] Шиманович Е.Л. С/С++ в примерах и задачах. — Мн.: Новое знание, 2004. –
528 с.
Предметный указатель
Valgrind, 378
Алгоритм, 44, 323
линейный, 45
основные конструкции, 45
Поиск максимального (минимально-
го) элемента массива и номера,
144
Произведение элементов массива, 142
разветвляющийся, 45
Сортировка элементов массива, 158
Сумма элементов массива, 142
Удаление элемента из массива, 153
цикл с параметром, 67
цикл с постусловием, 66
цикл с предусловием, 64
циклический, 45, 64
Библиотека
complex, 254
iostream, 8, 254
math.h, 16, 254
MathGL, 425
комплексных чисел, 254
операции с массивами, 256
определение переменной, 254
организация ввода-вывода, 254
основные функции, 255
Блок-схема, 44
Виджет
позиция и размер, 362
Виджеты, 328, 353
Виджеты верхнего уровня, 355
Виджеты-контейнеры, 369
Виртуальный метод, 295
Выражение, 23
Горячие клавиши
Qt Creator
, 333
Динамически распределяемая память, 378
Директивы, 33
Дочерние виджеты, 354
Запись файла с использованием Qt, 351
Идентификатор, 17
Инструменты Qt
Qt Assistant
, 331
Qt Creator
, 332
qmake, 333, 340
Qt Designer, 336
Интерпретатор, 10
Исключение, 304
индикатор, 304
обработчик, 304
Итератор, 321
Класс, 267
QMainWindow
, 336
QAbstractButton, 369
QAction, 393, 396, 400
QApplication, 353, 404
QCheckBox, 365, 369
QCloseEvent, 381
QColor, 390
QColorDialog, 401
QComboBox, 370
QDateTimeEdit, 370
QDial, 370
QDialog, 392, 408
QDockWidget, 393
QEvent, 381, 382
QFile, 349
QFileDialog, 401
QFlags, 350
QFont, 354
QFontDialog, 401
QFrame, 369
QGridLayout, 357, 359, 360
QGroupBox, 370
QHash, 347, 349
QHBoxLayout, 357
QIcon, 406
QInputDialog, 401
QIODevice, 349
QKeyEvent, 381
QKeySequence, 399
QLabel, 353, 370
QLCDNumber, 370
Предметный указатель
445
QLineEdit, 370
QLinkedList, 349
QList, 347, 349
QMainWindow, 392
QMap, 347, 349
QMessageBox, 401, 404
QMouseEvent, 381
QMultiHash, 349
QMultiMap, 349
QObject, 372, 377
QPaintDevice, 389
QPainter, 389
QPainterPath, 389
QPaintEvent, 381
QPen, 390
QPixmap, 375, 377
QPoint, 389
QProgressBar, 370
QPushButton, 369
QQueue, 349
QRadioButton, 369
QRect, 390
QResizeEvent, 381
QScrollBar, 370
QSet, 349
QSettings, 411
QSignalMapper, 367
QSize, 361, 362, 390
QSlider, 371
QStack, 349
QStatusBar, 393
QString, 345
QStringList, 346
QTabWidget, 370
QTextStream, 351
QTimerEvent, 381
QToolBox, 370
QToolButton, 369
QVBoxLayout, 357
QVector, 349
QWidget, 353, 369, 389, 392
абстрактный, 298
базовый, 268
деструктор, 272
дочерний, 268
конструктор, 272
метод, 270
модификаторы доступа, 292
модификаторы наследования, 292
наследование, 268, 291
переменная-член класса, 269
производный, 268
родительский, 268
свойство, 269
шаблон класса, 314
Ключевые слова, 17
Комментарии, 17
Компилятор, 10
Компиляция проекта, 340
Комплект (Kit), 332
Компоновкщик, 357
Консольное приложение
запуск, 13
создание, 13
Консольный проект, 343
Константа, 21
описание, 21
Конструктор
копирования, 285
Контейнер, 320
Контейнерные классы Qt, 346
Кроссплатформенная программа, 328
Макрос
foreach, 348
Q_PROPERTY, 386
QT_NO_DEBUG_OUTPUT, 344
QT_NO_WARNING_OUTPUT, 344
Манипулятор, 227
endl, 227
Массив, 21, 134
Метаобъект, 372
Метод Гаусса
вычисление обратной матрицы, 207
вычисление определителя, 210
решение систем линейных уравнений,
200
Модальность, 392
Модули Qt
дополнительные (Add-On), 330
основные (Essentials), 329
Наследование
множественное, 296
Настройка
Shadow Build, 342
версии Qt, 333
компилятора, 333
комплектов, 333
очистки проекта, 342
Объект, 266
инкапсуляция, 267
полиморфизм, 268
Объектная иерархия, 377
Операнд, 23
Оператор
delete, 138
new, 138
ввода, 225
вывода, 225
разветвляющийся, 46
составной, 46
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
446
Предметный указатель
условный, 46
цикл с параметром, 67
цикл с постусловием, 66
цикл с предусловием, 64
циклический, 64
Операции, 23
арифметические, 25, 30
бинарные, 23
битовой арифметики, 26
декремента, 26
инкремента, 26
логические, 28
множественного присваивания, 25
отношения, 28
получение адреса, 29
преобразования типа, 29
присваивания, 24, 30
разадресации, 29
составного присваивания, 25
унарные, 23
условная, 28
целочисленной арифметики, 26
Панель
присоединяемая, 393
статуса, 393
Перегрузка операторов, 277
Передача параметров, 104
по адресу, 104
по значению, 104
Переменная, 18
глобальная, 34, 103
значение, 18
имя, 18
локальная, 34, 103
описание, 18
Переменные qmake
CONFIG, 340
DEFINES, 340, 404
DESTDIR, 340
FORMS, 340
HEADERS, 340
INCLUDEPATH, 340
LIBS, 340, 413
PWD, 414
QT, 340
RESOURCES, 340
SOURCES, 339, 340
TARGET, 340
TEMPLATE, 340
Перечисления
QSizePolicy::Policy, 361
Qt::ConnectionType, 364
Подпрограмма, 100
Позднее связывание, 295
Позиция и размер виджета, 354
Политики размера (size policies), 361
Потоки, 229
Программа, 33
структура, 10, 33
Программная платформа, 328
Расширение файла
.pro, 338
Редактор форм, 394
Рекурсия, 121
Ресурсы, 405
Родительский виджет, 354, 377
Свойства, 386
Сигналы, 364, 366, 368
Сигнально-слотовые соединения, 363
автоматические, 368
Слоты, 364, 366, 368
cоздание, 366, 388
События, 380
Создание
Класса формы Qt Designer, 407
нового класса, 355
оконного проекта, 334
проекта с графическим интерфейсом,
357
проектного файла, 338
пустого проекта, 338, 353
файла исходных текстов, 339
Среда программирования Qt Creator, 11
Строка, 22, 240
Строки
ввод, 241
операции, 243
функции, 244
функции обработки, 241
Структура, 22
Структуры, 247
Типы данных, 18
вещественный, 20
логический, 20
основные, 18
символьный, 19
составные, 18
структурированные, 21
целый, 19
Транслятор, 10
Указатель, 22
вычитание, 30
декремент, 30
инкремент, 30
получение адреса, 29
присваивание, 30
разадресация, 29
скрытый, 286
сложение с константой, 30
Утечки памяти, 378
Программирование на языке С++ в среде Qt Creator
Предметный указатель
447
Файл
.ui, 398
make-файл, 340
двоичный, 235
закрыть, 236
запись, 229, 230, 235, 236
открыть, 230, 235
переименование, 236
последовательный доступ, 237
проекта, 338
ресурсов, 405
текстовый, 229
удаление, 236
формы, 336, 393, 398
чтение, 229, 235, 236
Фильтр событий, 382, 385
Флаги
Qt::Alligment, 361
Qt::WindowFlags, 392
Функции, 31
ввод данных, 35
вывод данных, 35
стандартные, 31
Функция, 100
calloc, 137
main, 10
malloc, 137
qCritical, 344
qDebug, 343, 344
qFatal, 344
qWarning, 344
realloc, 138
sqrt(x), 16
возврат результата, 103, 106
вызов, 102
заголовок, 101
механизм передачи параметров, 104
описание, 100
перегрузка имени, 123
прототип, 102
рекурсивная, 121
тело функции, 101
фактические параметры, 104
формальные параметры, 104
шаблон, 125
Цикл обработки событий, 380
Чисто виртуальный метод, 298
Чтение файла с использованием Qt, 350,
351
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
Учебное издание
Серия «Библиотека ALT Linux»
Алексеев Евгений Ростиславович, Григорий Григорьевич Злобин,
Дмитрий Александрович Костюк, Чеснокова Оксана Витальевна,
Чмыхало Александр Сергеевич
Программирование на языке С++ в среде Qt Creator
Оформление обложки: А. С. Осмоловская
Вёрстка: В. Л. Черный
Редактура: В. Л. Черный
Подписано в печать 26.12.14. Формат 70x100/16.
Гарнитура Computer Modern. Печать офсетная. Бумага офсетная.
Усл. печ. л. 23,0. Уч.-изд. л. 29.80. Тираж 999 экз. Заказ.
ООО «Альт Линукс»
Адрес для переписки: 119334, Москва, 5-й Донской проезд, д. 15, стр. 11
Телефон: (495) 662-38-83. E-mail: sales@altlinux.ru
http://altlinux.ru
Do'stlaringiz bilan baham: |