Строки в С++

  • Автор темы ermackprogramis
  • Дата начала
E

ermackprogramis

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

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

Rififi

#2
ermackprogramis

как задать так, чтобы прога определяла слова, которые читаются справа налево однаково.

в цикле сравнивать первый символ и последний
на следующей итерации - второй символ и предпоследний
повторять до тех пор пока останется только один символ для сравнения или ни одного.
 
E

ermackprogramis

#3
Я понял и в тоже время не понял.Не пойму как сделать проверку.Я сначала определяю слова,
а потом как то нужно их проверить являются они палиндромами или нет.Я вот писал но далее не знаю.
C++:
// подключение библиотек
#include <iostream>

using namespace std; 

// оголошение переменных
char s[100];
char scopy[100];
char word[100][100];
int n;

//===функция ввода===
void input()
{
cout<<"Input array"<<endl; 
gets(s);			// ввод массива
cout<<"Entered array :"<<endl;
puts(s);			 // вывод массива
}

void solution()
{
strcpy(scopy,s);

char *ptr; // указатель на лексему
char *delimiter="., _!?:;"; 
int i=0;
ptr = strtok(scopy,delimiter); // первое слово рядка
while(ptr!=NULL) // пошук слів
{
strcpy(word[i],ptr); // внесение слова в массив
i++;
ptr = strtok(NULL,delimiter); // следующее слово
}
n=i;
}

//===поиск слов-палиндромов===
void words()
{

}

//===функция вывода===
void output()
{
for(int i=0;i<n;i++)
{
puts(word[i]); // печать слов у столбик
}
cout<<"Number of words"<<n<<endl; // количество слов
}

//===главная функция===
int main()
{
input();
solution();
words();
output();
system("pause");
}
Помоги написать функцию определения слов-палиндромов,пожалуйста
 
I

ierofant

#4
Вот, на скорую руку набросал функцию для проверки. Если аргумент, это слово-палиндром она возвращает true, в противном случае false
C++:
bool check_str (std::string _str)
{
bool ret = true;
for (std::string::iterator beg = _str.begin (), end = _str.end () - 1; beg < end; beg++, end--)
if (*beg != *end) ret = false;
return ret;
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#5
ierofant
Кстати, если убрать переменную ret, в конце функции возвращать true, а после условия возвращать false то получится немного попроще, и циклу не придется доходить до конца, в случае если слово не палиндром.
 
I

ierofant

#6
Кстати, если убрать переменную ret, в конце функции возвращать true, а после условия возвращать false то получится немного попроще, и циклу не придется доходить до конца, в случае если слово не палиндром.
Да, конечно можно. Но многими специалистами осуждается несколько точек выхода из функций. В больших фунциях это может усложнить понимание кода. А я стремлюсь к единообразию.

Добавлено: Но цикл действительно было бы полезно сократить, здесь у меня никаких возражений.

C++:
bool check_str (std::string _str)
{
bool ret = true;
for (std::string::iterator beg = _str.begin (), end = _str.end () - 1; beg < end; beg++, end--)
if (*beg != *end) 
{
ret = false;
break;
}
return ret;
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#7
Ну ты опять же усложняешь ситуацию)) Если следующее условие срабатывает, т.е.:
... то можно смело возвращать false ! И переменная ret здесь опять же не при чем...

Для данного случая, специалистам не стоит обсуждать несколько точек выхода. Это просто будет бессмысленно и глупо, хоть и работоспособно.
Но многими специалистами осуждается несколько точек выхода из функций.
 
R

Rififi

#8
код не мой ;)

C++:
int IsPalindrome (char *s)
{
char*a,*b,c=0;
for(a=b=s;a<=b;c=(c?c==1?c=(*a&~32)-65>25u?*++a,
1:2:c==2?(*--b&~32)-65<26u?3:2:c==3?(*b-65&~32)-
(*a-65&~32)?*(b=s=0,a),4:*++a,1:0:*++b?0:1));
return s!=0;
}
препод-дестройер((((:)
 
E

ermackprogramis

#10
Уважаемые я теоретически понял но у меня не получается взгляните пожалуйста
C++:
// подключение библиотек
#include "stdafx.h" 
#include <iostream>

using namespace std; 

// оглашение переменных
char s[100];
char scopy[100];
char word[100][100],w[25];
int n;

//===функция ввода===
void input()
{
cout<<"Input array"<<endl; 
gets(s);			// ввод массива
cout<<"Enter array :"<<endl; 
puts(s);			 // вывод массива
}

//===функция поиска слов===
void solution()
{
strcpy(scopy,s);

char *ptr; // указатель на искаемую лексему
char *delimiter="., _!?:; \0"; // лексемы
int i=0;
ptr = strtok(scopy,delimiter); // первое слово рядка
while(ptr!=NULL) // поиск слов
{
strcpy(word[i],ptr); // занесение слов в массив
i++;
ptr = strtok(NULL,delimiter); // следующее слово
}
n=i;
}

//===поиск слов палиндромов===
bool words(char scopy[100])
{
size_t x(0), i, len(strlen(s) - 1), slen(len >> 1);
for(i = 0; i < slen; ++i) 
if(s[i] != s[len - i])
return false; 
return true;
}

void longword()
{
int max = strlen(word[0]);
strcpy(w,word[0]);
for(int i=0;i<n;i++)
{
if (max<strlen(word[i]))
{
max=strlen(word[i]);
strcpy(w,word[i]);
}
cout<<"Word = "<<w<<" length = "<<max<<endl;
}
}

//===функция вывода===
void output()
{
cout<<"========================="<<endl;
for(int i=0;i<n;i++)
{
puts(word[i]);
}
cout<<"Number of words"<<n<<endl;
}
//===главная функция===
int main()
{
input();
solution();
words(scopy);
longword();
output();
system("pause");
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#13
Найти наибольшую длину этих слов.
А почему именно этих слов?

Если таких слов нет, то с каждого слова на непарной позиции убрать гласные и вывести их на экран.
Здесь под словом 'таких' тоже все слова подразумеваются??
 
E

ermackprogramis

#14
Из всех слов которые вводились на начале,определить найбольшее из них
 

lazybiz

Well-known member
03.11.2010
1 339
0
#15
В строке символов найти слова-палиндромы, которые однаково
Из всех слов которые вводились на начале
Ты чего мне тут сказки рассказываешь. Какие еще слова. По-условию у тебя строка символов вводится. Я тебе уже пол программы написал, и переделывать ее у меня нет желания.
 
E

ermackprogramis

#16
Я не знаю как показать что бы что слово палиндром,если я не правильно высловился то извини,мне хоть что нибудь уже,хоть какой нибудь код.Хоть что то,что ты сделал может оно...
 

lazybiz

Well-known member
03.11.2010
1 339
0
#17
Ну вот тебе хоть что-то:
C++:
#include <iostream.h>

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

char *	separators	= " ,.;/*-+~!@#$%^&*()_+\\";

int is_separator( char c )
{
for ( int i = 0; i < strlen( separators ); i++ ) {
if ( c == separators[i] ) return 1;
}
return 0;
}

int is_palindrom( char *s, int n )
{
for ( int i = 0; i < n / 2; i++ ) {
if ( s[i] != s[n - i - 1] ) return 0;
}
return 1;
}

int main()
{
int		i, j, k, len, max = 0;
char *	s = "abba abcdefedcba apulaz zyz";

for ( i = 0; i < strlen( s ); ) {

while ( is_separator( s[i] ) ) i++;
j = i;
while ( !is_separator( s[i] ) && s[i] != '\0' ) i++;

len = i - j;
if ( len > max ) max = len;
if ( is_palindrom( &s[j], len ) ) {
for ( k = j; k < i; k++ ) {
cout << s[k];
}
cout << endl;
}
}

cout << "Maksimalnaja dlina slova: " << max;
return 0;
}
 
E

ermackprogramis

#18
lazybiz спасибо огромное,то что надо. Вы и представить не можете как я благодарен и от чего вы меня спасли,по гроб жизни помнить буду.Спасибо большое.
 
R

Rififi

#19
ermackprogramis

... Вы и представить не можете ... от чего вы меня спасли ...

Тоже мне, бином Ньютона. От армии, вестимо B)