Dobry wieczór, mam do wykonania pewne zadanie, oto jego treść:
Napisz program, który tworzy i wypełnia tablicę dwuwymiarową o wymiarach 30 x 6 liczbami pseudolosowymi z zakresu od 0 do 50. Wygenerowana tablica wyświetlana jest na standardowym wyjściu. Następnie:
• dla każdego wiersza uruchamiany jest nowy wątek, który oblicza wartość średnią elementów tego wiersza i zapisuje ją w tablicy jednowymiarowej Srednie[30].
• Dla każdego wiersza uruchamiany jest nowy wątek, który oblicza różnice wartosci elementów tablicy Tab[30][6] i wartości średniej z tablicy Srednie[30]. Wynik zapisywany jest w tablicy Roznice[30][6]. Na przykład: Roznice[1][2] = Tab[1][2] – Srednie[1];
• Dla każdego wiersza tablicy Roznice uruchamiany jest nowy wątek, który oblicza wartość średnią elementów tego wiersza. Wynik zapisywany jest w tablicy Odchylenia_standardowe[30]. Zauważ, że możesz (ale nie musisz) do tego wykorzystać tą samą funkcję obslugi wątku, która zapisywała wartości w tablicy Srednie.
Program powinien wyświetlać informację na standardowym wyjściu w następującym formacie:
Tablica Tab, wiersz 0: 1 43 5 2 6 0
Tablica Tab, wiersz 1: 4 3 6 12 6 10
….
Tablica Tab, wiersz 29: 4 7 23 3 6 9
Tablica Srednie, element 0: 9,5
Tablica Srednie, element 1: 6,83
Tablica Srednie, element 2: 8,67
….
Tablica Roznice, wiersz 0: …… <wartości >
Tablica Roznice, wiersz 1: …… <wartości >
…
Tablica Odchylenia_standardowe, element 0: …. <wartość>
Tablica Odchylenia_standardowe, element 1: …. <wartość>
Oto moje rozwiązanie:
#include <iostream>
#include <iomanip>
#include <time.h>
#include <thread>
#include <chrono>
#include <mutex>
std::mutex mtx;
const int MLP = 50; // Maksymalna wartosc elementu tablicy
const int LDT = 30; // Liczba wierszy
const int LG = 6; // Liczba kolumn
void srednia(int Tab[LDT][LG], float Srednie[LDT], int nr_wiersza)
{
std::lock_guard<std::mutex> lock(mtx);
float suma = 0;
for (int kolumna = 0; kolumna < LG; kolumna++)
{
suma += Tab[nr_wiersza][kolumna];
}
Srednie[nr_wiersza] = (float)suma/LG;
std::cout << "Tablica Srednie, element " << nr_wiersza <<": "<<Srednie[nr_wiersza] << std::endl;
}
void roznica(int Tab[LDT][LG], float Srednie[LDT], float Tab2[LDT][LG], int nr_wiersza)
{
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Tablica Roznice, wiersz " << nr_wiersza << ": ";
for (int kolumna = 0; kolumna < LG; kolumna++)
{
Tab2[nr_wiersza][kolumna] = Tab[nr_wiersza][kolumna] - Srednie[nr_wiersza];
std::cout << std::setw(6) << std::setprecision(3) << Tab2[nr_wiersza][kolumna];
}
std::cout << std::endl;
}
void odchylenie(float Tab2[LDT][LG], float Odchylenia_standardowe[LDT], int nr_wiersza)
{
std::lock_guard<std::mutex> lock(mtx);
float suma = 0;
for (int kolumna = 0; kolumna < LG; kolumna++)
{
suma += Tab2[nr_wiersza][kolumna];
}
Odchylenia_standardowe[nr_wiersza] = (float)suma/LG;;
std::cout << "Tablica Odchylenia_standardowe, element " << nr_wiersza <<": " << Odchylenia_standardowe[nr_wiersza] << std::endl;
}
int main()
{
int Tab[LDT][LG]; //wygenerowana tablica
float Roznice[LDT][LG]; //tablica na wyniki roznicy
float Srednie[LDT]; //tablica na srednie wiersza
float Odchylenia_standardowe[LDT]; //tablica na warotsci odchylenia
srand(time(NULL));
for (int wiersz = 0; wiersz < LDT; wiersz++)
for (int kolumna = 0; kolumna < LG; kolumna++)
{
Tab[wiersz][kolumna] = rand()% MLP + 1 ;
Roznice[wiersz][kolumna] = 0;
}
std::cout << " Tablica Tab: " << std::endl;
for (int wiersz = 0; wiersz < LDT; wiersz++)
{
for (int kolumna = 0; kolumna < LG; kolumna++)
std::cout << std::setw(4) << Tab[wiersz][kolumna];
std::cout << std::endl;
}
std::cout << std::endl;
for (int wiersz = 0; wiersz < LDT; wiersz++)
{
std::cout << "Tablica Tab, wiersz " << wiersz << ": ";
for (int kolumna = 0; kolumna < LG; kolumna++)
std::cout << std::setw(4) << Tab[wiersz][kolumna];
std::cout << std::endl;
}
std::cout << std::endl;
std::thread srednie_threads[LDT];
std::thread roznice_threads[LDT];
std::thread odchylenia_threads[LDT];
for (int i = 0; i < LDT; i++)
{
srednie_threads[i] = std::thread(srednia, Tab, Srednie, i);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
std::cout << std::endl;
for (int i = 0; i < LDT; i++)
{
roznice_threads[i] = std::thread(roznica, Tab, Srednie, Roznice, i);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
std::cout << std::endl;
for (int i = 0; i < LDT; i++)
{
odchylenia_threads[i] = std::thread(odchylenie, Roznice, Odchylenia_standardowe, i);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
std::cout << std::endl;
for (int i = 0; i < LDT; i++)
{
srednie_threads[i].join();
roznice_threads[i].join();
odchylenia_threads[i].join();
}
return 0;
}
Na ostatnim screenie widać błąd, gdzie wypisywane są wartości tablic odchylenie_standardowe. Czy mógłby mi ktoś wyjaśnić czemu tak się dzieje?
Z góry dziękuje za pomoc
Pozdrawiam
- screenshot-20200509210751.png (64 KB) - ściągnięć: 50
- screenshot-20200509210803.png (84 KB) - ściągnięć: 47
- screenshot-20200509210815.png (95 KB) - ściągnięć: 60