Как найти самое короткое слово в строке

Yes, the examples given are very different.

The first example effectively says:

Take the string s, split it by spaces, and then take each word, x, found and return the minimum value of just the length of x.

The second example effectively says:

Find the minimum value in the list generated by len(x) for x in s.split().

That first example generates an error because the min function expects to compare at least 2 or more elements, and only 1 is provided.

That second example works because the list that is generated by len(x) for x in s.split() converts a string, like say "Python types with ducks?" to a list of word lengths (in my example, it would convert the string to [6, 5, 4, 6]). That list that is generated (this is also why it’s called a generator), is what the min function then uses to find the minimum value inside said list.

Another way to write that first example so that it works like you would expect is like this

def find_short(s):
    min_length = float("inf")

    for x in s.split():
        if len(x) < min_length:
            min_length = len(x)

    return min_length

However, notice how you have to keep track of a variable that you do not have to define using the list generator method in your second example. Although this is not a big deal when you are learning programming for the first time, it becomes a bigger deal when you start making larger, more complex programs.

Sidenote:

Any value that follows the return keyword is what a function «outputs», and thus no more code gets executed.

For example, in your first example (and assuming that the error was not generated), your loop would only ever execute once regardless of the string you give it because it does not check that you actually have found the value you want. What I mean by that is that any time your code encounters a return statement, it means that your function is done.

That is why in my example find_short function, I have an if statement to check that I have the value that I want before committing to the return statement that exits the function entirely.

0 / 0 / 0

Регистрация: 12.11.2010

Сообщений: 14

1

Найти самое короткое слово в строке

28.04.2011, 19:25. Показов 31011. Ответов 4


Студворк — интернет-сервис помощи студентам

суть задачи такова: нужно найти самое короткое слово в введённой пользователем строке и записать его в обратном порядке,то есть,например : мама -> амам. По нахождению короткого слова идеи есть,но ещё не точно. Жду помощи



0



1552 / 918 / 193

Регистрация: 26.03.2010

Сообщений: 3,105

28.04.2011, 19:50

2

Какие идеи у вас есть?



0



pntuga

0 / 0 / 0

Регистрация: 12.11.2010

Сообщений: 14

28.04.2011, 21:28

 [ТС]

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string.h>
....
....
....
void main()
{clrscr();
 char str[255];int i,n,m,min,ns,ks;
 cout<<"vvedite stroku"<<endl;
 gets(str);
 n=strlen(str);
 ns=0;
for(i=0;i<n;i++)
if(str[i] = " ")   {kS=i;
                      if(i-1<min) {m=strlen(str);
                                      min=m;}
ns=ks+1;}

Добавлено через 54 минуты
допустим,если я буду рассматривать в массиве строку,то могу ли я каким-то образом находить длину каждого слова,а затем эту длину сравнивать с длиной другого слова?



0



babazoya

14 / 11 / 8

Регистрация: 28.12.2010

Сообщений: 43

28.04.2011, 23:50

4

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <conio.h>
#include <iostream.h>
#include <string.h>
int main( )
{
  char raz[]=" .,!?";            //массив разделителей слов
  char s[80];                //исходный текст
  char *slovo;             //указатель на очередное слово
  char *ks;               //ввод строки с пробелами
  cout<<"vvedite stroku ";
  cin.getline(s, 80);     //ввод строки с пробелами
  slovo=strtok(s, raz);  // Выделение первой лексемы
  int min; //кол-во букв в минимальном слове
  int n;
  n=0;
  min=1000;
  while(slovo!=0)              //нахождение минимальной длинны
  {
      n=strlen(slovo);
      if(n<min)
         min=n;
      slovo=strtok(0, raz); // выделение следующих лексем
  }
  slovo=strtok(s, raz);
  while(slovo!=0)              //нахождение минимального слова
  {
      n=strlen(slovo);
      if(n==min)
         ks=slovo;
      slovo=strtok(0, raz); // 
  }
  //операции перестановки бук в слове
  getch();
}

ks -минимальное слово
Дальше разберешься. Работает только, если в тексте 1 самое короткое слово.



1



0 / 0 / 0

Регистрация: 26.05.2011

Сообщений: 3

01.06.2011, 11:02

5

нужно найти самое короткое слово в введённой пользователем строке
на С нужно



0



Дано задание: В заданной строке найти самое длинное и самое короткое слово. Вывести их на экран и вывести их длину.

Самое длинное слово выводит, самое короткое нет, не получается, за длину слов даже и не пробовал выводить. Надеюсь на помощь, уже 5-й час ломаю мозг

Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    int main()
    {
        char string[200];

        printf("Input a sentences: ");

        gets(string);

        char * pch = strtok (string," "),
             * maxword = 0,
             * minword = 0;

        int length = strlen(pch);

        int maxLen = 0;
        int minLen = 1000;

          while (pch != NULL)
          {
              length = strlen(pch);

              if (maxLen < length )
              {
                  maxLen = length;
                  maxword = pch;
              }

              pch = strtok (NULL, " ");
          }

          while (pch != NULL)
          {
              length = strlen(pch);

              if (minLen > length )
              {
                  minLen = length;
                  minword = pch;
              }

              pch = strtok (NULL, " ");
          }

          for(char *pch = strtok(string, " "); pch; pch = strtok(NULL, " "))
        {
            if(length < minLen)
            {
                minLen = length;
                minword = pch;
                strcpy(string,pch);
            }
        }
          printf("The longest word is: %sn", maxword);
          printf("The least word is: %sn", minword);

        return 0;
    }
    `

Ainar-G's user avatar

Ainar-G

15.9k3 золотых знака24 серебряных знака41 бронзовый знак

задан 14 ноя 2019 в 22:47

alexander_kb19's user avatar

У вас в коде несколько ошибок, как фактических, так и стилистических, но
ответ на ваш вопрос можно свести к тому, что вы делаете в три цикла то,
что делается в один:

for (char *word = strtok(s, delims); word != NULL;
     word = strtok(NULL, delims)) {
    size_t len = strlen(word);

    if (len > max_len) {
        max_len = len;
        max_word = word;
    }

    if (len < min_len) {
        min_len = len;
        min_word = word;
    }
}

Полный рабочий код:

#include <stdint.h>

// size_t
// SIZE_MAX

#include <stdio.h>

// feof
// fflush
// fgets
// perror
// printf

#include <stdlib.h>

// NULL

#include <string.h>

// strtok
// strlen

enum { SIZE = 200 };

static const char delims[] = "tnr ";

int main()
{
    char s[SIZE];

    printf("enter a sentence: ");
    fflush(stdout);
    char *res = fgets(s, SIZE, stdin);
    if (!res && !feof(stdin)) {
        perror("can't get the sentence");
        return 1;
    }

    char *max_word = NULL;
    char *min_word = NULL;

    size_t max_len = 0;
    size_t min_len = SIZE_MAX;

    for (char *word = strtok(s, delims); word != NULL;
         word = strtok(NULL, delims)) {
        size_t len = strlen(word);

        if (len > max_len) {
            max_len = len;
            max_word = word;
        }

        if (len < min_len) {
            min_len = len;
            min_word = word;
        }
    }

    printf("the longest word is: %sn", max_word);
    printf("the shortest word is: %sn", min_word);

    return 0;
}

ответ дан 14 ноя 2019 в 23:56

Ainar-G's user avatar

Ainar-GAinar-G

15.9k3 золотых знака24 серебряных знака41 бронзовый знак

  1. Не ясно, почему вы ожидаете, что это вообще может работать. После завершения первого цикла while (поиск длинной строки) значение pch будет равно NULL. Второй цикл while (поиск короткой строки), разумеется, в такой ситуации будет просто пропущен.

  2. Как я понял, вместо того, чтобы разбираться со вторым циклом, вы написали третий цикл for, который пытается делать то, что не смог сделать второй цикл while

    Но функция strtok является разрушающей функцией — она модифицирует исходную строку путем замены некоторых символов на . Посте такой замены исходную строку уже невозможно обрабатывать повторным проходом все тем же strtok.

    Поэтому все ваши надежды на то, что вы сможете несколько раз пройтись по словам строки через strtok обречены на провал.

Если вы хотите, чтобы все ваши циклы работали через strtok, то вам придется каждому такому циклу предоставлять исходную, неповрежденную копию строки. Но лучше было бы обойтись без многочисленных проходов по строке. Для решения этой задачи одного прохода по исходной строке — более чем достаточно.

P.S. В стандартной библиотеке языка С уже давно нет функции gets.

ответ дан 14 ноя 2019 в 23:14

AnT stands with Russia's user avatar

Можно сделать так:

import re
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
words = re.sub("[^w]", " ",  s).split()
#  если просто найти все минимальные слова
t = [v for v in words if len(v) == len(min(words))]

# если все слова надо разделить по длине
from itertools import groupby
t1 = {k:list(v) for k,v in groupby(sorted(words, key=len), len)}

print(t1[min(t1)], t)

Самое короткое слово в строке

Уровень сложности:






  • Задание
  • Решение

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

Для решения задачи прочитайте статью — Строки в С++. Определить символ пробела в строке можно с помощью функции isspace. Чтобы определить длину слова, воспользуйтесь функцией strlen. пример вывода программы:

Автор программы — Сергей Киях. Задача решена с использованием класса string, собственно поэтому кода получилось так мало.

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::string s;

    std::cout << "Enter string: ";
    std::getline(std::cin, s);

    std::stringstream ss(s);
    std::string word(s);

    while (ss >> s)
          if (s.size() < word.size())
           word = s;

    std::cout << "Res: " << word << std::endl;

    return 0;
}

Результат  работы программы, показан ниже:

CppStudio.com

Enter string: Прокладывай себе дорогу силой.
Res: себе

Следующие статьи помогут вам в решении данной задачи:

Оставить комментарий

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

Понравилась статья? Поделить с друзьями:
  • Как найти техподдержку контакт
  • Как найти центр кривизны зеркала
  • Как найти частоту колебаний кинетической энергии
  • Как составить инвентаризационную опись образец
  • Как исправить нечеткое фото в фотошопе