Bir sayının başka bir sayıya bölümünden kalanı mod operatörü yardımıyla bulabiliriz. % sembolüyle gösterilir. 5%2 bize 1 sonucunu verir 7%4 bize 3 sonucunu verir …
#include <iostream>
using namespace std;
int main(){
int a = 5, b = 7, c = 2, d = 4;
cout << "5%2 = " << a % c << endl; // 1
cout << "7%4 = " << b % d << endl; // 3
}Şimdi kullanıcıdan aldığımız bir sayının çift mi tek mi olduğunu söyleyen bir program yapalım:
#include <iostream>
using namespace std;
int main(){
int sayi;
cout << "Lutfen bir sayi giriniz\n";
cin >> sayi;
if (sayi % 2 == 0) {
cout << "Girdiginiz sayi ciftir" << endl;
}
else {
cout << "Girdiginiz sayi tektir" << endl;
}
}
// Çıktı:
// Lutfen bir sayi giriniz
// 6
// Girdiginiz sayi ciftir
// Çıktı:
// Lutfen bir sayi giriniz
// 3
// Girdiginiz sayi tektirKullanıcıdan girdi almak için cin nesnesini ve >> operatörünü kullanıyoruz. Programımızı çalıştırdığımızda terminalden sayı girmemiz bekleyecek. Sayı girip enter’ladığımızda sayımızın tek mi çift mi olduğunu bize söyleyecek.
Burada yine if-else bloğu kullandık. Bir sayının çift olup olmadığını sorgulamak modulo operatörünün belki de en yaygın kullanımlarından biridir. 0, 2, 4, … gibi çift sayıların mod’u 0 dır; tek sayıların mod’u ise 1’dir. == karşılaştırma operatörüdür. Eğer iki tarafındaki değer eşit ise doğru(true), değilse yanlış(false) değerini döndürür.
Yukarıdaki kodda iki tane == olduğuna dikkat edin yani: if(sayi % 2 == 0) şeklindedir. Tek eşittir olması durumunda atama operatörü anlamına gelir. Program muhtemelen çalışır ama mantıksal hata içerir. Bu şekilde kodun teknik olarak doğru olup çalışsa da mantıksal biçimde yanlış olması sonucunda oluşan hatalara semantic error (semantik hata) diyoruz.
Şimdi de bir sayıyı mod operatörünü kullanarak nasıl basamaklarına ayırabileceğimize bakalım
#include <iostream>
using namespace std;
int main(){
int sayi = 6234;
int basamak_1 = sayi % 10; // 4
sayi = sayi / 10; // 6234/10 -> 623
int basamak_2 = sayi % 10; // 3
sayi = sayi / 10; // 623/10 -> 62
int basamak_3 = sayi % 10; // 2
sayi = sayi / 10; // 62/10 -> 6
int basamak_4 = sayi % 10; // 6
cout << basamak_1 << endl; // 4
cout << basamak_2 << endl; // 3
cout << basamak_3 << endl; // 2
cout << basamak_4 << endl; // 6
}Peki farklı uzunluktaki sayılar için farklı kodlar mı yazmamız gerekli? Daha genel bir çözüm yolu yok mu ? Tabi ki var. Bunun için while döngüsünden yararlanacağız.
#include <iostream>
using namespace std;
int main(){
int sayi = 6234;
while (sayi != 0) { // sayı 0 değilse
cout << sayi % 10 << endl;
sayi = sayi / 10;
}
}While döngüsü sayi != 0 ifadesi doğru olduğu müddetçe çalışacaktır. Adım adım yazmaya çalışırsak.
- sayi = 6234
- ————————————
- sayi != 0 -> 6234 != 0 -> true => Döngüye gir
- sayi%10 -> 6234%10 -> 4
- sayi = sayi/10 -> 6234/10 -> 623.4 -> 623
- ————————————
- sayi != 0 -> 623 != 0 -> true => Döngüye gir
- sayi%10 -> 623%10 -> 3
- sayi = sayi/10 -> 623/10 -> 62.3 -> 62
- ————————————
- sayi != 0 -> 62 != 0 -> true => Döngüye gir
- sayi%10 -> 62%10 -> 2
- sayi = sayi/10 -> 623/10 -> 6.2 -> 6
- ————————————
- sayi != 0 -> 6 != 0 -> true => Döngüye gir
- sayi%10 -> 6%10 -> 6
- sayi = sayi/10 -> 6/10 -> 0.6 -> 0
- ————————————
- sayi != 0 -> 0 != 0 -> false => Döngüden çık
- ————————————
Increment Operator ++
0’dan 10’a kadar olan sayıları yazdıralım:
#include <iostream>
using namespace std;
int main(){
int sayi = 0;
while (sayi < 10){
cout << sayi << ", ";
sayi = sayi + 1;
}
}
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Sayı 10 dan küçük olduğu müddetçe bu döngü tekrar tekrar çalışacaktır. Ne zaman ki 10’a eşit veya büyük ise döngü sonlanacaktır. Bu sebepten her döngüyü döndüğü zaman (yani her iterasyonda) sayımızı 1 artırıyoruz. Bunun için sayi = sayi + 1; yazdık. Aynı işlemi farklı şekillerde yapabilirdik:
sayi = sayi + 1;
sayi += 1;
sayi++;- satırda şuana kadar öğrendiklerimizle yaptığımız işlem.
- satırda, 1. satırın kısaltmış hali. Eğer = atama operatörünün sağ ve sol tarafında aynı değişken varsa bu şekilde kısaltabiliriz. Nasıl You are yerine you’re diyoruz onun gibi.
- satırda ise increment operator ile değerimizi 1 artırmayı görüyoruz. Bu operator tam da bu iş için yapılmış bir operator. Genelde döngülerde her adımda değeri artırmak için kullanıyoruz.
Daha önceki yaptığımız örneği biraz geliştirelim. 0’dan 10’a kadar olan çift sayıları yazdıralım
#include <iostream>
using namespace std;
int main(){
int sayi = 0;
while (sayi < 10){
if (sayi%2 == 0) {
cout << sayi << ", ";
}
sayi++;
}
}
// 0, 2, 4, 6, 8,Yine aynı döngü. Sadece içine if bloğu ekleyip sayının çift olup olmadığını sorguladık. Ayrıca sayi = sayi + 1; yazmak yerine sayi++; yazdık.
Başka bir örnek yapalım bu sefer bir sayının palindrome olup olmadığına bakalım. Palindrome bir sayının bir kelimenin simetrik olma durumudur. ABA, ABBA, 4554, 454 gibi. Farklı yöntemlerle yapılabilir. Bizim uygulayacağımız yöntem sayının tersini bulup == operatörüyle kontrol etmek.
#include <iostream>
using namespace std;
int main(){
int sayi, sayinin_ilk_hali, tersi = 0;
// Kullanıcıdan veri alıyoruz ve sayi değişkeninin ilk halini
// başka bir değişkende saklıyoruz çünkü sayi değişkeni değişecek
cout << "Lutfen bir sayi giriniz: ";
cin >> sayi;
sayinin_ilk_hali = sayi;
cout << endl;
// Daha önceden bir sayıyı basamaklarına % ve / yardımıyla ayırmıştık
// Şimdi toplama ve çarpma işlemleriyle basamaklardan sayıyı elde edeceğiz.
// sayi 1234 olsun dongü içinde sırasıyla şunlar gerçekleşecek
//
// toplama işlemi sonucu -> çarpma işlemi sonucu
// tersi = 4 -> tersi = 40
// tersi = 43 -> tersi = 430
// tersi = 432 -> tersi = 4320
// tersi = 4321 -> tersi = 43210
// döngü biter ve tersini 10'a böleriz
// tersi = 4321
while (sayi != 0){
tersi += sayi % 10; // tersi = tersi + (sayi%10);
sayi /= 10; // sayi = sayi / 10;
tersi *= 10; // tersi = tersi * 10;
}
tersi /= 10; // tersi = tersi / 10;
cout << "Sayi: " << sayinin_ilk_hali << "\tTersi: " << tersi << endl << endl;
// ilk hali ile tersini karşılaştırdık. Eğer eşitse palindrome
// değilse palindrome değil.
if (sayinin_ilk_hali == tersi)
cout << "Bu iki sayi palindromedur" << endl;
else
cout << "Bu iki sayi palindrome degildir" << endl;
// Tek satırlı if, if-else bloklarında {} kullanmamız gerek yok.
}
// Lutfen bir sayi giriniz : 1221
// Sayi : 1221 Tersi : 1221
// Bu iki sayi palindromedur
// Lutfen bir sayi giriniz : 121
// Sayi : 121 Tersi : 121
// Bu iki sayi palindromedur
// Lutfen bir sayi giriniz : 123
// Sayi : 123 Tersi : 321
// Bu iki sayi palindrome degildir.

Deneme Zamanı
- Semantic error’dan bahsettik. Başka ne tip error’lar vardır?
- Palindrome algoritmasını string’ler için yazın.
- int sayi = 0;
while (sayi != 0)
Burada int yerine float tipinde bir değişken kullanabilir miyiz? Kullanırsak ne tip sonuçlarla karşılaşırız?

Leave a Reply