take look at my solution
it uses a Dictionary
to store the words
with there lengths
class Program
{
static void Main(string[] args)
{
var longestWord = LongestWord("Hello Stack Overflow Welcome to Challenge World");
PrintTheLongestWord(longestWord.Key);
}
public static KeyValuePair<string, int> LongestWord(String statement)
{
Dictionary<string, int> wordsLengths = InitializeDictionary(statement.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries));
return GetMax(wordsLengths);
}
private static Dictionary<string, int> InitializeDictionary(string[] wordsList)
{
Dictionary<string, int> wordsLengths = new Dictionary<string, int>();
foreach (var word in wordsList)
{
wordsLengths[word] = word.Length;
}
return wordsLengths;
}
private static KeyValuePair<string, int> GetMax(Dictionary<string, int> dictionary)
{
KeyValuePair<string, int> max = new KeyValuePair<string, int>(" ", Int32.MinValue);
foreach (var item in dictionary)
{
if (item.Value.CompareTo(max.Value) > 0)
max = item;
}
return max;
}
public static void PrintTheLongestWord(string word)
{
Console.WriteLine($"the Longest word is {word} with length {word.Length}");
}
}
and here is another solution with one loop
public static string LongestWord2(String statement)
{
string max = "";
foreach (string word in statement.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries))
{
if (word.Length>max.Length)
{
max = word;
}
}
return max;
}
Нужно найти самое длинное слово в строке. 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 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
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
perfectperfect
9,94113 золотых знаков50 серебряных знаков113 бронзовых знаков
1
Raton_Laveur 0 / 0 / 0 Регистрация: 19.07.2013 Сообщений: 16 |
||||
1 |
||||
Найти самое длинное слово в строке20.11.2013, 18:18. Показов 75346. Ответов 13 Метки нет (Все метки)
В общем, нужно найти в строке самое длинное слово и вывести его, не создавая при этом новых строк. Всё находит, выводит, но после этого почему-то вылетает. Поняла только, что это происходит из-за части, где я уже записываю наверх найденное слово и пытаюсь стереть оставшуюся часть строки.
ЗЫ: Знаю, что способ нерациональный, дурацкий и всё такое, но при выполнении вроде всё правильно — и вылет=(((
0 |
Заблокирован |
||||||||||||
20.11.2013, 18:38 |
2 |
|||||||||||
«не создавая новых строк» не заметил, щас исправлю )
Почему оно работает вообще? память под строку не выделяется… Добавлено через 11 минут
Та, часть, кода, которая выполняла это: «//типа нахожу само это слово и записываю его в начало всё той же строки» вообще не нужна в задании.
1 |
Raton_Laveur 0 / 0 / 0 Регистрация: 19.07.2013 Сообщений: 16 |
||||
21.11.2013, 14:47 [ТС] |
3 |
|||
Да, неплохо тупанула, спасибо) Насчёт того, почему работает — на Си, по-моему, вообще практически любой бред работает, просто делает это соответственно глупости писавшего код)) Добавлено через 22 минуты Добавлено через 10 минут Добавлено через 42 минуты
0 |
9 / 9 / 2 Регистрация: 03.04.2016 Сообщений: 89 |
|
06.04.2016, 15:47 |
4 |
Здесь проги с ошибками, к сожалению. Правильного решения нет.
0 |
flash_back 20 / 20 / 20 Регистрация: 07.02.2016 Сообщений: 87 |
||||
16.06.2016, 16:05 |
5 |
|||
0 |
Qitelery 0 / 0 / 0 Регистрация: 17.05.2016 Сообщений: 58 |
||||
14.07.2017, 21:30 |
6 |
|||
Здравствуйте! На всякий случай задание: Входные данные Вводится одна строка. Слова в ней отделены одним пробелом. Выходные данные Выведите самое длинное слово. Если таких слов несколько, то выводить нужно, которое встречается раньше. мой код:
Думаю, что логика верна, но мне не хватает возможно синтаксической составляющей. К примеру, правильно ли я оперирую строками, когда набираю по буквам слова до пробела и когда делаю строку пустой. Пожалуйста помогите. Спасибо!
0 |
Геомеханик 837 / 640 / 940 Регистрация: 26.06.2015 Сообщений: 1,409 |
||||
15.07.2017, 03:34 |
7 |
|||
1 |
easybudda Модератор 11885 / 7258 / 1720 Регистрация: 25.07.2009 Сообщений: 13,276 |
||||
15.07.2017, 03:38 |
8 |
|||
Судя по стилю, нужен адский школьный «код», который к тому же должен в Borland TurboC++ компилироваться? Тогда вот:
1 |
0 / 0 / 0 Регистрация: 17.05.2016 Сообщений: 58 |
|
18.07.2017, 19:57 |
9 |
easybudda, Геомеханик, возможно выполнить данную задачу без применения char? Код должен компилироваться в C++. Использую ideone.com
0 |
easybudda Модератор 11885 / 7258 / 1720 Регистрация: 25.07.2009 Сообщений: 13,276 |
||||
18.07.2017, 20:17 |
10 |
|||
Код > g++ longest_word.cpp > ./a.out String: any many money more First longest word: money
1 |
Qitelery 0 / 0 / 0 Регистрация: 17.05.2016 Сообщений: 58 |
||||
21.07.2017, 20:22 |
11 |
|||
easybudda, возвращаясь к char, использовать что-то типа
можно? т.е. сделать так, чтобы не задавать изначально максимальные размер массива, потому что мало ли какого размера будет вводимый массив.
0 |
no swear 192 / 166 / 82 Регистрация: 01.07.2016 Сообщений: 942 |
||||
21.07.2017, 20:49 |
12 |
|||
монжо так:
Добавлено через 54 секунды
1 |
3434 / 2813 / 1249 Регистрация: 29.01.2016 Сообщений: 9,426 |
|
21.07.2017, 22:59 |
13 |
т.е. сделать так, чтобы не задавать изначально максимальные размер массива, потому что мало ли какого размера будет вводимый массив. Для этого и существует std::string.
1 |
Qitelery 0 / 0 / 0 Регистрация: 17.05.2016 Сообщений: 58 |
||||
22.07.2017, 18:41 |
14 |
|||
В общем ларчик открылся следующим образом))
0 |
Необходимо:
Осуществить взаимодействие клиента и сервера на основе протокола 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» определяет длину самого длинного слова, а часть когда перед этим, как раз разделяет строку и выводит отдельно слова.
Но всё вместе я не могу это совместить.
Самое длинное слово в строке
Уровень сложности:
- Задание
- Решение
Дана строка символов. Признак конца строки — символ '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: сегодняшним
Следующие статьи помогут вам в решении данной задачи:
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.