C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Help! напишите задачу на чистом С, актуально до 8-ми часов вечера
** 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



Сейчас попробуем, надо только вспомнить синтаксис чистого С++ biggrin.gif
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.: Главное, чтоб препод тему не заметил biggrin.gif

Отредактировано ROLpogo — 30/12/2004, 13:04

Вернуться в Вопросы программирования в C++Builder