Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Alex_Reilly
0 / 0 / 0
Регистрация: 04.12.2011
Сообщений: 26
05.02.2012, 18:10     Определить самое короткое слово в строке #1
Считываем строку из файла и определяем самое короткое слово..Проблема в том, что самым коротким словом выводит пустоту...Я не понимаю в чемм проблема, помогите пожалуйста
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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
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/7812d2...94fd0dba523c1f

Добавлено через 2 минуты
Еще можно использовать boost.
Alex_Reilly
0 / 0 / 0
Регистрация: 04.12.2011
Сообщений: 26
05.02.2012, 18:40  [ТС]     Определить самое короткое слово в строке #3
go, тяжеловато для меня...там у меня проблема токо в том, наверное где я беру в переменную типа стринг текст из файла.
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 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();
}
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
05.02.2012, 19:36     Определить самое короткое слово в строке #5
вот эта строка должна быть вне if :
word = strr.substr(beg, end - beg);
zago-vlad
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;
}
Сtrl
 Аватар для Сtrl
138 / 128 / 3
Регистрация: 19.07.2011
Сообщений: 184
06.02.2012, 01:59     Определить самое короткое слово в строке #7
Нет, zago-vlad. Ваше решение не учитывает знаки препинания и прочие символы. Слово - это последовательность букв, а не то, что между пробелами.
zago-vlad
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
06.02.2012, 02:25     Определить самое короткое слово в строке #8
Цитата Сообщение от Сtrl Посмотреть сообщение
Нет, zago-vlad. Ваше решение не учитывает знаки препинания и прочие символы. Слово - это последовательность букв, а не то, что между пробелами.
Просто написал первый код, который в голову пришел)
Но код проги можно поправить. Достаточно после считывания переменной temp либо посчитать в ней БУКВЫ вручную с помощью самописной функции и сравнивать это значение, либо посчитать количество знаков препинания в переменной temp и вычитить это значение из длины, полученой с помощью strlen().
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2012, 11:30     Определить самое короткое слово в строке
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
go
06.02.2012, 11:30     Определить самое короткое слово в строке
  #9

Не по теме:

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

Yandex
Объявления
06.02.2012, 11:30     Определить самое короткое слово в строке
Ответ Создать тему
Опции темы

Текущее время: 06:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru