none
C# Console Dizi içinde hareketli ortalama bulma RRS feed

  • Soru

  • Dizi içindeki değerlerin önce 0-7 aralığı daha sonra 1-8 aralığı şeklinde 8-14 e kadar gidecek bu aralıktaki ortalamaları bulmam gerek yardıma ihtiyacım var.
    5 Ocak 2017 Perşembe 19:58

Yanıtlar

  • Optimize halini kendin yaz diye vermek istememistim aslinda :)

    void Main()
    {
    	// ornek dizi
            int[] dizi = Enumerable.Range(1,15).Select(e => e).ToArray();
    
    
    	var end = 7; // ilk aralik sonu
    
    	var toplam = 0;
    	decimal[] ortalama = new decimal[dizi.Length-end];
    	for (int i = 0; i <= end; i++)
    	{
    		toplam += dizi[i];
    	}
    	ortalama[0] = (decimal)toplam / (end+1);
    
    	for (int i = 1; i < dizi.Length-end; i++)
    	{
    		toplam += (dizi[i+end]-dizi[i-1]);
    		ortalama[i] = (decimal)toplam / (end + 1);
    	}
    
    	// gostermek istersen
    	for (int i = 0; i < ortalama.Length; i++)
    	{
    		Console.WriteLine($"Aralik: {i}-{i + end}, Ortalama:{ortalama[i]}");
    	}
    }

    6 Ocak 2017 Cuma 10:27
    Yanıtlayıcı

Tüm Yanıtlar

  • Iyi de kodun ne kadarini yazdiniz, yapamadiginiz kisim neresi?

    Ornek: 2-9 araligi:

    int[] dizi = {1,2, ... 15}; 
    
    int start = 2;
    int end = 9;
    
    var ortalama = dizi.Skip(start).Take(end-start+1).Average();

    Not: Kayan bir sistemde hic de optimize olmayan bir yontem. Soyle dusunun, insanlar daha yavas hesap yaparlar ancak farkinda olarak ya da olmayarak islemleri optimize ederler. Bir insan soyle yapardi:

    - 0 - 7 icin o araliktakileri toplar

    - eleman sayisina (7-0+1 = 8) boler

    -sonraki basamak 1-8.

    -0-7 araliginin toplami elinde, ondan [0] elemanin degerini cikarip [8] elemanin degerini eklemek yeni toplam icin yeterli. (toplam += dizi[8] - dizi[0])

    -eleman sayisi sabit 8, bolunce ortalama.

    ...

    Butun yapmaniz gereken bunu koda cevirmek. 


    5 Ocak 2017 Perşembe 21:33
    Yanıtlayıcı
  •             
                decimal myAvgRow = 0;
                decimal[] myAvgTotal = new decimal[8];
    
                for (int i = 0; i < 8; i++)
                {
                    myAvgRow = 0;
                    for (int ii = i; ii < i+8; ii++)
                    {
                        myAvgRow += ii;
                    }
                    myAvgTotal[i] = myAvgRow / 8;
                }
    Bu işini görebilir umarım.
    6 Ocak 2017 Cuma 09:21
  • Optimize halini kendin yaz diye vermek istememistim aslinda :)

    void Main()
    {
    	// ornek dizi
            int[] dizi = Enumerable.Range(1,15).Select(e => e).ToArray();
    
    
    	var end = 7; // ilk aralik sonu
    
    	var toplam = 0;
    	decimal[] ortalama = new decimal[dizi.Length-end];
    	for (int i = 0; i <= end; i++)
    	{
    		toplam += dizi[i];
    	}
    	ortalama[0] = (decimal)toplam / (end+1);
    
    	for (int i = 1; i < dizi.Length-end; i++)
    	{
    		toplam += (dizi[i+end]-dizi[i-1]);
    		ortalama[i] = (decimal)toplam / (end + 1);
    	}
    
    	// gostermek istersen
    	for (int i = 0; i < ortalama.Length; i++)
    	{
    		Console.WriteLine($"Aralik: {i}-{i + end}, Ortalama:{ortalama[i]}");
    	}
    }

    6 Ocak 2017 Cuma 10:27
    Yanıtlayıcı