🚀 C# ile Programlamaya Giriş: Kodlamaya İlk Adımını At, Kendi Projelerini Geliştirmeye Başla!
00ANASAYFA 01YAZILAR 02EĞİTİM 03ELEKTRİK_ENERJİ 04OTOMOTİV_MÜHENDİSLİĞİ 05ARAÇLAR 06LAB 07SÖZLÜK 08ETİKETLER ♡OKUMA LİSTEM ⌕ARA
TRENG

Fonksiyonlar

Kodunu parçalara böl: tanım, parametre, dönüş değeri, varsayılan argüman ve fonksiyon aşırı yükleme (overload).

Bir programın büyümesiyle birlikte aynı hesabı farklı yerlerde tekrar yazmaya başlarsın. Fonksiyon, adı olan, tekrar tekrar çağırılabilen bir kod parçasıdır. Hem tekrarı azaltır hem de programı "küçük, test edilebilir parçalar" halinde düşünmeni sağlar.

Fonksiyonun yapısı

Yapı şudur: dönüşTipi isim(parametreler) { gövde }. Girdi olarak aldıkları değerlere parametre, çağırırken verdiğin gerçek değerlere argüman denir. Bir değer döndürmüyorsa dönüş tipi void olur.

#include <iomanip>
#include <iostream>

// Ohm yasasi: I = V / R
double akim(double volt, double direnc) {
    return volt / direnc;
}

double seriDirenc(double r1, double r2) {
    return r1 + r2;
}

double paralelDirenc(double r1, double r2) {
    return (r1 * r2) / (r1 + r2);
}

// Asiri yukleme: ayni isim, farkli parametre tipleri
int kare(int x) { return x * x; }
double kare(double x) { return x * x; }

// Varsayilan argumanlar: vref 3.3 V, 10 bit
double adcGerilim(int okuma, double vref = 3.3, int bit = 10) {
    int maks = (1 << bit) - 1;
    return okuma * vref / maks;
}

int main() {
    std::cout << "I = " << akim(12, 4) << " A\n";
    std::cout << "Seri: " << seriDirenc(100, 220) << " ohm\n";
    std::cout << "Paralel: " << paralelDirenc(100, 300) << " ohm\n";
    std::cout << "kare(3) = " << kare(3) << '\n';
    std::cout << "kare(1.5) = " << kare(1.5) << '\n';

    std::cout << std::fixed << std::setprecision(3);
    std::cout << "ADC: " << adcGerilim(512) << " V\n";
    std::cout << "ADC 12 bit: " << adcGerilim(2048, 5.0, 12) << " V\n";
    return 0;
}
I = 3 A
Seri: 320 ohm
Paralel: 75 ohm
kare(3) = 9
kare(1.5) = 2.25
ADC: 1.652 V
ADC 12 bit: 2.501 V

Neden bu örnekler önemli?

Değerle geçirme

C++'ta parametreler varsayılan olarak kopyalanır. akim(12, 4) çağrısında fonksiyon 12 ve 4 değerlerinin kendi kopyalarıyla çalışır. İçeride parametreyi değiştirsen bile dışarıdaki değişken etkilenmez. Kopyalamadan değiştirmeyi referanslar dersinde öğreneceğiz.

Aşırı yükleme (overload)

Aynı isimli birden fazla fonksiyon tanımlayabilirsin; derleyici argüman tiplerine bakarak doğrusunu seçer. kare(3) int sürümünü, kare(1.5) double sürümünü çağırır. Yalnızca dönüş tipi farklı olan iki fonksiyon aşırı yükleme sayılmaz.

Varsayılan argümanlar

Parametreye = değer verirsen çağıran atlayabilir. adcGerilim(512) çağrısı 3.3 V ve 10 bit kullanır; ikinci çağrıda ise hepsi açıkça verildi. Varsayılan değerli parametreler her zaman listenin sonunda olmalıdır.

Bildirim ve tanım

C++ derleyicisi dosyayı yukarıdan aşağı okur. Bir fonksiyonu tanımlanmadan önce çağırırsan hata alırsın. Çözüm, fonksiyonun imzasını (prototip) önceden bildirmektir:

double akim(double volt, double direnc);   // bildirim (prototip)

int main() {
    // akim burada kullanilabilir
}

double akim(double volt, double direnc) {  // tanim
    return volt / direnc;
}

Büyük projelerde bildirimler başlık dosyasına (.h), tanımlar .cpp dosyasına yazılır.

Kapsam (scope)

Bir fonksiyonun içinde tanımlanan değişken yalnızca orada yaşar. Başka bir fonksiyon volt adını kullanabilir; ikisi birbirinden bağımsızdır. Bu sayede fonksiyonları kendi başlarına düşünebilirsin.

İyi bir fonksiyon tek bir iş yapar ve adı o işi söyler: akim, paralelDirenc, adcGerilim. Bir fonksiyonu anlatmak için "ve" kelimesine ihtiyaç duyuyorsan muhtemelen ikiye bölmelisin.

paralelDirenc(0, 0) gibi bir çağrıda payda sıfır olur ve sonuç tanımsız değer (NaN) çıkar. Fonksiyonların girdisini sınamak ya da belgelemek iyi alışkanlıktır: "r1 + r2 sıfır olmamalı".

Kendin dene

  1. İki gerilim ve bir direnç alıp bir direnç üzerindeki gerilim farkından geçen akımı hesaplayan bir fonksiyon yaz.
  2. guc(double volt, double akim) fonksiyonunu yaz ve akim fonksiyonuyla birlikte kullan.
  3. Üç dirençli paralel bağlantı için paralelDirenc fonksiyonunu aşırı yükle.
  4. Bir bölüntü (gerilim bölücü) fonksiyonu yaz: Vout = Vin * R2 / (R1 + R2).

// Mini sınav

Bir seçeneğe tıkla; doğru mu yanlış mı, anında ve nedeniyle birlikte göreceksin.

1. Bir fonksiyon değer döndürmüyorsa dönüş tipi ne olmalıdır?
2. Aynı isimli iki fonksiyonun yalnızca parametre tipleri farklıysa buna ne denir?
3. Varsayılan değerli parametreler parametre listesinde nerede yer almalıdır?

Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.

İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.