Этот код действительно смущает меня, он использует некоторые библиотеки Стэнфорда для класса Vector (массив). Может кто-нибудь сказать мне, какова цель int index = line [j] - 'a';
почему’?
void countLetters(string filename)
{
Vector<int> result;
ifstream in2;
in2.open(filename.c_str());
if (in.fail()) Error("Couldn't read '" + filename + "'");
for (int i = 0; i < ALPHABETH_SIZE; i++)
{
result.add(0); // Must initialize contents of array
}
string line;
while (true)
{
getLine(in, line);
// Check that we got a line
if (in.fail()) break;
line = ConvertToLowerCase(line);
for (int j = 0; j < line.length(); j++)
{
int index = line [j] - 'a';
if (index >= 0 && index < ALPHABETH_SIZE)
{
int prevTotal = result[index];
result[index] = prevTotal +1;
}
}
}
}
Назначение кода:
Принимает имя файла и печатает, сколько раз каждая буква алфавита появляется в этом файле. Поскольку необходимо напечатать 26 чисел, CountLetters должен создать вектор. Например, если файл:
Символы в строке кодируются с использованием набора символов … обычно ASCII на аппаратных средствах, распространенных в системах на английском языке. Вы можете увидеть таблицу ASCII на http://en.wikipedia.org/wiki/ASCII
В ASCII (и большинстве других наборов символов) числа, представляющие буквы, являются смежными. Итак, это естественный способ проверить, является ли символ в индексе j
в массиве символов line
это письмо:
line[j] >= 'a' && line[j] <= 'z'
Ваша программа эквивалентна этому, в алгебраическом смысле она вычитает a
с обеих сторон (зная, что a
является первым символом в наборе символов):
line[j] >= 'a' - `a` && line[j] <= 'z' - `a`
line[j] >= 0 && line[j] <= 'z' - `a`
Замена «<знак равно z
— a
«с эквивалентом:
line[j] >= 0 && line[j] < ALPHABET_SIZE
где ALPHABET_SIZE равно 26. Это торгует зависимость от знания z
является последним символом вашего набора символов для того, чтобы знать, сколько символов в вашем наборе символов — оба немного хрупки, но хорошо, если вы знаете, что имеете дело с хорошо известной стабильной кодировкой набора символов.
Лучший способ проверить наличие письма — использовать isalpha()
сказуемое: http://www.cplusplus.com/reference/clibrary/cctype/isalpha/
«а» находится в начале символов ASII.
int index = line [j] — ‘a’;
if (index> = 0 && индекс < ALPHABETH_SIZE)
Эти две строки кода предназначены только для того, чтобы строка [j] была символом.