Создать многопоточное приложение для определения количество вхождений числа b в массив C - C#

Узнай цену своей работы

Формулировка задачи:

Задание написать программу

Дана последовательность чисел С = {с0…сn–1} и число b. Создать многопоточное приложение для определения количество вхождений числа b в массив C.

Как я понял в массиве у нас будут хранится номер элементов. Основной поток создает нужное число потоков, число которых задается параметром, каждому из которых передается параметр – номер процесса (или номер части массива, обрабатываемой потоком). Функция потока считает количество вхождений числа b в массив C, а основной поток ждет завершения всех потоков Заранее, большое спасибо! Вот есть похожая задачка для примера, но я все равно не понимаю Дана последовательность натуральных чисел a0, …, a99. Создать поточное приложение для поиска суммы квадратов ∑ai2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
 
namespace MultiThread
{
    class Program
    {static int []a=new int [1000];
     static int n;
     static void ThreadFunc(int param, out int sum) //Функция потока
        {
    int i,nt,beg,h,end;
    sum=0;
    nt=param;
    h=1000/n;
    beg = h*nt;end=beg+h;
    if (nt==n-1)
     end=1000;
    Console.WriteLine("Поток {0} начало {1} конец {2}",nt,beg,end);
    for(i=beg;i<end;i++) sum += a[i]*a[i];
    }

        static void Main(string[] args)
        {n=Convert.ToInt32(args[0]);
        Stopwatch sWatch = new Stopwatch();
        short start1, finish1,start2,finish2;
    int i;
    Thread [] thread =new Thread[n];
    int [] s1=new int[n];
    int rez=0,s = 0;
    int[] x = new int[n];
            for (i=0;i<100;i++)
           a[i] = i;
          sWatch.Start();
    //создание n дочерних потоков
          for (i=0;i<n;i++)
    {x[i]= i;thread[i] = new Thread(()=>ThreadFunc(x[i],out s1[i]));
    thread[i].Start(); thread[i].Join();
        }
                        for(i=0;i<n;i++)    rez+=s1[i];
            sWatch.Stop();
            Console.WriteLine (sWatch.ElapsedMilliseconds.ToString());
    Console.WriteLine("Сумма квадратов с {0} потоками = {1}",n,rez);
    sWatch.Start();
    for (i = 0; i < 1000; i++) s += a[i]*a[i];
    sWatch.Stop();
    Console.WriteLine(sWatch.ElapsedMilliseconds.ToString());
    Console.WriteLine("Сумма квадратов без потоков = {0}", s);
            Console.ReadLine();
                }
    }
}

Решение задачи: «Создать многопоточное приложение для определения количество вхождений числа b в массив C»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
 
namespace ConsoleApplication173
{
    class Program
    {
        static int[] C = new int[1000];
        static int n;
        static int b;//наше число
 
        static int[] sl;
 
        static void ThreadFunc(int param)//функия потока 
        {
            int i, nt, beg, h, end;
            nt = param;
            var res = 0;
            h = 1000 / n;
            beg = h * nt;
            end = beg + h;
            if (nt == n - 1)
                end = 1000;
 
            Console.WriteLine("Поток {0} начало {1} конец {2}", nt, beg, end);
 
            for (i = beg; i < end; i++)
            {
                if (C[i] == b)
                    res++;
            }
 
            Console.WriteLine("Поток {0} стоп", nt);
 
            sl[param] = res;
 
        }
 
        static void Main(string[] args)
        {
            Console.WriteLine("Введите число");
 
            b = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Введите количество потоков");
 
            n = Convert.ToInt32(Console.ReadLine());
            Stopwatch sWatch = new Stopwatch();
            //short start1, finish1, start2, finish2;
            int i;
            Thread[] thead = new Thread[n];
            sl = new int[n];
            int rez = 0;
 
            for (i = 0; i < 1000; i++)
                C[i] = i;
            sWatch.Start();
            //Cоздание дочерних потоков
            for (i = 0; i < n; i++)
            {
                var temp = i;
                thead[i] = new Thread(() => ThreadFunc(temp));
                thead[i].Start();
            }
 
            for (i = 0; i < n; i++)
            {
                thead[i].Join();
                rez += sl[i];
            }
 
            sWatch.Stop();
 
            Console.WriteLine("Число вхождений в массив {0} потоками ={1}", n, rez);
            Console.WriteLine("Время:{0}", sWatch.ElapsedMilliseconds.ToString());
            sWatch.Start();
 
            int res = 0;
            for (i = 0; i < 1000; i++)
                if (C[i] == b)
                    res++;
            sWatch.Stop();
 
            Console.WriteLine("Число вхождений в массив без потоков ={0}", res);
            Console.WriteLine("Время:{0}", sWatch.ElapsedMilliseconds.ToString());
            Console.ReadLine();
        }
    }
 
}

ИИ поможет Вам:


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

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы