#c
#c
Вопрос:
Как следует из названия, у меня возникли проблемы при попытке извлечь среднее слово из строки, я считаю, что моя формула неверна, но я не совсем уверен, что отсюда можно исправить проблему, любая помощь всегда приветствуется спасибо!
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string sentence="";
string middle="";
string midtemp="";
int count=0;
int mid=0;
cout << "Enter a sentence:" << endl;
getline(cin,sentence); //gets user input
for(int count =0; count<sentence.length();count ){
letter=sentence.substr(count,1);
int mid = sentence.length();
if (midtemp.length()>middle.length())
{ midtemp=middle;}
if (sentence[count]!=' ')
{ if(mid%2==0);
reverse(longest.rbegin(),longest.rend()); //shows the word not backwards
cout<<"Middle word is: " << sentence.substr(mid/2 -1) <<"n" << endl;
break; //presents info to user
}
else(mid%2!=0);
{ mid/2;
cout<<"Middle word is: " << sentence.substr(mid/2 -1) <<"n" << endl;
break; //presents info to user if number is even
}
}
Комментарии:
1. пожалуйста, укажите ввод, вывод и ожидаемый результат в вопросе. Что такое среднее слово в строке? Например, что такое среднее слово в
"Hello World"
?2. Я не верю, что код работает, это не неправильная формула, это просто неверно понятый алгоритм (а также ряд ошибок в кодировании). Способ решить сложную проблему — разбить ее на части. Итак, попробуйте это, шаг 1 разбейте предложение на слова. После первого шага у вас будет вектор строк, каждая строка — одно слово. Шаг 2 выберите среднюю запись из вектора. Теперь у вас есть две проблемы вместо одной, но каждая проблема проще, чем исходная проблема.
3. Да, извините за этот плохой пост, я отказался от этого кода и перезапускаю, спасибо за помощь!
Ответ №1:
Чтобы найти среднее слово в строке из трех слов, используйте:
size_t begin_index = sentence.find(' ') 1;
size_t end_index = sentence.find(' ', begin_index);
size_t length = end_index - begin_index;
string middle_word = sentence.substr(begin_index, length);
Чтобы найти среднее слово в строке с любым нечетным числом слов, используйте:
// create string stream from sentence
istringstream ss(sentence);
// split string stream into vector of words
vector<string> words(istream_iterator<string>(ss), {});
// get middle index
size_t middle_index = (words.size() - 1) / 2;
// get middle word
const autoamp; middle_word = words[middle_index];
Если имеется четное количество слов, результат округляется либо в большую, либо в меньшую сторону до C 11, после C 11 он округляется в меньшую сторону. (К слову перед средним пробелом).
Комментарии:
1. Ничто в постановке задачи не говорит, что должно быть три слова. Вы, конечно, можете быть правы, и OP пропустил эту важную деталь.
2. Вы правы, есть среднее слово, если есть 5 слов, и я никогда не думал об этом, позвольте мне переосмыслить
3. » результат округляется либо в большую, либо в меньшую сторону до C 11 «. Действительно? Что изменилось в C 11? Я думаю, оно всегда должно быть округлено в меньшую сторону.
4. «Двоичный оператор / делит первый операнд на второй (после обычных арифметических преобразований). Для целых операндов это дает алгебраическое частное. Частное округляется в направлении, определенном реализацией. (до C 11). Частное усекается до нуля (дробная часть отбрасывается). (начиная с C 11)`.» — en.cppreference.com/w/cpp/language/operator_arithmetic
Ответ №2:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char **argv) {
string input;
getline(cin, input);
vector<string> tokens;
string token;
for (size_t i = 0; i < input.length(); i ) {
char c = input[i];
if (c == ' ' || !input[i 1]) {
if (!input[i 1])
token = c;
tokens.push_back(token);
token = "";
continue;
}
token = c;
}
auto mid = tokens.size() % 2 == 0 ? tokens.begin() tokens.size() / 2 - 1
: tokens.begin() tokens.size() / 2;
cout << *mid;
return 0;
}