Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
sswt
0 / 0 / 3
Регистрация: 31.08.2015
Сообщений: 49
#1

Реализация функции палиндрома - C++

09.09.2015, 12:20. Просмотров 381. Ответов 10
Метки нет (Все метки)

Я написала функцию, функция нормально работает. Но так как я смотрела по примерам, мне не очень нравиться этот момент:
Код
for (t = str; *t!= '\0'; ++t);
	for (t = str; *t!= '\0'; --t);
Как сделать чтобы forом проходиться и str и t ?
MyFunc.h:
Код
#ifndef __MY_FUNC_H__
#define __MY_FUNC_H__
int Palidrome(const char *str);
#endif
MyFunc.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "MyFunc.h"
int Palidrome(const char *str)
{
    const char *t; 
    for (t = str; *t!= '\0'; ++t);
    for (t = str; *t!= '\0'; --t);
    while (str < t)
    {
        if (*str++ != *t--) 
            return 0;
    }
    return 1;
}
Source.cpp:
C++
1
2
3
4
5
6
7
8
9
#include <cstdio>
#include "MyFunc.h"
int main()
{
        const char* ach2 = "aabbbbaa";
    printf("Palidrome:%d\n", Palidrome(ach2));
        
        return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2015, 12:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Реализация функции палиндрома (C++):

Реализация функции печати результатов предыдущей функции
Была написана программа с функцией, находящая результат выражения с аргументом,...

Реализация функции c++
Программа: #include &lt;iostream&gt; using namespace std; struct Node { ...

Реализация функции srcat.
Я написал (реализовал) функцию strcat. Вот ... #include &quot;stdafx.h&quot;...

Реализация friend функции
Есть код. Нужно реализовать вывод ответа через friend. Подскажите пожалуйста...

Реализация функции itoa
помогите написать реализацию функции itoa MyItoa(int,char*,int) и пожалуйста...

Реализация функции-модуля
ТОВАРИЩИ, я всех приветствую. Помогите пожалуйста разобраться. Есть проект...

10
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
09.09.2015, 12:42 #2
На основе Вашей функции:
C++
1
2
3
4
5
6
7
8
9
10
11
bool Palidrome(const char *str)
{
    char *t=str+strlen(str); // находим конец строки 
    while (str < t)
    {
        if ( *str!= *t) 
            return false;
        str++;t--; // сдвигаемся к следующей паре
    }
    return true;
}
0
sswt
0 / 0 / 3
Регистрация: 31.08.2015
Сообщений: 49
09.09.2015, 12:47  [ТС] #3
zss, Я Хочу сделать без strLen(str) так как я отдельно делала раньше strLen(str) и тут хочу обойтись без него
Моя функция которую я раньше написала strLen
C++
1
2
3
4
5
6
unsigned StrLen(const char* str)
{
    unsigned len = 0;
    for (; *str != '\0'; ++str, ++len);
    return len;
}
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
09.09.2015, 13:03 #4
Ну так вставьте этот фрагмент в код:
Цитата Сообщение от sswt Посмотреть сообщение
C++
1
2
unsigned len = 0;
 for (; *str != '\0'; ++str, ++len);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Palidrome(const char *str)
{
   unsigned len = 0;
   char* t;
   for (t=str; *t != '\0'; ++t, ++len)
       ;// пустой оператор
   t--; // находим конец строки 
   while (str < t)
   {
        if ( *str!= *t) 
            return false;
        str++;t--; // сдвигаемся к следующей паре
   }
   return true;
}
0
sswt
0 / 0 / 3
Регистрация: 31.08.2015
Сообщений: 49
09.09.2015, 16:14  [ТС] #5
zss,
C++
1
2
3
 for (t=str; *t != '\0'; ++t, ++len)
       ;// пустой оператор
   t--; //
это одно и тоже?:
C++
1
2
3
 for (t=str; *t != '\0'; ++t, ++len)
       ;// пустой оператор
 for (t=str; *t != '\0'; --t,); //
Просто я не очень поняла, можете сам алгоритм расписать поподробнее в вкашем коде?
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
09.09.2015, 16:23 #6
Цитата Сообщение от sswt Посмотреть сообщение
for (t=str; *t != '\0'; --t); //
Эта строка у Вас ошибочная. В ней устанавливается указатель на начало строки, а потом смещается влево за пределы строки.
Цитата Сообщение от sswt Посмотреть сообщение
for (t=str; *t != '\0'; ++t, ++len)
Здесь двигаемся по строке вперед, пока не встретим терминальный нуль, и подсчитываем количество символов. В конце t указывает на терминальный ноль. А нам нужен указатель на символ, который стоит перед нулем. Для этого достаточно сделать t--;
Кстати, в итоге len оказалась ненужной.
0
sswt
0 / 0 / 3
Регистрация: 31.08.2015
Сообщений: 49
09.09.2015, 16:31  [ТС] #7
zss, а нет вы не поняли....
C++
1
for (t=str; *t != '\0'; ++t, ++len)
я знаю что тут.
я не могу понять
C++
1
 t--;
от это. оно так просто без нечего пишеться? Можно так просто написать?
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
09.09.2015, 16:33 #8
t указывает на терминальный ноль, который стоит за последним элементом массива.
Если мы уменьшим этот адрес на единицу, то как раз и попадем на последний элемент.
Это можно написать как t=t-1; а можно и как t--;
0
sswt
0 / 0 / 3
Регистрация: 31.08.2015
Сообщений: 49
09.09.2015, 16:40  [ТС] #9
zss, я имею введу это поза фором нужно его писать?
Мой остаточный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int Palidrome(const char *str)
{
    const char *last; 
    for (last = str; *last != '\0'; ++last);
    --last;
    while (str < last)
    {
        if (*str++ != *last--) 
            return 0;
    }
    return 1;
}
Добавлено через 14 секунд
zss, я имею введу это поза фором нужно его писать?
Мой остаточный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int Palidrome(const char *str)
{
    const char *last; 
    for (last = str; *last != '\0'; ++last);
    --last;
    while (str < last)
    {
        if (*str++ != *last--) 
            return 0;
    }
    return 1;
}
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
09.09.2015, 16:50 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Palidrome(const char *str)
{
    char *last; 
    for (last = str; *last != 0; ++last)
           ;// обязательно комментируем эту ; что это пустой оператор, а не ошибка
    --last;
    while (str < last)
    {
        if (*str != *last) // не перегружайте оператор кодом, который плохо читаем  
            return false;
        str++;
        last--;
    }
    return true;
}
1
sswt
0 / 0 / 3
Регистрация: 31.08.2015
Сообщений: 49
09.09.2015, 17:08  [ТС] #11
zss, спасибо
0
09.09.2015, 17:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2015, 17:08
Привет! Вот еще темы с решениями:

реализация ThreadSafe функции
Пишу статическую библиотеку функций, на основе которой разрабатывают...

Реализация функции strtok
Добрый день. Мое задание звучит так: изучите поведение функции strtok из...

Реализация функции erase()
Как работает erase()? То есть, если у нас : prev, it, next - итераторы и...

Реализация функции принтф
Хелпуем товарищи, треба написать свою фукнцию принтф с форматной строкой(правда...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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