Member 14912096 Ответов: 2

Как мне изменить и заменить слово


У меня есть массив слов. Чего я хочу добиться, так это если есть "успех", и я хочу изменить его на "XXXXXXX". Как вы можете видеть в цикле, мне удается получить длину слова, которое соответствует "успеху". Но я не могу повернуть цикл вспять, чтобы заменить слово, которое я нашел. Я успешно заменяю первый последний, но не другие. Как я могу изменить цикл, чтобы вернуться от последнего слова "успех" и заменить его.
public char[,] CrossWord
        {
            get
            {
                var table = new char[,]
                {   //1   2   3   4   5   6    7
                    {'S','U','C','C','E','S','S'},//1
                    {'E','U','S','S','E','C','U'},//2
                    {'U','S','C','C','C','E','C'},//3
                    {'S','S','U','C','E','C','C'},//4
                    {'S','E','S','S','E','S','S'},//5
                    {'U','C','S','E','U','S','S'},//6
                    {'C','C','S','S','E','E','S'},//7
                    {'S','U','S','S','S','S','E'},//8
                    {'U','S','E','S','S','C','S'} //9

                };
                return table;
            }
        }

public char[,] ReplaceWord(string searchWord, string replaceWord)
        {
           
            var newReplaceCrossWordTable = (char[,])CrossWord.Clone();

            var totalRowNumber = newReplaceCrossWordTable.GetLength(0);
            var totalColumnNumber = newReplaceCrossWordTable.GetLength(1);

            String word;
            word = "SUCCESS";
            int len = word.Length;
            int R;
            int C;
            R = 9;
            C = 7;

            Console.WriteLine("*** Crossword Table *****");
            for (var row = 0; row < totalRowNumber; row++)
            {
                for (var column = 0; column < totalColumnNumber; column++)
                {

                    Console.Write(newReplaceCrossWordTable[row, column]);

                    if (CrossWord[row, column] != word[0])
                    {

                    }
                    for (int dir = 0; dir < 8; dir++)
                    {
                        int k, rd = row + x[dir], cd = column + y[dir];


                        for (k = 1; k < len; k++)
                        {
                            //CrossWord[row, column] = 'X';
                            // If out of bound break 
                            if (rd >= R || rd < 0 || cd >= C || cd < 0)
                            {
                                break;
                            }

                            // If not matched, break 
                            if (CrossWord[rd, cd] != word[k])
                            {
                                break;
                            }

                            // Moving in particular direction 
                            rd += x[dir];
                            cd += y[dir];
                        }

                        // If all character matched, then value of k 
                        // must be equal to length of word 
                        if (k == len)
                        {

                                //newReplaceCrossWordTable[row, column] = 'X';
                            //Console.Write(newReplaceCrossWordTable[row, column]);

                            for (int di = 0; di < 8; di++)
                            {
                                int kk, r = row + x[dir], c = column + y[dir];


                                for (kk = 1; kk < len; kk++)
                                {
                                    //CrossWord[row, column] = 'X';
                                    // If out of bound break 
                                    if (rd >= R || rd < 0 || cd >= C || cd < 0)
                                    {
                                        break;
                                    }


                                    // Moving in particular direction 
                                    r -= x[dir];
                                    c -= y[dir];
                                    newReplaceCrossWordTable[row, column] = 'X';
                                }

                            }

                        }
                    }



                }
                Console.WriteLine();
            }
            Console.WriteLine("************************");

            return newReplaceCrossWordTable;
        }
        }


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

Как вы можете видеть, я успешно получаю длину слова. Мне удается изменить 1-й последний, но не остальные.

*** Crossword Table *****
SUCCESS
EUSSECU
USCCCEC
SSUCECC
SESSESS
UCSEUSS
CCSSEES
SUSSSSE
UXESSCS
************************
//This is what i wanted

*** Crossword Table *****
xxxxxxx
EXSSECU
UXXCCEC
SXUXECC
SXSSXSS
UXSEUXS
CXSSEEX
SXSSSSE
UXESSCS
************************

                            }
}

OriginalGriff

Вам придется объяснить гораздо более подробно, что вы пытаетесь сделать - я, например, не могу понять, голова или хвост из вашего описания.

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

Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Member 14912096

Я уже обновил вопрос. Надеюсь, вы меня поймете. Спасибо!

Patrice T

Постарайтесь показать желаемый результат.

Member 14912096

я уже обновился с желаемым результатом

Richard MacCutchan

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

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
Как я могу перевернуть цикл и заменить все символы желания после того, как я нашел длину слова?

Было бы неплохо объяснить, что должен делать код с более подробной информацией.
Пример ввода-вывода тоже был бы хорош.
Цитата:
Уже много раз модифицировал цикл и все еще безуспешно

Запустите с помощью отладчика и посмотрите своими глазами, как формируется ваш код.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

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

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

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

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
[Обновление]
Цитата:
У меня есть массив слов. Чего я хочу добиться, так это если есть "успех", и я хочу изменить его на "XXXXXXX".

Мой перевод: у меня есть матрица букв, я хочу найти скрытое слово "успех" (в любом направлении) в Матрице и заменить все вхождения на "xxxxxxx".
rd += x[dir];
cd += y[dir];

x и y не определены в вашем наборе СНиПов кода

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


Рейтинг:
0

George Swan

Мое предложение состояло бы в том, чтобы разбить ваш код на ряд коротких методов. Предположим, что вы хотите найти успех в строках, Столбцах и левой и правой диагоналях вашей таблицы либо как успех, либо как SSECCUS, попробуйте что-то вроде этого. Установите 2 целевых массива, один из которых содержит последовательность SUCCESS, а другой SSECCUS. Пройдите по строкам, столбцам и диагоналям, пытаясь сопоставить один или другой из ваших двух целевых массивов. Вот пример проверки строк таблицы.


private char[] _target = new char[] { 'S', 'U', 'C', 'C', 'E', 'S', 'S' };
private char[] _revTarget = new char[] { 'S', 'S', 'E', 'C', 'C', 'U', 'S' };
private List<Point> _XPoints = new List<Point>();
private int _colCount = 7;
private int _rowCount = 9;
public void CheckRows()
{
    char[] testFrame = new char[_target.Length];
    List<Point> points = new List<Point>();

    for (int r = 0; r < _rowCount; r++)
    {
        int startCol = 0;
        while (startCol + _target.Length <= _colCount)
        {
            points.Clear();
            for (int c = startCol; c < startCol + _target.Length ; c++)
            {
                testFrame[c] = _table[r, c];
                //add the Table reference point (x axis,y axis)
                points.Add(new Point(r, c));
            }

            if (testFrame.SequenceEqual(_target) || testFrame.SequenceEqual(_revTarget))
            {
                //found a match so add the reference points to the main collection
                _XPoints.AddRange(points);
                //when all rows cols and diagonals have been checked
                //use _xPoints to mark an X at each of the points in the table array
            }
            startCol += 1;
        }
    }
}