• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Структуры С++

  • Автор темы TSoprano
  • Дата начала
T

TSoprano

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstring>
#include <cmath>
#include <stdlib.h>
using namespace std;
const int n = 3000;

struct hashdata //структура для описания ячейки хэш-таблицы
{
int collisions;
char key[7];
bool empty; //пуста ли ячейка в таблице
};

int hash_s(char key[])
{
int address = 0;
for (int i = 0; i<6; i++)
{
int code = int(key);
address += code*code*code;
}
address %= 10000;
address %= n;
return address;
}

void hashrecord(char word[], char emphcell[], hashdata htable[], int index)
{
double h = 2, p = 1; //h - число, прибавляемое к индексу, p - степень h;
if (htable[index].empty)
{
for (int i = 0; i<6; i++)
htable[index].key = word;
}
else{
for (int i = index; i<n; i += pow(h, p))
{
p++;
if (strcmp(htable.key, word) == 0)
break;
if (htable.empty)
{
for (int j = 0; j<6; i++)
htable.key[j] = word[j];
break;
}
}
}
}

int hashsearch(hashdata htable[], char word[])
{
double h = 2, p = 1; //h - число, прибавляемое к индексу, p - степень h
int index;
index = hash_s(word);
bool find = false;
for (int i = index; i<n; i += pow(h, p))
{
if (strcmp(htable.key, word) == 0)
{
cout << "Данный элемент найден." << endl;
cout << "Столбец:" << i << " Ключ:" << htable.key << endl;
find = true;
return i;
}
}
if (!find)
cout << "Элемент не найден" << endl;
return 3000;
}

int main()
{
setlocale(LC_ALL, "rus");
hashdata htable[n];
char key[7], emphcell[7] = " ";
int index, a = 4;
ofstream colout("Text.txt");
ofstream hashout("Text1.txt");
for (int i = 0; i<n; i++)
htable.collisions = 0;
for (int i = 0; i<n; i++)
{
htable.empty = true;
strcpy(htable.key, " ");
}

srand(time(NULL)); //генерация 8000 ключей генератором случайных чисел

for (int j = 0; j<3; j++)
key[j] = 48 + rand() % 10;
key[3] = 65 + rand() % 26;
for (int j = 4; j<6; j++)
key[j] = 48 + rand() % 10;
index = hash_s(key);
htable[index].collisions++;
hashrecord(key, emphcell, htable, index);

while (a != 0)
{

cout << "Какие дополнительные действия произвести?" << endl;
cout << "1-добавить элемент; 2-удалить элемент; 3-поиск и вывод на экран; 0-выход" << endl;
cin >> a;

switch (a)
{
case 1:
cout << "Введите ключ формата цццАцц(А - буква, ц - число):";
cin >> key;
index = hash_s(key);
htable[index].collisions++;
hashrecord(key, emphcell, htable, index);
break;
case 2:
cout << "Введите ключ формата цццАцц(А - буква, ц - число):";
cin >> key;
index = hashsearch(htable, key);
if (index != 3000)
strcpy(htable[index].key, " ");
break;
case 3:
cout << "Введите ключ формата цццАцц(А - буква, ц - число):";
cin >> key;
hashsearch(htable, key);
break;
case 0:
break;
}
cout << endl;
}

for (int i = 0; i<n; i++)
{
colout << htable.collisions << endl;
hashout << i << ' ' << htable.key << endl;
}
colout.close();
hashout.close();

cout << "Программа выполнена успешно." << endl;
cout << "Результаты работы программы записаны в файлы collisions.txt и hash.txt." << endl;

system("pause");
return 0;
}


выводит в файл с хеш таблицей пустую нумерацию,а в файл коллизиями нулевые значение, в чем ошибка?
 

Вложения

  • SaoD3.cpp
    3,3 КБ · Просмотры: 390
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!