jatinp510 Ответов: 2

В чем проблема в моем коде


#include <stdio.h>
#include <string.h>

int main()
{
    int n,flag=0,p;
    scanf("%d",&n);
    while(n--){
        int j=0;
        char s[10000];
        scanf("%s",&s);
        j=strlen(s);

        for(int i=1;i<=j/2;i++){

            if(s[i]==s[j-i+1])
            flag++;
            p=i;
            }
        if(flag==p)
            printf("palindrome");
            else
        printf("not");

    }
}
[edit]добавлен блок кода-OriginalGriff [/edit]

Что я уже пробовал:

я пытаюсь проверить строку палиндрома.

Richard MacCutchan

В чем вопрос?

2 Ответов

Рейтинг:
2

OriginalGriff

Ну, это довольно просто - и если бы вы использовали отладчик, вы бы заметили его довольно быстро.

Начните с пары подсказок:
1) каков индекс первого элемента массива?
2) Что будет делать с этим приоритет оператора:

j-i+1
Будет ли он оцениваться как
j-(i+1)
Или как
(j-i)+1
Разве это имеет значение?
3) оказывает ли (1) какое-либо влияние на значение p?
4)каково значение флага при втором обходе внешней петли?

Вместо того, чтобы проверить как и что, добавить переменную isPalindrome, и установить его в 1 (это с "истинная") вне внутреннего цикла.
Внутри цикла, если вы найдете одно несоответствие, установите его в 0 (это C для " false")

После цикла проверьте его, и он скажет вам, является ли это палиндромом...


jatinp510

thnk u soo much

OriginalGriff

Пожалуйста!

jatinp510

//в этом коде я проверил, является ли это палиндромом, и если это палиндром, то он проверит, является ли он нечетным или четным
// предложите мне лучший код, чтобы улучшить мои навыки

#include < stdio.h>
#include & lt;string.h>

тап_п()
{
int n, p, i;
scanf ("%d",& n);
в то время как(n--){
int flag=0, type=0;
int j=0;
char s[100000];
scanf ("%s",& s);
j=strlen(s);
если (j==1){
printf ("YES ODD\n");
}
еще{

если (j%2==0){
тип=1;
}

for (int i=0;i< j / 2; i++){
если (s[i]==s[j-i-1])
флаг++;
p=i;}
если усилитель(флаг==(П+1)&;&амп;вид==1)
printf ("да даже\n");
else if (flag==(p+1)& & amp; type==0)
printf ("YES ODD\n");
еще
printf ("NO\n");

}}
}

OriginalGriff

Может быть, вам следовало дольше думать о задаче, а не бросаться в код? Это ... гм ... довольно бедно, если честно.

jatinp510

сэр, я начинающий...
плзз... дайте мне несколько ценных предложений.. :)

OriginalGriff

Хорошо: перестаньте торопиться с кодом.
Размышление о проблеме и разработка решения сначала облегчают всю вашу жизнь: например, планирование маршрута в вашем автомобиле перед отправлением, вместо того, чтобы садиться в машину и мчаться в надежде на правильное направление. Убедившись, что у вас достаточно топлива, ваших кредитных карт или чего-то еще, жена, дети с вами, прежде чем вы отправитесь.

В данный момент Вы смотрите на задачу и бросаетесь печатать - и в итоге получаете запутанный код, который вроде бы работает, но не делает этого, а потом вы немного взламываете его, потом еще немного, и в итоге получаете что-то, что все еще не совсем работает, но вы не понимаете и не можете легко изменить.

Так что игнорируйте эту кучу, сделайте резервную копию и полностью прочтите проблему - а затем разработайте способ сделать это, полностью игнорируя код, прежде чем переводить его в код.

Здесь есть три стадии:
1) Получить входные данные.
2) Проверьте, не палиндром ли это.
3) Проверьте, является ли она "нечетной" - что, как я предполагаю, означает длину нечетной или четной.
Вы слишком много их путаете и в результате не облегчаете себе жизнь.

Я не собираюсь делать код для вас - это ваше домашнее задание, и делать его - это то, как вы изучаете этот материал, - но вы можете сделать это довольно легко, если сначала сядете и подумаете! Поехали-это не сложная задача, Честное слово!

jatinp510

thnk u... еще раз :)

OriginalGriff

Пожалуйста!

Рейтинг:
0

Patrice T

Прежде всего, используйте правильный отступ, это поможет вам читать код, это поможет незнакомцам читать ваш код.

#include <stdio.h>
#include <string.h>

int main()
{
    int n,flag=0,p;
    scanf("%d",&n);
    while(n--){
        int j=0;
        char s[10000];
        scanf("%s",&s);
        j=strlen(s);

        for(int i=1;i<=j/2;i++){

            if(s[i]==s[j-i+1])
                flag++;
            p=i;
        }
        if(flag==p)
            printf("palindrome");
        else
            printf("not");

    }
}

Массивы C основаны на 0, что означает, что первый символ в s является s[0] Вы начинаете проверять второй символ.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


jatinp510

ТНК у ... сэр

jatinp510

//в этом коде я проверил, является ли это палиндромом, и если это палиндром, то он проверит, является ли он нечетным или четным
// предложите мне лучший код, чтобы улучшить мои навыки

#include < stdio.h>
#include & lt;string.h>

тап_п()
{
int n, p, i;
scanf ("%d",& n);
в то время как(n--){
int flag=0, type=0;
int j=0;
char s[100000];
scanf ("%s",& s);
j=strlen(s);
если (j==1){
printf ("YES ODD\n");
}
еще{

если (j%2==0){
тип=1;
}

for (int i=0;i< j / 2; i++){
если (s[i]==s[j-i-1])
флаг++;
p=i;}
если усилитель(флаг==(П+1)&;&амп;вид==1)
printf ("да даже\n");
else if (flag==(p+1)& & amp; type==0)
printf ("YES ODD\n");
еще
printf ("NO\n");

}}
}

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.