0 / 0 / 0
Регистрация: 04.12.2011
Сообщений: 26
1

Определить самое короткое слово в строке

05.02.2012, 18:10. Показов 2030. Ответов 8
Метки нет (Все метки)

Считываем строку из файла и определяем самое короткое слово..Проблема в том, что самым коротким словом выводит пустоту...Я не понимаю в чемм проблема, помогите пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
string strr ;
   std::getline(ifs, strr);
            //Переменная типа string для хранения минимального слова
 string min_word = strr;
 //Переменная типа string для хранения текущего слова
 string word;
 
 //Выводим исходную строку
 cout << "Исходная строка:" << endl << strr << endl << endl;
 
 //Переменные для границ текущего слова
 string::size_type beg = 0;
 string::size_type end = 0;
 
 //Пока находим символы в строке следующие за пробелом отличные от пробела
 while((beg = strr.find_first_not_of(' ', end)) != string::npos) 
 {
 
  //Находим первый пробел за словом
  end = strr.find_first_of(' ', beg);
 
  //Если это конец строки
  if(end == string::npos)
   {//То присваиваем переменной end значение длины строки
   end = strr.length();
 
  //Извлекаем слово из строки
  word = strr.substr(beg, end - beg);
    }
 
  //Если длина текущего слова меньше минимального
  if(word.length() < min_word.length())
    {//Новое минимальное слово
    min_word = word;
    }
 }
 
 //Выводим результат работы
 cout << "Минимальное слово в строке:" << min_word << endl;
 cout << "Его длина: " << min_word.length() << endl;
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2012, 18:10
Ответы с готовыми решениями:

В заданной строке определить самое длинное и самое короткое слово
Ввести несколько строк,каждая из которых содержит некоторое количество слов.В заданной строке...

Определить, сколько раз встречается в строке самое короткое слово
Дана строка содержащая текст на русском языке.Определить, сколько раз встречается в строку самое...

Ввести строку с клавиатуры. Найти самое длинное слово в строке и самое короткое
Ввести строку с клавиатуры. Найти самое длинное слово в строке и самое короткое. Слова...

Напечатать самое длинное и самое короткое слово в строке
Напечатать самое длинное и самое короткое слово в строке в С++

8
go
Эксперт С++
3645 / 1377 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
05.02.2012, 18:28 2
Допусти есть строка s
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
 
typedef std::string T_str;
typedef std::vector<T_str> T_vec;
 
int split_str_to_vec(const T_str s, const T_str DELIM, T_vec &v)
{
   size_t l, r;
 
   for ( l = s.find_first_not_of(DELIM), r = s.find_first_of(DELIM, l) ; 
      l != std::string::npos ; l = s.find_first_not_of(DELIM, r), r = s.find_first_of(DELIM, l) )
      v.push_back(s.substr(l, r - l));
   return v.size();
}
 
int main()
{
   T_str s("Hello  world Hee Hi");
   T_vec v;
   
   split_str_to_vec(s, " \t\n", v);
   
   std::sort(std::begin(v), std::end(v), [] (const T_str a, const T_str b) { return a.size() < b.size(); });
   
   if ( v.size() ) 
      std::cout << v[0] << std::endl;
 
   return 0;
}
http://liveworkspace.org/code/... 0dba523c1f

Добавлено через 2 минуты
Еще можно использовать boost.
0
0 / 0 / 0
Регистрация: 04.12.2011
Сообщений: 26
05.02.2012, 18:40  [ТС] 3
go, тяжеловато для меня...там у меня проблема токо в том, наверное где я беру в переменную типа стринг текст из файла.
0
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
05.02.2012, 19:21 4
Цитата Сообщение от Alex_Reilly Посмотреть сообщение
go, тяжеловато для меня
Я постарался сделать побольше комментариев.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <cctype>
 
using namespace std;
 
string ShortWord(const string &line)
{
    string shortWord = ""; // переменная с результатом
 
    // перебираем побуквенно строку
    for (string::const_iterator it = line.begin(); it != line.end();)
    {
        string buffer;
        while (it != line.end() && isalpha(*it))        // пока текующий символ - буква
            buffer += *(it++);                          // добавляем его в буфер и переходим к следующему
        while (it != line.end() && !isalpha(*it)) ++it; // пропускаем небуквенные символы
        if (shortWord.empty() ||                        // если самое короткое слово пустое (не найдено) или
            shortWord.length() > buffer.length())       // найдено более короткое слово
            shortWord = buffer;                         // устанавливаем новое значение
    }
 
    return shortWord;
}
 
int main()
{
    ifstream fileStream("x.txt"); // поток для чтения из файла
    queue<string> lines;          // список из строк файла
    {
        // заполнение lines
        string line;
        while (fileStream) // пока поток доступен для чтения
        {
            getline(fileStream, line); // считываем одну строку
            if (!line.empty())         // если она не пуста
                lines.push(line);      // добавляем в список
        }
    }
    queue<string> shortWords; // список самых коротких слов
    {
        // заполнение shortWords
        string shortWord;
        while (!lines.empty()) // пока остались строки
        {
            shortWord = ShortWord(lines.front()); // находим самое короткое слово
            if (!shortWord.empty())               // если оно не пустое
                shortWords.push(shortWord);       // добавляем в список
            lines.pop();                          // переход к следующей строке
        }
    }
 
    while (!shortWords.empty()) // пока остались короткие слова
    {
        cout << shortWords.front() << endl; // выводим на экран
        shortWords.pop();                   // переход к следующему короткому слову
    }
    fileStream.close();
    cin.get();
}
1
2479 / 1906 / 951
Регистрация: 21.12.2010
Сообщений: 3,473
Записей в блоге: 10
05.02.2012, 19:36 5
вот эта строка должна быть вне if :
word = strr.substr(beg, end - beg);
1
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
06.02.2012, 01:16 6
Я бы реализовал эту задачу по-другому:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream.h>
using namespace std;
 
int main()
{
    FILE * f; 
    f = fopen("file.txt","r"); // Открываем файл
    char min_word[1000]; // Здесь будет самое короткое слово
    strcpy(min_word,""); // Очищаем созданную нами переменную (сразу после создания в нее попал мусор)
    while(!feof(f)) // Будем считывать слова с файла пока они там есть
    {
                   char temp[1000]; // Временная переменная
                   fscanf(f,"%s",temp); // Считываем очередно слово
                   if((strlen(temp) < strlen(min_word)) || (strlen(min_word) == 0))
                   // Если текущее слово короче min_word или переменная min_word пуста
                   {
                                   strcpy(min_word,temp); // Это пока что самое короткое слово
                   }
    }
    fclose(f); // Закрываем файл
    printf("%s\n",min_word); // Выводим результат
    getchar(); // Это нужно для того, чтобы прога не закрылась сразу
    return 0;
}
0
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
06.02.2012, 01:59 7
Нет, zago-vlad. Ваше решение не учитывает знаки препинания и прочие символы. Слово - это последовательность букв, а не то, что между пробелами.
0
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
06.02.2012, 02:25 8
Цитата Сообщение от Сtrl Посмотреть сообщение
Нет, zago-vlad. Ваше решение не учитывает знаки препинания и прочие символы. Слово - это последовательность букв, а не то, что между пробелами.
Просто написал первый код, который в голову пришел)
Но код проги можно поправить. Достаточно после считывания переменной temp либо посчитать в ней БУКВЫ вручную с помощью самописной функции и сравнивать это значение, либо посчитать количество знаков препинания в переменной temp и вычитить это значение из длины, полученой с помощью strlen().
0
go
06.02.2012, 11:30     Определить самое короткое слово в строке
  #9

Не по теме:

Цитата Сообщение от zago-vlad Посмотреть сообщение
Но код проги можно поправить.
Такое уже не правиться... Необходимо писать с нуля, заранее определившись с языком. :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2012, 11:30

Напечатать самое длинное и самое короткое слово в строке
. Напечатать самое длинное и самое короткое слово в этой строке. Вроде все выводиться но...

Найти самое длинное и самое короткое слово в строке
Вообщем, дано задание найти самое длинное и самое короткое слово в строке. Все хорошо работает, но,...

Найти самое короткое и самое длинное слово в строке
#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; using namespace...

Напечатать самое длинное и самое короткое слово в строке
Прошу помочь с решением задачи. Задана строка, состоящая из символов. Символы объединяются в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru