1

Тема: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Отже, умова задачі така: по даному рядку оприділіть, чи є він паліндромом (тобто чи можна прочитати його навпаки, як, наприклад, слово "вижив"); вхідні дані: один рядок без пробілів; вихідні дані: 0, якщо слово - паліндром, -1 в протилежному випадку.
Мій розв'язок:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    string s;
    cout << "Express 's' " << endl;
    getline(cin,s);
    int h,a,i;
    h=s.length();
    a=h;
    char str[h];
    for (i=0;i<a;i++)
    {
        str[i]=s[h-1];
        h--;
    }
    cout << s.compare(str) << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

Підкажіть, будь ласка, в чому помилка, а то при написанні тільки одного символа в рядку отримую -2, а коли слово паліндром і складається з 5 елементів, я чомусь все одно отримую -1.

2

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

1) В C рядки закінчуються завершальним нулем (символ код якого 0).
Після циклу:

str[a] = '\0';

2) Метод compare() повертає 0, якщо рядки співпадають і якесь інше число якщо не співпадають (не завжди -1).

3) Поганий стиль використовувати одразу C++ рядки та C-рядки.

4) Змінні можна називати більш по людськи. Наприклад, s -> input_string, str -> compare_string, h - len або n.

5) int argc, char *argv[] якщо не використовуєте можна просто int main() { ... }

6) Express - більш правильно буде Input.

7) Операції краще розділяти пробілами з обох сторон.  Також пробіли між виразами в for та інших операторах, а також в викликах функції.

for (i = 0, j = n - 1; i < n; i++)
{
    input_str[i] = compare_str[j];
    j--;
}
Подякували: _-_MAIBA_-_, leofun012

3

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Ваш  цикл переписав би так:

    for (i=0;i<h;i++)
    {
        str[i]=s[h-1-i];
    }

А змінну а взагалі можна не вводити.
Хоча взагалі розв'язок не раціональний. По перше оголошується ще один рядок, як наслідок, об'єм пам'яті зростає вдвічі. Крім того, цикл має бути вдвічі коротшим.
Щось на зразок цього:

    int result=0;
    for (i=0;i<a/2;i++)
    {
        if(s[i]!=s[h-1-i]);
        {
            result=-1;
            break;
        }
    }
Подякували: _-_MAIBA_-_1

4

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Списибі вам велике! Як то кажуть: на помилках вчаться. Я ще не випробовував відредагованого коду (зараз сиджу на телефоні), але думаю, все буде добре. Ви ж професіонали!!!

5

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

До речі, запитання: а котрий з "моїх" рядків належить до С++?

6

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

yooll, тільки там не потрібно ; після if :)
Взагалі можна ще спростити. Замість for використовувати while і потім перевіряти значення змінної i, якщо > a/2, то паліндром.

_-_MAIBA_-_, краще почати вивчати з C, а не все одразу купою. Показувати де рядок C, а де C++ якось недоцільно. Наведу краще код на чистому C, з урахуванням моїх зауважень та yooll'а

#define MAX_SIZE 255
#include <stdio.h>
#include <string.h>

int main() 
{
    int i, n, result;
    char str[MAX_SIZE];

    printf("%s\n", "Input string:");
    scanf("%s", str);
    
    result = 0;
    n = strlen(str);

    for (i = 0; i < n/2; i++)
    {
        if(str[i] != str[n-i-1])
        {
            result = -1;
            break;
        }
    }
    
    printf("result = %d\n", result);
    
    return 0;
}
Подякували: _-_MAIBA_-_, yooll2

7

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Ну так, це кращий розв'язок! Зараз випробую усі)

8

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Досить цікаво получилося. Ні один з вищенаписаних кодів, окрім того, що на С, не працював. Зараз проаналізую правильний код і тоді спробую втілити щось подібне в С++.

9

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

На С++ це, напевно, виглядатиме найкраще так:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int i, len, result = 0;
    string input_str;
    cout << "Input a string:" << endl;
    getline (cin, input_str);
    len = input_str. length ();
    for (i = 0; i < len/2; i++)
    {
        if(input_str[i] != input_str[len-i-1])
        {
            result = -1;
            break;
        }
    }
    cout << "RESULT = " << result << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}


Дякую всім за допомогу. Принаймні я до кінця зрозумів всі мої помилки і навчився писати "гарно". Мені так здається=))

Подякували: Replace, yooll2

10

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Replace написав:

yooll, тільки там не потрібно ; після if :)
Взагалі можна ще спростити. Замість for використовувати while і потім перевіряти значення змінної i, якщо > a/2, то паліндром.

Крапку  з комою не помітив :)
Цикл while можна використати, але особливих переваг це не дасть.

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Я наскільки зрозумів, треба щоб програма задом наперед прочитала і сказала чи воно так само читається як з ліва направо?

12

Re: Проблема у роз'язку задач на мові С++ (чи є слово паліндром)

Саме так. Але тема мабуть вже не актуальна і вичерпала себе, тому думаю можна закрити.