Форум программистов, компьютерный форум CyberForum.ru

Указатели - C++

Восстановить пароль Регистрация
 
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
19.03.2013, 11:18     Указатели #1
Вот в чем проблема, пишу код по хешированию вот что есть:
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
#include<clocale>
#include<stdio.h>
#include<conio.h>
#include <iostream>
#include <fstream>
using namespace std;
 
const int N=256;
 
struct HashTable
{
    char *arr[256];
    HashTable()
    {
        for(int i=0;i<N;i++)
        {
            arr[i]="a";
        }
    }
    int HashKey(char *str)
    {
        unsigned char amount=0;
        while(*str)
        {
            amount +=*str;
            *str++;
        }
        amount*=amount;
        amount=amount%256;
        return amount;
    }
    bool Add(char *str)
    {
        int i;
        i=HashKey(str);
        while(i!=N)
        {
            if(arr[i]=="a")
            {
                arr[i]=str;
                return true;
            }
            else
            {
                i=(i+1)%N;
            }
        }
        return false;
    }
    void PrintHash()
    {
        for(int i=0;i<N;i++)
        {
            if(arr[i]!="a")
            {
                cout << i << ": ";
                cout << arr[i]<<"\n";
            }
        }
    }
};
 
int main()
{
    setlocale( LC_ALL, "rus" );
    //ifstream in("input.txt");
    FILE *in;
    in=fopen("input.txt", "r");
    HashTable table;
    char str[100];
    //str=new char[100];
    while(!feof(in))
    {
        fscanf(in,"%s",&str);
        if(!table.Add(str))
        {
            printf("Хеш-таблица заполнина!!!");
            break;
        }
    }
    /*while(!in.eof())
    {
        in>>str;
        //strcpy(str,str);
        if(!table.Add(*str))
        {
            printf("Хеш-таблица заполнина!!!");
            break;
        }
    }*/
    table.PrintHash();
    getch();
    return 0;
}
Проблема заключается в том, что ключи считает правильно, записывает в массив слова правильно(по ключу), но вот на экран за место всех прочитанных и записанных в массив слов, выводит на всех позициях последнее прочитанное слово, как это исправить?...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2013, 11:18     Указатели
Посмотрите здесь:

C++ Указатели
Указатели.... C++
C++ Указатели
Указатели C++
Указатели. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.03.2013, 11:45     Указатели #2
Цитата Сообщение от Apelsin199 Посмотреть сообщение
if(arr[i]!="a")
это вообще что такое???
Вот за что ещё я люблю Си,
так это за то, что он всегда напоминает тебе, чтострока это не какая-то абстрактная переменная, а массив символов.
Что, на массивы по-твоему оператор "не равно" распространяется?
(распространяется, конечно, но не так как ты думаешь)
А strcmp для кого придумали, если по-твоему можно просто != поставить.
Выходит нельзя? - Верно! вот и используй strcmp в условии.
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
19.03.2013, 11:55  [ТС]     Указатели #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это вообще что такое???
Это я изначально все ячейки массива задаю буквой "а", затем, чтобы обозначить ячейку пустой. к примеры, были бы у меня цифры, я бы поставил вместо "а", ну к примеру NULL.

Добавлено через 1 минуту
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это вообще что такое???
Сори... немного не то, if(arr[i]!="a") этим я проверяю на пустоту ячейку, если встречается буква "а", значит ячейка пустая.

Добавлено через 3 минуты
Вот, доделал код, единственное что осталось, это проблема, это то, что все слова в массиве перезаписываются на последнее прочитанное...
К примеру, считалось слово "стол", нашелся хеш ключ, к примеру 121, и на место 121 записался "стол", потом читаю слово "рука", считается хеш ключ, к примеру 130, на место 130 пишется "рука", но и в этот же момент на месте 121, стол" перезаписывается на "рука", и т.д. .....
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
133
134
135
136
#include<clocale>
#include<stdio.h>
#include<conio.h>
#include <iostream>
#include <fstream>
using namespace std;
 
const int N=256;
 
struct HashTable
{
    char *arr[256];
    HashTable()
    {
        for(int i=0;i<N;i++)
        {
            arr[i]="a";
        }
    }
    int HashKey(char *str)
    {
        unsigned char amount=0;
        while(*str)
        {
            amount +=*str;
            *str++;
        }
        amount*=amount;
        amount=amount%256;
        return amount;
    }
    bool Add(char *str)
    {
        int i;
        i=HashKey(str);
        while(i!=N)
        {
            if(arr[i]=="a")
            {
                arr[i]=str;
                return true;
            }
            else
            {
                i=(i+1)%N;
            }
        }
        return false;
    }
    void PrintHash()
    {
        for(int i=0;i<N;i++)
        {
            if(arr[i]!="a")
            {
                cout << i << ": ";
                cout << arr[i]<<"\n";
            }
        }
    }
    bool search(char *str)
    {
        int i;
        i=HashKey(str);
        while(i!=N && arr[i]!="a")
        {
            if(strcmp(arr[i],str)==0)
            {
                return true;
            }
            else
                i=(i+1)%N;
        }
        return false;
    }
    bool Delete(char *str)
    {
        int i;
        i=HashKey(str);
        while(arr[i]!="a")
        {
            if(arr[i]==str)
            {
                arr[i]="a";
                return true;
            }
            i=(i+1)%N;
        }
        return false;
    }
};
 
int main()
{
    setlocale( LC_ALL, "rus" );
    FILE *in;
    in=fopen("input.txt", "r");
    HashTable table;
    char str[100];
    char buf[100];
    while(!feof(in))
    {
        fscanf(in,"%s",&str);
        if(!table.Add(str))
        {
            printf("Хеш-таблица заполнина!!!");
            break;
        }
    }
    table.PrintHash();
    printf("\n\n------------------------------------------------\n\n");
    printf("Поиск в хеш таблице\nвведите слово:");
    scanf("%s",&buf);
    if(table.search(buf))
    {
        printf("\nСлово %s находится в таблице", buf);
    }
    else
    {
        printf("\nСлово не находится в таблице!!!");
    }
    printf("\n\n------------------------------------------------\n\n");
    printf("Удаления слова из таблици\nВведите слово");
    scanf("%s",buf);
    if(table.Delete(buf))
    {
        printf("\nСлово удаленое из таблице!!!\nВот что осталось:\n");
        table.PrintHash();
    }
    else
    {
        printf("Слово %s не удалено",buf);
    }
    getch();
    return 0;
}
Добавлено через 3 минуты
Мне через час в институт идти, никто не поможет?....
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.03.2013, 11:59     Указатели #4
ну так во всех местах заменяй на strcmp, где у тебя !="a" стоит
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
19.03.2013, 12:01     Указатели #5
На самом деле все элементы массива arr будут указывать на str, а в конце программы, естественно, в str будет находиться последнее прочитанное слово. Решение проблемы: каждый раз выделять под str новую память.
C++
1
2
3
4
5
6
7
8
9
10
while(!feof(in))
    {
        str = new char[100];
        fscanf(in,"%s",&str);
        if(!table.Add(str))
        {
            printf("Хеш-таблица заполнина!!!");
            break;
        }
    }
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
19.03.2013, 12:01  [ТС]     Указатели #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну так во всех местах заменяй на strcmp, где у тебя !="a" стоит
Не понял...
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
19.03.2013, 12:02     Указатели #7
Apelsin199, "a" - это на самом деле строковый литерал, который возвращает указатель на его первый элемент (const char*), поэтому у вас идет сравнение не букв, а адресов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2013, 12:07     Указатели
Еще ссылки по теме:

C++ Указатели
C++ Указатели
C++ Указатели

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

Или воспользуйтесь поиском по форуму:
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
19.03.2013, 12:07  [ТС]     Указатели #8
Цитата Сообщение от fjay69 Посмотреть сообщение
На самом деле все элементы массива arr будут указывать на str, а в конце программы, естественно, в str будет находиться последнее прочитанное слово. Решение проблемы: каждый раз выделять под str новую память.
Все работает, большое большое спасибо =)
Yandex
Объявления
19.03.2013, 12:07     Указатели
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru