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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2019, 17:51   #1
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
Печаль Помогите вникнуть в суть задачи

Добрый день,


Нужно написать программу на C# согласно условию задачи, приведенного ниже:

Дана последовательность символов C = {c0...cn - 1}. Дан набор из N пар кодирующих символов (ai,bi). Создать многопоточное приложение, кодирующее строку C следующим образом: поток 0 заменяет в строке С все символы a0 на символы b0, поток 1 заменяет в строке С все символы a1 на символы b1, и т.д. Потоки должны осуществлять кодирование последовательно.


Не могу разобраться что от меня требуется. Раньше я сталкивался с задачами где всё было конкретно, описаны типы данных и т.д. А такие абстракции с c0...cn-1 и т.д. мне даются тяжелей.


Вот как я пытаюсь мыслить:

Есть строка C = "Привет, мир! Мир так прекрасен!"

И есть 2 пары кодирующих символов (и,а) (р,й)

То есть после того как поток 0 отработает мы получаем:

C = "Правет, мар! Мар так прекрасен!"

А во втором потоке 2 заменяем символ a1 (в данном случае это символ "р" на "й") и в итоге получаем:


C = "Пйавет, май! Май так пйекйасен!"


То есть от меня требуется придумать строку, придумать N пар кодирующих символов. И уже с помощью N потоков закодировать строку последовательно, как я описал выше?

У меня правильный ход мыслей ? Или я ошибаюсь ?
artems67 вне форума Ответить с цитированием
Старый 26.02.2019, 17:53   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Можете не придумывать, а вводить.
p51x вне форума Ответить с цитированием
Старый 26.02.2019, 18:53   #3
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

А как динамически создавать потоки в зависимости от N пар (Поток 1, поток 2, поток 3 и т.д.)? Ведь я заранее не буду знать сколько мне нужно объявить объектов класса Thread.
artems67 вне форума Ответить с цитированием
Старый 26.02.2019, 19:23   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Ну так создайте массив
p51x вне форума Ответить с цитированием
Старый 26.02.2019, 20:00   #5
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Массив потоков ? Что-то я не пойму.

Вот синтаксис создание потока:

Thread myThread0_Run = new Thread(myThread0);

myThread0 - функция в которой я кодирую первую пару символов.

Соответственно myThread0_Run. Я могу создать массив из 10 кодирующих пар без проблем. Но я не понимаю как мне создать 10 потоков в одному случае. А в другом, например, случае уже ввели 5 пар. И соответственно нужно только 5 потоков.

В условии написано:

поток 0 заменяет в строке С все символы a0 на символы b0, поток 1 заменяет в строке С все символы a1 на символы b1, и т.д. Потоки должны осуществлять кодирование последовательно.

То есть если пар 4. То и потоков должно быть 4 и они запущены одновременно. Но должна соблюдаться некая очередь, и чтобы потоки работали друг за другом.
artems67 вне форума Ответить с цитированием
Старый 26.02.2019, 20:15   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Цитата:
Сообщение от artems67 Посмотреть сообщение
Соответственно myThread0_Run. Я могу создать массив из 10 кодирующих пар без проблем. Но я не понимаю как мне создать 10 потоков в одному случае. А в другом, например, случае уже ввели 5 пар. И соответственно нужно только 5 потоков.
Ввести Number. Создать массив
Код:
Thread[] Threads = new Thread[Number];
и заполнить его
Код:
for (int counter = 0; counter <= Length; counter++)
{
   Threads[counter] = new Thread(() =>...
}
Цитата:
Сообщение от artems67 Посмотреть сообщение
Но должна соблюдаться некая очередь, и чтобы потоки работали друг за другом.
Ну так соблюдайте. К вашим услугам управление потоками, средства синхронизации, ...

Последний раз редактировалось p51x; 26.02.2019 в 20:19.
p51x вне форума Ответить с цитированием
Старый 27.02.2019, 09:58   #7
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Спасибо большое за помощь! Программу написал, преподаватель принял.

Вот код, может кому поможет в решении подобной задачи:

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace KodirovkaStroki
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        // Одномерный массив из 2-х элементов представляет собой кодирующую пару (ai,bi)
        char[] para_new = new char[2]; 

        public async void myThread() // Функция кодирования строки парой кодирующий символов.
        {
                for (int i = 0; i < C.Length; ++i)
                {
                    if (para_new[0] == C[i])
                    {
                        C = C.Replace(C[i], para_new[1]);
                    }

                }
        }



        string C; 

        public async void butRun_Click(object sender, EventArgs e)
        {
            C = textBox1.Text; // Считываем строку С

            /* 
             * Кол-во и сами пары кодирующих символов 
             * я заполняю вручную соответственно это переменная Number и массив para_start 
             */
            int Number = 5;
            // Мой набор кодирующих пар (ai,bi)
            char[,] para_start = { {'и','а' },{'р','к' },{'и','м' },{'о','г' },{'с','х'} };

            
            //Составляем массив потоков согласно количеству пар (Поток 0, Поток 1 и т.д.)
            Thread[] Threads = new Thread[Number]; int j = 0;

            

            for (int counter = 0; counter < Threads.Length; counter++)
            {
                para_new[0] = para_start[counter, 0]; 
                para_new[1] = para_start[counter, 1];
                Threads[counter] = new Thread(myThread);
                Threads[counter].Start();
                textBox2.Text += "Поток №" + counter.ToString() + ".старт..." + Environment.NewLine;
                while (Threads[counter].IsAlive) // Отслеживаю, когда закончится Поток кодирования пар символов, чтобы перейти к след. потоку
                {
                    await Task.Delay(5000);
                }
            }


            textBox2.Text += "Результат: " + C + Environment.NewLine; // Вывод закодированной строки
        }
    }
}
artems67 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите понять суть задания на макросы alexboliam Общие вопросы C/C++ 0 18.03.2018 02:52
[Хочу вникнуть суть компонентов] Вид CheckBox'а Ship_1 Компоненты Delphi 17 25.01.2017 19:05
Парсим текст, не могу вникнуть antoxamad Помощь студентам 7 23.02.2012 10:02
Задачи на Pascal ABC (обьясните хотябы суть) Joker_SoloD Помощь студентам 1 08.12.2010 15:15
Помогите вникнуть в условие задачи. Что нужно сделать garald50 Паскаль, Turbo Pascal, PascalABC.NET 3 04.06.2008 19:42