OfficialSub0 Ответов: 3

Как проверить, являются ли разные строки палиндромом?


Я не знаю, как проверить отдельные строки, чтобы показать, являются ли они палиндромами или нет. Программа рассматривает обе строки как одну, поэтому выводит "это не палиндром", когда одна из строк действительно есть.

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

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Palindrome
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack list = new Stack();
            string ch;
            string value1= "eye";
            string value2 = "view";

            string word = string.Format("{0}\n{1}\n", value1, value2);                                                              
            bool palindrome = true;

            for (int x = 0; x < word.Length; x++)
                list.push(word.Substring(x, 1));
            int pos = 0;

            while (list.count > 0)
            {
                ch = list.pop().ToString();
                if (ch != word.Substring(pos, 1))
                {
                    palindrome = false;
                    break;
                }
                pos++;
            }
            if (palindrome)
                Console.WriteLine(word + " \nis a palindrome.");
            else
                Console.WriteLine(word + " \nis not a palindrome.");
            Console.Read();
        }

        class Stack
        {
            private int index;
            private ArrayList list;
            public Stack()
            {
                list = new ArrayList();
                index = -1;
            }
            public int count
            {
                get
                {
                    return list.Count;
                }
            }
            public void push(object item)
            {
                list.Add(item);
                index++;
            }
            public object pop()
            {
                object obj = list[index];
                list.RemoveAt(index);
                index--;
                return obj;
            }
            public void clear()
            {
                list.Clear();
                index = -1;
            }
            public object peek()
            {
                return list[index];
            }
      
        }
    }
}

3 Ответов

Рейтинг:
25

CHill60

Вы на самом деле проверяете значение word посмотреть, не палиндром ли это.

eye
view
это не палиндром. Если вы хотите проверить эти отдельные слова, то вам придется провести некоторую обработку, чтобы отделить их, например, разделить на \n и обрабатывайте каждый результат в этом массиве в цикле.

Если вы измените свой код на
string word = value1;
тогда он правильно отмечает, что это палиндром.

Пожалуй, самый известный палиндром - "Мадам, я Адам". Ваш код не будет рассматривать это как палиндром, потому что:
1. Вы не удаляете и не обрабатываете знаки препинания, такие как ', , и т.д.
2. вы не обрабатываете различия в случае M должно быть "равно" m для того, чтобы найти палиндром.
3. Вы вставляете \n в ваши тестовые данные.


Рейтинг:
2

Patrice T

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

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


OfficialSub0

Я использовал отладчик и не уверен, что именно поэтому создал этот пост...

Patrice T

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

Member 10317286

Почему бы не попробовать сделать каждое слово отдельно и посмотреть, что получится?

Рейтинг:
2

George Swan

Попробуйте использовать linq. Что-то вроде


var names=new List<string>(){"level","eve","tub","Eye","Racecar","motor"};
var palindromes = names.Select(n => n.ToLower().ToCharArray())
.Where(n => n.Reverse().SequenceEqual(n));
foreach (var p in palindromes)
{
 Console.WriteLine(p);
}


F-ES Sitecore

Ваш код не определит, что "гоночный автомобиль" - это палиндром :)

George Swan

Спасибо за шутливый ответ. Я ожидал выговора за ответ на вопрос. Большинство из них не понимают, насколько полезным может быть Linq, поэтому я решил опубликовать его в качестве примера.

F-ES Sitecore

Однако это явно домашнее задание, поэтому решение должно будет охватывать то, что они узнали в своем классе до сих пор, так что LINQ, вероятно, не будет считаться допустимым решением.