Как сделать в Си проверку - является ли строка полиндромом? Т.е вот например строку шалаш программа должна считать полиндромом, т.е от центра влево и вправо одинаковые буквы.
Разбить строку на две части. Началом второй части считать конец общей строки. В первой подстроке двигаться к центру строки, как и во второй. Сравнивать их символы. К примеру Л - длина строки. И - переменная в цикле. Тогда следует сравнивать Первая(И) == Вторая(Л-И) Также следует предусмотреть четную или нечетную длину строки.
а можно код? Не понял как разбить на две строки. Ещё вопросик. Нужно строчку перевернуть. Я сделал так: Code: #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int main() { char stroka1[]="эдуард"; char stroka2; int dlina; for (int i=0;stroka1[i]!=0;i++) { dlina=i; } for (int j=0;j<dlina;j++) { stroka2[j]=stroka1[dlina]; dlina=dlina-1; } system("pause"); } Ошибку выводит в первой строке второго цикла. Как исправить?
Как разбить строку на две части? Можно и не разбивать. Просто получите длину строки (strlen). Возьмите от неё половину(Л/2) и сравнивайте по тому алгоритму что я написал Cтрока(И) == Строка(Л-И) Ошибку в студию. Перевернуть строку можно методом reverse из С++. Входные параметры - указатель на начало строки и указатель на элемент, после конца строки(элемент может и не существовать).
насчёт переворота строки проблемы решил. В объявление переменных char добавил [100]; А вот с полиндромами так и не разобрался. То что делать на 2 я так изначально и думал, а как дальше цикл организовать никак не пойму
Воспользуйся любой функцией сравнения строк и проверь идентичны ли исходная и перевернутая строки. Или свою функцию сравнения пиши.
Блин гениально. Но к сожалению уже разобрался с алгоритмом tim-oleksii. Вот результат строки полиндрома: Code: #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int main() { char s1[100]; cin >> s1; int dlina; for (int i=0;s1[i]!=0;i++) { dlina=i; } int centr=dlina/2; int nomer=0; for (int i=0;i<centr;i++) { if (s1[i]==s1[dlina-i]) { nomer++; } if (nomer==centr) {cout << "stroka polindrom";} } system("pause"); }
Мне нужно подсчитать кол-во слов в строке. Лешил протись циклом по всем элементам строки и какой равен пробелы - то значит +1 слово. Как обзначается пробел? Пробовал так char s==" "; не пашет. Пробовал вставлять тоже не работает.
Raine 1. Палиндром ли строка? PHP: #include <string> #include <algorithm> #include <iostream> #include <iterator> int main() { std::string s, rs; std::getline(std::cin, s); std::reverse_copy(s.begin(), s.end(), std::back_inserter(rs)); std::cout << (s == rs ? "Yes" : "No") << std::endl; return 0; } 2. Количество слов в строке PHP: #include <string> #include <algorithm> #include <iostream> int main() { std::string s; std::getline(std::cin, s); std::cout << std::count(s.begin(), s.end(), ' ') + 1 << std::endl; return 0; }
Лучше разбивать строку через strtok с массивом разделителей "!\"№;%:?*()_=+ " Иначе все слова не посчитаешь. а кто знает аналог strtok на С++? Added: или boost::regex на символы [A-Zaz]{1,}
tim-oleksii можно на крайняк велосипед свой написать, что-то типа Code: char** split(char *splitIt, char splitter) { int x = 0; for(int i=0;i<strlen(splitIt);i++) if(splitIt[i] == splitter) x++; i = 0; char bits[x][256]; x = 0; while (splitIt[i] != '\0') { if (splitIt[i] == splitter) { bits[x][i] = '\0'; x++; } else { bits[x][i] = splitIt[i]; } i++; } return bits; } не тестил, но примерно так