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

Сравнение двух переменных типа string

08.01.2018, 18:12. Показов 1424. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я решаю одну задачу, в ней нужно сделать бинарное дерево поиска, но суть не в это. При поиске по параметрам типа string результат совсем не тот, что нужен, я, конечно, могу пойти по пути извращения и убрать это неординаным способом, но хочется понять в чём конкретно проблема. Вот код:
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using namespace std;
 
struct Node //Звено дерева (инв.номер, название, автор, издательство, год, номер стелажа)
{
    int x; //Инв.номер
    string name;//Название
    string author;//Автор
    string pub;//Издательство
    int year;//Год
    int number_st;//Номер стелажа
 
    Node *l, *r; //Указатели на новые звенья
};
 
 
void menu(Node *&tree);
 
int main()
{
    int i = 0;
    setlocale(0, "");
    Node *Tree = NULL;  //Создаю указатель, тип которого = звено дерева и инициализирую его пустотой
    int num;
    string name;//Название
    string author;//Автор
    string pub;//Издательство
    int year;//Год
    int number_st;//Номер стелажа
    ifstream file("C:\\Users\\Admin\\Desktop\\тест.txt");
 
    while (file >> num >> name >> author >> pub >> year >> number_st)
    {
        add_node(num, name, author, pub, year, number_st, Tree);
    }
    
    menu(Tree); //Вывод на экран дерева. или просто обход дерева
 
    return 0;
}
 
void show(Node *& Tree)
{
        cout << Tree->x << ' ';
        cout << Tree->name << ' ';
        cout << Tree->author << ' ';
        cout << Tree->pub << ' ';
        cout << Tree->year << ' ';
        cout << Tree->number_st<<endl;
}
void SearchByAuthor(string author, Node *&Tree)
{
    if (Tree != NULL) //Пока не встретится пустое звено
    {
        allshow(Tree->l); //Рекурсивная функция для вывода левого поддерева
        if(Tree->author==author)
            show(Tree);
        allshow(Tree->r); //Рекурсивная функция для вывода правого поддерева
    }
}
void menu(Node *&tree)
{
    int option;
    string buf;
    cout << "Введите номер опции" << endl;
    cout << "1)Поиск по инвентарному номеру" << endl;
    cout << "2)Выдача всего списка" << endl;
    cout << "3)Поиск по автору" << endl;
    cout << "4)Поиск по названию" << endl;
    cout << "5)Удаление информации о книге по инвентарноу номеру" << endl;
    //  cout << "6)Поиск по инвентарному номеру" << endl;
    cin >> option;
    switch (option)
    {
        case 1:
            int i;
            cout << "Введите инв.номер: ";
            cin >> i;
            SearchByNumber(i, tree);
            break;
        case 2:
            allshow(tree);
            break;
        case 3:
            cout << "Введите имя автора: ";
            cin >> buf;
            SearchByAuthor(buf, tree);
            break;
        case 4:
            cout << "Введите название книги: ";
            cin >> buf;
            SearchByName(buf, tree);
            break;
        case 5:
            cout << "функция не готова" << endl;
            break;
    }
    cout << "Вернуться к меню(1) или выйти из программы(2)?  ";
    cin >> option;
    switch (option)
    {
    case 1:
        menu(tree);
        break;
    case 2:
        break;
    default:
        cout << "Ответ не коректный, попробуйте ещё раз" << endl;
        cout << "Вернуться к меню(1) или выйти из программы(2)?  ";
    }
}
//Думаю этого фрагмента хватит, там 230 строк
P.s. При поиске по автору выводится всё древо, кроме предшествующего пункта
Следуя из этого можно поменять условие на
C++
1
if(Tree->author!=author)
и буфарить указатель, но по мне это извращение.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2018, 18:12
Ответы с готовыми решениями:

Ищу прогрмму или функию для проверки идентичности двух переменных типа string
Всем привет, кто-нибудь может скинуть ссылку на прогу или есть функция такая для проверки...

Сравнение переменных структурного типа
Всем доброго времени суток, объяснить пожалуйста, как можно сравнить переменную типа структуры с...

Сравнение переменных типа стринг
Помогите разобраться что не так в программе. Сама программа большая, работает хорошо, но непонятный...

Сравнение нескольких переменных типа стринг
Есть код, в котором нужно сравнивать 3 временных промежутка, и по результатом сравнения выводит,...

19
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
08.01.2018, 18:54 2
Сформулируй яснее. Что делает allshow() и что ты хочешь получить?
0
392 / 262 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
08.01.2018, 19:01 3
а в чем проблема-то?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
08.01.2018, 22:53  [ТС] 4
проблема с выводом, allshow() выводит все записи, в этом проблем нет. Проблемы с поиском, а точнее с поиском по автору.

Добавлено через 2 минуты
Она выводит все записи, кроме записей, предшествующих тем, которые удовлетворяют поиску.
Я не понимаю как это может вообще происходить.
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
08.01.2018, 23:37 5
Если нужен вывод одной, зачем ты всё выводишь?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 11:32  [ТС] 6
nmcf, ты реально не понимаешь? Взгляни на функцию menu. В ней есть выбор между выводом, поиском по разным параметрам и удалением записи. А поиск по параметрам типа string работает не правильно.
Цитата Сообщение от IlyaKr Посмотреть сообщение
Она выводит все записи, кроме записей, предшествующих тем, которые удовлетворяют поиску.
Я не понимаю как это может вообще происходить.
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
09.01.2018, 11:42 7
Нет, это реально плохо объясняешь. SearchByAuthor() не рекурсивная, а что там в allshow() происходит, не видно.
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 11:45  [ТС] 8
я это заметил щас, я запись код бекапил, потом код посеял, а в бэкапе была недороботка, щас я поправил, но проблема осталась, теперь поиск вообще ничего не выводит.

Добавлено через 42 секунды
C++
1
2
3
4
5
6
7
8
9
10
11
12
void SearchByAuthor(string author, Node *&Tree)
{
    if (Tree != NULL) //Пока не встретится пустое звено
    {
        SearchByAuthor(author, Tree->l); //Рекурсивная функция для вывода левого поддерева
        if (Tree->author == author)
        {
            show(Tree);
        }
        SearchByAuthor(author, Tree->r); //Рекурсивная функции для вывода правого поддерева
    }
}
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
09.01.2018, 11:49 9
У тебя дерево-то правильно построено? На английских именах проверяешь?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 11:53  [ТС] 10
на русских, у меня локализация стоит. Думаешь в этом проблема?

Добавлено через 1 минуту
поиск по числовым значениям работает хорошо, по крайней мере по ключу.
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
09.01.2018, 11:55 11
Английские имена пробуй. Не вижу у тебя никакой локализации.
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 11:56  [ТС] 12
по умолчанию setlocale(0, "")
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
09.01.2018, 11:59 13
Это ничего не даёт. Или английские, или задай имя для поиска в самой программе на время отладки.
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 12:17  [ТС] 14
ясно, ввод у меня не так идёт, надо сменить на
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Добавлено через 28 секунд
английские проходят хорошо

Добавлено через 3 минуты
что-то тут не так, я прогуглил этот код, он должен был заметить setlocale, но вывод идёт не правильный

Добавлено через 5 минут
как весь этот ввод и вывод оформить? У меня отладчик сам сразу после выхода не дохнет, проверить их сочетание сейчас я не могу, приходится либо играть в мафию, либо ждать.

Добавлено через 3 минуты
*ошибка компиляции 1168

Добавлено через 2 минуты
Бесполезно, думаю параметр не тот. Кто знает как вывод наладить?
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
09.01.2018, 12:21 15
Ты setlocale() убрал? Шрифт сменил?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 12:27  [ТС] 16
и убрал, и обратно поставил вместе с этим всем, всё ровно ничего.
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
09.01.2018, 14:14 17
Показывай.
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 14:35  [ТС] 18
вот скрины
Миниатюры
Сравнение двух переменных типа string   Сравнение двух переменных типа string  
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 95
09.01.2018, 14:39  [ТС] 19
без setlocale идут кракозябры, даже с #define.

Добавлено через 2 минуты
если вместе с setlocale обычные функции
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
то всё ровно кракозябры, и при этом setlocale закрывается этим всем и вывод далеко не на русском.
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
10.01.2018, 09:13 20
Цитата Сообщение от IlyaKr Посмотреть сообщение
если вместе с setlocale обычные функции
Шрифт при этом изменён?
0
10.01.2018, 09:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2018, 09:13
Помогаю со студенческими работами здесь

Проверка значений переменных типа string
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main() {...

Сравнение двух string
Почему код не работает? #include&lt;iostream&gt; using namespace std; struct test { string name;...

Сравнение двух string
Вот написала функцию для сравнения двух string (а именно численно) но нужно чтоб возвращала функцию...

Сравнение двух строк string
Добрый день. Никак не пойму почему не хочет работать такой способ сравнения двух string строк,...


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

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