Сравнение строк на русском
Из файла в программу считываются строки и заносятся в вектор строк , среди них могут быть одинаковые :
Пушкин А.С. «Евгений Онегин»
Тургенев И.С. «Отцы и дети»
Логинов С.В. «Свет в окошке»
Пушкин А.С. «Евгений Онегин»
Стругацкий Б.Н., Стругацкий А.Н. «Понедельник начинается в субботу»
Янссон Т.С. «Волшебная зима»
Тургенев И.С. «Отцы и дети»
Толстой Л.Н. «Война и мир»
Есть отдельный массив номеров , который присваивается строкам по возрастанию , например (при этом строки не сортируются, а просто сравниваются):
2. Пушкин А.С. «Евгений Онегин»
5. Тургенев И.С. «Отцы и дети»
1. Логинов С.В. «Свет в окошке»
2. Пушкин А.С. «Евгений Онегин»
3. Стругацкий Б.Н., Стругацкий А.Н. «Понедельник начинается в субботу»
6. Янссон Т.С. «Волшебная зима»
5. Тургенев И.С. «Отцы и дети»
4. Толстой Л.Н. «Война и мир»
У меня есть реализация для случая , когда среди строк нету равных , но как переделать цикл , чтобы он учитывал и равные строки тоже ?
for (int i = 0; i < n; i++) {
k = 1;
for (int j = 0; j < i; j++) {
if (strcmp(Name[i].c_str(), Name[j].c_str())==1)
k++;
}//исключаем сравнение Name[i] книги с Name[j]
for (int j = i + 1; j < n; j++) {
if (strcmp(Name[i].c_str(), Name[j].c_str())==1)
k++;
}
A[i] = k;
Если I-ая строка больше J-ой и при этом
среди строк , есть еще какая то строка
(как минимум одна , которая равна J-ой) ,
то номер для i-ой строки прибавится на одну
лишнюю единицу(или на несколько единиц ,
в зависимости от того , сколько книг будет равных j-ой )
, и вместо таких номеров (например) :
1.abba будет : 1.abba
2.bcda 3.bcda потому что мы bcda сравнили с индексом 1 и и
1.abba 1.abba индексом 3, и два раза прибавили единицу
3.flow 4.flow , получилось 3(изначально k=1) , что
НЕВЕРНО
Ответы (1 шт):
Автор решения: neon1ks
→ Ссылка
В качестве решения можно добавить еще один цикл, для проверки повторов. Это не образцовое решение:
#include <iostream>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> Name = { { "Пушкин А.С. «Евгений Онегин»" },
{ "Тургенев И.С. «Отцы и дети»" }, { "Логинов С.В. «Свет в окошке»" },
{ "Пушкин А.С. «Евгений Онегин»" },
{ "Стругацкий Б.Н., Стругацкий А.Н. «Понедельник начинается в "
"субботу»" },
{ "Янссон Т.С. «Волшебная зима»" }, { "Тургенев И.С. «Отцы и дети»" },
{ "Толстой Л.Н. «Война и мир»" } };
std::vector<int> A = {};
auto n = Name.size();
unsigned int k = 0;
for (unsigned int i = 0; i < n; ++i) {
k = 1;
for (unsigned int j = 0; j < n; ++j) {
if (i != j) {
if (Name[i] > Name[j]) {
bool isNew = true;
for (unsigned int jj = 0; jj < j; ++jj) {
if (Name[jj] == Name[j]) {
isNew = false;
break;
}
}
if (isNew) {
++k;
}
}
}
}
A.push_back(k);
}
for (unsigned int i = 0; i < n; ++i) {
std::cout << A[i] << " : " << Name[i] << std::endl;
}
return 0;
}