RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-670518

Студент 221's questions

Martin Hope
1843
Asked: 2025-03-21 10:09:27 +0000 UTC

创建 AddAfter 和 Addbefore 方法

  • 4

DoublyLinkedList给出了用于处理双向链表的类。有必要落实其中的方法AddAfter和措施AddBefore。从我所理解的一切来看,它应该基于方法Add,但我不明白要用什么来补充它,除了LinkedListNode<T> node- 在什么之前或之后,以及T value- 添加。

以防万一:

public class DoublyNode<T>
{
    public DoublyNode(T data)
    {
        Data = data;
    }
    public T Data { get; set; }
    public DoublyNode<T> Previous { get; set; }
    public DoublyNode<T> Next { get; set; }
}

public class DoublyLinkedList<T> : IEnumerable<T>  // двусвязный список
{
    DoublyNode<T> head; // головной/первый элемент
    DoublyNode<T> tail; // последний/хвостовой элемент
    int count;  // количество элементов в списке

    // добавление элемента
    public void Add(T data)
    {
        DoublyNode<T> node = new DoublyNode<T>(data);

        if (head == null)
            head = node;
        else
        {
            tail.Next = node;
            node.Previous = tail;
        }
        tail = node;
        count++;
    }
    public void AddFirst(T data)
    {
        DoublyNode<T> node = new DoublyNode<T>(data);
        DoublyNode<T> temp = head;
        node.Next = temp;
        head = node;
        if (count == 0)
            tail = head;
        else
            temp.Previous = node;
        count++;
    }
    public void AddLast(T data)
    {
        DoublyNode<T> node = new DoublyNode<T>(data);
        DoublyNode<T> temp = tail;
        node.Previous = temp;
        tail = node;
        if (count == 0)
            head = tail;
        else
            temp.Next = node;
        count++;
    }

    public void AddAfter(LinkedListNode<T> node, T value) 
    { 
    
    }
    public void AddBefore(LinkedListNode<T> node, T value) 
    {
    
    }  
}
c#
  • 2 个回答
  • 64 Views
Martin Hope
1843
Asked: 2025-02-28 10:00:33 +0000 UTC

多线程程序运行中线程同步方面的问题

  • 5

给出以下问题:从键盘输入组装玩具的机器人数量和要组装的套件数量。玩具组装套件的数量必须至少是机器人数量的100倍。每个机器人在一定时间内组装一个玩具,落在用户从键盘输入的范围内(用随机数替换)。一旦玩具组装完毕,机器人就会拿出一套新的套件来组装玩具,直到所有套件都组装完毕。每个机器人在单独的线程中工作。在 WinForms 中工作。

为此,创建了此代码:

public bool stop;
List<Thread> threads = new List<Thread>();
int[] robots;
int numberSets = 0;
Random random = new Random();
object locker = new object();

private void button1_Click(object sender, EventArgs e)
{
    if (Convert.ToInt32(numberRobots.Text) * 100 <= Convert.ToInt32(numberSet.Text))
    {
        robots = new int[Convert.ToInt32(numberRobots.Text)];
        for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
        {
            robots[i] = i + 1;
        }
        for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
        {
            threads.Add(new Thread(new ParameterizedThreadStart(CreatSet)));
            threads[i].Name = $"Робот {i + 1}";
            threads[i].Start(Convert.ToInt32(robots[i]));
        }
    }

    else
    {
        Console.WriteLine("Неправильно!");
    }
}

public void CreatSet(object obj)
{

    int numberRobot = (int)obj;

    while (numberSets != Convert.ToInt32(numberSet.Text))
    {
        int tsb = random.Next(50, 100);
        numberSets++;
        lock (locker)
        {
            var message = $"• {Thread.CurrentThread.Name} начал сбор набора №{numberSets}. Время сбора набора: {tsb} секунд;";
            Invoke((MethodInvoker)delegate
            {
               infAssembly.Items.Add(message);

            });
        }
        var message1 = $"• {Thread.CurrentThread.Name} закончил сбор набора №{numberSets}.";
        Thread.Sleep(tsb);
        Invoke((MethodInvoker)delegate { infAssembly.Items.Add(message1); });

        //Thread.Sleep(random.Next(50, 100));
    }

    var message2 = $"• Наборы для сборки закончились.";
    Invoke((MethodInvoker)delegate { infAssembly.Items.Add(message2); });
}

它似乎可以工作,但是它产生了这样的无意义的结果,即第一个具有同样构建时间的流就完成了。治疗方法是去除lock。但随之而来的是,lock出于某种原因,这是老师要求该程序需要的功能,这与“机器人必须并行工作”这一陈述的逻辑相悖。简而言之,我如何重写程序以使其存在lock,同时它们可以并行工作?

c#
  • 2 个回答
  • 87 Views
Martin Hope
1843
Asked: 2025-01-20 22:22:35 +0000 UTC

多线程程序中的问题[重复]

  • 5
这个问题已经在这里得到回答:
从后台线程使用控件 (2 个答案)
23 小时前关闭。

给定一个听起来像这样的任务:

使用键盘输入组装玩具的机器人数量和组装套件的数量。玩具组装套件的数量必须超过机器人数量至少100倍。每个机器人在一定时间内收集一个玩具,该玩具落在用户从键盘输入的范围内。当玩具组装完毕后,机器人会取出一套新的玩具来拼搭玩具,直到所有的套件都组装完毕。每个机器人都在单独的线程中运行。

要求:

ListBox 需要显示有关进程进度的信息。需要在ListBox中体现的事件:

  1. 机器人 #n 开始收集集合 #m。试剂盒收集时间:x分钟;
  2. 机器人#n 已完成收集#m 组;
  3. 组装套件已经出来了。

代码:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public bool stop;
        List<Thread> threads = new List<Thread>();
        int[] robots;
        int numberSets = 0;
        Random random = new Random();
        object locker = new object();
        //List<int> sets = new List<int>();
        //List<int> setss;
        public Form1()
        {
            InitializeComponent();
            stop = false;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            foreach (Thread thread in threads) 
            {
                thread.Abort();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(numberRobots.Text) * 100 <= Convert.ToInt32(numberSet.Text))
            {
                robots = new int[Convert.ToInt32(numberRobots.Text)];
                for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
                {
                    robots[i] = i + 1;
                }
                for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
                {
                    threads.Add(new Thread(new ParameterizedThreadStart(CreatSet)));
                    threads[i].Name = $"Робот {i + 1}";
                    threads[i].Start(Convert.ToInt32(robots[i]));
                }              
            }
            else
            {
                Console.WriteLine("Неправильно!");
            }
        }

        public void CreatSet(object obj)
        {            
            int numberRobot = (int)obj;

            while (numberSets != Convert.ToInt32(numberSet.Text))
            {                
                lock (locker)
                {
                    numberSets++;
                    infAssembly.Items.Add($"• {Thread.CurrentThread.Name} начал сбор набора №{numberSets}. Время сбора набора: {random.Next(50, 100)} секунд;"); //<-- Ошибка
                }
                infAssembly.Items.Add($"• {Thread.CurrentThread.Name} закончил сбор набора №{numberSets}.");
                Thread.Sleep(random.Next(50, 100));
            }  
                
            infAssembly.Items.Add("•Наборы для сборки закончились.");
        }
    }
}

但在做的时候,总是会出现问题。每次按下按钮时,都会出现未处理的异常,如屏幕截图所示,引用块的第 88 行(在代码中注明)。请告诉我如何解决这个异常?

发生的异常是:

System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления `infAssembly` не из того потока, в котором он был создан"

在此输入图像描述

c#
  • 1 个回答
  • 44 Views
Martin Hope
1843
Asked: 2025-01-05 11:41:43 +0000 UTC

将查询结果输出到文件[关闭]

  • 0
关闭这个问题是题外话。目前不接受对此问题的答复。

寻求调试帮助的问题(“为什么这段代码不起作用? ”)应包括所需的行为、具体问题或错误,以及直接在问题中重现它的最少代码。没有明确描述问题的问题对于其他访问者来说是没有用的。请参阅如何创建最小的、独立的且可重现的示例。

2 小时前关闭。

改进问题

对于本程序,实现按照选项(见表)将查询结果输出到文件中。

选项:显示商店中可用产品的所有信息(由用户输入)[已取消]总之,我把表中的选项搞乱了,我只需要将它输出到文件中即可。

代码:

Program
static void Main(string[] args)
{
    Storage stock = new Storage(3);
    stock[0] = new Tovar("01", "Товар1", "Магазин5", 4300);
    stock[1] = new Tovar("02", "Товар2", "Магазин7", 5340);
    stock[2] = new Tovar("03", "Товар3", "Магазин3", 3040);

    bool auditor = true;
    while (auditor)
    {

        Console.WriteLine("\nВведите тип операции");
        Console.WriteLine("1) Найти товар по ID");
        Console.WriteLine("2) Найти товар по названию");
        Console.WriteLine("3) Отсортировать массив товаров по цене");
        Console.WriteLine("4) Отсортировать массив товаров по названию");
        Console.WriteLine("5) Отсортировать массив товаров по магазину");
        Console.WriteLine("6) Закончить");

        string number = Console.ReadLine();
        Console.WriteLine();

        switch (number)
        {
            case "1":
                string search_ID = Console.ReadLine();
                Tovar  item0 = stock.FindProductID(search_ID);
                if (item0 != null)
                    Console.WriteLine(item0.ToString());
                break;
            case "2":
                string search_name = Console.ReadLine();
                Tovar item1 = stock.FindProductName(search_name);
                if (item1 != null)
                    Console.WriteLine(item1.ToString());
                else Console.WriteLine("Нет такого");
                break;
            case "3":
                Tovar[] tests = stock.SortByCost();
                for (int i = 0; i < tests.Length; i++)
                {
                    Console.WriteLine(tests[i].ToString());
                }
                break;
            case "4":
                Tovar[] tests1 = stock.SortByName();
                for (int i = 0; i < tests1.Length; i++)
                {
                    Console.WriteLine(tests1[i].ToString());
                }
                break;
            case "5":
                Tovar[] tests2 = stock.SortByShop();
                for (int i = 0; i < tests2.Length; i++)
                {
                    Console.WriteLine(tests2[i].ToString());
                }
                break;
            case "6":
                auditor = false;        
                break;
        }
    }
    Console.WriteLine();
    
    Console.WriteLine("Сумма товаров:");
    Console.WriteLine(stock[0] + stock[1]);
    Console.ReadKey();
}
internal class Tovar
{
    public string ID { get; private set; } //что бы явно не обявлять резервную переменную
    public string Name { get; private set; }
    public string Shop { get; private set; }
    public double Cost { get; private set; }
    public Tovar(string id, string name, string shop, double cost)
    {
        ID = id;
        Name = name;
        Shop = shop;
        Cost = cost;
    }
    public override string ToString()
    {
        return $"ID: {ID}, название: {Name}, магазин: {Shop}, цена: {Cost}";
    }
    public static double operator +(Tovar obj1, Tovar obj2)
    {
        return obj1.Cost + obj2.Cost;
    }
}
internal class Storage
{
    Tovar[] products;
    public int Length { get; private set; }
    public Storage(int length)
    {
        Length = length;
        products = new Tovar[Length];
    }

    public Tovar this[int index]
    {
        get
        {
            if (IsValid(index))
                return products[index];
            throw new IndexOutOfRangeException();
        }
        set
        {
            if (IsValid(index))
                products[index] = value;
            else
                throw new IndexOutOfRangeException();
        }
    }

    public Tovar FindProductID(string id)
    {
        foreach (Tovar item0 in products)
        {
            if (item0.ID == id)
                return item0;
        }
        return null;
    }

    public Tovar FindProductName(string name)
    {
        foreach (Tovar item1 in products)
        {
            if (item1.Name == name)
                return item1;
        }
        return null;
    }
    public Tovar[] SortByName()
    {
        return products.OrderBy(n => n.Name).ToArray();
    }
    public Tovar[] SortByShop()
    {
        return products.OrderBy(n => n.Shop).ToArray();
    }
    public Tovar[] SortByCost()
    {
        return products.OrderBy(n => n.Cost).ToArray();
    }
    private bool IsValid(int index)
    {
        return (index >= 0) && (index < Length);
    }
}

问题:代码中需要添加什么才能将所有信息输出到文件中?

c#
  • 1 个回答
  • 51 Views
Martin Hope
Студент 221
Asked: 2024-12-31 19:09:54 +0000 UTC

需要 Directory 类的帮助

  • 5

简而言之,我的作业要求我演示 Directory 和 DirectoryInfo 类的操作。当我输入一种方法的测试示例时,我收到一条错误消息,表明该方法名称在当前上下文中不存在。我最终该如何解决这个问题?我附上下面的代码。

internal class Directory
{
    static void Main(string[] args)
    {
        string dirName = "E:\\";
        if (Directory.Exists(dirName)) //<-вот здесь на Exists
        {
            Console.WriteLine("Подкаталоги:");
            string[] dirs = Directory.GetDirectories(dirName); //<-и здесь на GetDirectories
            foreach (string s in dirs)
            {
                Console.WriteLine(s);
            }
            Console.WriteLine();
            Console.WriteLine("Файлы:");
            string[] files = Directory.GetFiles(dirName); //<-и тут на GetFiles
            foreach (string s in files)
            {
                Console.WriteLine(s);
            }
        }

    }
}
c#
  • 1 个回答
  • 81 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5