Как найти слово максимальной длины

Нужно найти самое длинное слово в строке. BAЖНО! Без класса string! проблема в том что код, не работает. и мне выводит всю строку вместо самого длинного слова

 #include <iostream>
    #include <locale>
    #include <cstring> 
    using namespace std;

int main()
{
    setlocale(LC_ALL, "rus");
    char S[100];
    int n, i, k, kol, max = 0, y,g,j=0;
    cin.getline(S, 100);
    int p;
    i = 0;
    for (int l=0;l<strlen(S);l++)//проходимся по длине строки, и ищем пробелы, и после каждого меряем слово.
    {
    while (S[l] != ' ')
    {
        if (S[l] == ' ')
        {
            p=l;
            l++;
        }
        else
        {

            do
            {
                l++;
            } while (S[l] != ' ');    //длина слова
             kol = strlen(S)-l-p; //длина слова  //p последний пробел
            if (kol > max)
            {
                l++;
                     ///max word
                max = kol;
            }

        }

     }
    }
    for (n; n<k; n++)
    {
        cout << S[n];
    }
    cout << " - самое длинное слово" << endl;

    system("pause");
}

задан 8 апр 2017 в 16:13

Awesome Man's user avatar

Awesome ManAwesome Man

6643 золотых знака15 серебряных знаков31 бронзовый знак

16

У вас на мой вкус сложновато…
Я бы делал так:

int main()
{
    const int STRLEN = 200;
    char s[STRLEN];
    cin.getline(s, STRLEN);

    size_t maxlen = 0;
    char * maxidx = nullptr;

    for(char * c = s; *c;)
    {
        while(*c == ' ') ++c;
        if (*c == 0) break;
        char * begin = c;
        while(*c && *c != ' ') ++c;
        if (maxlen < (c - begin))
        {
            maxlen = c - begin;
            maxidx = begin;
        }
    }
    if (maxlen == 0)
    {
        cout << "Empty line!n";
        return 0;
    }
    else
    {
        *(maxidx+maxlen) = 0;
        cout << maxidx;
    }
}

ответ дан 8 апр 2017 в 16:33

Harry's user avatar

HarryHarry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

2

Не уверен что это поможет вам, вот рабочий код:

#include <iostream>

using namespace std;

int main() {
    // сторка
    char * theString = " dsjfkd1 sdf2 dsfkdsj3   sdfjsdkjfdsjf4   d5 ";
    char * theLetter = theString; // здесь будем хранить адрес очередного символа начинаяя с первого
    unsigned counter = 0, // счетчик подсчета букв в слове
        storage = 0; // здесь будем хранить количество букв самого большого слова

    while (*theLetter) { // повторять пока не прийдет нулевой символ конца
        theLetter++; // увеличиваем очерной адрес на размер символа

        if (*theLetter != ' ') // если не пробел
            counter++; // увеличиваем счетчик
        else
            if (counter > storage) { // если букв больше чем мы знали раньше ,
                storage = counter;   // то сохраним это число
                counter = 0; // апотом обнулим счетчик подсчета
            }
    }

    cout << storage << endl; // результат
}

ответ дан 8 апр 2017 в 16:55

perfect's user avatar

perfectperfect

9,93113 золотых знаков50 серебряных знаков113 бронзовых знаков

1

How can I use python to find the longest word from a set of words?
I can find the first word like this:

'a aa aaa aa'[:'a aa aaa aa'.find(' ',1,10)]

'a'

rfind is another subset

'a aa aaa aa'[:'a aa aaa aa'.rfind(' ',1,10)]

'a aa aaa'

asked Jul 28, 2009 at 9:10

Niklas Rosencrantz's user avatar

2

If I understand your question correctly:

>>> s = "a aa aaa aa"
>>> max(s.split(), key=len)
'aaa'

split() splits the string into words (seperated by whitespace); max() finds the largest element using the builtin len() function, i.e. the string length, as the key to find out what “largest” means.

answered Jul 28, 2009 at 9:15

balpha's user avatar

balphabalpha

49.8k18 gold badges109 silver badges131 bronze badges

0

Here is one from the category “How difficult can you make it”, also violating the requirement that there should be no own class involved:

class C(object): pass
o = C()
o.i = 0
ss = 'a aa aaa aa'.split()
([setattr(o,'i',x) for x in range(len(ss)) if len(ss[x]) > len(ss[o.i])], ss[o.i])[1]

The interesting bit is that you use an object member to maintain state while the list is being computed in the comprehension, eventually discarding the list and only using the side-effect.

But please do use one of the max() solutions above 🙂 .

answered Jul 28, 2009 at 9:53

ThomasH's user avatar

ThomasHThomasH

22.1k13 gold badges60 silver badges61 bronze badges

1

I thought it meant more like (code below) which outputs the longest word in the string. In this case it is “sentence” however, simply change return(len(s)) which would output howmany characters are in the longest word which would be 8.

def longest_word(text):
    s = max(text.split(), key = len)
    return(s)

if __name__ == "__main__":
    print(longest_word("This is a sentence with words and such."))

Flair's user avatar

Flair

2,5191 gold badge27 silver badges40 bronze badges

answered Sep 5, 2021 at 0:22

APPrentice's user avatar

Another way to find longest word in string:

a="a aa aaa aa"
b=a.split()
c=sorting(b,key=len)
print(c[-1])    

answered Jan 21, 2017 at 10:44

Rohit's user avatar

RohitRohit

194 bronze badges

def largest_word(sentence):
    split_sentence = sentence.split(' ')
    largest_word = ''
    for i in range(len(split_sentence)):
        if len(split_sentence[i]) > len(largest_word):
           largest_word = split_sentence[i]
    print(largest_word)


sentence = "Improve your coding skills with python"

largest_word(sentence)

answered Aug 14, 2018 at 18:39

Md Shafiqul Islam's user avatar

Необходимо:
Осуществить взаимодействие клиента и сервера на основе протокола UDP.
Функционирование клиента и сервера реализовать следующим образом:
клиент посылает набор слов, сервер возвращает слово с максимальным количеством букв.

Клиент:

#include <winsock2.h> 
#include <iostream> 
#include <stdlib.h> 
 
#pragma comment(lib,"Ws2_32.lib") 
using namespace std;
 
int main() { 
  WORD wVersionRequested; 
  WSADATA wsaData; 
  wVersionRequested = MAKEWORD(2, 2); 
  WSAStartup(wVersionRequested, &wsaData); 
  struct sockaddr_in peer; 
  peer.sin_family = AF_INET; 
  peer.sin_port = htons(1280); // т.к. клиент и сервер на одном компьютере, пишем адрес 127.0.0.1 
  peer.sin_addr.s_addr = inet_addr("127.0.0.1"); 
  SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); 
  int size = sizeof(peer); 
  char buf[255], b[255]; 
  cout << "Please, enter the string." << endl; 
  cin.getline(buf, 100, 'n'); 
  sendto(s, buf, sizeof(buf), 0, (sockaddr *)&peer, size); 
  if (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&peer, &size) != 0) { 
    b[strlen(b)] = ''; //Удаление ненужных символов в конце строки 
    cout << b << endl; 
    cin.get(); 
    } 
  closesocket(s); 
  WSACleanup(); 
  return 0; 
}

Сервер:

#include <winsock2.h> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
 
#pragma comment(lib,"Ws2_32.lib") 
using namespace std;
 
int main() { 
  WORD wVersionRequested; // максимальный номер версии WinSock
  WSADATA wsaData; // структура для WSAStartup
  wVersionRequested = MAKEWORD(2, 2); // инициализируем WinSock API
  WSAStartup(wVersionRequested, &wsaData); 
 
  SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); // Создаем серверный сокет
 
  struct sockaddr_in local; // Создаем структуру данных соединения
  local.sin_family = AF_INET; // Поле sin_family всегда имеет значение AF_INET
  local.sin_port = htons(1280);  // Слушаем 1280 порт
  local.sin_addr.s_addr = htonl(INADDR_ANY); // Слушаем все сетевые соединения
  int size = sizeof(local); 
  int c = bind(s, (struct sockaddr*)&local, size); // Связываем сокет с соединением
 
  int r = listen(s, 5); // Инициализируем прослушивание сокета
  cout<<"Server is ready!n"<<endl;
 
  while (true) { // Запускаем бесконечный цикл сервера
    char res[255], b[255]; 
    int length;
    while (recvfrom(s, b, sizeof(b), 0, (sockaddr *)&local, &size) != 0) { 
 
        
   //curlen - текущая длина слов
   //maxlen - максимальная длина слова
   //index - индекс, соответствующий позиции
   //конца самого длинного слова +1
    
char * str = strtok (b," ");
//int curlen = 0, maxlen = 0, index = 0, i;
 
while (str != NULL){
    cout << str << endl;
    str = strtok (NULL," ");}
/*  
 for(i=0;i < strlen(b);i++)
   {
     if(b[i] == ' '|| b[i]==''){
         if(curlen>maxlen){
           maxlen = curlen;
             index = i;
         }
         //если конец строки -> выйти из цикла
        if(b[i]=='')break;
         curlen = 0;
      }
      else curlen++;
   }*/
 
//cout << b << endl << strlen (b);
//cout << str << endl;
//cout << maxlen << endl;
 //cout << " " << endl << b;
}
  // Посылает данные на соединенный сокет 
  sendto(s, b, sizeof(b), 0, (struct sockaddr*)&local, size); 
  } 
 
  closesocket(s); //завершаем работу сокета
  //} 
  WSACleanup(); 
}

Я понимаю, что надо сделать, но не могу реализовать. Чтобы вывести слово максимальной длины, необходимо разбить строку на слова, а потом определять длину.
Часть кода, которая в комментариях начиная с цикла “for” определяет длину самого длинного слова, а часть когда перед этим, как раз разделяет строку и выводит отдельно слова.
Но всё вместе я не могу это совместить.

Перейти к содержанию

Самое длинное слово в строке

Просмотров 24.5к. Обновлено 15 октября 2021

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

Следует ввести счетчик букв в слове. В цикле по символам строки пока очередной символ не пробел, счетчик увеличивается. Как только встречается пробел, следует сравнить значение счетчика со значением, записанным в переменной для хранения размера самого длинного слова. Если слово, которое сейчас было «измерено», длиннее, то записать его длину в эту переменную. Кроме того, надо запомнить индекс начала этого слова. Он определяется вычитанием длины слова из текущего индекса.

После того, как очередное слово было обработано, надо сбросить счетчик букв на 0.

Поскольку последнее слово может не оканчиваться пробелом, то оно будет не учтено. Поэтому после цикла надо проверить текущее значение счетчика букв.

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

Pascal

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


var
s: string;
i, id, len, max, count: byte;

begin
readln(s);
len := length(s);
max := 0; // длина самого длинного слова
id := 0; // индекс начала самого длинного слова
count := 0;
for i:=1 to len do
if s[i] <> ' ' then
count := count + 1
else begin
if count > max then begin
max := count;
id := i - count;
end;
count := 0
end;

if count > max then begin // проверка последнего слова
max := count;
id := len - count + 1;
end;

writeln(copy(s,id,max));
end.



one two three four five six seven
three

Язык Си


#include < stdio.h>
#include < string.h>
main() {
char s[100];
int i, id, max, count, len;
gets(s);
len = strlen(s);
max = 0;
id = 0;
count = 0;
for (i=0; i< len; i++)
if (s[i] != ' ') count += 1;
else {
if (count > max) {
max = count;
id = i - count;
}
count = 0;
}

if (count > max) {
max = count;
id = i - count;
}
max += id;
for (i=id; i< max; i++)
putchar(s[i]);
printf("n");
}

Python

найти самое длинное слово в строке python (питон)


# Вариант 1 - классический алгоритм
s = input()
l = len(s)
m = 0
ind = 0
count = 0
for i in range(l):
if s[i] != ' ':
count += 1
else:
if count > m:
m = count
ind = i - count
count = 0

if count > m:
m = count
ind = i - count + 1

print(s[ind:ind+m])

# Вариант 2 - с помощью встроенных функций и методов
s = input()
s = s.split()
print(max(s, key=len))

КуМир


алг самое длиное слово
нач
лит s
цел i,id,len,mx,count
ввод s
len := длин(s)
mx := 0
id := 0
count := 0
нц для i от 1 до len
если s[i] <> " " то
count := count + 1
иначе
если count > mx то
mx := count
id := i - count
все
count := 0
все
кц
если count > mx то
mx := count
id := len - count
все
вывод s[id:id+mx]
кон

Basic-256


input s$
l = length(s$)
m = 0
id = 0
c = 0
for i=1 to l
b$ = mid(s$,i,1)
if b$ <> " " then
c = c + 1
else
if c > m then
m = c
id = i -c
endif
c = 0
endif
next i

if c > m then
m = c
id = i-c
endif

print mid(s$,id,m)

Самое длинное слово в строке

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






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

Дана строка символов. Признак конца строки — символ 'n' (переход на новую строку). Строка состоит из слов, которые отделены друг от друга пробелами. Вывести самое длинное слово и его порядковый номер.

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

Ниже приведен код для этой задачи. Код самый простой и может усовершенствоваться (например разбиение его на несколько отдельных функции). Код нам предоставил пользователь — Василий Шуверов. Скажем ему: «Спасибо!».

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

char s[100000];
int  number [10000];
char a;

int i,j=0,n=0,k=0, g, max=0, hulp=0, hulp_1=0;

/*Набор текста и одновременный подсчет длины каждого слова.*/

 for (i=0;i<100000;++i)
 {

    s[i]=getchar();

if (s[i]=='n')
{
   number[k]=j;
   break;
}

    ++n;

    if (s[i] != ' ')
    {
        ++j;
    }

    if (s[i]==' ')
    {
        number[k]=j;
        ++k;
        j=0;
    }

 }

printf("n");

/*Отыскание самого длинного слова и его позиции в тексте */

max=number[0];
 for (g=0;g<k;++g)
 {

if (number[g]>max)
{
    max=number[g];
    hulp=g;
}
 }

++hulp;

/*Вывод на экран самого длинного слова и его позиции */

 printf("The longest word at number %d: ", hulp);

 for (g=0;g<n;++g)
 {
     if (s[g]==' ')

     {
         ++hulp_1;
     }
     if (hulp-hulp_1==1)
     printf("%c", s[g]);

     if (hulp_1>g)
     break;

 }

   return 0;
}

Результат:

CppStudio.com

Лишь очень немногие живут сегодняшним днем. Большинство готовится жить позднее.
n

The longest word at number 5:  сегодняшним

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

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

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

Добавить комментарий