Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Использование компилятора командной строки и текстового редактора Geany
Одним из самых мощных современных кроссплатформенных компиляторов языка C++ является свободно-распространяемый компилятор g++. Для его установки в debian-подобных ОС семейства Linux (Debian, Ubuntu, Mint и их клоны) достаточно выполнить команду терминала apt-get install g++ с правами суперпользователя (администратора) или воспользоваться менеджером пакетов synaptic.
Установка компилятора g++ в ОС семейства Windows несколько сложнее, поэтому рассмотрим этот процесс более подробно.
- На сайте mingw.org переходим в раздел Download (Загрузки), в появившемся окне щёлкаем по ссылке Download mingw-get-setup.exe (рис. A.1). Загружаем установочный файл и запускаем его.
- На первом этапе установки необходимо выбрать команду Install (см. рис. A.2), затем папку для установки (рис. A.3).
- После этого начнётся процесс доустановки инсталлятора (рис. A.4).
- Далее выбираем компиляторы для установки (C++, Fortran, Ada) (рис. A.5) и ждём пока будут скачаны и установлены необходимые компиляторы. После завершения процесса установки компиляторы (в нашем случае компилятор C++) готовы к использованию. Но для вызова их (из командной строки Windows, из текстового редактора Geany) необходимо указывать полное имя файла с компилятором. При установке компилятора C++ в стандартный каталог C:\MinGW — полное имя компилятора C++ будет таким: C:\MinGW\bin\g++. Для того, чтобы каждый раз не писать полное имя компилятора, можно добавить путь C:\MinGW\bin в список путей системной переменной Path.
- Для изменения значения системной переменной Path необходимо в панели управления выбрать Система -> Дополнительные параметры системы -> Дополнительно -> Переменные среды -> Системные переменные -> Path -> Изменить. В открывшемся диалоговом окне добавить путь C:\MinGW\bin\.
После перезагрузки ОС 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). Чтобы исключить автоматическую компоновку программы, следует использовать опцию -c. В этом случае команда будет иметь вид g++ -c name.cpp
Технология работы с компилятором g++ может быть такой: набираем текст программы в стандартном текстовом редакторе, потом в консоли запускаем компилятор, после исправления синтаксических ошибок запускаем исполняемый файл. После каждого изменения текста программы надо сохранить изменения в файле на диске, запустить компилятор, и только после этого запускать программу (исполняемый файл). Очень важно не забывать сохранять текст программы, иначе при запуске компилятора будет компилироваться старая версия текста программы.
Компилятор 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) — функция вычисления определителя.
Для создания библиотеки создадим заголовочный файл slau.h и файл slau.cpp, в который поместим тексты всех трёх функций решения задач линейной алгебры.
Текст файла slau1.h:
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 );
Текст файла slau1.cpp:
#include <math.h> int SLAU( double ** matrica_a, int n, double *massiv_b, double *x ) { int i, j, k, r; double c,M, max, s; double **a, *b; a=new double * [ n ]; for ( i =0; i<n; i++) a [ i ]=new double [ n ]; b=new double [ n ]; for ( i =0; i<n; i++) for ( j =0; j<n; j++) a [ i ] [ j ]=matrica_a [ i ] [ j ]; for ( i =0; i<n; i++) b [ i ]=massiv_b [ i ]; for ( k=0;k<n; k++) { max=fabs ( a [ k ] [ k ] ); r=k; for ( i=k+1; i<n; i++) if ( fabs ( a [ i ] [ k ] )>max) { max=fabs ( a [ i ] [ k ] ); r= i; } for ( j =0; j<n; j++) { c=a [ k ] [ j ]; a [ k ] [ j ]=a [ r ] [ j ]; a [ r ] [ j ]= c; } c=b [ k ]; b [ k ]=b [ r ]; b [ r ]= c; for ( i=k+1; i<n; i++) { for (M=a [ i ] [ k ] / a [ k ] [ k ], j=k; j<n; j++) a [ i ] [ j ]-=M*a [ k ] [ j ]; b [ i ]-=M*b [ k ]; } } if ( a [ n -1 ] [ n-1]==0) if ( b [ n-1]==0) return -1; else return -2; else { for ( i=n-1; i >=0; i --) { for ( s =0, j= i +1; j<n; j++) s+=a [ i ] [ j ] * x [ j ]; x [ i ]=( b [ i ]- s ) / a [ i ] [ i ]; } return 0; } } int INVERSE( double **a, int n, double **y ) { int i, j, res; double *b, *x; b=new double [ n ]; x=new double [ n ]; for ( i =0; i<n; i++) { for ( j =0; j<n; j++) if ( j==i ) b [ j ]= 1; else b [ j ]= 0; res=SLAU( a, n, b, x ); if ( res !=0) break; else for ( j =0; j<n; j++) y [ j ] [ i ]=x [ j ]; } if ( res !=0) return -1; else return 0; } double determinant ( double ** matrica_a, int n ) { int i, j, k, r; double c,M, max, s, det =1; double **a; a=new double * [ n ]; for ( i =0; i<n; i++) a [ i ]=new double [ n ]; for ( i =0; i<n; i++) for ( j =0; j<n; j++) a [ i ] [ j ]=matrica_a [ i ] [ j ]; for ( k=0;k<n; k++) { max=fabs ( a [ k ] [ k ] ); r=k; for ( i=k+1; i<n; i++) if ( fabs ( a [ i ] [ k ] )>max) { max=fabs ( a [ i ] [ k ] ); r= i; } if ( r !=k ) det=_det; for ( j =0; j<n; j++) { c=a [ k ] [ j ]; a [ k ] [ j ]=a [ r ] [ j ]; a [ r ] [ j ]= c; } for ( i=k+1; i<n; i++) for (M=a [ i ] [ k ] / a [ k ] [ k ], j=k; j<n; j++) a [ i ] [ j ]_=M_a [ k ] [ j ]; } for ( i =0; i<n; i++) det*=a [ i ] [ i ]; return det; for ( i =0; i<n; i++) delete [ ] a [ i ]; delete [ ] a; }
В качестве тестовой задачи напишем главную функцию, которая предназначена для решения системы линейных алгебраических уравнений.
#include <iostream> #include <math.h> //Подключение личной библиотеки slau #include " slau1 .h " using namespace std; int main ( ) { int result, i, j,N; double **a, *b, *x; //Ввод размерности системы. cout<<" N = "; cin>>N; //Выделение памяти для матрицы правых частей и вектора свободных членов. a=new double * [N ]; for ( i =0; i<N; i++) a [ i ]=new double [N ]; b=new double [N ]; x=new double [N ]; //Ввод матрицы правых частей и вектора свободных членов . cout<<" Input Matrix A "<<endl; for ( i =0; i<N; i++) for ( j =0; j<N; j++) cin>>a [ i ] [ j ]; cout<<" Input massiv B "<<endl; for ( i =0; i<N; i++) cin>>b [ i ]; //Вызов функции решения СЛАУ методом Гаусса из библиотеки slau.h result=SLAU( a,N, b, x ); if ( result ==0) { //Вывод массива решения. cout<<" MassivX "<<endl; for ( i =0; i<N; i++) cout<<x [ i ]<<" \t "; cout<<endl; } else if ( result ==-1) cout<<"Бесконечное множество решений\n "; else if ( result ==-2) cout<<"Нет решений\n "; }
Теперь необходимо из этих текстов создать работающее приложение. Рассмотрим это поэтапно.
- Компиляция библиотеки slau1.h с помощью команды g++ -c slau1.cpp.
- Компиляция главной функции main.cpp с помощью команды g++ -c main.cpp.
- Создание исполняемого файла с именем primer из двух откомпилированных файлов main.o и slau1.o с помощью команды g++ main.o slau1.o -o primer.
- Запуск исполняемого файла.
После разработки библиотеки линейной алгебры (пример) slau1, можно использовать её в различных программах при вычислении определителя, обратной матрицы и решения систем линейных алгебраических уравнений.
При разработке программ с большим количеством вычислений, компилятор 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.
- Необходимо создать шаблон приложения на C/C++ (или другом языке программирования) с помощью команды Файл -> Создать из шаблона -> main.cxx. После чего необходимо ввести текст программы и сохранить его.
- Для компиляции и запуска программы на выполнение служит пункт меню Сборка. Для компиляции программы следует использовать команду Сборка -> Скомпилировать (F8). В этом случае будет построен объектный код программы (файл с расширением .o или .obj). Для создания исполняемого кода программы служит команда Сборка -> Собрать (Shift+F9). Для запуска программы следует выполнить команду Сборка -> Выполнить (F5).
Параметры компилятора определяются автоматически после выбора шаблона (Файл -> Создать из шаблона). Однако команды компиляции и сборки по умолчанию можно изменить, используя команду Сборка -> Установить параметры сборки (см. рис. A.7). Здесь %f — имя компилируемого файла, %e — имя файла без расширения.