Последнее слова в последовательности

  • Автор темы Kilin
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

Kilin

#1
Надо написать функцию которая будет выводит последнее слова.Первая строка должна содержать одну линию, что является не более 1000 знаков с пробелами и вывод должен быть только слова с большими буквами

Ввод
Qwerty usually test Buffalo
Вывод
BUFFALO
---------------------------------------------------------------------------------------------
Ввод
The you term the get with can ?
Вывод
CAN
 
F

flashkpi

#2
Если что пишите, сделаем
icq: 588002847
email: flash_1989@ukr.net
 

DarkKnight

Well-known member
01.08.2010
653
0
#4
Ну если решил, то выложи.... Может кому-нибудь другому пригодится....
Если конечно не сложно...
 
K

Kilin

#5
Код:
#include <iostream>

using namespace std;

int main()
{
int a;
char ch[1000];
cin.getline(ch,1000);

for (int i=0; i<strlen(ch); i++)
{
if (ch[i]==' ')
a=i;}
for (int i=a+1; i<strlen(ch); i++)
{
if (islower(ch[i]))
ch[i]=toupper(ch[i]);
if(isalpha(ch[i])) 
cout << ch[i];
}
cout<<" ";
return 0;
}
этот код правильный,но я хочу решить эту задачу если последовательность кончается на символы,то вывести последнее слова.
Например если ввести Can you can the can with can?,код работает правильно,а если ввести Can you can the can with can ?,код не работает
 

lazybiz

Well-known member
03.11.2010
1 339
0
#6
У меня такое предчувствие что твоя программа работает в корне не правильно. Попробуй введи "that that that and and".
 

DarkKnight

Well-known member
01.08.2010
653
0
#7
Лично я бы написал бы такое решение

C++:
#include <iostream>
#include <ctype.h>

using namespace std;

int main()
{
int a;
char ch[1000];
cin.getline(ch,1000);

strcpy(ch,strupr(ch)); //Переведем в верхний регистр

char buffer[128]; //Введем буферную переменную
memset(buffer,0,128); //Обнулим ее
char *pStr = buffer; //Введем указатель на буферную перемнную

int Max = 0; //Текущий максимум вхождений слова
char Result[128]; //Результирующее слово
for (int i=0; i<=strlen(ch);i++) //Обойдем всю строку и ее заверщающий символ
{
if (isspace((unsigned char)ch[i]) || iscntrl((unsigned char)ch[i])) //Если разделитель и управляющий символ (в нашем случае завершающий) то
{																  //usigned char - что бы русский язык понимали
int nMax = 0; //Введем промежуточный счетчик слов
char *ptrMax = ch; //Введем указатель на ch(искомую строку)
if (strlen(buffer)) //Длина буфера не нулевая (нулевой она может быть при подряд идущих разделителях
{
while (strstr(ptrMax,buffer)) //Пока есть входимость слова buffer(текущего) в строку на которую указывает ptrMax
{
ptrMax = strstr(ptrMax,buffer) + strlen(buffer); //Сдвиним указатель за первое вхождение buffer
nMax++; //Увеличим счетчик
}
if (nMax >= Max) //Сравним максимальное значение с текущим если больше либо равно перезапишим результат
{
Max = nMax;
strcpy(Result,buffer);
}
cout<<buffer<<" - "<<nMax<<endl; // Для отладки Слово - кол-во встречаимости
memset(buffer,0,128); //Обнулим буферную переменую
pStr = buffer; //Установим указатель на начало буфера
}
continue; //Выйдем из это итерации (продолжим цикл)
}
*pStr = ch[i]; //Посимвольно пишим символы в буфер из ch
pStr++; //Сдвиг указателя 
}

cout<<"Result : '"<<Result<<"' this word in "<<Max<<" count";
}
 
K

Kilin

#8
Ой ,я кажется перепутал задачу,надо найти последнее слова,а не слова встречаюшаяя больше всех,и если последовательность кончается на символы то все равно выводит посл. слова.Я решил задачу,но я еще решить если последовательность кончается на символы, и символ стоит отдельно.Мне нужен код который выводит последнее слова и для такой ситуации:The you term the ultra with can ? Код должен вывести CAN
 

DarkKnight

Well-known member
01.08.2010
653
0
#9
Ну ты веселый парень ;-)))) Немного позже посмотрю тогда ;-)
 

DarkKnight

Well-known member
01.08.2010
653
0
#10
C++:
#include <iostream>
#include <ctype.h>

using namespace std;

int main()
{
int a;
char ch[1000];
cin.getline(ch,1000);

strcpy(ch,strupr(ch)); //Переведем в верхний регистр /* хотя для этой Задачи - это уже лишнее */

char buffer[128]; //Введем буферную переменную
memset(buffer,0,128); //Обнулим ее
char *pStr = buffer; //Введем указатель на буферную перемнную

char Result[128]; //Результирующее слово

for (int i = 0; i <= strlen(ch); i++) //Обойдем всю строку включая завершающий символ
{
if ((unsigned char)isalnum(ch[i])) //Если символ букво-циферный то
{
*pStr = ch[i]; //Посимвольно пишим символы в буфер из ch
pStr++; //Сдвиг указателя 
}
else if (strlen(buffer)) //Если же не буквенно-циферный и в buffer - что то есть то
{
strcpy(Result,buffer); //Скопируем из буфера в результат
memset(buffer,0,128); //Обнулим буферную переменную
pStr = buffer; //Установим указатель на начало буфера
}
}
cout<<"Result : '"<<Result<<"'"; //Выведим результат

}
 
K

Kilin

#11
Спасибо DarkKnight125!!
Оказывается мне cktletn польностью посмотреть биб-ку ctype
 

DarkKnight

Well-known member
01.08.2010
653
0
#12
Пожалуйста.
Ты понял, что именно из ctype.h я взял только isalnum()....

Вот глянь еще задачку http://codeby.net/ipb.html?s=&sh...st&p=189000, что бы лучше понять принип, смыслы разные а реализация почти один в один....
 
Статус
Закрыто для дальнейших ответов.