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
- İki gerilim ve bir direnç alıp bir direnç üzerindeki gerilim farkından geçen akımı hesaplayan bir fonksiyon yaz.
guc(double volt, double akim)fonksiyonunu yaz veakimfonksiyonuyla birlikte kullan.- Üç dirençli paralel bağlantı için
paralelDirencfonksiyonunu aşırı yükle. - 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.
Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.
İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.