Ders 2 - Altan MESUT - Trakya Üniversitesi

Download Report

Transcript Ders 2 - Altan MESUT - Trakya Üniversitesi

PROGRAMLAMA DİLLERİNE
GİRİŞ
Ders 2: Koşula Göre İşlem Yapma
Yrd. Doç. Dr. Altan MESUT
Trakya Üniversitesi
Bilgisayar Mühendisliği
if - else
• Belirli bir koşula göre işlem yapılması
istendiğinde en çok kullanılan komut kümesi
if-else yapısıdır:
if (koşul) koşul doğru ise yapılacak işlem
else koşul yanlış ise yapılacak işlem
• Koşullar: büyük (>), küçük (<), büyük eşit (>=),
küçük eşit (<=), eşit (==), eşit değil (!=)
NOT: => ve =< şeklinde yazım yanlıştır
Akış Şeması Elemanları
Başla / Bitir
Ekrana
Gösterme
Veri Girişi
Koşul
Klavyeden
Veri Girişi
Döngü
İşlem
Fonksiyon
Çağırma
Yazıcıdan
Çıktı
Doğrudan
Erişimli
Dosya
Sıralı
Erişimli
Dosya
Akış Yönü
Başarı Notu Hesabı Programı
Başla
static void Main(string[] args)
{
v
byte v, f, bn;
Console.Write("Vize Notu : ");
f
?
v = Convert.ToByte(Console.ReadLine());
bn=v*0.3+f*0.7+0.5
Console.Write("Final Notu : ");
f = Convert.ToByte(Console.ReadLine());
bn
bn = (byte)(v * 0.3 + f * 0.7 + 0.5);
Console.Write("Başarı Notu = " + bn);
Evet
bn>=60
if (bn >= 60)
Hayır
Console.Write(" (başarılı)");
"başarılı"
"başarısız"
else
Console.Write(" (başarısız)");
Dur
}
Koşul içinde mantıksal operatörler
• Koşul bazen && (ve), || (veya), ! (değil) gibi mantıksal
operatörleri içeren birleşik bir mantıksal ifade olabilir:
if (bn >= 60 && bn < 70) Console.Write("(CC)");
if (bn >= 70 && bn < 80) Console.Write("(CB)");
if (bn >= 80 && bn < 90) Console.Write("(BB)");
if (bn >= 90 && bn < 95) Console.Write("(BA)");
if (bn >= 95) Console.Write("(AA)");
• VE yerine VEYA : if (bn >= 60 || bn < 70) … olsaydı ???
– 60'tan büyük sayılar ile 70'ten küçük sayıların kesişim değil
birleşim kümesi ele alınacağı için birleşik mantıksal ifade
her zaman true olacaktı. Her zaman true üreten ifadeyi
içeren bir koşulun kontrolünü yapmak mantıksız olacağı
için bu if'in yazılması ile yazılmaması arasında fark yoktur.
else if
• Önceki slaytta olduğu gibi koşul yanlış olduğunda
yapılacak herhangi bir işlem yoksa, else ifadesini
kullanmayabiliriz. Peki aşağıdaki gibi yazarsak ne olur:
if (bn >= 60 && bn < 70) Console.Write("(CC)");
else if (bn >= 70 && bn < 80) Console.Write("(CB)");
else if (bn >= 80 && bn < 90) Console.Write("(BB)");
else if (bn >= 90 && bn < 95) Console.Write("(BA)");
else if (bn >= 95) Console.Write("(AA)");
• Bu şekilde yazıldığında ilk koşul doğru ise diğer 4 koşulu
kontrol etmez, ikinci koşul doğru ise altındaki 3 koşulu
kontrol etmez, … Bu sayede program daha hızlı çalışır.
Dört İşlem Programı
Geçen hafta yazılan dört işlem
static void Main(string[] args)
programında işlem seçimi
{
yoktu, iki sayı girildikten sonra
int a, b, i;
tüm işlemler gösteriliyordu. Bu
Console.Write("İlk sayıyı girin
: ");
programda işlem seçilerek
a = Convert.ToInt32(Console.ReadLine());
sadece o işlemin sonucu
Console.Write("İkinci sayıyı girin : ");
gösteriliyor.
b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("1) Toplama, 2) Çıkarma, 3) Çarpma, 4) Bölme");
Console.Write("İşlemi Seçin
: ");
i = Convert.ToInt32(Console.ReadLine());
if (i == 1) Console.WriteLine("Toplam : " + (a + b));
else if (i == 2) Console.WriteLine("Fark
: " + (a - b));
else if (i == 3) Console.WriteLine("Çarpım : " + (a * b));
else if (i == 4) Console.WriteLine("Bölüm : " + (a / b));
}
Yazılmasa da program çalışır ama gereksiz yere tüm if’ler kontrol edilir
Dört İşlem Programının Akış Şeması
Başla
Akış şemalarında genellikle "İlk sayıyı girin",
"İkinci sayıyı girin", "İşlemi seçin" gibi ekranda
kullanıcıyı bilgilendirme amaçlı çıktılara yer
verilmez. Veri girişi, işlem ve sonuç çıktıları
gösterilmesi yeterlidir.
a
b
i
i=1
Evet
a+b
Hayır
i=2
Evet
a-b
Evet
a*b
Evet
a/b
Hayır
i=3
Hayır
i=4
Hayır
Dur
Koşul (Karar) ifadelerinde "=="
kullanmak gerekli değildir. Basic,
Pascal gibi farklı dillerde
karşılaştırma için "==" değil "="
kullanılır. Akış şemaları belirli bir
dile göre yazılmadığı için "="
kullanımı daha uygundur.
KeyChar ile Dört İşlem Programı
static void Main(string[] args)
ReadKey() fonksiyonu
{
basılan tuşun değerini
int a, b; char i;
ConsoleKeyInfo olarak
Console.Write("İlk sayıyı girin
: ");
döndürür (ENTER
a = Convert.ToInt32(Console.ReadLine());
basılmasını gerektirmez).
Console.Write("İşlemi Seçin
: ");
".KeyChar" ile bu değeri
i = Console.ReadKey().KeyChar;
karaktere çevirip i
değişkenine atadık.
Console.Write("\nİkinci sayıyı girin : ");
b = Convert.ToInt32(Console.ReadLine());
if (i == '+') Console.WriteLine("Toplam : " + (a + b));
else if (i == '-') Console.WriteLine("Fark
: " + (a - b));
else if (i == '*') Console.WriteLine("Çarpım : " + (a * b));
else if (i == '/') Console.WriteLine("Bölüm : " + (a / b));
}
i karakter türünde olduğu için atama ve karşılaştırmalarda tek tırnak kullanılır
(if (i == /) yazılamaz). String türü için ise çift tırnak kullanılmalıdır.
Klavyeden girilen 2 sayıdan birincisi büyük ise
ikisini çarpan, değilse ikisini toplayan ve sonucu
ekranda gösteren program
static void Main(string[] args)
Başla
{
X
int X, Y, S;
Console.Write("X : ");
Y
X = Convert.ToInt32(Console.ReadLine());
X>Y
Evet
S=X*Y
Console.Write("Y : ");
Hayır
Y = Convert.ToInt32(Console.ReadLine());
S=X+Y
if (X > Y) S = X * Y;
S
else S = X + Y;
Console.Write("S = " + S);
Dur
}
Kod Bloğu
• PASCAL ve C gibi yapısal programlama dillerinde
program kodu bloklara ayrılır. PASCAL’da kod bloğu
begin ile başlar end ile biter. C, C++, C# ve JAVA gibi
dillerde ise { ile başar } ile biter.
• Şimdiye kadar bu işaretleri Main() fonksiyonunun başını
ve sonunu belirtmek için kullandık. Bazı durumlarda bir
fonksiyonun içinde de bir kod bloğu oluşturmamız
gerekebilir. Örneğin belirtilen koşul sağlandıysa (yada
sağlanmadıysa) yapılacak iş birden fazla komutu
içerdiği durumlarda blok içinde yazmamız gerekir:
if (koşul) { koşul doğru ise yapılacak işlemler }
else { koşul yanlış ise yapılacak işlemler }
Önceki Program (Farklı Çözüm)
Başla
X
Y
X>Y
Evet
S=X*Y
Hayır
S=X+Y
S
S
Dur
static void Main(string[] args)
{
int X, Y, S;
Console.Write("X : ");
X = Int32.Parse(Console.ReadLine());
Console.Write("Y : ");
Y = Int32.Parse(Console.ReadLine());
if (X > Y) {
S = X * Y;
Console.Write("X * Y = " + S);
}
else {
S = X + Y;
Console.Write("X + Y = " + S);
}
}
Okunabilirliği arttırmak için kod bloğunun iç satırları
dışındaki satırlardan 1 tab (~4 karakter) sağdan başlar.
Girilen 3 sayıdan en büyük olanı bulma
Başla
a,b,c
Evet
a>b
Hayır
Evet
b>c
Hayır
En büyük
sayı c’dir
Dur
static void Main(string[] args)
{
int a, b, c;
Console.Write ("a : ");
a = Int32.Parse(Console.ReadLine());
Console.Write
("b : ");
Evet
En büyük
a>c
b = Int32.Parse(Console.ReadLine());
sayı a’dır
Console.Write
("c : ");
Hayır
c = Int32.Parse(Console.ReadLine());
En büyük
if (a sayı
> b)b’dir
if (a > c)
Console.Write("en büyük sayı a'dır");
else Console.Write("en büyük sayı c'dir");
else if (b > c)
Console.Write("en büyük sayı b'dir");
else Console.Write("en büyük sayı c'dir");
}
if-else yapılarında blok açma/kapatma yok, sorun olur mu?
switch-case Koşul Deyimi
• Çok seçenekli işlemlerde (menü gibi) birçok if /
else if kullanmak yerine switch-case yapısı
tercih edilebilir:
switch (i) {
case 1: …; break;
case 2: …; break;
case 3: …; break;
case 4: …; break;
…
default: …
}
switch-case ile Dört İşlem Programı
static void Main(string[] args) {
int a, b, i;
Console.Write("ilk sayiyi girin : ");
a = Convert.ToInt32(Console.ReadLine());
Console.Write("ikinci sayiyi girin : ");
b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("1) Toplama, 2) Çıkarma, 3) Çarpma, 4) Bölme");
secim:
Console.WriteLine("İşlemi Seçiniz");
i = Convert.ToInt32(Console.ReadLine());
switch (i) {
case 1: Console.WriteLine("Toplam : " + (a + b)); break;
case 2: Console.WriteLine("Fark
: " + (a - b)); break;
case 3: Console.WriteLine("Çarpım : " + (a * b)); break;
case 4: Console.WriteLine("Bölüm : " + (a / b)); break;
default: goto secim;
}
}
GoTo
• Goto komutunun kullanılabilmesi için program içinde
yönlendirilecek olan satırdan önce bir etiket (label)
tanımlanmalıdır. Bizim programımızda bu etiketin adı
secim'dir. Etiket tanımı ; ile değil : ile biter.
• Farklı etiketler tanımlanabileceği gibi, aynı etikete
birden çok yerden goto ile geri dönmek mümkün
olabililir, fakat fazla goto kullanımı program akışının
takibini zorlaştırır ve okunabilirliğini azaltır (spagetti
kod adı verilen duruma neden olur).
• Bir sonraki dersimizde goto ile yapılan bu işi while
döngüsü nasıl yapabileceğimizi göreceğiz (ve yapısal
programlama kavramının gereği olarak, bundan sonra
goto deyimini kullanmamaya gayret edeceğiz).
Programa Açıklama Satırı Ekleme
• Yazdığımız program kodunda değişkenleri, fonksiyonları,
döngüleri, vs. ne için kullandığımızı açıkladığımız ilave
satırlar yer alabilir. Bu satırları derleyicinin dikkate
almaması için satırın başında // kullanırız (genellikle kod
editörleri açıklama satırını farklı renkte gösterirler).
• Eğer açıklamamız kısa ise, yeni bir satır açmak yerine önceki
satırın sonuna // ilave ederek açıklamayı yazmamız
mümkündür (derleyici iki bölü işaretine yanyana gördüğü
yerden itibaren satır sonuna kadar yazılanı göz ardı eder).
char islem; // işlem seçimi için kullanılacak
• Eğer birkaç satır uzunluğunda açıklama yazmak istiyorsak
her satırın başına // koymak yerine ilk satırın başında /* ile
başlayıp, son satırın sonunda */ ile bitirebiliriz.
Yazdığımız programın bazı satırlarının göz ardı edilmesini istersek o satırları işaretleyip
simgesi ile satırların başına // ekleyebilir simgesi ile de bunları kaldırabiliriz.
Vücut kitle indeksi programı
/* Vücut kitle indeksi (VKİ), vücut ağırlığının (kg),
//
// boy uzunluğunun (m) karesine bölünmesiyle hesaplanır */
static void Main(string[] args)
{
float boy, kilo, vki; // float ile Single aynıdır
Console.Write("Boyunuz (cm)
: ");
boy = Single.Parse(Console.ReadLine());
Console.Write("Ağırlığınız (kg) : ");
kilo = Single.Parse(Console.ReadLine());
vki = kilo / (boy * boy / 10000);
neden "/ 10000" ?
Console.Write("Vücut kitle ind. : " + vki);
if (vki < 20) Console.Write("(zayıf)");
else if (vki >= 20 && vki < 25) Console.Write("(normal)");
else if (vki >= 25 && vki < 30) Console.Write("(kilolu)");
else if (vki >= 30 && vki < 35) Console.Write("(şişman)");
else Console.Write("(obez)");
}
static void Main(string[] args)
{
int sayi, tahmin, sayac = 1;
Random rastgele = new Random(); // Rastgele sayı üretmek için
// yeni bir sınıf tanımladık.
sayi = rastgele.Next(1, 100);
// Tanımladığımız sınıfın Next
// yöntemi ile 1 ile 100
// arasında bir sayı ürettik.
Console.WriteLine("1-100 arasında tuttuğum sayıyı tahmin et");
tahmin:
Console.Write("{0}. tahmin : ", sayac);
tahmin = Int32.Parse(Console.ReadLine());
if (sayi > tahmin) {
Console.WriteLine("tuttuğum sayı daha büyük");
sayac++; goto tahmin;
}
else if (sayi < tahmin) {
Console.WriteLine("tuttuğum sayı daha küçük");
sayac++; goto tahmin;
}
else Console.Write("Tebrikler " + sayac + " denemede buldun");
}
Sayı tahmin etme oyunu
Örnek : Ekran çıktısı ne olur?
static void Main(string[] args)
{
int a = 10, b = 20;
Console.WriteLine(++a);
Console.WriteLine(a++); Önce a'yı görüntüler sonra 1 arttırır
Console.WriteLine(a);
Console.WriteLine("{0} {1}", a, b += a);
Console.WriteLine(b=5);
Console.WriteLine(b+=5);
Console.WriteLine(b==5);
Console.WriteLine(true && false);
Console.WriteLine(!((true || false) && !true));
}
~((1 ᴠ 0) ᴧ ~1)
Ödev 1
• Not Hesaplama Programını değiştirin:
– Notlar 0-100 arasında girilmezse uyarı mesajı
görüntülenecek ve hatalı girilen vize yada final notu
kullanıcıdan tekrar istenecek.
– Öğrencinin Başarı Notu 60’tan az ise başarı notunun
yanında sadece "Başarısız" değil, "Final sınavından en az …
almalıydı" mesajı da görüntülenecek.
– Programın sonunda “Devam ? [ E / H ]” sorusu sorulacak,
eğer kullanıcı e yada E tuşuna basarsa program başa
dönecek, başka bir tuşa basarsa program sonlanacak.
Ödev 2
• Dört işlem programını değiştirin:
– Ondalıklı sayılar ile işlem yapılabilsin.
– Önce işlem seçimi yapılsın, sonra sayılar girilsin.
– 5 numaralı işlem “çıkış” olarak tanımlansın.
Kullanıcı 5’i seçmedikçe program başa dönerek
çalışmaya devam etsin.
– Programı hem if-else hem de switch-case
ifadelerini kullanarak iki farklı şekilde yazın.
Ödev 3
• Vücut kitle indeksi programını değiştirin:
– Eğer girilen boy ve ağırlığa göre "zayıf" sonucu
çıktıysa vki = 20 olması için alınması gereken kilo
miktarı da yazılsın.
– Eğer girilen boy ve ağırlığa göre normalin üzerinde
bir sonuç çıktıysa vki = 24.9 olması için verilmesi
gereken kilo miktarı da yazılsın.
Ödev 4
• Girilen 10 sayıdan en büyüğünü bulan ve
görüntüleyen programı yazın.
• Sonraki slaytta yer alan soldaki akış şemasına
göre (kontrol ifadesiyle olan) çözümü yazınız.
• Programda goto kullanmanız gerekecektir.
Önümüzdeki hafta döngüler anlatıldığında for
döngüsü ile nasıl yapılacağı (sağdaki akış
şemasına göre çözüm) gösterilecektir.
Girilen 10 sayıdan en büyüğünü bulan ve
görüntüleyen akış şeması
Kontrol İfadesiyle
Döngü İfadesiyle
Başla
Başla
i=1, eb=0
i,1,10,1
sayı
sayı
Evet
i=i+1
sayı>eb
Hayır
Evet
i<10
eb
Dur
Evet
eb=sayı
sayı>eb
Hayır
i
eb
Dur
eb=sayı