Кириллица в CLion

196
17 февраля 2019, 01:20

Написал небольшое приложение

#include "iostream"
#include <iomanip>
#include <cstdlib>
#include <sstream>
#include <string>
using namespace std;
int times = 0, start = 0, answ = 0;
template <typename T>
T fromString(const string& s)
{
    istringstream iss(s);
    T res;
    iss >> res;
    return res;
}
int InpInt(string s1)
{
    int i = 0, resultat;
    if (s1[0] == '-')
    {
        i++;
    }
    while (s1[i])
    {
        if ('0' <= s1[i] && s1[i] <= '9')
        {
            resultat = fromString<int>(s1);//перевод строки символов в int
        }
        else
        {
            resultat = 0;
            goto end;
        }
        i++;
    }
    end:
    return resultat;
}
int correctionInp(string s, int num_err)
{
    const string positiv_otv = "Нет", negative_otv = "Нет";
    string otv_user, inp_n, inp_el;
    int resultat;
    if (num_err == 1)
        cout << "Вы ошиблись при вводе значения переменной n" << endl;
    else
        cout << "Вы ошиблись при вводе значения элемента массива" << endl;
    cout << "Вы хотите ввести корректное значение?" << endl;
    cout << "Если Вы хотите изменить значение на корректное введите Да" << endl;
    cout << "Иначе, введите Нет" << endl;
    cout << "Ваш ответ: ";
    cin >> otv_user;
    if (otv_user == "Да")
    {
        if (num_err == 1)
        {
            cout << "Введите колчество строк и столбцов двумерного массива n. n > 0. n = " << endl;
            cin >> inp_n;
            resultat = InpInt(inp_n);
        }
        else
            cout << "Введите элемент массива" << endl;
        cin >> inp_el;
        resultat = InpInt(inp_el);
    }
    else
    {
        cout << "Вы точно хотите завершить программу?" << endl;
        cout << "Для завершения программы введите Да" << endl;
        if (num_err == 1)
        {
            cout << "Для изменения значения n введите Нет " << endl;
            cout << "Ваш ответ: ";
            cin >> otv_user;
        }
        else
        {
            cout << "Для изменеиня значения массива введите Нет ";
            cout << "Ваш ответ: ";
            cin >> otv_user;
        }
        if (otv_user == "Нет")
        {
            if (num_err == 1)
            {
                cout << "Введите колчество строк и столбцов двумерного массива n. n > 0. n = ";
                cin >> inp_n;
                resultat = InpInt(inp_n);
            }
            else
            {
                cout << "Введите значения элемента массива = ";
                cin >> inp_el;
                resultat = InpInt(inp_el);
                if ((inp_el != "0") && (resultat == 0))
                    resultat = -12345;
            }
        }
        else
            resultat = 0;
    }
    return resultat;
}
int search_min(int **A, int n) {
    int min = A[0][0];
    long start_time, end_time;
    start_time = clock();
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (min > A[i][j])
                min = A[i][j];
        }
    end_time = clock();
    times = end_time - start_time;
    return min;
}
int search_max(int **A, int n) {
    int max = A[0][0];
    long start_time = clock();
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (max < A[i][j])
                max = A[i][j];
        }
    long end_time = clock();
    times = end_time - start_time;
    return max;
}
int search_parallel_min(int **A, int n, int stream) {
    int min;
#pragma omp parallel for num_threads(stream)
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (min < A[i][j])
                min = A[i][j];
        }
    return min;
}
int search_parallel_max(int **A, int n, int stream) {
    int max;
#pragma omp parallel for num_threads(stream)
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (max < A[i][j])
                max = A[i][j];
        }
    times = clock();
    return max;
}
int main()
{
    string inp_el, inp_n;
    int n = 8, m, k = 0, num_err = 0, min, max;
    system("chcp 65001");
    //cout << "Здравствуйте, уважаемый Пользователь!" << endl;
    //cout << "Введите количество строк и столбцов двумерного массива n. n > 0. n = ";
    //cin >> inp_n;

    /*
    n = InpInt(inp_n);
    if ((n == 0) || (n < 0))
    {
        num_err = 1;
        n = correctionInp(inp_n, num_err);
        if (n == 0)
        {
            goto close;
        }
    }
    close:
    */
    int **A = new int *[n];
    for (int j = 0; j < n; j++)
        A[j] = new int[n];
    if (n <= 5)
    {
        cout << "Введите элементы массива = ";
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
            {
                cin >> inp_el;
                A[i][j] = InpInt(inp_el);
                if (((A[i][j] == 0) && (inp_el != "0")) || ((A[i][j] == 0) && (inp_el != "-0")) || ((A[i][j] == 0) && (inp_el != "+0")))
                {
                    num_err = 2;
                    A[i][j] = correctionInp(inp_n, num_err);
                }
            }
    }
    else
    {
        cout << "Массив будет введен с помощью генератора случайных чисел" << endl;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                A[i][j] = rand();
    }
    cout << "Вывод массива А" << endl;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
        {
            if (n > 15) {
                if (i == 9) {
                    cout << "..... " << "..... " << "..... " << "..... " << "..... " << "..... " << "..... " << "..... " << "..... " << "..... " << "..... " << "..... " << endl;
                    i = n - 2;
                    break;
                }
                cout << setw(5) << A[i][j] << " ";
                if (j == n - 1)
                    cout << endl;
                if (j == 9) {
                    cout << "..... " << setw(5) << A[i][n - 1] << endl;
                    break;
                }
            }
            else {
                cout << setw(5) << A[i][j] << " ";
                if (j == n - 1)
                    cout << endl;
            }
        }
    start = clock();
    min = search_min(A, n);
    max = search_max(A, n);
    answ = clock();
    //min = search_parallel_min(A, n, n);
    //max = search_parallel_max(A, n, n);
    times = answ - start;
    cout << min << endl;
    cout << max << endl;
    cout << times << endl;
    system("pause");
    return 0;
}

Для отображения в консоли кириллицы использовал system("chcp 65001"); При запуске программа не выдала вообще ничего. Просто попросила нажать на любую кнопку, чтобы завершить работу.

А если не использовать переключение на кириллицу, то иероглифами, но программа будет выполняться Можете подсказать из-за чего такое происходит?

Answer 1

CLion тут ни при чём. Измените кодировки исходников и консоли на UTF-8 (или на нужную вам кодировку, поддерживающую русский язык, главное - чтобы она была одна везде, но лучше - UTF-8).

p.s.: не используйте system, используйте <locale>

p.p.s.: тем более это уже спрашивали много раз Отображение кириллицы в CLion

Answer 2

Вначале метода main допишите:

setlocale(LC_ALL, "ru_RU.UTF-8");
READ ALSO
Как подставить в FindFirstFile букву? [закрыт]

Как подставить в FindFirstFile букву? [закрыт]

В примере указано что диск С но нужно менять в индивидуальном порядке как можно это сделать чтоб указывало?

193
Как хранятся структуры в памяти?

Как хранятся структуры в памяти?

Прочитал, что поля структуры хранятся в памяти последовательно(в порядке объявления) (+- платформзависимое выравнивание)

187
Функция gets_s не работает

Функция gets_s не работает

Перемещение функции gets_s из тела функции main в тело функции INPUT приводит к ошибке"Отсутствуют экземпляры перегруженная функция 'gets_s' соответствующие...

1209
Задача с покупкой продуктов

Задача с покупкой продуктов

Падает задача выдавая Runtime errorПри этом на тестовом примере работает правильно

170