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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
#1

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

19.03.2013, 11:18. Просмотров 275. Ответов 7
Метки нет (Все метки)

Вот в чем проблема, пишу код по хешированию вот что есть:
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++
Объясните что происходит в последней строке , и если мои комменты не правильны поправьте пожалуйста. void order ( int* numb1, int*...

Указатели.... - C++
Найти наибольшее отрицательное число с четными индексами. (Создать указатель на наиболее отрицательное число среди элементов с четными...

Указатели - C++
Используя вместо самой переменной указатель на нее, написать программу в соответствии с заданием (выполнение задания оформить...

Указатели - C++
Всем привет. Нам дали сделать лабу: Дана целочисленная прямоугольная матрица. 1) Определить номер первого из столбцов, содержащих хотя...

Указатели - C++
Есть задание,я сделала через массив,а мне нужно переделать через указатели. #include &lt;iostream.h&gt; #include &lt;stdio.h&gt; #include...

Указатели - C++
Вводится строка слов, разделенных пробелами (возможны лишние пробелы в начале и в конце строки и между словами). Скопировать в новую строку...

Указатели - C++
Доброй ночи! Вот столкнулась с такой проблемой, нужно из одной функции в другую перенести переменную number через указатель, что у меня...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
19.03.2013, 11:59     Указатели #4
ну так во всех местах заменяй на strcmp, где у тебя !="a" стоит
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++
1) Предположим, что p - указатель, установленный на целую переменную со значением 3. Что можно сказать о значении выражений p, * p, &amp; p, *...

Указатели - C++
Почему такой вариант кода невозможен(конкретно: строка 6)?int indicator, x = 15, y = 10; int *ptr; cin &gt;&gt; indicator; ...

Указатели - C++
Доброго времени суток. У меня задание. Кто поможет? Сказали разобраться с указателями. Программа ругается на +=, выдает ошибку. Как их...

указатели - C++
1) создать функцию(проблем нет) 2) в функции ввести и определить локальную переменную типа int и задать ей значение 1(проблем нет) 3) в...

Указатели - 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     Указатели
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru