Почему эта c# программа Palindrome не работает? - PullRequest
0 голосов
/ 19 марта 2020
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Palindrome
{
    class Program
    {
        static void Main(string[] args)
        {


            string filePath = @"C:\Users\Me\Desktop\Palindromes\palindromes.txt";
            //This gets the file we need

            var meStack = new Stack<string>();
            //this  creates the stack

            foreach (var item in File.ReadLines(filePath))
            {
                meStack.Push(item.ToUpper());
            }
            //for every item in the file, push onto the stack and make it upper case


            while (meStack.TryPop(out string Line))
            {
                reverseMe(Line);
            }
            //While every line in the stack is popped out, every line goes to the fucntion reverseMe






            static bool reverseMe(string Line)
            {
                return
                    Line == Line.Reverse();
            }
            //return true if line is the same as the line backwards or false if its not.


        }
    }

}

Как получить вывод? Я написал комментарии, чтобы попытаться понять ... но я не получаю вывод консоли. Я хочу, чтобы код взял файл, поместил все строки в стек и отправил каждую строку в этом стеке в функцию reverseMe (), которая является логическим значением. Bool увидит, является ли строка такой же, как и в обратном направлении, и, если это так, вернет true или false. В основном моя консоль пуста, когда я пытаюсь запустить этот код .. Что мне делать?

Ответы [ 3 ]

1 голос
/ 19 марта 2020

Существует проблема в методе reverseMe, функция Реверс дает вам набор char, если применить его к string, тогда вам нужно преобразовать IEnumerable<char> в string new string() или string.Concat(), как в следующем коде:

static bool reverseMe(string Line)
{
    //deleting whitespaces, tabs
    Line = Regex.Replace(Line, @"\s+", "");

    return Line == new string(Line.Reverse().ToArray());
    //or
    //return Line == string.Concat(Line.Reverse());
    //or like Dmitry comment
    //return Line.SequenceEqual(Line.Reverse());
}

Вызов reverseMe, и результат вывода такой как : слово не является палиндромом

while (meStack.TryPop(out string Line))
{
    string isOrNotPalindrome = reverseMe(Line) ? string.Empty : "not";
    Console.WriteLine($"{Line} is {isOrNotPalindrome} palindrome");
}

Демо

bool isPalindrome1 = reverseMe("madam");
bool isPalindrome2 = reverseMe("nurses run");
bool isPalindrome3 = reverseMe("AaBbbBaAp");

Результат

true
true
false

Надеюсь, это поможет вам решить проблему

1 голос
/ 20 марта 2020

Начнем с проблемы; Я предполагаю, что вы хотите отсканировать все строки файла и распечатать, если строка является палиндромом.

Во-первых, нам нужно реализовать метод IsPalindrom:

private static bool IsPalindrom(string value) {
  if (null == value)
    return false; // or true, ot throw ArgumentNullException

  // We have to prepare the string: when testing for palindrom
  //  1. Let's ignore white spaces (' ', '\r', '\t' etc.)
  //  2. Let's ignore punctuation  (':', ',' etc.)
  //  3. Let's ignore cases        (i.e. 'M' == 'm') 
  // So "Madam, I'm Adam" will be a proper palindrom
  value = string.Concat(value
    .Where(c => !char.IsWhiteSpace(c))
    .Where(c => !char.IsPunctuation(c))
    .Select(c => char.ToUpperInvariant(c)));

  // Instead of Reversing we can just compare:
  // [0] and [Length - 1] then [1] and [Length - 2] etc.
  for (int i = 0; i < value.Length / 2; ++i)
    if (value[i] != value[value.Length - 1 - i])
      return false; // we have a counter example: value is NOT a palidrom

  // Value has been scanned, no counter examples are found
  return true;    
}

Время записи Main метод:

static void Main(string[] args) {
  string filePath = @"C:\Users\Me\Desktop\Palindromes\palindromes.txt";

  var result = File
    .ReadLines(filePath)
    .Where(line => !string.IsNullOrWhiteSpace(line)) // let's skip empty lines
    .Select(line => $"{(IsPalindrom(line) ? "Palindrom" : "Not a palindrom")}: \"{line}\"");

  // Do not forget to print result on the Console:
  foreach (var record in result)   
    Console.WriteLine(record);

  // Pause to have a look at the outcome (wait for a key to be pressed)
  Console.ReadKey(); 
} 
0 голосов
/ 19 марта 2020

Хм, не существует Console.WriteLine () для выполнения какого-либо фактического вывода после получения результатов от функции reverseMe ().

...