C# pomiar trwania czasu obliczeń średniej arytmetycznej

0

Witam na wstępie powiem ze od wczoraj programuje w tym języku i juz mam zadanie do zrobienia troche zrobiłęm może ktos mi pomóc bo nie bardzo rozumiem 4 punktu

Zadanie:
Napisz program w języku c#, który:
1)
Umożliwia wpisanie liczby elementów tablicy - LN
2)
Tworzy tablicę Tablica o liczbie elementów równej LN,
zawierającej losowe wartości typu double,
3)
Oblicza średnią arytmetyczną tej tablicy
**4)
Podaje czas obliczania średniej arytmetycznej w
nanosekundach.
Następnie dokonaj pomiarów trwania czasu obliczeń
średniej arytmetycznej dla LN = 3·106 4·106 5·10 6 6 ·106 7·106 8 ·10 6 9·10 6 10 ·10 6
Dla każdej wartości LN
powtórzyć pomiar 5 razy.
**

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Zadanie_1
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Podaj rozmiar tablicy.");

            int rozmiarTablicy = int.Parse(System.Console.ReadLine());

            int[] tablicaLiczb = new int[rozmiarTablicy];


            for (int i = 0; i < tablicaLiczb.Length; i++)
            {

                Console.WriteLine("podaj kolejny element");

                tablicaLiczb[i] = int.Parse(Console.ReadLine());


            }

            int suma = 0;
            foreach (int x in tablicaLiczb)
            {

                Console.WriteLine("Kolejne elementy tablicy to: " + x);
                suma += x;
            }
            Console.WriteLine("Średnia: " + (float)suma / rozmiarTablicy);
            Console.ReadKey();

        }
    }
}
0

Dodaj taką motodę, random.NextDouble() zwraca pomiędzy 0.0000.. a 1, więc musisz jakiś tam zakres dać jeśli ma być wieksze od zera

public double GetRandomNumber(double minimum, double maximum)
{ 
    Random random = new Random();
    return random.NextDouble() * (maximum - minimum) + minimum;
}

W pierwszej pętli zamiast int.Parse(Console.ReadLine()); użyj powyższej metody. Zamień tablice z int na double.
Zastosuj to odpowiednio dla 3 000 000, 4 000 000 000.. Zmierz to po 5 razy żeby czas uśrednić.

Czas możesz zmierzyć:

Stopwatch sw = new Stopwatch();

sw.Start();

// To twoja pętla sumuj wszyćkie, podziel przez ilość;

sw.Stop();

Console.WriteLine("Mineło={0}",sw.Elapsed)
0

czytam to juz kilka razy ale nie rozumiem jak to wszystko złożyć może ktos pomóc zaczynam programwać a juz nam zadał takie zadanie :/

0

marcixe12 zapomniałeś dodać że program musi mieć na początku

DateTime Początek;
DateTime Koniec;
TimeSpan Interwał;
long CzasObliczeń;

przed kodem którego czas działania obliczamy ma być:
CzasObliczeń = 0;
Początek = DateTime.Now;

a na końcu kodu którego obliczamy:
Koniec = DateTime.Now;
Interwał = Koniec - Początek;
CzasObliczeń = Interwał.Ticks * 100;

0

stworzyłem sam coś takiego czy jest to dobrze może ktos sprawdzić

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Zadanie_1
{
    class Program
    {
        static void Main(string[] args)
        {

            DateTime start;
            DateTime stop;
            TimeSpan Interwał;
            long CzasObliczeń;
            int suma = 0;
           
            Console.WriteLine("Podaj rozmiar tablicy.");

            int rozmiarTablicy = int.Parse(System.Console.ReadLine());

            double[] tablicaLiczb = new double[rozmiarTablicy];

            CzasObliczeń = 0;
            start = DateTime.Now;

            for (int i = 0; i < tablicaLiczb.Length; i++)
            {

                Console.WriteLine("podaj kolejny element");

                tablicaLiczb[i] = int.Parse(Console.ReadLine());


            }

            stop = DateTime.Now;
            Interwał = stop - start;
            CzasObliczeń = Interwał.Ticks * 100;

          
            foreach (int x in tablicaLiczb)
            {

                Console.WriteLine("Kolejne elementy tablicy to: " + x);
                suma += x;
            }

            Console.WriteLine("Średnia: " + (double)suma / rozmiarTablicy);
            Console.ReadLine();
            Console.WriteLine("Czas pracy: " + CzasObliczeń);
            Console.ReadLine();
        }
    }
}
0

Po pierwsze MarekR22, podał Ci gotową odpowiedź wystarczy kliknąć w link...
Po drugie:

CzasObliczeń = 0;
            start = DateTime.Now;
 
            for (int i = 0; i < tablicaLiczb.Length; i++)
            {
 
                Console.WriteLine("podaj kolejny element");
 
                tablicaLiczb[i] = int.Parse(Console.ReadLine());
 
 
            }
 
            stop = DateTime.Now;
            Interwał = stop - start;
            CzasObliczeń = Interwał.Ticks * 100;
 

Magia:), wiesz może że w w CzasObliczeń masz czas jak długo liczby zostały wpisywane?A nie jak wynika z treści zadania czas liczenia średniej?
Następnie w zadaniu piszę o milionach liczb i iluś testach, masz zamiar wklepywać z palca? Zamiast Console.ReadLine() stwórz sobie obiekt random i go wołaj, masz przykład wyżej.

 
            foreach (int x in tablicaLiczb)
            {
 
                Console.WriteLine("Kolejne elementy tablicy to: " + x);
                suma += x;
            }
 
            Console.WriteLine("Średnia: " + (double)suma / rozmiarTablicy);
            Console.ReadLine();
            Console.WriteLine("Czas pracy: " + CzasObliczeń);
            Console.ReadLine();
        }
    }
}

Tu wołasz ten czas co obliczyłeś wcześniej, czyli czas wpisywania liczb przez ciebie.

0

źle. datetime ma rozdzielczość kilkunastu ms. użyj StopWatch:

			var sw = new System.Diagnostics.Stopwatch();
			sw.Start();
			// some stuff
			var duration = (long)(((float)sw.ElapsedTicks / (float)System.Diagnostics.Stopwatch.Frequency) * 1000 /*ms*/ * 1000 /*us*/ * 1000 /*ns*/);
0

Tak się składa, że w poleceniu, które mój kolega z roku przedstawił potrzebny jest ten kawałek kodu bo wykładowca tego wymaga więc zadanie musi być z użyciem tego kawałka kodu.

0

to podałeś zły przykład użycia. jeśli chcesz mieć dokładność w ns narzędziem pozwalającym na siedem rzędów wielkości słabszą dokładność pomiaru, to robi się to inaczej - trzeba wystartować "stoper", wykonać 107 powtórzeń wykonania algorytmu i przy wypisywaniu czasu podzielić go przez 107.

0
using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
	class Program
	{
		private static readonly Random random = new Random();
		private DateTime timer = DateTime.Now;
		private Stopwatch stopWatch = new Stopwatch();

		public Program()
		{
			int length = ReadTableLength();
			var tab = CreateRandomTable(length);
			int iterations = Math.Max(100000000 / length, 1); // liczba powtórzeń algorytmu dobrana tak, żeby wykonywał się wystarczająco długo aby DateTime dało radę to zmierzyć
			double avg = 0;

			StartTimer();
			
			for (int i = 0; i < iterations; i++)
				avg = CalculateAverage(tab);
			
			StopTimerAndPrintResult(iterations);

			WriteTableAverage(avg);
		}


		private void StartTimer()
		{
			timer = DateTime.Now;
			stopWatch.Restart();
		}


		private void StopTimerAndPrintResult(int iterations = 1)
		{
				Console.WriteLine("Czas operacji to {0:0.00}ns ({1:0.00}ns) uśrednione na {2} iteracjach",
				(float)(DateTime.Now - timer).TotalMilliseconds * 1000 * 1000 / iterations,
				(float)stopWatch.ElapsedTicks / Stopwatch.Frequency * 1000 * 1000 * 1000 / iterations,
				iterations
			);
		}


		private void WriteTableAverage(double avg)
		{
			Console.WriteLine("Średnia dla tablicy wynosi {0}", avg);
		}


		private int ReadTableLength()
		{
			int length;
			do { Console.WriteLine("Podaj rozmiar tablicy"); } while (!int.TryParse(Console.ReadLine(), out length));
			return length;
		}


		private double[] CreateRandomTable(int length)
		{
			var result = new double[length];
			for (int i = 0; i < result.Length; i++)
				result[i] = random.NextDouble();
			return result;
		}


		private double CalculateAverage(double[] tab)
		{
			if (tab.Length == 0) return 0;

			double sum = 0;
			for (int i = 0; i < tab.Length; i++)
				sum += tab[i];

			return sum / tab.Length;
		}


		static void Main(string[] args)
		{
			new Program();
		}
	}
}

jako pracę domową pozostawiam Ci zastanowienie się, dlaczego pierwszy czas bardzo się różni od drugiego, jeśli w linijce z iterations zmienisz tą stałą liczbę na np. 10 czy 100.

0

jak dla mnie to jest to czarna magia ŁF napisałeś mi ten kod ale ja większości nie rozumiem powiedz czy moj kod jest całkiem zle czy wymaga poprawek ?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Zadanie_1
{
    class Program
    {
        static void Main(string[] args)
        {
 
            DateTime start;
            DateTime stop;
            TimeSpan Interwał;
            long CzasObliczeń;
            int suma = 0;
 
            Console.WriteLine("Podaj rozmiar tablicy.");
 
            int rozmiarTablicy = int.Parse(System.Console.ReadLine());
 
            double[] tablicaLiczb = new double[rozmiarTablicy];
 
            CzasObliczeń = 0;
            start = DateTime.Now;
 
            for (int i = 0; i < tablicaLiczb.Length; i++)
            {
 
                Console.WriteLine("podaj kolejny element");
 
                tablicaLiczb[i] = int.Parse(Console.ReadLine());
 
 
            }
 
            stop = DateTime.Now;
            Interwał = stop - start;
            CzasObliczeń = Interwał.Ticks * 100;
 
 
            foreach (int x in tablicaLiczb)
            {
 
                Console.WriteLine("Kolejne elementy tablicy to: " + x);
                suma += x;
            }
 
            Console.WriteLine("Średnia: " + (double)suma / rozmiarTablicy);
            Console.ReadLine();
            Console.WriteLine("Czas pracy: " + CzasObliczeń);
            Console.ReadLine();
        }
    }
}
0

Gdy odpalam w Microsoft Visual Studio 2010 to wyskakuje komunikat podaj rozmiar tablicy dgy wpiszę jakos liczbę to program sie wyłącza ?

using System;
using System.Diagnostics;
 
namespace ConsoleApplication1
{
        class Program
        {
                private static readonly Random random = new Random();
                private DateTime timer = DateTime.Now;
                private Stopwatch stopWatch = new Stopwatch();
 
                public Program()
                {
                        int length = ReadTableLength();
                        var tab = CreateRandomTable(length);
                        int iterations = Math.Max(100000000 / length, 1); // liczba powtórzeń algorytmu dobrana tak, żeby wykonywał się wystarczająco długo aby DateTime dało radę to zmierzyć
                        double avg = 0;
 
                        StartTimer();
 
                        for (int i = 0; i < iterations; i++)
                                avg = CalculateAverage(tab);
 
                        StopTimerAndPrintResult(iterations);
 
                        WriteTableAverage(avg);
                }
 
 
                private void StartTimer()
                {
                        timer = DateTime.Now;
                        stopWatch.Restart();
                }
 
 
                private void StopTimerAndPrintResult(int iterations = 1)
                {
                                Console.WriteLine("Czas operacji to {0:0.00}ns ({1:0.00}ns) uśrednione na {2} iteracjach",
                                (float)(DateTime.Now - timer).TotalMilliseconds * 1000 * 1000 / iterations,
                                (float)stopWatch.ElapsedTicks / Stopwatch.Frequency * 1000 * 1000 * 1000 / iterations,
                                iterations
                        );
                }
 
 
                private void WriteTableAverage(double avg)
                {
                        Console.WriteLine("Średnia dla tablicy wynosi {0}", avg);
                }
 
 
                private int ReadTableLength()
                {
                        int length;
                        do { Console.WriteLine("Podaj rozmiar tablicy"); } while (!int.TryParse(Console.ReadLine(), out length));
                        return length;
                }
 
 
                private double[] CreateRandomTable(int length)
                {
                        var result = new double[length];
                        for (int i = 0; i < result.Length; i++)
                                result[i] = random.NextDouble();
                        return result;
                }
 
 
                private double CalculateAverage(double[] tab)
                {
                        if (tab.Length == 0) return 0;
 
                        double sum = 0;
                        for (int i = 0; i < tab.Length; i++)
                                sum += tab[i];
 
                        return sum / tab.Length;
                }
 
 
                static void Main(string[] args)
                {
                        new Program();
                }
        }
}
 
0

z jakim błędem się "wyłącza"... jak podasz zbyt dużą liczbę, to nie wystarczy Ci pamięci na zaalokowanie tablicy.

0

czekaj oblicza tylko trzeba to zatrzymać bo sie od razu wyłącza jak to zatrzymać ?

0

A jakby wyglądał program za pomocą tej niedokładnej metody i gdyby wrzucić losowe wypisywanie wartości tablicy?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.