** nick |
Отправлено: 29.12.2004, 15:36 |
|
Не зарегистрирован
|
Составит программу, преобразующую введенное с клавиатуры предложение таким образом, чтобы оно содержало только слова, являющиеся отражением друг друга (например, слово "abcd" является зеркальным отражением слова "dcba"). Считать, что слова в предложении разделяются пробелами и запятыми. Порядок слов менять нельзя. Например, если пользователь вводит с клавиатуры предложение "si qwerty zxcvb, redivider asdf is, ytrewq", программа должна вывести на экран "si qwerty redivider is ytrewq". (обратите внимание что слово-палиндром "redivider" в предложении является отражением самого себя.) |
|
ROLpogo |
Отправлено: 29.12.2004, 16:28 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
Сейчас попробуем, надо только вспомнить синтаксис чистого С++ |
|
ROLpogo |
Отправлено: 29.12.2004, 17:36 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
CODE | #include <iostream.h>
#include <string.h>
void main(void)
{
char SourceStr[256]; //Строка ввода.
char ReverseStr[256]; //Перевёрнутая строка ввода (палиндром).
//Вводим наш текст (не более 255 символов!).
cin>>SourceStr;
unsigned int StLen=strlen(SourceStr); //Длина строки ввода.
//Делаем палиндром из строки ввода.
strcpy(ReverseStr,SourceStr);
strrev(ReverseStr);
char BufStr[256]; //Строка для выделения слов из строки ввода.
unsigned int BufInd=0; //Индекс для BufStr.
char FinalStr[256]; //Результирующая строка.
FinalStr[0]='\0';
// Идём по нашей строке, выделяя каждое слово и проверяя его на вхождение в строку палинром.
for(unsigned int i=0;i<StLen+1;i++)
{
if(SourceStr[i]!=' '&&SourceStr[i]!=','&&SourceStr[i]!='\0')
{
BufStr[BufInd]=SourceStr[i];
BufInd++;
}
else
{
BufStr[BufInd]='\0';
if(strlen(BufStr))
{
if(StrFoundHere(ReverseStr,BufStr))
{
strcat(FinalStr,BufStr);
strcat(FinalStr," ");
}
}
BufInd=0;
}
}
FinalStr[strlen(FinalStr)-1]='\0';
cout<<FinalStr;
}
//---------------------------------------------------------------------------
// Функция проверки вхождения слова PartStr в текст SourceStr.
bool __fastcall TForm1::StrFoundHere(char* SourceStr,char* PartStr)
{
unsigned int StSLen=strlen(SourceStr);
unsigned int StPLen=strlen(PartStr);
char* BufStr=new char[StSLen];
unsigned int BufInd=0;
for(unsigned int i=0;i<StSLen+1;i++)
{
if(SourceStr[i]!=' '&&SourceStr[i]!=','&&SourceStr[i]!='\0')
{
BufStr[BufInd]=SourceStr[i];
BufInd++;
}
else
{
BufStr[BufInd]='\0';
if(strlen(BufStr)==StPLen)
{
if(!strcmp(PartStr,BufStr))
{
delete BufStr;
return true;
}
}
BufInd=0;
}
}
delete BufStr;
return false;
}
|
Проверял на Builder'е. Чистого C++ под рукой не оказалось. Алгоритм работает, могут возникнуть технические проблемы, наподобие отсутствия функции strrev в библиотеке string.h. Тогда вместо строк:
CODE | strcpy(ReverseStr,SourceStr);
strrev(ReverseStr); |
пишем:
CODE | for(int i=StLen-1;i>=0;i++)
ReverseStr[StLen-1-i]=SourceStr[i];
ReverseStr[StLen]='\0';
|
P.S.: Главное, чтоб препод тему не заметил
Отредактировано ROLpogo — 30/12/2004, 13:04 |
|
|