Задано предложение, состоящее из слов-строк. Написать программу, которая находит самое короткое слово в предложении
Задано предложение, состоящее из слов-строк. Написать программу, которая находит самое короткое слово в предложении.
Не понимаю, почему программа пишет самое первое слово и вообще не находит короткого слова.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string n;
int count = 0;
int s;
int min = INT_MAX;
int min_i = 0;
getline(cin, n);
for (int i = 0; i < n.size(); i++) {
count++;
if (isspace(n[i])) {
if (count < min) {
min = count;
min_i = i;
}
count = 0;
}
}
for (int i = min - min_i - 1; i < min; i++) {
cout << n[i];
}
}
Ответы (1 шт):
Автор решения: Стас
→ Ссылка
Я исправил ваш код, оставил в нём комментарии с объяснением. И ещё - в строку нужно вводить символы на латинице, русский она не воспринимает (или переводить строку в правильную кодировку и пользоваться русским).
#include <iostream>
using namespace std;
int main(){
setlocale(LC_ALL, "Russian");
string n;
int count = 0, min = INT_MAX, min_i = 0;
getline(cin, n);
n += " "; //я добавил пробел, т.к. вы проверяете на наличие пробела в строке, и, когда доходит до последнего слова -
// - пробела там нет и оно просто не учитывается
for (int i = 0; i < n.length(); i++){
if (isspace(n[i])){
if (count < min) {
min = count;
min_i = i;
}
count = -1; //переместил count++ вниз цикла, иначе проверка начинается со 2го символа,
// и чтобы расчёты остались верными нужно его уменьшить на один
// (при следующем запуске цикла отсчёт начнется неправильно без -1)
}
count++;
}
cout << "Длина самого короткого слова равна " << min << endl;
int i = min_i - min; // сделал по другому расчёт мин индекса
// у вас минимальный индекс ставится в конце слова, и из-за этого был неправильный вывод.
//Раз мин индекс в конце слова - начало этого слова это мин индекс - длина, а длина это min.
cout << "Это слово ";
while (!isspace(n[i])){ //и здесь вывод начинается с начала самого короткого слова,
// и до его конца, т.е. - пробела
cout << n[i];
i++;
}
}