Здравствуйте. Собственно пока опыта мало, хочу проконсультироваться по поводу сдледующего листинга. Надеюсь найдутся опытные и объяснят.
Это я случайно обнаружил в интернете. Впринципе я понимаю все основные моменты, но просто хочется убедиться, что допустим этот код в некоторых моментах не полный и не правильный.
Сначала код а потом вопросы
************************************************** ******
Вначале мы определим структуру пары следующим образом:
struct pair {
char* name;
int val;
};
Основная идея состоит в том, что строка имеет ассоциированное с ней целое значение. Легко определить функцию поиска find(), которая поддерживает структуру данных, состоящую из одного pair для каждой отличной от других строки, которая была ей представлена. Для краткости представления используется очень простая (и неэффективная) реализация:
const large = 1024;
static pair vec[large+1};
pair* find(char* p)
/*
поддерживает множество пар "pair":
ищет p, если находит, возвращает его "pair",
иначе возвращает неиспользованную "pair"
*/
{
for (int i=0; vec[i].name; i++)
if (strcmp(p,vec[i].name)==0) return &vec[i];
if (i == large) return &vec[large-1];
return &vec[i];
}
Эту функцию может использовать функция value(), реализующая массив целых, индексированный символьными строками (вместо обычного способа):
int& value(char* p)
{
pair* res = find(p);
if (res->name == 0) { // до сих пор не встречалось:
res->name = new char[strlen(p)+1]; // инициализировать
strcpy(res->name,p);
res->val = 0; // начальное значение 0
}
return res->val;
}
Для данной в качестве параметра строки value() находит целый объект (а не значение соответствующего целого); после чего она возвращает ссылку на него. Ее можно использовать, например, так:
const MAX = 256; // больше самого большого слова
main()
// подсчитывает число вхождений каждого слова во вводе
{
char buf[MAX];
while (cin>>buf) value(buf)++;
for (int i=0; vec[i].name; i++)
cout << vec[i].name << ": " << vec [i].val << "\n";
}
На каждом проходе цикл считывает одно слово из стандартной строки ввода cin в buf (см. Главу 8), а затем обновляет связанный с ней счетчик с помощью find(). И, наконец, печатается полученная таблица различных слов во введенном тексте, каждое с числом его встречаемости. Например, если вводится
aa bb bb aa aa bb aa aa
то программа выдаст:
aa: 5
bb: 3
************************************************** ****
Мои вопросы:
1). К чему применятся ++ тут while (cin>>buf) value(buf)++;
И зачем он тут вообще нужен.
2). Почему тут if (strcmp(p,vec[i].name)==0) return &vec[i]; сравнивается содержимое строки через ссылку p и индекс массива name. Может быть надо создать переменную хранящую позицию и потом сравнивать
strcmp(p[i],vec[pos].name) под условием, пока не встретится конец строки, и тогда считать сравнение удачным.
3) Когда возвращается return &vec[i]; то что конкретно возвращается, получается ссылка на пустой индекс пустого массива и можно ли вообще создавать Piar vec[] просто так.
P.S Хотелось бы, чтобы кто-нибудь написал рабочую идеальную версию этой программы, как образец мастерства. Мне бы это помогло в чем-то...
Социальные закладки