2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
1

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

10.11.2016, 18:51. Показов 1233. Ответов 11
Метки нет (Все метки)

Задача:
Ввести строку, содержащую несколько слов. Определить самое длинное и самое короткое слово.
Код:
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
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char str[256], count[256], max[256], min[256];
    cout << "Введите строку: " << endl;
    cin.getline(str, 256);
    int word = 0;
    for (int i = 0; str[i] != ' '; i++)
    {
        max[i] = str[i];
        min[i] = str[i];
    }
    for (int i = 0, j = 0; str[i] != '\0'; i++, j++)
    {
        count[j] = str[i];
        if (str[i] = ' ')
        {
            if (max[j+1] = ?)
            {
                for (int k = 0; count[k] != ' '; k++)
                max[k] = count[k];
            }
            if (min[j+1] != ?)
            {
                for (int k = 0; count[k] != ' '; k++)
                min[k] = count[k];
            }
            j = 0;
        }
    }
    cout << "Самое длинное слово: " << max << endl << "Самое короткое слово: " << min << endl;
    system("pause");
    return 0;
}
Можно ли ввести что-нибудь вместо "?", что обозначало бы отсутствие символа?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2016, 18:51
Ответы с готовыми решениями:

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

Дан текст из нескольки строк, определить самое длинное и самое короткое слово
Вот задание: Дан текст из нескольки строк, определить самое длинное и самое короткое слово.... Я...

Ввести строку, содержащую несколько слов. Определить самое длинное и самое короткое слово
Здравствуйте, не могли бы мне помочь с кодом. Как его переписать, чтобы программа работала? ...

Определить самое длинное и короткое слово
Задача: Ввести строку, содержащую несколько слов. Определить самое длинное и самое корот-кое...

11
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
10.11.2016, 18:58 2
Цитата Сообщение от narsky Посмотреть сообщение
if (max[j+1] = ?)
а это работает вообще? О_о
0
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
10.11.2016, 19:14  [ТС] 3
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
а это работает вообще? О_о
Нет х)
Я не знаю, что подставить вместо "?", что означало бы отсутствие какого-либо символа в этом номере строки. Я даже не знаю, существует ли такая вещь
Но к сожалению, алгоритма получше я придумать не смог
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
10.11.2016, 20:09 4
Цитата Сообщение от narsky Посмотреть сообщение
if (str[i] = ' ')
у вас везде в if присваивание идет, а не сравнение... а что значит:
Цитата Сообщение от narsky Посмотреть сообщение
означало бы отсутствие какого-либо символа в этом номере строки
? не очень понятно?

Добавлено через 8 минут
ладно... пофиг... на самом деле задача примитивная, нужно:
1) Получить строку
2) Разбить ее на слова (т.е. разделить по символу " " - пробел)
3) Пройтись по всем разбитым словам и посчитать кол-во символов...

1-е у вас есть...
делаем второе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <sstream>
#include <vector>
 
void split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss;
    ss.str(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
}
 
 
std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
как пользоваться:

C++
1
2
3
4
5
6
int main()
{
   string somestring;
 
   vector<string> result = split(somestring, ' '); // разделить по пробелам
}
Дальше... у строки есть такой метод, называется: size() - он возвращает кол-во символов в строке... соответственно, нужно пройтись по разбитой строке и узнать размеры минимальных и максимальных эл-тов...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int index = 0;
int minvalue = 100000;
int minvalueindex = 0;
 
int maxvalue = 0;
int maxvalueindex =0;
for (string item : split(somestring, ' '))
{
   int currentItemSize = item.size();
   if (minvalue > currentItemSize)
   {
          minvalue = currentItemSize;
          minvalueindex = index;
   }
 
   if (maxvalue < curentItemSize)
   {
        maxvalue = curenItemSize;
        maxvalueindex = index;
   }
   ++index;
}
собственно - всё... я домой погнал, до завтра
1
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
10.11.2016, 20:15  [ТС] 5
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
у вас везде в if присваивание идет, а не сравнение...
Упс, такое у меня часто бывает, к сожалению х) Везде исправил
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
? не очень понятно?
Ну покажу вам пример:
Вот допустим, ввели мы строку - dasd das dsaassda
Первые 4 символа записываются в переменную max и min.
Доходим до момента, когда str[i] == ' '. Там чуть-чуть не правильно, но не суть. Получается, что count[j-1] - определенно какой-то символ, и нужно проверить, существует ли в строке max с этим номером (j) какой-либо символ. Если существует, то ничего не происходит, если не существует или там пробел, то переменной max присваиваются значения count.
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
10.11.2016, 20:47 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
29
30
31
32
33
#include <iostream>
#include <string>
#include <sstream>
#include <set>
using namespace std;
 
int main()
{
    string str;
    getline(cin, str);
 
    istringstream isstrm(str);
 
    auto f =
        [] (const string& str1, const string& str2)
    {
        return str1.size() < str2.size();
    };
 
    set<string, decltype(f)> strSet(f);
    for (string temp; isstrm >> temp;)
        strSet.emplace( move(temp) );
 
 
    if (!strSet.empty())
    {
        cout
            << *strSet.cbegin() << endl
            << *strSet.crbegin() << endl;
    }
 
    system("pause");
}
0
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
10.11.2016, 21:03  [ТС] 7
Maxim Prishchepa, премного благодарен)
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
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
 
void split(const string &s, char delim, vector<string> &elems) {
    stringstream ss;
    ss.str(s);
    string item;
    while (getline(ss, item, delim)) {
        elems.push_back(item);
    }
}
 
 
vector<string> split(const string &s, char delim) {
    vector<string> elems;
    split(s, delim, elems);
    return elems;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    string somestring;
    cout << "Введите строку: " << endl;
    getline(cin, somestring);
    vector<string> result = split(somestring, ' ');
    int index = 0;
    int minvalue = 100000;
    int minvalueindex = 0;
 
    int maxvalue = 0;
    int maxvalueindex =0;
    for (string item : split(somestring, ' '))
    {
        int currentItemSize = item.size();
        if (minvalue > currentItemSize)
        {
            minvalue = currentItemSize;
            minvalueindex = index;
        }
        if (maxvalue < currentItemSize)
        {
            maxvalue = currentItemSize;
            maxvalueindex = index;
        }
        ++index;
    }
    cout << "Самое длинное слово: " << ?[maxvalueindex] << endl << "Самое короткое слово: " << ?[minvalueindex] << endl;
    system("pause");
    return 0;
}
Только я так и не смог разобраться, какая переменная отвечает за разбитые слова (т.е., их написание, а не порядковый номер), не подскажете, какую переменную нужно вставить вместо "?" в одной из последних строк?)
P.S. Надеюсь, Вы не обидитесь, поскольку я удалил в Вашем коде все "std::" и воспользовался этой библиотекой непосредственно, не привык так писать х)

Добавлено через 6 минут
Ferrari F1, не работает, "Ошибка C3497: нельзя сформировать экземпляр лямбда-выражения", возможно это уже из-за операционной системы, компилятора и т.д.
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
10.11.2016, 21:09 8
narsky, эмм, тогда хз в чем мб проблема)
но в онлайн иде вроде нарм робит
http://cpp.sh/6k6g
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
11.11.2016, 13:41 9
Лучший ответ Сообщение было отмечено narsky как решение

Решение

Цитата Сообщение от narsky Посмотреть сообщение
Надеюсь, Вы не обидитесь, поскольку я удалил в Вашем коде все "std::"
код сей был вероломно скомунизден со стековерфлоу раз так 100500, так что мне как-то все едино
по поводу что вставить...
вместо
Цитата Сообщение от narsky Посмотреть сообщение
C++
1
for (string item : split(somestring, ' '))
должно быть:
C++
1
for (string item : result)
и соответственно:
C++
1
cout << "Самое длинное слово: " << result[maxvalueindex] << endl << "Самое короткое слово: " << result[minvalueindex] << endl;
1
Форумчанин
Эксперт CЭксперт С++
8191 / 5041 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.11.2016, 13:53 10
Лучший ответ Сообщение было отмечено narsky как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::istringstream ist(str);
    auto p = std::minmax_element(std::istream_iterator<std::string>(ist), std::istream_iterator<std::string>(),
        [](const std::string &s1, const std::string &s2) { return s1.length() < s2.length(); });
    std::cout << "Min length: " << *p.first << "\nMax length: " << *p.second << std::endl;
}
Добавлено через 4 минуты
Не за чем вообще доп. контейнеры.
Можно даже решить так, по старинке без STL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <sstream>
#include <string>
 
int main()
{
    std::string str, min, max, word;
    std::getline(std::cin, str);
    std::istringstream ist(str);
    ist >> word;
    min = max = word;
    while (ist >> word)
    {
        if (min.length() > word.length()) min = word;
        if (max.length() < word.length()) max = word;
    }
    std::cout << "Min length: " << min << "\nMax length: " << max << std::endl;
}
2
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 142
11.11.2016, 14:03  [ТС] 11
Maxim Prishchepa, MrGluck, покорно благодарю, все работает
0
Maxim Prishchepa
11.11.2016, 15:34     Определить самое длинное и короткое слово
  #12

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Не за чем вообще доп. контейнеры.
Можно даже решить так, по старинке без STL:
можно, но вариант с контейнерами более интуитивно понятен и будет проще объяснить вского рода преподам, чо там происходит ;) хотя ваш вариант безусловно лучше для прода ;)

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

Поменять местами самое длинное слово и самое короткое слово в тексте
Пусть есть двумерный массив, заполненный символами. Рассматривать его как многострочный текст,...

Поменять местами в предложении самое длинное и самое короткое слово
Сам код, но тут 12 ошибок выдает в логе: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Найдите самое длинное, и самое короткое слово в заданном предложении
Найдите самое длинное и самое короткое слово в заданном предложении.

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

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

В каждом предложении требуется поменять местами самое длинное и самое короткое слово
Введите текст, заканчивающийся знаком *. Каждое предложение заканчивается точкой. В каждом...


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

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

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