Консультация № 192594
23.02.2018, 12:59
0.00 руб.
0 23 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
С клавиатуры вводится произвольный текст, содержащий не более 10 строк, в каждой строке не более 80 символов.
Необходимо найти и вывести на экран все слова-палиндромы.

Обсуждение

давно
Посетитель
7438
7205
23.02.2018, 13:20
общий
Адресаты:
Здравствуйте, Андрей!
Не хотите показать, что у Вас получается?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401835
9
23.02.2018, 13:39
общий
23.02.2018, 13:40
У меня проблема, как проверить слово в строке то что оно палиндром


Код:
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
const int n = 10, m = 80;// Задание констант: n-размер массива,m-максимальное количество символов строки

// Функция ввода массива строк с клавиатуры.
int input_mas(char **mas, int n)
{
int k = 0; // Переменная для хранения текущего номера строки
char buf[m];
while (k<n) // Пока число веденных строк меньше возможного
{
cin.getline(buf, m);//Считываем строку из консоли в буферную переменную
OemToChar(buf, mas[k]);//Перевод в кодировку windows
if ((strcmp(mas[k], "") == 0)) break;// Если была введена пустая строка, выходим из цикла
k++;//Если строка была непустая, продолжаем и увеличиваем k
}


return k ; //иначе введена k+1 строка (т.к. отсчет с 0)
}

void print_mas(char **mas, int n)// Функция вывода массива строк
{
for (int i = 0; i<n; i++) // Распечатка в цикле строк массива
cout << mas[i] << endl;
}

//Функция проверки, что символ является знаком пуктуации
bool puncts(char ch)
{
char str[] = ".,!?;:-()";
if (strchr(str, ch)) return true;
else return false;
}

//Функция проверки, что символ является пробельным символом
bool spaces(char ch)
{
if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\v' || ch == '\0') return true;
else return false;
}

//Изменение массива строк (обмен 1 и последней буквы в словах)
void swap_words(char **mas, int n)
{
int d = 0; // Переменная для хранения длины строки
bool inword;
char buf;
for (int i = 0; i<n; i++) // Пробег по строкам массива
{
d = strlen(mas[i]); // Вызов стандартной функции длины строки
inword = false;//Опускаем флаг – мы не в слове
int jbeg;//Переменная начала слова
for (int j = 0; j<d; j++)// Пробег по символам строки
{ //Если нашли букву
if (!puncts(mas[i][j]) && !spaces(mas[i][j]))
{
if (!inword) //Мы были не в слове
{
inword = true;//Поднимает флаг нахождения в слове
jbeg = j;//Запоминаем начало слова
}

}
}
}
}
void main() // Главная функция
{
setlocale(LC_ALL, "");
char **mas; // Динамический двумерный массив символов,т.е. массив указателей на строки
mas = new char *[n];// Выделение места в памяти под n указателей на начало строк
for (int i = 0; i<n; i++) mas[i] = new char[m];// Выделение места в памяти под m символов для каждой строки
cout << "Введите массив строк" << endl;
int k = input_mas(mas, n); //Вызов функции ввода массива строк
cout << "Введенный текст:" << endl;
print_mas(mas, k); // Вызов функции вывода массива строк
swap_words(mas, k); // Вызов функции изменения строк
cout << "Изменённый текст:" << endl;
print_mas(mas, k);
for (int i = 0; i<n; i++) delete[] mas[i];// освобождение памяти
delete[] mas;
system("pause");
}
давно
Посетитель
7438
7205
23.02.2018, 13:57
общий
Адресаты:
Ну вот! Это ж совсем другое дело! Сейчас посмотрим...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 14:09
общий
Адресаты:
У меня большие подозрения, что это не Ваша программа
Взяли чужую программу (допустим, другого варианта) и хотите, чтобы мы ее подправили под Вашу задачу...
Я не прав?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401835
9
23.02.2018, 14:11
общий
Правы, есть чисто мой вариант только без функций, но без разницу, просто я не могу понять как сделать проверку на палиндром и вывести все палиндромы
давно
Посетитель
7438
7205
23.02.2018, 14:14
общий
Адресаты:
Приведите чисто свой вариант. От него и будем отталкиваться.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401835
9
23.02.2018, 14:15
общий
23.02.2018, 14:20
Вот это я писал
Код:
#include <iostream>
#include <Windows.h>
using namespace std;


int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char s[10][80];
int z = 0;
cout << "Введите 10 строк до 80 символов на каждую: " << endl;
for (int i = 0; i < 10; i++)
{
cin.getline(s[i], 80);
}


for (int i = 0; i < 10; i++) {
z = strlen(s[i]); // Вызов стандартной функции длины строки
for (int j = 0; j < z; j++) // Пробег по символам строки
{


}
}

system("pause");
return 0;
}
давно
Посетитель
7438
7205
23.02.2018, 14:19
общий
Адресаты:
А проверку на полиндром сделать можно так:
1) Проходим по всем строкам массива
2) Находим начало очередного слова в строке
3) Ищем конец слова
4) В цикле проверяем равенство букв от начала и от конца
5) Если нашли - выводим слово
6) Ставимся на конец найденного слова
7) на п 2)
8) на п 1)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 14:20
общий
Адресаты:
Кстати, общая ошибка: надо выделять на 1 байт больше (забываете о завершающем 0)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 14:21
общий
Адресаты:
Ну что, попробуете сначала самостоятельно реализовать предложенный алгоритм?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401835
9
23.02.2018, 14:30
общий
Еще вопрос с поиском слова, как это сделать?
А так алгоритм понятен
давно
Посетитель
401835
9
23.02.2018, 14:33
общий
Код:
if (s[i][j] != ' ' && (s[i][j + 1] == ' ' || s[i][j + 1] == '\0'))

таким же условием мы находим слово?
давно
Посетитель
7438
7205
23.02.2018, 14:37
общий
Адресаты:
Пока пишите, как думаете, потом подправим...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 14:47
общий
Адресаты:
Могу порекомендовать функцию strtok.
Она портит исходные строки, но они нам и не нужны :)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 14:48
общий
Адресаты:
Пример из MSDN (для понимания)
Код:
#include <string.h>
#include <stdio.h>

char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;

void main( void )
{
printf( "%s\n\nTokens:\n", string );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
printf( " %s\n", token );
/* Get next token: */
token = strtok( NULL, seps );
}
}

Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401835
9
23.02.2018, 14:59
общий
Код:
#include <iostream>
#include <Windows.h>
#include <сstring>
using namespace std;


int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char s[10][80];
int z = 0;
cout << "Введите 10 строк до 80 символов на каждую: " << endl;
for (int i = 0; i < 10; i++)
{
cin.getline(s[i], 80);
}

char* s = strtok(s, " ,.-");

while (s != NULL)
{
cout << s << "n";
s = strtok(NULL, " ,.-");
}





system("pause");
return 0;
}

как правильно оформить функцию?
давно
Посетитель
7438
7205
23.02.2018, 15:19
общий
23.02.2018, 15:22
Адресаты:
Держите примерный код...
Код:
#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;

bool isPalyndrom(char *str)
{
int len = strlen(str);
int half = len>>1;
int i;

for(i=0; i<half; i++, len--)
if (str[i] != str[len-1])
break;
return (i == half);
}

void FindPalyndrom(char *str)
{
char* s = strtok(str, " ,.-");
while (s != NULL)
{
if (isPalyndrom(s))
cout << s << endl;
s = strtok(NULL, " ,.-");
}
}

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

char s[10][81];
int i, z = 0;

cout << "Введите 10 строк до 80 символов на каждую: " << endl;
for (i = 0; i < 10; i++)
cin.getline(s[i], 81);

cout << endl << "Палиндромы:" << endl;

for (i = 0; i < 10; i++)
FindPalyndrom(s[i]);

system("pause");
return 0;
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 15:23
общий
Адресаты:
Чего-то обозвал сначала полиномами Наверно, это слово ближе математику...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401835
9
23.02.2018, 15:27
общий
Еще одна проблема, выдает ошибку
Прикрепленные файлы:
816e1e4a9d24ec29bcd59b143243e95c.png
давно
Посетитель
7438
7205
23.02.2018, 15:33
общий
Адресаты:
Ну так исправьте
Посмотрите здесь
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 15:34
общий
Адресаты:
Я пользуюсь старенькой студией. В последних вместо strtok() надо использовать strtok_s()
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2018, 15:41
общий
23.02.2018, 15:42
Адресаты:
Не разобрались? Держите...
Код:
void FindPalyndrom(char *str)
{
char* s1 = NULL;
char* s = strtok_s(str, " ,.-",&s1);
while (s != NULL)
{
if (isPalyndrom(s))
cout << s << endl;
s = strtok_s(NULL, " ,.-",&s1);
}
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
26.02.2018, 12:38
общий
это ответ
Здравствуйте, andrey.lushov!
Программа, решающая Вашу задачу:
[code h=200]#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;
bool isPalyndrom(char *str)
{
int len = strlen(str);
int half = len>>1;
int i;
for(i=0; i<half; i++, len--)
if (str[i] != str[len-1])
break;
return (i == half);
}

void FindPalyndrom(char *str)
{
char* s1 = NULL;
char* s = strtok_s(str, " ,.-",&s1);
while (s != NULL)
{
if (isPalyndrom(s))
cout << s << endl;
s = strtok_s(NULL, " ,.-",&s1);
}
}

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

char s[10][81];
int i, z = 0;

cout << "Введите 10 строк до 80 символов на каждую: " << endl;
for (i = 0; i < 10; i++)
cin.getline(s[i], 81);
cout << endl << "Палиндромы:" << endl;
for (i = 0; i < 10; i++)
FindPalyndrom(s[i]);

system("pause");
return 0;
}[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа