Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2015, 16:53   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию C# как заменить массив строк

Я уже писал топик, что программа медленно работает. Тогда я еще не очень разобрался, но смог заменить одну строку на int[]. Программа заработала в 3 раза быстрее!

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

То есть дан массив:
B = {"010010011", "110010010", "100111101"}
К конкретному символу я могу обращаться просто: B[1][3] = 0.
Первая скобка - номер элемента, вторая - номер символа в строке.
Вот такой массив я обрабатывать могу!

Что бы я хотел: найти такой формат, или такой код, с помощью которого я бы мог делать вышеуказанную операцию B[1][3].

Вроде, тут все подходит, но смотрите конкретнее - у меня только бинарные данные, то есть либо 0, либо 1. И я бы сам додумался, может быть, но мне и так надо много моментов сейчас в голове держать, потому что учу подробнее С# в ходе данной работы.
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 17:05   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Вопрос то в чем?

ps: если промедетировал правильно то вам надо смотреть битовые операции, маски и т.п.

Последний раз редактировалось come-on; 02.11.2015 в 17:07.
come-on вне форума Ответить с цитированием
Старый 02.11.2015, 17:15   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

ОК, давайте конкретно. Как оптимизировать этот кусок кода?

Код:
difcod.Add(difcoding(Bsc[itmr - 1]));

    string difcoding(string X)
        {
            char c1 = '0'; string cout = "0"; int count = 0;
            string Y = "";

            foreach (char c in X)
            {
                if ((byte)c1 - (byte)c == 0) cout = "0";
                else if ((byte)c1 - (byte)c == 1) cout = "1";
                else if ((byte)c1 - (byte)c == -1) cout = "1";
                else { }
                c1 = c;
                Y = Y + cout;
                count++;
            }
            return Y;
        }
Я могу использовать здесь любой формат данных, но сначала я думал, что хорошо использовать string. А теперь я думаю, что можно сделать намного лучше, поменяв тип данных string. Есть варианты, как? Строки string в этом случае - это последовательность бит, то есть просто "01110110101". И таких в массиве много, они определяются по индексу itmr-1

Последний раз редактировалось Krasi; 02.11.2015 в 17:20.
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 17:20   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
у меня сейчас в голове такой бардак
Разгребай. Я например даже после твоего примера ничего не понял...
Задачу для начала озвучь и на словах сам алгоритм.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2015, 17:28   #5
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ок, задача в том, что имеется входная строка Bsc[itmr-1], представляющая из себя что-то типа "001110110..." и выходной листинг difcod. Я получаю выходные данные из входных с помощью функции difcoding():
Код:
difcod.Add(difcoding(Bsc[itmr - 1]));
Сама функция делает следующее:

Код:
 string difcoding(string X)
        {
            char c1 = '0'; string cout = "0"; int count = 0;
            string Y = ""; //Выходной результат функции

            foreach (char c in X) //Для каждого бита, ведь строчка "0011011", а в ней по сути лишь биты и ничего больше
            {
                if ((byte)c1 - (byte)c == 0) cout = "0"; //Вычитаем из предыдущего бита следующий за ним - в зависимости 
                             от результата вычитания выход cout принимает значение либо 0, либо 1.
                else if ((byte)c1 - (byte)c == 1) cout = "1";
                else if ((byte)c1 - (byte)c == -1) cout = "1";
                else { }
                c1 = c;
                Y = Y + cout; // В строчку Y добавляется новый бит
                count++;
            }
            return Y; //Возвращаем строчку битов, полученную вышеописанным алгоритмом
        }
Нужно максимально оптимизировать этот код. Можно уйти от строчек и листингов, либо оставить листинги пока, но уйти от строчек. Вообще - как фантазия позволит. можно сделать входной листинг не листингом, на массивом int, бинарным массивом - чем угодно.
Я хочу потом переписать весь код, не только этот кусочек, но захотел начать именно с предложенного кусочка.

Последний раз редактировалось Stilet; 02.11.2015 в 17:42.
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 17:53   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я так понимаю что ты хочешь такое?:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static int foo(int n) {
            int k = 0;
            for (int i = 0; i < sizeof(int)-1; i++)
            {
                k += ((n & 2) != 1) ? 1 : 0 - (n & 1);
                k <<= 1;
                n >>= 1;
            }
            return k;
        }
        static void Main(string[] args)
        {
            int n = 567;
            Console.Write("{0} - {1}", Convert.ToString(n, 2), Convert.ToString(foo(n), 2));
            Console.ReadKey();
        }
    }
}
Да?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2015, 10:37   #7
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Не совсем. Так как исправить пока не очень получается, привожу комментарий, как надо

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BITSDiffer
{
    class Program
    {
        static int foo(int n)
        {
            int k = 0;
            for (int i = 0; i < sizeof(int) - 1; i++)
            {
                k += ((n & 2) != 1) ? 1 : 0 - (n & 1);
                k <<= 1;
                n >>= 1;
            }
            return k;
        }
        static void Main(string[] args)
        {
            int n = 567;
            Console.Write("{0} vs {1}", Convert.ToString(n, 2), Convert.ToString(foo(n), 2)); //размеры {0} и {1} должны быть одинаковы
                                                        //если в {0} содержится последовательность 1000110111, то {1} будет равно
                                                        //1100101100. То есть программа переходит вправо от бита к биту и смотрит,
                                                        //не поменялось ли значение бита (сначала все считается относительно 0)
                                                        //если поменялось - то записываем 1, если нет - 0.
                                                                                            
            Console.ReadKey();
        }
    }
}
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать массив строк в массив чисел на C#? orfos Помощь студентам 4 03.10.2014 15:56
Заменить слово в массиве строк =S-S-K= Общие вопросы C/C++ 0 02.04.2014 21:43
Написать программу на СИ: дано массив с n строк.В каждой строке заменить знаки восклицания на точки. novyky@ukr.net Общие вопросы C/C++ 9 24.01.2013 17:00
Написать программу на СИ: дано массив с n строк.В каждой строке заменить знаки восклицания на точки. Костя555 Помощь студентам 2 28.12.2012 00:39