Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
98 / 34 / 10
Регистрация: 24.04.2012
Сообщений: 151

Непонятно работает функция - член класса

16.08.2012, 15:07. Показов 1148. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача создать телефонный справочник с использованием бинарного дерева. Проблема возникает при попытке найти абонента по имени. Создал функцию-члент для поиска Tree::Surch_name. Внутри неё для перебора всех элементов используется функция Tree::Surch_Tree_Name в которую передаю указатель на корень, имя которое неоходимо найти и указатель - cash на элемент если он найден. Внутри функции Tree::Surch_Tree_Name указателю - cash присваивается адрес найденого элемента но как только работа функции заканчивается он снова становится нулевым. Интересно в чём дело?
файл С++
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
# include<iostream>
# include "tree.h"
# include <ctime>
using namespace std;
 
int main(void)
{
    srand(time(NULL));
    char* sarch_name = new char[20];
 
    Tree A;
    A.Create_unit("Ivanoff", rand()%1000000);
    A.Create_unit("Petrof", rand()%1000000);
    A.Create_unit("Sidorov", rand()%1000000);
    A.Create_unit("Smirnof", rand()%1000000);
    A.Create_unit("Pupkin", rand()%1000000);
    A.Create_unit("Verjovkin", rand()%1000000);
    A.Create_unit("Kozlov", rand()%1000000);
    A.Create_unit("Berlioz", rand()%1000000);
    A.Create_unit("Pushkin", rand()%1000000);
    A.Show_all();
    int key = 100;
    do
    {
        cout<<"\t\tMenu:\n";
        cout<<"\t Poisk po abonentu - 1;\n"<<"\t Poisk po nomeru - 2;"<<endl;
        cout<<"\t Zakonchit robotu - 0;\n";
        cin>> key;
        switch (key)
        {
            case 1:
                    cout<<"\tVvedite abonenta - ";
                    cin>>sarch_name;
                    A.Surch_name(sarch_name);
                    break;
            case 2:
                    int number;
                    cout<<"\tVvedite nomer telefona - ";
                    cin>>number;
                    A.Surch_num_fon(number);
                    break;
        }
    }
    while(key);
    return 0;
}
Библиотечный файл
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# define SIZE 8
# include <string.h>
# include<iostream>
 
using namespace std;
struct unit
{
    char* name;
    int fon_number;
    unit * left, * right, * parent;
};
class Tree
{
public: 
    unit * root;
    Tree();
    void Create_unit( char* name, int number);
    void Show_unit(unit* root);
    void Show_all();
    void Show_all_unit(unit* root);
    void Surch_num_fon(int number);
    void Surch_name(char* sarch_name);
    void Surch_Tree_Name( unit* temp, char* sarch_name, unit* cash);
 
    void Delete_all(unit* root);
    ~Tree();
};
Tree::Tree()
{
    root = NULL;
}
void Tree::Create_unit( char* name, int number)
{   
    unit* temp = new unit;
    temp->left=NULL;
    temp->right=NULL;
    int len = strlen(name) + 1;
    temp->name = new char[len];
    strcpy(temp->name , name);
    temp->fon_number = number;
    
    //Начинаем мискать место для вставки в дерево
    unit* temp1 = NULL;
    unit* temp2 = root;
 
    while(temp2 !=0)
    {
        temp1 = temp2;
        if((temp2->fon_number>temp->fon_number)) 
        temp2 = temp2->left;
        else temp2 = temp2->right;
    }
    temp->parent = temp1;
    if(temp->parent==0) root = temp;
    else 
    {
        if(temp1->fon_number > temp->fon_number)
            temp1->left = temp;
        else 
            temp1->right = temp;
    }
}
void Tree::Show_unit(unit* temp)
{
        cout<<"Name - "<<temp->name<<endl;
        cout<<"Nomber - "<<temp->fon_number;
        cout<<endl;
}
void Tree::Show_all()
{
    unit* temp = root; 
    Show_all_unit( temp);
    
}
void Tree::Show_all_unit(unit* temp)
{
    if(temp!=0)
    {   
        cout<<"\n\tName - "<<temp->name<<endl;;
        cout<<"\tNomber - "<<temp->fon_number<<endl;
        Show_all_unit(temp->right);
        Show_all_unit(temp->left);
    }
}
void Tree::Surch_num_fon(int number)
{
    unit* temp = root;
    int i=0;
    while(temp)
    {
        if (temp->fon_number==number)
        {
            Show_unit(temp); 
            i++;
            temp = 0;
        }
        else
        {
            if (temp->fon_number>number) 
                temp=temp->left;
            else if(temp->fon_number<number) 
                temp=temp->right;
        }
    }
    if(!i) cout<<"Takogo abonenta net!"<<endl;
}
void Tree::Surch_name(char* sarch_name)//Функция поиска
{
    unit* temp = root; 
    unit* cash = NULL;
    Surch_Tree_Name(temp, sarch_name, cash);
    //в этом месте cash снова становиться нулевым
    if(cash) Show_unit(cash);
    else cout<<"\tAbonent ne najden.\n";
}
void Tree::Surch_Tree_Name( unit* temp, char* sarch_name, unit* cash)//функция создана отдельно для возможности её вызова рекурсивно
{
    if(temp)
    {
        if (strcmp( temp->name,  sarch_name)==0) cash = temp;
        Surch_Tree_Name(temp->left,  sarch_name, cash);
        Surch_Tree_Name(temp->right,  sarch_name, cash);
    }
}
void Tree::Delete_all(unit* root)
{
 
}
Tree::~Tree()
{
    Delete_all(root);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.08.2012, 15:07
Ответы с готовыми решениями:

Член-функция класса не работает
Доброго вечера! Только что написал вот такой несложный класс, который определяет две характеристики предмета (вес и стоимость)....

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса?
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...

1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.08.2012, 15:36
Alexxx7, Передавать либо указатель на указатель cash либо ссылку на указатель cash.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2012, 15:36
Помогаю со студенческими работами здесь

Не функция-член класса
Фрагмент из книги, об дружественной функции operator&lt;&lt;: &quot;Обратите внимание, что она не является функцией-членом класса String&quot;. Из...

Функция-член шаблонного класса
Как правильно объявить функцию-член шаблонного класса? Класс: template &lt;class SType&gt; class Set { int len; // число...

Не срабатывает функция-член класса
Есть следующий код: #include &quot;stdafx.h&quot; #include &lt;Windows.h&gt; #include &quot;std_lib_facilities.h&quot; class Name_pairs { ...

Функция-член Ошибка класса
Непонятная ошибка связанная с функцией-членом. Я в панике + почему-то не могу внести хедер с include ввожу #include &quot;header.h&quot; ...

Функция-друг одно класса, член другого.
Привет. Не поможете как сделать чтобы функция одного класса была функцией-другом другого класса? я сделал так: Класс snake: ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru