Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для DaskOFF
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1

Посмотреть код

01.08.2012, 20:14. Показов 3654. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех
Вот решил написать программу сам, чтобы так скажем закрепить все полученные на сегодняшний день знания по С++ (еще не полностью дочитал книгу Липпмана)
Вот как раз в этой книге надо было сделать проект.

Задача программы в следующем.
/*
* Программа принимает у пользователя путь к файлу.
* Разбирает файл по строкам и словам.
* Пользователь может ввести любое слово и получить данные в виде номеров строк в которых встречается данное слово.
* При желании вывести эти строки или искать другое слово
*/
так вот, прочитав тему по этому проекту честно ничего не понял, т.к. там пишется все сразу и за всем сложно уследить с самого начала. И я решил написать его собственными силами.
С классами я еще знаком слабо(через 1 главу только начнется их изучение) , только то что рассказывалось в общем.

Прошу у кого есть время и желание посмотрите код и скажите может есть что-то, что реализовано "ужасно", только не надо показывать как это можно реализовать более сложными способами, то что я использовал это, то что я прошел по книге.

Заранее благодарен за указание на все мои косяки
PS: Первый раз писал программу содержащую больше 100 строк

файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
* Программа принимает у пользователя путь к файлу. Разбирает файл по строкам и словам.
* Пользователь может ввести любое слово и получить данные в виде номеров строк в которых
* встречается данное слово.
* При желании вывести эти строки.
*/
 
#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include "TextQuery.h"
 
int main() 
{
    //открытие файла
    std::string file_name_str;
    std::ifstream file_f;
    std::cout << "Enter file name and its type(name.type)" << std::endl
            << " -> ";
    std::cin >> file_name_str;
    open_file(file_f, file_name_str);
 
    Quer tq;
    tq.add_line_to_vec(file_f);     // каждую строку в вектор
    //закрытие файла(больше не понадобится)
    file_f.close();
 
    //заполняем карту
    tq.line_to_word_in_map();
    
    // Для искомого слова
    std::string word_for_search;
    //Ввод слова и вывод результатов
    found_and_result(tq, word_for_search);
    std::cout << std::endl;
 
    //Меню
    menu();         
    
    //проверка ответов
    int otv;            //Для принятия ответа
    do {
        std::cin >> otv;
        if (otv == 1) { 
            output_lines(tq, word_for_search);
            std::cout << std::endl;
            menu();
        }
        if (otv == 2) {
            found_and_result(tq, word_for_search);
            std::cout << std::endl;
            menu();
        }
    }while (otv != 0);
 
    return 0;
}

файл TextQuery.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifndef TEXTQUERY_H
#define TEXTQUERY_H
 
#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <set>
#include <vector>
#include <string>
 
class Quer {
public:
    typedef std::vector<std::string>::size_type siz_vec;     // тип хранящий размер вектора
    typedef std::map<std::string, std::set<int> >::iterator map_iter;           // вывод данных по найденому слову
 
    // МЕТОДЫ
    void add_line_to_vec(std::ifstream&);                   // Заполнение вектора строками из файла
    void line_to_word_in_map();                             // Разбор строк и заполнение карты
    void get_vec(std::vector<std::string>&);                // Получение вектора
    void print_map(std::map<std::string, std::set<int> > &); // получение карты
    std::map<std::string, std::set<int> >::iterator get_iter_word_map(std::string);  // Получене итератора найденого слова в карте
    void print_result(std::string, bool&);
    
 
private:
    std::map<std::string, std::set<int> > word_map;     // карта хранящая слово(ключ) и номера строк в которых оно встречается(набор)
    std::vector<std::string> line_text;                 // вектор хранящий каждую строку текста
};
 
void open_file(std::ifstream&, std::string);            // открытие файла
void not_punct (std::string&);                          // удаление знаков пунктуации и приведение к строчному виду
void found_and_result(Quer&, std::string&);             // Ввод слова для поиска и вывод результата
void menu();                                            // меню
void output_lines(Quer&, std::string&);                 // Вывод строк с найденым словом
 
#endif

файл TextQuery.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include "TextQuery.h"
 
//Открываем файл
void open_file(std::ifstream& f, std::string ss)
{ 
    if (std::ifstream(ss.c_str()) == NULL) {
        system("cls");
        std::cout << "Error file not found!" << std::endl
            << "Enter file name and its type(name.type)" << std::endl
            << " -> ";
        std::string if_error;
        std::cin >> if_error;
        open_file(f, if_error);
    } else {
        f.open(ss.c_str());
        system("cls");
        std::cout << "Excellent! The file \'"<< ss
            << "\' is opened!" << std::endl;
    }
}
 
//Заполняем вектор строками из открытого файла
void Quer::add_line_to_vec (std::ifstream &f) 
{
    std::string line;
    while (std::getline(f, line)) {
        line_text.push_back(line);
    }       
}
 
//Удаление знаков пунктуации и перевод к строчному виду выбраного слова
void not_punct(std::string &pun)
{
    
    for(std::string::size_type i(0); i != pun.length(); i++) {
        if (isupper(pun[i]))
            pun[i] = tolower(pun[i]);
        if (ispunct(pun[i])) {
            pun.erase(i,1);
            --i;
        }
    }
}
 
//Разбираем строки по словам и заполняем карту
void Quer::line_to_word_in_map()
{
    Quer::siz_vec count(1);
    for(std::vector<std::string>::iterator iter=line_text.begin();
                                            iter != line_text.end(); iter++, count++) {
            std::istringstream stream(*iter);
            std::string word;
            while (stream >> word) {
                not_punct(word);
                word_map[word].insert(count);
            }
 
    }
}
 
//Получение данных вектора
void Quer::get_vec(std::vector<std::string>& ver)
{
    for(std::vector<std::string>::iterator iter = line_text.begin();
                                            iter != line_text.end(); iter++) {
        ver.push_back(*iter);
    }
}
 
//Получение карты
void Quer::print_map(std::map<std::string, std::set<int> > &mape)
{
    for(std::map<std::string, std::set<int> >::iterator iter = word_map.begin();
                                                        iter != word_map.end(); iter++) {
            mape.insert(std::make_pair(iter->first,iter->second));
    }
}
 
//Поиск слова в карте
std::map<std::string, std::set<int> >::iterator Quer::get_iter_word_map(std::string word_founds)
{
    not_punct(word_founds);
    return word_map.find(word_founds);
}
 
//Вывод результата
void Quer::print_result(std::string word_found, bool &fail) 
{
    map_iter iter = Quer::get_iter_word_map(word_found);
    if (iter != word_map.end()) {
        system("cls");
        std::cout << "The word \'" << word_found << "\' found in the following lines:";
        for (std::set<int>::iterator iter_set = iter->second.begin(); iter_set != iter->second.end(); iter_set++) {
            std::cout << " " << *iter_set;
        }
        std::cout << "." << std::endl;
        fail = false;
    } else {
        std::cout << std::endl << "Word not fount!" << std::endl;
        fail = true;
    }
}
 
// Ввод слова для поиска и вывод результата
void found_and_result(Quer& tq, std::string& search)
{
    bool fail = false;      //Проверка на правильность ввода
    do {
        if (fail) 
            std::cout << "Please try again." <<std::endl << "-> ";
        else 
            std::cout << "What word search?" << std::endl << "-> ";
        std::cin >> search;
 
        //Вывод результата
        tq.print_result(search, fail);
    }while (fail);
}
 
 
// меню
void menu()
{
    std::cout << "To show themselves prompt, type 1" << std::endl
        << "To find another word enter 2" << std::endl
        << "To exit, type 0" << std::endl << "-> " << std::flush;
}
 
//Вывод строк со встречающимся словом
void output_lines(Quer& que, std::string &word_for_search) 
{
    std::cout << "The output lines: " << std::endl;
    std::vector<std::string> vec_str_out;
    que.get_vec(vec_str_out);
    Quer::map_iter iter = que.get_iter_word_map(word_for_search);
    for(std::set<int>::iterator it_set = iter->second.begin(); it_set != iter->second.end(); it_set++) {
        std::cout << "(line " << *it_set << ") " << vec_str_out[*it_set-1] << std::endl;
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.08.2012, 20:14
Ответы с готовыми решениями:

Посмотреть код встроенных математических функций. Открыть cmath
Каким образом можно посмотреть, как в c++ считаются встроенные функции в библиотеке cmath(math.h) ? Например, хочу посмотреть, как...

Односвязный список (псевдокод) - поменять два элемента местами (посмотреть, правильно ли написан код)
Дан односвязный список 0...9 Дан указатель на первый элемент - p Поменять местами 5 и 6 node *a =...

можеш посмотреть
вообще не понимаю

20
 Аватар для DaskOFF
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
05.08.2012, 16:08  [ТС]
Студворк — интернет-сервис помощи студентам
ForEveR, я об этом как-то не задумывался, что так можно, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2012, 16:08
Помогаю со студенческими работами здесь

Посмотреть содержимое папки
Здравствуйте, хочу написать прожку, которая будет показывать содержимое папки, а так же может переходить из папки в папку. Вот этот код...

Как посмотреть элементы динамического массива при дебаге?
Подскажите, как посмотреть элементы динамического массива при дебаге (VS 2010)?

Подскажите, где посмотреть информацию
Всем добрый день! Скачал недавно САПР для создания выкроек и там есть возможность создания адаптивных выкроек. Все это дело пишется на...

Где посмотреть простейший парсер на C++?
Надо отпарсить и подсветить несколько строк (для начала - хотя бы одну) формата CString. Лексеммы разделены запятыми, скобочками,...

Посмотреть символ в битовой схеме
есть запись например такая: unsigned char bits=1; как ее можно посмотреть в битовой схеме, т.е. чтобы вывод на экран выглядел так:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru