Skip to content

Commit edb2613

Browse files
committed
Удаление одинаковых слов.
1 parent c2e079e commit edb2613

File tree

9 files changed

+365
-0
lines changed

9 files changed

+365
-0
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- [Удаление из строки S последней подстроки, совпадающей с S₀](remove-last-substring/)
1717
- [Вставка подстроки в позицию N строки S](insert-string-at-position/)
1818
- [Удаление содержимого круглых скобок](remove-parentheses-from-sentence/)
19+
- [Удаление одинаковых слов](remove-same-words/)
1920

2021
## Дата и время
2122

Diff for: remove-same-words/Makefile.win

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Project: RemoveSameWords
2+
# Makefile created by Dev-C++ 5.11
3+
4+
CPP = g++.exe
5+
CC = gcc.exe
6+
WINDRES = windres.exe
7+
OBJ = main.o
8+
LINKOBJ = main.o
9+
LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc
10+
INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
11+
CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
12+
BIN = RemoveSameWords.exe
13+
CXXFLAGS = $(CXXINCS)
14+
CFLAGS = $(INCS)
15+
RM = rm.exe -f
16+
17+
.PHONY: all all-before all-after clean clean-custom
18+
19+
all: all-before $(BIN) all-after
20+
21+
clean: clean-custom
22+
${RM} $(OBJ) $(BIN)
23+
24+
$(BIN): $(OBJ)
25+
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
26+
27+
main.o: main.cpp
28+
$(CPP) -c main.cpp -o main.o $(CXXFLAGS)

Diff for: remove-same-words/README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Problem Statement
2+
3+
Вывести предложения, удалив из него те слова, которые встретились там более одного раза.

Diff for: remove-same-words/REFERENCES.md

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# C++ Reference
2+
3+
- [string](http://www.cplusplus.com/reference/string/string/)
4+
- [string::substr](http://www.cplusplus.com/reference/string/string/substr/)
5+
- [string::compare](http://www.cplusplus.com/reference/string/string/compare/)
6+
- [isalpha](http://www.cplusplus.com/reference/cctype/isalpha/)
7+
- [ispunct](http://www.cplusplus.com/reference/cctype/ispunct/)
8+
9+
# C++ Forum
10+
11+
- [Using cin to get user input.](http://www.cplusplus.com/forum/articles/6046/)
12+
- [getline and wchar_t](http://www.cplusplus.com/forum/beginner/196204/)
13+
14+
# Stack Overflow
15+
16+
- [c++ - Passing std::string by Value or Reference](https://stackoverflow.com/questions/10789740/passing-stdstring-by-value-or-reference)
17+
- [Another C++ learning moment: returning strings from functions](https://stackoverflow.com/questions/3282608/another-c-learning-moment-returning-strings-from-functions)
18+
- [c++ - How to append a char to a std::string?](https://stackoverflow.com/questions/1472048/how-to-append-a-char-to-a-stdstring)
19+
- [bash - How to change the output color of echo in Linux](https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux)
20+
- [Case-insensitive string comparison in C++](https://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c)
21+
- [c - warning: multi-character character constant [-Wmultichar]](https://stackoverflow.com/questions/23633502/warning-multi-character-character-constant-wmultichar)
22+
23+
# Misc
24+
25+
- [Bool data type in C++ - GeeksforGeeks](https://www.geeksforgeeks.org/bool-data-type-in-c/)
26+
- [c++ - What is a 'Null Terminated String' ? - Software Engineering Stack Exchange](https://softwareengineering.stackexchange.com/questions/181505/what-is-a-null-terminated-string)
27+
- [std::size_t - cppreference.com](https://en.cppreference.com/w/cpp/types/size_t)
28+
- [IBM Knowledge Center - Pass by reference (C++ only)](https://www.ibm.com/support/knowledgecenter/SSGH3R_13.1.2/com.ibm.xlcpp131.aix.doc/language_ref/cplr233.html)
29+
- [C++ for loop](https://www.tutorialspoint.com/cplusplus/cpp_for_loop.htm)
30+
- [What English sentences contain repeated, consecutive words? - Quora](https://www.quora.com/What-English-sentences-contain-repeated-consecutive-words)
31+
- [BASH Programming - Introduction HOW-TO: Loops for, while and until](http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html)
32+
- [What size wchar_t do I need for Unicode?](http://icu-project.org/docs/papers/unicode_wchar_t.html)

Diff for: remove-same-words/RemoveSameWords.dev

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
[Project]
2+
FileName=RemoveSameWords.dev
3+
Name=RemoveSameWords
4+
Type=1
5+
Ver=2
6+
ObjFiles=
7+
Includes=
8+
Libs=
9+
PrivateResource=
10+
ResourceIncludes=
11+
MakeIncludes=
12+
Compiler=
13+
CppCompiler=
14+
Linker=
15+
IsCpp=1
16+
Icon=
17+
ExeOutput=
18+
ObjectOutput=
19+
LogOutput=
20+
LogOutputEnabled=0
21+
OverrideOutput=0
22+
OverrideOutputName=RemoveSameWords.exe
23+
HostApplication=
24+
UseCustomMakefile=0
25+
CustomMakefile=
26+
CommandLine=
27+
Folders=
28+
IncludeVersionInfo=0
29+
SupportXPThemes=0
30+
CompilerSet=0
31+
CompilerSettings=0000000000000000000000000
32+
UnitCount=1
33+
34+
[VersionInfo]
35+
Major=1
36+
Minor=0
37+
Release=0
38+
Build=0
39+
LanguageID=1033
40+
CharsetID=1252
41+
CompanyName=
42+
FileVersion=1.0.0.0
43+
FileDescription=Developed using the Dev-C++ IDE
44+
InternalName=
45+
LegalCopyright=
46+
LegalTrademarks=
47+
OriginalFilename=
48+
ProductName=
49+
ProductVersion=1.0.0.0
50+
AutoIncBuildNr=0
51+
SyncProduct=1
52+
53+
[Unit1]
54+
FileName=main.cpp
55+
CompileCpp=1
56+
Folder=
57+
Compile=1
58+
Link=1
59+
Priority=1000
60+
OverrideBuildCmd=0
61+
BuildCmd=
62+

Diff for: remove-same-words/RemoveSameWords.layout

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[Editor_0]
2+
CursorCol=21
3+
CursorRow=182
4+
TopLine=163
5+
LeftChar=1
6+
[Editors]
7+
Order=0
8+
Focused=0
9+
[Editor_1]
10+
CursorCol=2
11+
CursorRow=1
12+
TopLine=1
13+
LeftChar=1

Diff for: remove-same-words/main.cpp

+190
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
#include <iostream>
2+
#include <string>
3+
#include <cstddef>
4+
#include <windows.h>
5+
6+
using namespace std;
7+
8+
// Переход на кириллицу:
9+
void cyrillic() {
10+
// Эти строки нужны для правильного отображения кириллицы:
11+
SetConsoleOutputCP(1251);
12+
SetConsoleCP(1251);
13+
14+
// Также надо изменить шрифт в консоли на Lucida Console.
15+
// Для замены шрифта кликаете правой кнопкой на надписи «Командная строка» окна консоли.
16+
// В открывшемся меню выбираете «Свойства».
17+
// В появившемся окне выбираете вкладку «Шрифт» и там выбираете «Lucida Console».
18+
}
19+
20+
// Функция для определения, является ли символ буквой.
21+
// Возвращает true, если является и false в ином случае.
22+
bool isletter(char ch) {
23+
return isalpha(ch)
24+
|| (ch >= 'а' && ch <= 'я') || (ch >= 'А' && ch <= 'Я');
25+
}
26+
27+
// Функция для поиска слов в строке.
28+
// Возвращает true, если слово найдено и false в ином случае.
29+
// Вход:
30+
// str - строка в которой надо искать слова.
31+
// start - индекс с которого надо начинать поиск.
32+
// finish - индекс дальше которого искать не нужно.
33+
// Выход:
34+
// word_start_idx - индекс первой буквы слова.
35+
// word_end_idx - индекс последней буквы слова.
36+
bool find_word(string const& str, size_t start, size_t finish, size_t& word_start_idx, size_t& word_end_idx) {
37+
size_t len = str.length();
38+
bool word_start = false;
39+
bool word_end = true;
40+
41+
for (size_t i = start; i <= finish && i >= 0 && i < len; ++i) {
42+
char ch = str.at(i);
43+
44+
// Захват первой буквы слова:
45+
if (word_end && isletter(ch)) {
46+
word_start_idx = i;
47+
word_start = true;
48+
word_end = false;
49+
}
50+
51+
// Захват последней буквы слова:
52+
if (word_start) {
53+
if (isspace(ch) || ispunct(ch) || iscntrl(ch)) {
54+
word_end_idx = i - 1;
55+
word_end = true;
56+
} else if (isletter(ch) && i == len - 1) {
57+
word_end_idx = i;
58+
word_end = true;
59+
}
60+
}
61+
62+
// Если есть первая и последняя буквы слова, то возвращаем результат:
63+
if (word_start && word_end) {
64+
word_start = false;
65+
return true;
66+
}
67+
}
68+
69+
return false;
70+
}
71+
72+
// Функция переводит символ в нижний регистр:
73+
char to_lower_letter(char ch) {
74+
if (ch >= 'а' && ch <= 'я') {
75+
return ch;
76+
} else if (ch >= 'А' && ch <= 'Я') {
77+
return 'а' + (ch - 'А');
78+
} else {
79+
return tolower(ch);
80+
}
81+
}
82+
83+
// Функция для проверки равенства строк, независимо от их регистра.
84+
bool iequals(const string& a, const string& b) {
85+
unsigned int sz = a.size();
86+
if (b.size() != sz)
87+
return false;
88+
for (unsigned int i = 0; i < sz; ++i)
89+
if (to_lower_letter(a[i]) != to_lower_letter(b[i]))
90+
return false;
91+
return true;
92+
}
93+
94+
// Функция для подсчёта количества раз, которое слово встречается в строке.
95+
size_t count_word(string const& str, size_t start, size_t finish, string const& word) {
96+
size_t cnt = 0; // количество раз, которое слово встречается в строке.
97+
size_t word_start_idx; // индекс первой буквы слова.
98+
size_t word_end_idx; // индекс последней буквы слова.
99+
100+
// Обход в цикле всех слов:
101+
while (find_word(str, start, finish, word_start_idx, word_end_idx)) {
102+
103+
// Извлечение слова из строки:
104+
string next_word = str.substr(word_start_idx, word_end_idx - word_start_idx + 1);
105+
106+
// Сравнение очередного слова с заданным словом:
107+
if (iequals(word, next_word)) {
108+
++cnt;
109+
}
110+
111+
start = word_end_idx + 1; // передвижение вперёд левой границы поиска слов.
112+
}
113+
114+
return cnt;
115+
}
116+
117+
// Функция для удаления одинаковых слов.
118+
string delete_same_words(string const& str) {
119+
string result; // переменная в которой будет конечный результат.
120+
121+
size_t len = str.length(); // длина строки.
122+
123+
size_t start = 0; // индекс с которого надо начинать поиск слов.
124+
size_t finish = len - 1; // индекс дальше которого искать слова не нужно.
125+
size_t word_start_idx; // индекс первой буквы слова.
126+
size_t word_end_idx; // индекс последней буквы слова.
127+
128+
string word; // слово.
129+
size_t cnt; // количество раз, которое слово встречается в строке.
130+
131+
bool skip_word = false; // флаг пропуска слова.
132+
133+
size_t i = 0;
134+
135+
// Обход в цикле всех слов:
136+
while (find_word(str, start, finish, word_start_idx, word_end_idx)) {
137+
138+
if (skip_word) {
139+
i = word_start_idx;
140+
}
141+
142+
// Вывод символов перед найденным словом:
143+
while (i < word_start_idx) {
144+
result += str.at(i++);
145+
}
146+
147+
// Извлечение слова из строки:
148+
word = str.substr(word_start_idx, word_end_idx - word_start_idx + 1);
149+
150+
// Подсчёт количества встреч слова в строке:
151+
cnt = count_word(str, 0, len - 1, word);
152+
153+
if (cnt == 1) { // если слово встречается только 1 раз, то:
154+
result.append(word); // добавляем его в результирующую строку.
155+
skip_word = false; // опускаем флаг пропуска слова.
156+
} else {
157+
skip_word = true; // поднимае флаг пропуска слова.
158+
}
159+
160+
start = word_end_idx + 1; // передвижение вперёд левой границы поиска слов.
161+
i = start;
162+
}
163+
164+
// Вывод всего, что осталось за последним словом:
165+
while (i < len) {
166+
result += str.at(i++);
167+
}
168+
169+
return result;
170+
}
171+
172+
// Главная функция:
173+
int main(int argc, char** argv) {
174+
cyrillic(); // переход на кириллицу.
175+
176+
// Заголовок программы:
177+
cout << "// Удаление из предложения слов, которые встретились в нём более 1 раза.\n\n";
178+
179+
// Ввод входной строки:
180+
string str = "";
181+
cout << "Пожалуйста, введите предложение:\n>";
182+
getline(cin, str);
183+
cout << "Вы ввели строку: \"" << str << "\"\n\n"; // проверка ввода.
184+
185+
cout << "Результат:\n" << delete_same_words(str) << endl << endl;
186+
187+
system("pause"); // пауза перед выходом из программы.
188+
return 0;
189+
}
190+

Diff for: remove-same-words/run.sh

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
3+
readonly RED='\033[0;31m'
4+
readonly NC='\033[0m' # No Color
5+
6+
#clear
7+
8+
g++ -Wall main.cpp -o program.out && ./program.out
9+
exit
10+
11+
g++ -Wall main.cpp -o program.out
12+
13+
declare -a collection=(
14+
"The sound sounds sound."
15+
"It's the right right, right?"
16+
"The key key is this one."
17+
"It's an objective objective."
18+
"In May, May may make out with me."
19+
"A can can help."
20+
"Compared with the last one, this is a fine fine."
21+
"Fat fat."
22+
"The man we saw saw a saw."
23+
"The first second was alright, but the second second was tough."
24+
"It's a square square. It's a flat flat."
25+
"Well, well, well... There there. lol lol lol"
26+
)
27+
28+
cnt=0
29+
if [ -n "$collection" ]; then
30+
for i in "${collection[@]}"
31+
do
32+
echo -e "${RED}Test # $cnt${NC}"
33+
echo "$i" | ./program.out
34+
let cnt=cnt+1
35+
done
36+
fi

Diff for: remove-same-words/solution.doc

109 KB
Binary file not shown.

0 commit comments

Comments
 (0)