所以我试图找出教授在董事会上写的内容以及它如何回答我们要做的实验室任务。
这是实验室作业:
创建一个哈希表和哈希映射,其中包含(在下面给出的)独立声明中的所有词语。 使用链式方法处理碰撞。 (注意我们不会修改此表也不会删除!) 以编程方式回答以下问题:
- 哈希表的大小是多少?
- 什么是最长的碰撞(即链条)
- 最常用的词是什么?你是如何确定的?
醇>创建一个(第二个)哈希表,其中包含独立宣言中的所有字母。
哈希表的大小是什么
- 醇>
什么字母碰撞最长?
这是伪代码,我做了一些修改,修复了一些错误:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
class Translate
{
string word;
public:
int trans(string word);
w = word.charAT(0); //gives a letter
return #num;
};
class HashTable
{
int size();
int collision();
int length();
char fword();
public:
Translate t;
list<string> hashTable[29];
bool insert(string word)
{
hashTable[t.trans(word)].push_back(word);
return true;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
HashTable h;
open file f("hash.txt");
//h.insert(word)
while (!f.eof())
{
h.insert(f.word());
}
cout << h.size;
cout << h.collision.length;
cout << h.fword;
return 0;
}
我遇到的错误是:
错误15错误C1903:无法从先前的错误中恢复;停止编译 错误5错误C2014:预处理程序命令必须作为第一个非白色空格开始 错误4错误C2059:语法错误:'return'
错误13错误C2065:'f':未声明的标识符
错误10错误C2065:'file':未声明的标识符 错误8错误C2065:'open':未声明的标识符 错误6错误C2143:语法错误:缺少';'在'}'之前 错误1错误C2143:语法错误:缺少';'在'='之前 错误11错误C2146:语法错误:缺少';'在标识符'f'之前 错误9错误C2146:语法错误:缺少';'在标识符'文件'之前
错误14错误C2228:'。''的左边必须有class / struct / union
错误3错误C2238:';'之前的意外标记 错误7错误C2238:';'之前的意外标记 错误12错误C3861:'f':未找到标识符
错误2错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int
错误19智能感知:此处不会出现'#' 错误17 IntelliSense:类“std :: basic_string,std :: allocator&gt;”没有会员“charAT”
错误21智能感知:预期为';' 错误18智能感知:预期声明
错误22 IntelliSense:标识符“f”未定义
错误20智能感知:标识符“打开”未定义
错误16 IntelliSense:此声明没有存储类或类型说明符
我从未使用过.c_str,而且我对C ++还很陌生,所以我的知识有限。我可以说有些地方需要一个标识符,但我认为有一种更好的方法来创建一个“打开文件”。我之前的知识是C#,HTML和一些Python,其中C ++给我带来了一些学习和理解上的困难。任何帮助和/或见解将不胜感激!
答案 0 :(得分:0)
代码太过错,无法理解。但是,我正在尽我所能帮助解决我对C ++和哈希的一点知识。
int _tmain(int, _TCHAR*)
代替int main()
。如果您迁移到非Windows编译器,这应该保证您能够测试出来。
资料来源:Unicode _tmain
vs main
我想帮助其余部分,但是,发布的代码太难以理解了。如果发布算法以供参考,那就太好了。
答案 1 :(得分:0)
你应该改变一些事情:
trans()
应该是一个函数定义,而不是一个声明,并且它后面的行应该是正文:
const string&
代替string
。w
是char
。std::string
定义operator[]
,因此可以像数组一样编入索引。#num
是什么(我假设它来自Python,但我不熟悉),所以我不确定你是怎么做的打算计算返回值
[因此我假设您要返回w
,而是int
而不是char
。如果是这种情况,那么return word[0];
只会更简单。] HashTable
的成员存在一些问题。
size()
,collision()
,length()
和fword()
是私密的。这似乎并非故意。t
和hashTable
为public
,当您可能希望它们为私有时。同样,这似乎并非故意。HashTable::insert()
。另外,如上面1.1中所述,参数应该是true
。const string&
和_tmain()
是Microsoft扩展,可在Visual Studio和一些(但不是全部)编译器上获得,旨在与其兼容(例如C ++ Builder)。如果您希望代码与平台无关,则可能需要_TCHAR
。 [请注意,这并不需要 进行更改。如果您只使用Visual Studio进行编译,则可以保留原样。如果您想要平台独立性,您可以自己轻松定义main()
和_tmain
。] _TCHAR
都不是C ++中的关键字,也不是类型(尽管open
是C类型,但它似乎并不是您想要的)。您似乎想要file
。FILE
循环中使用std::ifstream
作为条件,因为eofbit
won't be set until after reading fails。!f.eof()
没有成员函数while
。但是,如果给定一个可以接受的参数,则提取运算符fstream
将一次读取一个单词。word()
,operator>>()
,HashTable::size()
和HashTable::collision()
是函数。要调用它们,请使用HashTable::length()
。如果您只是直接使用函数名称,则不要调用它,而是引用它(这可用于创建函数指针或函数引用)。HashTable::fword()
没有成员函数operator()
。因此,您无法致电int
。在C ++中,如果链接这样的函数调用,链中的每个函数都被视为它是直接在前类型的成员函数,而不是最左边的类型;这意味着对于第一个之后的每个函数,使用前一个函数的返回类型。 (在这种情况下,length()
会返回h.collision().length()
,因此h.collision()
会尝试调用成员函数int
。.length()
不是类类型,因此没有任何会员功能。)因此,考虑到这些,您的代码可以修改如下:
int::length()
除了int
之外,您还需要为// Assuming your stdafx.h contains "#include <string>" and "#include <tchar.h>".
// If it doesn't, either put them there, or #include them here.
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <list>
// #4: Defining _tmain and _TCHAR
#ifndef _tmain
#define _tmain main
typedef char _TCHAR;
#endif
using namespace std;
class Translate
{
string word;
public:
// #1: Fixing trans().
int trans(const string& word)
{
char w = word[0]; // First letter of word.
return w; // Will be promoted to int.
}
};
class HashTable
{
// #2: Making member functions public, and member variables private.
Translate t;
list<string> hashTable[29];
public:
int size();
int collision();
int length();
char fword();
// #3: Making word a const reference. Changing return type to void.
void insert(const string& word)
{
hashTable[t.trans(word)].push_back(word);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
HashTable h;
// #5.1: Opening the file.
ifstream f("hash.txt");
//h.insert(word)
// #5.2 & 5.3: Reading a word.
std::string word;
while (f >> word)
{
h.insert(word);
}
// #6: Calling functions.
cout << h.size();
cout << h.collision(); // #7: Assuming you wanted to output both h.collision() and
cout << h.length(); // h.length(), I put them on separate lines.
// If you actually DID want h.collision().length(), then
// h.collision() should return a type (or reference to a type)
// with member function length(), or be an instance
// (or reference to an instance) of a class with member function
// length() (instead of being a function).
cout << h.fword();
return 0;
}
成员函数提供正文,并进行您想要的任何其他修改。您可能还想从HashTable
中删除成员insert()
,如果它实际上并不需要存储字符串。