Консультация № 182843
13.04.2011, 16:41
55.00 руб.
0 9 1
Здравствуйте! У меня возникли сложности с таким вопросом:
В строке содержатся предложения, заканчивающиеся точкой. Определить число предложений и длину каждого из них в знаках.

Обсуждение

Неизвестный
13.04.2011, 16:44
общий
Что понимается под знаками? Например, пробелы?
Неизвестный
13.04.2011, 17:11
общий
это ответ
Здравствуйте, Посетитель - 351942!
Программа. С++. Компилировал GCC.
Код:
#include <cstdlib>
#include <iostream>
#include <string>
#include <locale>
#include <vector>
#include <algorithm>

using namespace std;

// Разделитель
const wchar_t DELIM = L'.';

typedef vector<wstring> str_vec;

// Разбивает строку по символу-разделителю, исключая пустые предложения

str_vec split(const wstring& str)
{
str_vec res;

wstring::const_iterator beg = str.begin(), end = str.end(), cur;
while ((cur = find(beg, end, DELIM)) != end)
{
if (cur != beg)
{
res.push_back(wstring(beg, cur));
}
beg = cur + 1;
}

return res;
}

int main()
{
locale::global(locale(""));

wstring str;

// Ввод строки
wcout << L"Введите строку:";
getline(wcin, str);

// Разбиваем строку по точкам
str_vec sv = split(str);

// Вывод результата
wcout << L"В строке: "" << str << L""" << L" предложений: " << sv.size() << endl;

for (str_vec::const_iterator it = sv.begin(), end = sv.end(); it != end; ++it)
{
wcout << L"Предложение:"" << *it << L"", знаков:" << it->length() << endl;
}

#ifdef _WIN32
system("pause");
#endif

return (EXIT_SUCCESS);
}

Пример работы:
Код:
Введите строку:1-е предложение. А это второе. Наверное, хватит
В строке"1-е предложение. А это второе. Наверное, хватит" предложений: 3
Предложение:"1-е предложение", знаков:15
Предложение:" А это второе", знаков:13
Предложение:" Наверное, хватит", знаков:17
5
Неизвестный
13.04.2011, 17:28
общий
извиняюсь, что не указал сразу, но можно сделать в dev C++
Неизвестный
13.04.2011, 17:33
общий
по поводу пробелов, если не сложно, могли бы вы сделать оба варианта
Неизвестный
13.04.2011, 17:45
общий
Код:
#include <cstdlib>
#include <iostream>
#include <string>
#include <locale>
#include <vector>
#include <algorithm>

using namespace std;

// Разделитель
const wchar_t DELIM = '.';

typedef vector<string> str_vec;

// Разбивает строку по символу-разделителю, исключая пустые предложения
str_vec split(const string& str)
{
str_vec res;

string::const_iterator beg = str.begin(), end = str.end(), cur;
while (beg != end)
{
cur = find(beg, end, DELIM);
if (cur != beg)
{
res.push_back(string(beg, cur));
}
beg = cur + (cur != end);
}

return res;
}

int main()
{
locale::global(locale(""));

string str;

// Ввод строки
cout << "Input string:";
getline(cin, str);

// Разбиваем строку по точкам
str_vec sv = split(str);

// Вывод результата
cout << "In string"" << str << """ << " sentenses: " << sv.size() << endl;

for (str_vec::const_iterator it = sv.begin(), end = sv.end(); it != end; ++it)
{
cout << """ << *it << "", characters:" << it->length() << endl;
}

#ifdef _WIN32
system("pause");
#endif

return (EXIT_SUCCESS);
}


Код:
#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>
#include <locale>
#include <vector>
#include <algorithm>

using namespace std;

// Разделитель
const wchar_t DELIM = '.';

typedef vector<string> str_vec;

// Разбивает строку по символу-разделителю, исключая пустые предложения
str_vec split(const string& str)
{
str_vec res;

string::const_iterator beg = str.begin(), end = str.end(), cur;
while (beg != end)
{
cur = find(beg, end, DELIM);
if (cur != beg)
{
res.push_back(string(beg, cur));
}
beg = cur + (cur != end);
}

return res;
}

size_t characters(const string& str)
{
size_t res=0;
for(string::const_iterator it = str.begin(), end = str.end(); it!=end; ++it)
{
res+=!isspace(*it);
}
return res;
}

int main()
{
locale::global(locale(""));

string str;

// Ввод строки
cout << "Input string:";
getline(cin, str);

// Разбиваем строку по точкам
str_vec sv = split(str);

// Вывод результата
cout << "In string"" << str << """ << " sentenses: " << sv.size() << endl;

for (str_vec::const_iterator it = sv.begin(), end = sv.end(); it != end; ++it)
{
cout << """ << *it << "", characters:" << characters(*it) << endl;
}

#ifdef _WIN32
system("pause");
#endif

return (EXIT_SUCCESS);
}
Неизвестный
13.04.2011, 18:41
общий
а почему если строка не заканчивается точкой, то она все равно считается предложением? Она же не заканчивается точкой.
Неизвестный
13.04.2011, 18:55
общий
Верно. Но она же все таки предложение. Тем более, я так понял, по условию, что в текст содержит предложения заканчивающиеся точкой. Так же пустое предложение типа "." или ".." или еще как предложением не считаются. Это поведение не сложно изменить. Опишите конкретно какое поведение Вам надо.
Неизвестный
13.04.2011, 19:50
общий
предложение должно заканчиваться точкой, если не зачанчивается, то и не считается
"." или ".."-тоже не считается, должны быть символы перед точкой.
Неизвестный
13.04.2011, 20:21
общий
Замените функцию split() на эту:
Код:
// Разбивает строку по символу-разделителю, исключая пустые предложения
str_vec split(const string& str)
{
str_vec res;

string::const_iterator beg = str.begin(), end = str.end(), cur;
while ((cur = find(beg, end, DELIM)) != end)
{
if (cur != beg)
{
res.push_back(string(beg, cur));
}
beg = cur + 1;
}

return res;
}
Форма ответа