Çözüldü Aritmetik ortalama ve standart sapma hazır kodları olmadan nasıl yazılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Blacksidemre

Kilopat
Süper Moderatör
Katılım
8 Eylül 2018
Mesajlar
6.350
Makaleler
2
Çözümler
43
Yer
İstanbul
Merhaba. Başlıkta gördüğünüz üzere aritmetik ortalama ve standart sapmayı hazır kodlar olmadan hesaplayan bir bilgisayar programı yazmam lazım ama uygun algoritmayı bir türlü bulamadım.

Aritmetik ortalama, verilerin toplamı/veri adedi olarak yazabiliriz, mesela (x1+x2)/2 gibi, standart sapma varyansın karekökü, ama buradan da hazır kod olan varyansın karekökünü alıp yazmak da kolaya kaçmak oluyor.

Bana şöyle gerçekten anlamlı gelecek bir bilgisayar programı lazım, rica etsem Python veya R dili üzerinden bana bir program yazabilir misiniz bu iki operatör için?
 
Son düzenleyen: Moderatör:
Çözüm
Python:
def AritmetikOrtalama(lst):
    toplam = 0
    for i in range(len(lst)):
        toplam += lst[i]
        
    arOrt = toplam/len(lst)
    return arOrt

def StandartSapma(lst):
    pay = 0
    for i in range(len(lst)):
        pay += (lst[i]-AritmetikOrtalama(lst))**2
        
    payda = len(lst)-1
    stSapma = (pay/payda)**0.5
    return stSapma

liste = [5,10,20,30,35]

print(AritmetikOrtalama(liste))
print(StandartSapma(liste))
Python:
def AritmetikOrtalama(lst):
    toplam = 0
    for i in range(len(lst)):
        toplam += lst[i]
        
    arOrt = toplam/len(lst)
    return arOrt

def StandartSapma(lst):
    pay = 0
    for i in range(len(lst)):
        pay += (lst[i]-AritmetikOrtalama(lst))**2
        
    payda = len(lst)-1
    stSapma = (pay/payda)**0.5
    return stSapma

liste = [5,10,20,30,35]

print(AritmetikOrtalama(liste))
print(StandartSapma(liste))
 
Çözüm
Aritmetik ortalama nedir? Elimizdeki sayı dizesindeki tüm elemanların toplamının, eleman sayısına bölünmesine denir değil mi? O zaman hazır kod olmadan nasıl yazarız?

(Not: Kodları C++ ile vereceğim.)
Elimizde bir dize olduğu düşünelim;
int array[5] = {1, 2, 3, 4, 5};
Bu dizenin tüm verilerini toplayan, topladıktan sonrada eleman sayısına bölen bir fonksiyon yazalım.

1) Fonksiyon önce kullanıcıdan dizeyi, sonrasında da dizenin boyutunu istemeli. (C++'ta eğer container yapıları veya ranged based for kullanmıyorsan, arrayın sizeını alamıyorsun.)
2) Ardından dizenin içindeki tüm sayıları toplamalı.
3) Son olarak da toplamı, eleman sayısına bölmeli ve bunu kullanıcıya döndürmeli.
C++:
float ort(int arr[], int n) {
    int sum = 0;
    for(int i = 0; i < n; i++) {
        sum += arr[i];
    }
    return ((float)sum / (float)n);
}
Bu bize aritmetik ortalamayı verecek.
Standart sapma içinde; dizedeki her bir değeri aritmetik ortalamadan çıkarıp, karesini aldıktan sonra topluyorum ve çıkan sonucu dizenin eleman sayısı - 1'e bölüyoruz.

1) Kullanıcıdan parametre olarak dizeyi ve boyutunu alan bir fonksiyon tanımlayalım.
2) Dize içerisindeki tüm değerleri aritmetik ortalamasından çıkarıp karesini alıp toplayalım.
3) Toplamı eleman sayısı - 1'e bölelim ve bunu kullanıcıya döndürelim.
4) Varyansın karekökünü alalım (isteğe bağlı).
C++:
float stSapmaVaryans(int arr[], int n) {
    int sum = 0;
    float ortalama = ort(arr, n);
    for(int i = 0; i < n; i++) {
        sum += (arr[i] - ortalama) * (arr[i] - ortalama);
    }
   
    return ((float)sum / (float)(n - 1));
}
Yukarıdaki kod bize varyansı döndürecek. İstersek son bir fonksiyon daha yazıp varyansın karekökünü alabiliriz. Fakat gerek duymadım. Ne yapacağını bildikten sonra kodları kendin yazabilirsin.
 
@Blacksidemre Input'ları listede tutarak almaya karar verdim ama farklı şekillerde alınabilir. Aritmetik ortalama fonksiyonunda, listenin uzunluğu (eleman sayısı) kadar bir for döngüsü ile listenin elemanlarına ulaşıyoruz ve toplama ekliyoruz. Bu toplamı da listenin uzunluğuna bölünce aritmetik ortalamayı bulmuş oluyoruz.

Standart sapma için pay ve payda diye iki kısmı ayrı ayrı buluyoruz. Pay için "listenin o anki elemanı - aritmetik ortalama" yapıyoruz. (Üstteki for mantığı ile aynı.) Sonra bu sonucun karesini alıyoruz ve her eleman için yaparak "pay +=" ile ekliyoruz. Payda için "eleman sayısı-1". En son "standart sapma = pay bölü paydanın karekökü" yapıyoruz.

İstersek StandartSapma fonksiyonu içinde for'dan önce aritmetik ortalamayı bir kez bulup, bir değişkene atayıp sonra for'un içinde onu kullanabiliriz. Fonksiyonu bir kez çağırmış oluruz.
 
Aritmetik ortalama nedir? Elimizdeki sayı dizesindeki tüm elemanların toplamının, eleman sayısına bölünmesine denir değil mi? O zaman hazır kod olmadan nasıl yazarız?

(Not: Kodları C++ ile vereceğim.)
Elimizde bir dize olduğu düşünelim;
int array[5] = {1, 2, 3, 4, 5};
Bu dizenin tüm verilerini toplayan, topladıktan sonrada eleman sayısına bölen bir fonksiyon yazalım.

1) Fonksiyon önce kullanıcıdan dizeyi, sonrasında da dizenin boyutunu istemeli. (C++'ta eğer container yapıları veya ranged based for kullanmıyorsan, arrayın sizeını alamıyorsun.)
2) Ardından dizenin içindeki tüm sayıları toplamalı.
3) Son olarak da toplamı, eleman sayısına bölmeli ve bunu kullanıcıya döndürmeli.
C++:
float ort(int arr[], int n) {
    int sum = 0;
    for(int i = 0; i < n; i++) {
        sum += arr[i];
    }
    return ((float)sum / (float)n);
}
Bu bize aritmetik ortalamayı verecek.
Standart sapma içinde; dizedeki her bir değeri aritmetik ortalamadan çıkarıp, karesini aldıktan sonra topluyorum ve çıkan sonucu dizenin eleman sayısı - 1'e bölüyoruz.

1) Kullanıcıdan parametre olarak dizeyi ve boyutunu alan bir fonksiyon tanımlayalım.
2) Dize içerisindeki tüm değerleri aritmetik ortalamasından çıkarıp karesini alıp toplayalım.
3) Toplamı eleman sayısı - 1'e bölelim ve bunu kullanıcıya döndürelim.
4) Varyansın karekökünü alalım (isteğe bağlı).
C++:
float stSapmaVaryans(int arr[], int n) {
    int sum = 0;
    float ortalama = ort(arr, n);
    for(int i = 0; i < n; i++) {
        sum += (arr[i] - ortalama) * (arr[i] - ortalama);
    }
  
    return ((float)sum / (float)(n - 1));
}
Yukarıdaki kod bize varyansı döndürecek. İstersek son bir fonksiyon daha yazıp varyansın karekökünü alabiliriz. Fakat gerek duymadım. Ne yapacağını bildikten sonra kodları kendin yazabilirsin.

Dili bilmiyorum ama mantığını kavradım, ben R'a import etmeye çalışıp dönüş yaparım size.

@Blacksidemre Input'ları listede tutarak almaya karar verdim ama farklı şekillerde alınabilir. Aritmetik ortalama fonksiyonunda, listenin uzunluğu (eleman sayısı) kadar bir for döngüsü ile listenin elemanlarına ulaşıyoruz ve toplama ekliyoruz. Bu toplamı da listenin uzunluğuna bölünce aritmetik ortalamayı bulmuş oluyoruz.

Standart sapma için pay ve payda diye iki kısmı ayrı ayrı buluyoruz. Pay için "listenin o anki elemanı - aritmetik ortalama" yapıyoruz. (Üstteki for mantığı ile aynı.) Sonra bu sonucun karesini alıyoruz ve her eleman için yaparak "pay +=" ile ekliyoruz. Payda için "eleman sayısı-1". En son "standart sapma = pay bölü paydanın karekökü" yapıyoruz.

İstersek StandartSapma fonksiyonu içinde for'dan önce aritmetik ortalamayı bir kez bulup, bir değişkene atayıp sonra for'un içinde onu kullanabiliriz. Fonksiyonu bir kez çağırmış oluruz.

Çok iyi anlatmışsınız teşekkür ederim. Peki while döngüsü ile de yapılabilir mi? Henüz denemeden soruyorum ama eğer olursa hemen while ile yapmaya çalışacağım.
 
Neden while kullanmak isteyesiniz ki? Yazılan kodlardaki for döngüsü bu iş için ideal. While kullanıp dizinin daha fazla elemanı kalmayana kadar işlemleri yapıp bir yandan da her iterasyonda bir sayaç değişkenini birer artırıp o sayede de dizinin uzunluğunu bulup işlemleri yapabilirsiniz. Ama daha iyi metotlar varken bu kötü teknikle yazılmış bir kod olur.
 
Neden while kullanmak isteyesiniz ki? Yazılan kodlardaki for döngüsü bu iş için ideal. While kullanıp dizinin daha fazla elemanı kalmayana kadar işlemleri yapıp bir yandan da her iterasyonda bir sayaç değişkenini birer artırıp o sayede de dizinin uzunluğunu bulup işlemleri yapabilirsiniz. Ama daha iyi metotlar varken bu kötü teknikle yazılmış bir kod olur.

Sınav olacağımdan dolayı hocanın hangi döngü ile yapmamı isteyeceğini kestiremiyorum, o yüzden ne kadar farklı çözüm, o kadar iyi.
 
Böyle bir şeyde while kullanılmasının isteneceğini hiç sanmam ama dediğim şekilde yapabilirsiniz. Ya da kullanıcıdan eleman sayısını alıp o şekilde de yapabilirsiniz.
 

Geri
Yukarı