Одесса: 5°С (вода 9°С)
Киев: 3°С
Львов: 2°С

Тема: Помогите начинающему по C++

Ответить в теме
Показано с 1 по 6 из 6
  1. Вверх #1
    Yandex
    гость

    По умолчанию Помогите начинающему по C++

    Здравствуйте. Собственно пока опыта мало, хочу проконсультироваться по поводу сдледующего листинга. Надеюсь найдутся опытные и объяснят.
    Это я случайно обнаружил в интернете. Впринципе я понимаю все основные моменты, но просто хочется убедиться, что допустим этот код в некоторых моментах не полный и не правильный.

    Сначала код а потом вопросы
    ************************************************** ******
    Вначале мы определим структуру пары следующим образом:
    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 Хотелось бы, чтобы кто-нибудь написал рабочую идеальную версию этой программы, как образец мастерства. Мне бы это помогло в чем-то...


  2. Вверх #2
    Не покидает форум Аватар для madbut
    Пол
    Мужской
    Адрес
    Одесса
    Сообщений
    9,143
    Репутация
    3090
    Записей в дневнике
    1
    Не совсем удачное руководство ты выбрал, это Страуструп, хоть и автор с++, но для новичка имхо не удачный выбор, найди что то попроще.
    серая лиса шаг за шагом возвращается в общежитие

  3. Вверх #3
    1) int& value(char* p) возвращает ссылку на счетчик количества вхождений данного слова... ++ его увеличивает
    тоесть вызывается value для "аа" например...
    ищется такое слово в статическом векторе пар значение-колво вхождений
    если не находится то создается новая пара
    возвращает функция ссылку на количество входжений этого слова
    и уже в майне ++ по этой ссылку увеличивает значение на 1

  4. Вверх #4
    2) это ты чтото нескладное придумал... strcmp сравнивает строку целиком... зачем p[i]?
    может ты не правильно понял for (int i=0; vec[i].name; i++)
    vec[i].name означает что цикл будет выполнятся до тех пор пока есть записи в vec... тоесть цикл идет по словам в vec сравнивая их с p

    3) return &vec[i] возвращается сслыка на элемент vek если он найден, если он не найден то res->name == 0 и будет создан новый

    P.S. это и есть рабочая идеальная версия и образец мастерства
    Последний раз редактировалось shurikwg; 12.11.2008 в 11:40. Причина: дополнено

  5. Вверх #5
    Частый гость Аватар для Hisp
    Пол
    Мужской
    Адрес
    сами мы не местные
    Возраст
    18
    Сообщений
    984
    Репутация
    401
    не считая очепяточки))
    Поверхность Юпитера должна быть засеяна коноплей.

  6. Вверх #6
    Новичок Аватар для Permanent
    Пол
    Женский
    Возраст
    17
    Сообщений
    13
    Репутация
    10
    Записей в дневнике
    1
    Та он сам себя забанил...и что теперь?
    Ваша реклама здесь!


Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения