Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
1

Ошибка кодировки при выводе оригинального и отсортированного списка

08.10.2014, 12:03. Показов 2177. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!
Не могу понять, почему трабла с кодировкой? При выводе оригинального и отсортированного списка кракозябры.
Вроде, все верно прописал.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<iostream>
#include<stdlib.h>
#include<string>
#include<locale>
 
using namespace std;
 
struct Student {
    string name;
    int day;
    int month;
    int year;
};
enum Result { Less, greater, Equal };
 
Result checkDate(const Student &first, const Student &second)
{
    if (first.year > second.year) return greater;
    if (first.year < second.year) return Less;
    if (first.month > second.month) return greater;
    if (first.month > second.month) return Less;
    if (first.day > second.day) return greater;
    if (first.day > second.day) return Less;
    return Equal;
}
 
void sortStudents(Student *array, int size)
{
    for (int i = 0; i < size - 1; ++i)
    for (int j = 0; j < size - 1; ++j)
    if (checkDate(array[j], array[j + 1]) == Less)
    {
        Student temp = array[j];
        array[j] = array[j + 1];
        array[j + 1] = temp;
    }
}
 
void getInfo(Student &man)
{
    setlocale(LC_ALL, "Russian");
    cout << "ФИО: ";
    cin.clear();
    cin.ignore();
    getline(cin, man.name);
    cout << "Дата рождения (DD MM YYYY): "; cin >> man.day >> man.month >> man.year;
}
 
void show(Student *students, int size)
{
    setlocale(LC_ALL, "Russian");
    for (int i = 0; i < size; ++i)
        cout << (i + 1) << ". " << students[i].name << " (" << students[i].day << "." << students[i].month << "." << students[i].year << ")" << endl;
}
 
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Russian");
    int size;
    cout << "Введите число студентов: "; cin >> size;
    Student *students = new Student[size];
    for (int i = 0; i < size; ++i) // Вбиваем данные
    {
        cout << "Студент №" << (i + 1) << endl;
        getInfo(students[i]);
    }
    cout << "Оригинальный лист студентов:" << endl;
    show(students, size);
    sortStudents(students, size); // Сортируем студентов
    cout << "Список отсортированных студентов:" << endl;
    show(students, size);
    delete[]students;
    system("pause");
    return 0;
}
Заранее, спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2014, 12:03
Ответы с готовыми решениями:

Ошибка кодировки при выводе на сайт
Помогите устранить следущую ошибку. Я создал базу данных, в бд создал таблицу. В таблице создал 2...

Функции Setup API, ошибка при выводе списка устройств
Вывожу данные о системной информации ПК, список устройств в файл, но компилятор указывает на...

Потеря кодировки при выводе модального окна
Подскажи плз., куда искра уходит. Ситуация следующая: 1. Броузер - Хром 2. Открываю модальное...

Задание кодировки при выводе данных в датагрид
Есть небольшая проблема, при выводе из файла dbf в datagridview русские слова отображаются как...

37
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.10.2014, 12:15 2
Цитата Сообщение от st12345 Посмотреть сообщение
if (first.month > second.month) return greater; if (first.month > second.month) return Less; if (first.day > second.day) return greater; if (first.day > second.day) return Less;
То есть если fisrst - двадцатое января, а second - десятое февраля того же года, то greater, а если те же даты сравнить в обратном порядке, то Equal?
1
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
08.10.2014, 12:18  [ТС] 3
Кстати, у меня тут функция сортировки еще работает по годам только.
Не поможете дополнить ее, пожалуйста?
Нужно, что если года совпадают, то сортировка еще шла по месяцам (по увеличению).
А если и месяцы совпадают, и года, то по дням. (по увеличению).
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.10.2014, 12:24 4
Цитата Сообщение от st12345 Посмотреть сообщение
C++
1
2
if (first.month > second.month) return greater;
if (first.month > second.month) return Less;
Если первая строка сработала, то до второй не дойдём, если не сработала, то условие во второй строке тоже ложно. Зачем она вообще нужна? В этом случае переходим к сравнению дня.
Цитата Сообщение от st12345 Посмотреть сообщение
C++
1
2
if (first.day > second.day) return greater;
if (first.day > second.day) return Less;
.Если первая строка сработала, то до второй не дойдём, если не сработала, то условие во второй строке тоже ложно. Зачем она вообще нужна? В этом случае проваливаемся на последний ретон.
Цитата Сообщение от st12345 Посмотреть сообщение
C++
1
return Equal;
. Получается, что less возвращается только если first относится к более раннему году, чем second, а если к предшествующему месяцу того же года, то ответ определяется днём, если же и день предыдущий, то даты считаются совпадающими.
1
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
08.10.2014, 12:33  [ТС] 5
C++
1
2
3
4
5
6
7
Result checkDate(const Student &first, const Student &second)
{
    if (first.year > second.year) return greater;
    if (first.month > second.month) return greater;
    if (first.day > second.day) return greater;
    return Equal;
}
Сделал так.
Но результат тот же.
Нужно, что если года совпадают, то сортировка еще шла по месяцам (по увеличению).
А если и месяцы совпадают, и года, то по дням. (по увеличению).
А программа все равно сортирует только по годам.

Добавлено через 1 минуту
И с кодировкой тоже проблема. Не выводит оригинальный список и отсортированный на русском. Выходят кракозябры.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
08.10.2014, 12:57 6
Цитата Сообщение от st12345 Посмотреть сообщение
Выходят кракозябры.
Возможно у Вас файл с программой закодирован в UTF-8. Если так, то перекодируйте его в ANSI/windows-1251.

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
Result checkDate(const Student &first, const Student &second)
{
    if (first.year > second.year) return greater;
    else if (first.year < second.year) return Less;
    else if (first.month > second.month) return greater;
    else if (first.month < second.month) return Less;
    else if (first.day > second.day) return greater;
    else if (first.day < second.day) return Less;
    else return Equal;
}
1
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
08.10.2014, 13:02  [ТС] 7
Спасибо за сортировку! Работает.
А вот с кодировкой трабла все равно.
Попробовал пересохранить - все равно тот же результат. И в юникод пробовал. И в кириллицу.
В чем еще может быть проблема?
Компилятор Visual Studio 2013
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
08.10.2014, 13:04 8
st12345, попробуйте оставить setlocale только в main, а в остальных функциях уберите и оставьте кириллическую кодировку.
0
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
08.10.2014, 13:08  [ТС] 9
Kerry_Jr, тоже самое.
Но вот когда в юникод изменял, то там даже вывод таких фраз, как "cout << "Оригинальный лист студентов:" << endl;" был весь в кракозябрах.
А при кириллице выводит в кракозябрах только то, что мы ввели с клавиатуры.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
08.10.2014, 13:20 10
Не знаю, у меня в голове пока только одна идея: заменить <locale> на <windows.h> и в main вместо setlocale прописать
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
0
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
08.10.2014, 13:32  [ТС] 11
Kerry_Jr, тот же результат остался. Только вообще всё в кракозябрах.
И так попробовал:
C++
1
2
    SetConsoleCP(65001);
    SetConsoleOutputCP(65001);
Вообще ничего не выводит.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.10.2014, 14:43 12
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
В свойствах консоли выбрать шрифт: Lucida Console.
1
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
08.10.2014, 15:31  [ТС] 13
Спасибо, помогло!)
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.10.2014, 18:00 14
Цитата Сообщение от st12345 Посмотреть сообщение
Сделал так.
Но результат тот же.
Ну так это только часть ошибок.
1
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
15.10.2014, 10:23  [ТС] 15
А не подскажете, как сделать, чтобы был вывод данных из файла по той же сортировке?
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include<iostream>
#include<stdlib.h>
#include<string>
#include<locale>
 
using namespace std;
 
struct Student {
    string name;
    int day;
    int month;
    int year;
};
enum Result { Less, Big, Equal };
 
Result checkDate(const Student &first, const Student &second)
{
    if (first.year > second.year) return Big;
    if (first.year < second.year) return Less;
    if (first.month > second.month) return Big;
    if (first.month > second.month) return Less;
    if (first.day > second.day) return Big;
    if (first.day > second.day) return Less;
    return Equal;
}
 
void sortStudents(Student *array, int size)
{
    for (int i = 0; i < size - 1; ++i)
    for (int j = 0; j < size - 1; ++j)
    if (checkDate(array[j], array[j + 1]) == Less)
    {
        Student temp = array[j];
        array[j] = array[j + 1];
        array[j + 1] = temp;
    }
}
 
void getInfo(Student &man)
{
    cout << "ФИО: ";
    cin.clear();
    cin.ignore();
    getline(cin, man.name);
    cout << "Дата рождения (DD MM YYYY): "; cin >> man.day >> man.month >> man.year;
}
 
void show(Student *students, int size)
{
    for (int i = 0; i < size; ++i)
        cout << (i + 1) << ". " << students[i].name << " (" << students[i].day << "." << students[i].month << "." << students[i].year << ")" << endl;
}
 
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Russian");
    int size;
    cout << "Введите число студентов: "; cin >> size;
    Student *students = new Student[size];
    for (int i = 0; i < size; ++i) // Вбиваем данные
    {
        cout << "Student " << (i + 1) << endl;
        getInfo(students[i]);
    }
    cout << "Оригинальный лист студентов:" << endl;
    show(students, size);
    sortStudents(students, size); // Сортируем студентов
    cout << "Список отсортированных студентов:" << endl;
    show(students, size);
    delete[]students;
    system("pause");
    return 0;
}
Заранее, спасибо.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.10.2014, 15:25 16
Цитата Сообщение от st12345 Посмотреть сообщение
А не подскажете, как сделать, чтобы был вывод данных из файла по той же сортировке?
А что такое "вывод по сортировке"?

Добавлено через 1 минуту
Цитата Сообщение от st12345 Посмотреть сообщение
cout << "Список отсортированных студентов:" << endl;
Беря с полки книгу, из неё выпал листок.
0
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
15.10.2014, 17:13  [ТС] 17
taras atavin, имелось в виду, чтобы при выводе данных из файла. Ну, чтобы при выводе на экран список студентов сортировался по увеличению.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.10.2014, 17:14 18
А в чём проблема?
0
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 46
15.10.2014, 17:18  [ТС] 19
Не хватает знаний, чтобы реализовать. Вот и прошу помощи. Я начинаю изучать С++ только.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.10.2014, 18:10 20
Ну ты же уже отсортировал.
0
15.10.2014, 18:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2014, 18:10
Помогаю со студенческими работами здесь

Заполнение списка и вывод отсортированного списка на экран
нужно Создать список,значения которого равны значениям массива.Создать список,равный...

При добавлении студента, сбивается вся структура, и при выводе всего списка студентов, выводит какой то мусор
Суть действий: При добавлении студента, сбивается вся структура, и при выводе всего списка...

Программа зависает при выводе однонаправленного списка
создал однонаправленный список. все компилится, но при попытке вывода - прога зависает уже горит,...

IMAP получения отсортированного списка писем
Всем привет. Стоит такая задача. Надо получить ограниченный список (к примеру, не больше 50) и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru