Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
#1

Строка символов s1, s2, . , sn. Зеркальное отражение строки без последнего символа - C++

05.03.2014, 22:35. Просмотров 685. Ответов 10
Метки нет (Все метки)

Условие: Дана строка s, содержащая n символов s1, s2, ... , sn,. Если эта строка является Палиндромом то есть s1 = sn, s2= sn-1..., то оставить его без смены, иначе - дополнить эту строку его «зеркальным» отражением без повторение последнего символа (s1,s2,...,sn-1,sn, sn-1,...,s2,s1). Не пойму как можно реализовать зеркальное отражение без одного символа Помогите пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<fstream>
#include<conio.h>
#include<string>
using namespace std;
 
int main ()
{
    string s;
    cin >> s;
    bool fl = true;
    for (int i =0 ; i < s.size()/2; ++i)
        if (s[i] != s[s.size() - 1 - i])
        { 
            fl = false; 
            break;
        }
    if (!fl)
    {
        int size = s.size();
        for (int i = 0; i < size; ++i)
            s += s[size - 1 - i];
    }
 cout << s;
 return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2014, 22:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строка символов s1, s2, . , sn. Зеркальное отражение строки без последнего символа (C++):

Дана строка s, содержащая n символов s1, s2, . , sn,. Зеркальное отражение строки - C++
Дана строка s, содержащая n символов s1, s2, ... , sn,. Если эта строка является Палиндромом то есть s1 = sn, s2= sn-1..., то оставить...

Зеркальное отражение строки - C++
Всем привет. Такая задача: Написать программу реализующую зеркальное отражение строки Вот что я накалякал :)Подскажите что здесь не так?...

Проверка на зеркальное отражение строки - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { char str; cin.getline(str, 1000); if...

Строка: Определить местоположение символа первой строки,который первым совпал с одним из символов второй строки. - C++
заданы 2 строки,состоящие из слов,разделенных пробелами.Определить местоположение символа первой строки,который первым совпал с одним из...

Строка: Определить местоположение символа первой строки,который первым совпал с одним из символов второй строки. - C++
пожалуйста с пояснениями если можно.Заданы 2 строки,состоящие из слов,разделенных пробелами.Определить местоположение символа первой...

Зеркальное Отражение И Сисстемы счисления - C++
Помогите написать программу по решению задачи Задача: Выводить все двух и трёх значные числа 10-чной Системы Счисления которые выглядь...

10
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
06.03.2014, 11:54 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
{
    std::string s("abrakadabra"), temp;
    int size = s.size();
    size -= 2;
    do
    {
        temp += s[size];
        size--;
    }
    while(size >= 0);
    
    s += temp;
    std::cout << s << std::endl;
    
    system("pause");
    return 0;
}
1
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
06.03.2014, 12:59 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
string str, str2;
getline(cin,str);
str2=str;
reverse(str2.begin(),str2.end());
    if(str==str2)
        cout<<str;
    else
    {
    string str3(str, 0 , str.length()-1);
    reverse(str3.begin(),str3.end());
    cout<<(str+=str3);
    }
}
Добавлено через 46 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
string str, str2;
getline(cin,str);
str2=str;
reverse(str2.begin(),str2.end());
    if(str==str2)
        cout<<str;
    else
    {
    string str3(str2, 1 , str.length());
    cout<<(str+=str3);
    }
}
1
Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.03.2014, 21:57  [ТС] #4
Как можно реализовать эту задачу, без типа string, т.е. вместо типа string, использовать тип char. А так же как написать свою функцию reverse. Мне усложнили задание, сказав что нельзя использовать reverse, реализуйте свою функцию или же играйтесь со строкой, но как с ней можно играться не знаю. Подскажите пожалуйста Буду очень благодарен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
string str, str2;
getline(cin,str);
str2=str;
reverse(str2.begin(),str2.end());
    if(str==str2)
        cout<<str;
    else
    {
    string str3(str, 0 , str.length()-1);
    reverse(str3.begin(),str3.end());
    cout<<(str+=str3);
    }
}
0
IrineK
Заблокирован
31.03.2014, 07:05 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using std::cout;
 
int IsPalindrom (char *str)
{   int i = -1, j = strlen(str);
    while (++i < --j)
        if (str[i] != str[j])
            return 0;
    return 1;
}
 
char *Mirror (char *str)
{   int size = 2*strlen(str);
    char *mirror = new char [size];
    
    int i = -1, j = size-1;
    mirror[j] = '\0';
    while (++i < --j)
        mirror[i] = mirror[j] = str[i];
    mirror[i] = str[i];
    
    return mirror;
}
 
void Delete (char *str)
{   delete [] str;
}
 
 
int main()
{   char *s = "12345";
 
    if (IsPalindrom (s))
        cout << s << "\nAlready palindrom. No changes\n";
    else
    {   cout << s << "\nNot palindrom. Let's transform it\n";
        char *mirror = Mirror (s);
        cout << mirror;
        Delete (mirror);
    }
    
    getchar();
    return 0;
}
1
Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
31.03.2014, 10:35  [ТС] #6
Спасибо за ответ. Можете ответить на пару вопросов? Что бы я понимал в дальнейшем, как подобные задачи можно решить.
Можете пояснить, почему вы использовали
C++
1
 int i = -1,
Можете объяснить это цикл, пожалуйста
C++
1
 while (++i < --j)
Это задержка экрана ввода верно?
C++
1
getchar();
P.S. Большое спасибо за решение и за пояснение
0
IrineK
Заблокирован
31.03.2014, 10:48 #7
while (++i < --j);
Заходим в while и сразу: i становится на 1 больше, j - на один меньше. После этого выполняется тело цикла.
Выход из цикла: если i станет равным или большим j, т.е., если по i начали с начала строки, а по j с конца, то остановимся посередине.

i = -1;
Теперь уже понятно, т.к. сразу при входе в цикл i растет на 1.

Задержек экрана много. getchar(); одна из них.
1
Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
02.04.2014, 00:44  [ТС] #8
Можете пояснить ещё немного решение, код вижу... но всеравно понять не могу. Если можно, прокомментируйте действия. Буду очень, очень благодарен.
0
IrineK
02.04.2014, 01:30
  #9

Не по теме:

Цитата Сообщение от Anwer Посмотреть сообщение
Если можно, прокомментируйте действия.
Угу, еще и на экзамен сходи.

0
Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
02.04.2014, 11:05  [ТС] #10
Подскажите, зачем выполнялись эти действия, пожалуйста. смысла их не пойму P.S. все прокомментировал
mirror[j] = '\0'; // Вот это не понял что это О_о, это или массив j, который равен 0 символу или что-то другое О_о
Delete (mirror); // и тут же её удаляем?? Зачем О_о...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
using std::cout;
 
int IsPalindrom (char *str)
{   int i = -1, j = strlen(str); // создаем целочисленную переменную i со значением -1, создаем целочисленную переменную j и присваиваем ей значение длины строки str 
    while (++i < --j) // выполняется цикл while, где переменная i увеличивается на 1, а переменная j уменьшается на 1
        if (str[i] != str[j]) // Условие, если строка из i символов, равна строке из j символов, возвращаем значение 0
            return 0;
    return 1;
}
 
char *Mirror (char *str)
{   int size = 2*strlen(str); // создаем целочисленную переменную size и присваиваем ей, значение длины строк * 2, т.е. было к примеру, было 8 символов, стало 16.
    char *mirror = new char [size]; // создаем динамический массив, размера size    
    int i = -1, j = size-1; // создаем опять целочисленную переменную i и присваиваем ей -1, создаем целочисленную переменную j со значением, размер переменной size -1, т.е. строка -1 символ от неё.
    mirror[j] = '\0'; // Вот это не понял что это О_о, это или массив j, который равен 0 символу или что-то другое О_о
    while (++i < --j) // опять цикл while
        mirror[i] = mirror[j] = str[i]; // Приравниваем, массивы с изначальной строкой, для сравнения, и присваиваем значение i-го массива к i-й строке.
    mirror[i] = str[i];
    
    return mirror;
}
 
void Delete (char *str)
{   delete [] str; // освобождаем динамическую память
}
 
 
int main()
{   char *s = "12345"; // создаем строку
 
    if (IsPalindrom (s)) // проверяем на палиндромность, выполняем функцию которую мы реализовали ранее.
        cout << s << "\nAlready palindrom. No changes\n";
    else
    {   cout << s << "\nNot palindrom. Let's transform it\n"; // как я понял, мы исправляем и подгоняем строку под полиндром.
        char *mirror = Mirror (s); // создаем указатель на миррор, и присваиваем ему значение, строки которая была введена выше. 
        cout << mirror; // выводим строку
        Delete (mirror); // [B]и тут же её удаляем??[/B] Зачем О_о...
    }
    
    getchar();
    return 0;
}
0
IrineK
Заблокирован
02.04.2014, 19:18 #11
Цитата Сообщение от Anwer Посмотреть сообщение
и тут же её удаляем?? Зачем О_о...
Была б задача побольше, удалили б подальше.
Просто задача кончилась, а память освобождать надо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 19:18
Привет! Вот еще темы с ответами:

Зеркальное отражение числа 0001->1000 - C++
Может быть вопрос глупый, а может утро, или я еще не просунлся. все работет, но если первый ноль, то проблемка. а надо что бы и с...

Зеркальное отражение относительно побочной диагонали - C++
Дана квадратная матрица А порядка М. Зеркально отразить ее элементы относительно побочной лиагонали. (при этом элементы побочной диагонали...

Дана строка . Вывести коды его первого и последнего символа - C++
Дана строка . Вывести коды его первого и последнего символа.

в двумерном массиве (NxN) произвести зеркальное отражение относительно вертикальной оси симметрии. - C++
в двумерном массиве (NxN) произвести зеркальное отражение относительно вертикальной оси симметрии.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
02.04.2014, 19:18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru