1

宿題の場合: ランダム化されたアルファベット キーを作成し、それらをファイルに出力してから、以下のコードにある関数「goodHash」を使用して、それぞれをハッシュ テーブルにハッシュすることになっています。

以下のコードを実行しようとすると、「goodHash」「識別子が見つかりません」と表示されます。コードの何が問題になっていますか?

#include <iostream>
#include <vector>
#include <cstdlib>
#include "math.h"
#include <fstream>
#include <time.h>
using namespace std;

// "makeKey" function to create an alphabetical key 
// based on 8 randomized numbers 0 - 25.
string makeKey() {
    int k;
    string key = "";
    for (k = 0; k < 8; k++) {
        int keyNumber = (rand() % 25);
        if (keyNumber == 0)
            key.append("A");
        if (keyNumber == 1)
            key.append("B");
        if (keyNumber == 2)
            key.append("C");
        if (keyNumber == 3)
            key.append("D");
        if (keyNumber == 4)
            key.append("E");
        if (keyNumber == 5)
            key.append("F");
        if (keyNumber == 6)
            key.append("G");
        if (keyNumber == 7)
            key.append("H");
        if (keyNumber == 8)
            key.append("I");
        if (keyNumber == 9)
            key.append("J");
        if (keyNumber == 10)
            key.append("K");
        if (keyNumber == 11)
            key.append("L");
        if (keyNumber == 12)
            key.append("M");
        if (keyNumber == 13)
            key.append("N");
        if (keyNumber == 14)
            key.append("O");
        if (keyNumber == 15)
            key.append("P");
        if (keyNumber == 16)
            key.append("Q");
        if (keyNumber == 17)
            key.append("R");
        if (keyNumber == 18)
            key.append("S");
        if (keyNumber == 19)
            key.append("T");
        if (keyNumber == 20)
            key.append("U");
        if (keyNumber == 21)
            key.append("V");
        if (keyNumber == 22)
            key.append("W");
        if (keyNumber == 23)
            key.append("X");
        if (keyNumber == 24)
            key.append("Y");
        if (keyNumber == 25)
            key.append("Z");
    }
    return key;
}

// "makeFile" function to produce the desired text file.
// Note this only works as intended if you include the ".txt" extension,
// and that a file of the same name doesn't already exist.
void makeFile(string fileName, int n) {
    ofstream ourFile;
    ourFile.open(fileName);
    int k; // For use in below loop to compare with n.
    int l; // For use in the loop inside the below loop.
    string keyToPassTogoodHash = "";
    for (k = 1; k <= n; k++) {
        for (l = 0; l < 8; l++) {    // For-loop to write to the file ONE key
        ourFile << makeKey()[l];
        keyToPassTogoodHash += (makeKey()[l]);
        }
        ourFile << "  " << k << "\n";// Writes two spaces and the data value
        goodHash(keyToPassTogoodHash); // I think this has to do with the problem
        makeKey(); // Call again to make a new key.
    }
}

// Primary function to create our desired file!
void mainFunction(string fileName, int n) {
    makeKey();
    makeFile(fileName, n);
}

// Hash Table for Part 2
struct Node {
    int key;
    string value;
    Node* next;
}; 
const int hashTableSize = 10;
Node* hashTable[hashTableSize];

// "goodHash" function for Part 2
void goodHash(string key) {
    int x = 0;
    int y;
    int keyConvertedToNumber = 0;
    // For-loop to produce a numeric value based on the alphabetic key,
    // which is then hashed into hashTable using the hash function
    // declared below the loop (hashFunction).
    for (y = 0; y < 8; y++) {
        if (key[y] == 'A' || 'B' || 'C')
            x = 0;
        if (key[y] == 'D' || 'E' || 'F')
            x = 1;
        if (key[y] == 'G' || 'H' || 'I')
            x = 2;
        if (key[y] == 'J' || 'K' || 'L')
            x = 3;
        if (key[y] == 'M' || 'N' || 'O')
            x = 4;
        if (key[y] == 'P' || 'Q' || 'R')
            x = 5;
        if (key[y] == 'S' || 'T')
            x = 6;
        if (key[y] == 'U' || 'V')
            x = 7;
        if (key[y] == 'W' || 'X')
            x = 8;
        if (key[y] == 'Y' || 'Z')
            x = 9;
        keyConvertedToNumber = x + keyConvertedToNumber; 
    }
    int hashFunction = keyConvertedToNumber % hashTableSize;
    Node *temp;
    temp = new Node;
    temp->value = key;
    temp->next = hashTable[hashFunction];
    hashTable[hashFunction] = temp;
}

// First two lines are for Part 1, to call the functions key to Part 1.
int main() {
    srand ( time(NULL) );            // To make sure our randomization works.
    mainFunction("sandwich.txt", 5); // To test program
    cin.get();
    return 0;
}

一部のセクションでコードが扱いにくいことは認識していますが、私は C++ の初心者であり、それを改善する方法をあまり知りません。

私ができる別の方法は、アルファベット順のキーをファイルに書き込んだ後、ファイルからそれらを読み取り、各キーをハッシュすることだと思いますが、それをコーディングする方法がわかりません。

4

4 に答える 4

3

挿入すると

void goodHash(string key);

「名前空間を使用して...」の下の行で動作します

于 2012-06-10T22:11:18.750 に答える
3

C++ は、宣言される前に何も使用されないように、すべてが順番に宣言されることを期待していました。ファイル内で定義されている場所よりも上の関数を参照する必要がある場合は、関数を宣言するファイルの先頭近くに関数プロトタイプを配置する必要があります。(この結果として、すべての関数のプロトタイプを作成することが標準的な方法になっています。)

ファイルの先頭付近 ( #includes の後) に追加するだけです。

void goodHash(string key);

定義

関数宣言: 関数の名前と関数が取る型を宣言するもの。

関数定義: 関数の実際のコードを指定するもの。

于 2012-06-10T22:13:21.643 に答える
2

問題は、で使用する場合は、事前に宣言goodHashまたは定義する必要があることです。それ以外の場合、コンパイルが にあるときに、トークンが表示され、それが何を意味するのかがわからないため、コンパイル時エラーが発生します。goodHashmakeFilegoodHashmakeFilemakeFilegoodHash

編集これは前方宣言に関する優れたリソースです

于 2012-06-10T22:12:51.690 に答える
0

関数プロトタイプを忘れた場合は、これを一番上に追加してください:

void goodHash(string key);

ところで、makeKey() が長すぎる場合は、代わりにこれを試すことができます。

string makeKey() {
    int k;
    string key = "";
    for (k = 0; k < 8; k++) {
        int keyNumber = (rand() % 25);
        char app[2];
        app[0] = keyNumber + 'A';
        app[1] = 0;
        key.append(app);
        }
    return key;
}
于 2012-06-10T23:11:03.257 に答える