ВОПРОС · Q&A

Строки в С++

19 ответов 12 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

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

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

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

в цикле сравнивать первый символ и последний
на следующей итерации - второй символ и предпоследний
повторять до тех пор пока останется только один символ для сравнения или ни одного.
 
Я понял и в тоже время не понял.Не пойму как сделать проверку.Я сначала определяю слова,
а потом как то нужно их проверить являются они палиндромами или нет.Я вот писал но далее не знаю.
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");
}
Помоги написать функцию определения слов-палиндромов,пожалуйста
 
Вот, на скорую руку набросал функцию для проверки. Если аргумент, это слово-палиндром она возвращает 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;
}
 
ierofant
Кстати, если убрать переменную ret, в конце функции возвращать true, а после условия возвращать false то получится немного попроще, и циклу не придется доходить до конца, в случае если слово не палиндром.
 
Кстати, если убрать переменную 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;
}
 
Ну ты опять же усложняешь ситуацию)) Если следующее условие срабатывает, т.е.:
... то можно смело возвращать false ! И переменная ret здесь опять же не при чем...

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

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;
}

препод-дестройер(((((:
 
Rififi
Убей препода!
 
Уважаемые я теоретически понял но у меня не получается взгляните пожалуйста
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");
}
 
Нет,найбольшего из усех слов
 
Найти наибольшую длину этих слов.
А почему именно этих слов?

Если таких слов нет, то с каждого слова на непарной позиции убрать гласные и вывести их на экран.
Здесь под словом 'таких' тоже все слова подразумеваются??
 
Из всех слов которые вводились на начале,определить найбольшее из них
 
В строке символов найти слова-палиндромы, которые однаково
Из всех слов которые вводились на начале
Ты чего мне тут сказки рассказываешь. Какие еще слова. По-условию у тебя строка символов вводится. Я тебе уже пол программы написал, и переделывать ее у меня нет желания.
 
Я не знаю как показать что бы что слово палиндром,если я не правильно высловился то извини,мне хоть что нибудь уже,хоть какой нибудь код.Хоть что то,что ты сделал может оно...
 
Ну вот тебе хоть что-то:
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;
}
 
lazybiz спасибо огромное,то что надо. Вы и представить не можете как я благодарен и от чего вы меня спасли,по гроб жизни помнить буду.Спасибо большое.
 
ermackprogramis

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

Тоже мне, бином Ньютона. От армии, вестимо B)
 
Какие мы умные,а даже не угадали!!!