Nöbetçi Kontrollü Döngü Ortalama örneğini geliştirelim; Program çalıştırıldığında, kaç kişinin ortalamasının hesaplanacağını önceden bilmeden, sınıf ortalamasını bulacak bir program. Öğrenci sayısı bilinmemekte Program nasıl sonlandırılacak? Nöbetçi değer kullan. Ayrıca sinyal ve ya işaretçi değer de denir. ‘Veri girişi sonunu.’ gösterir Kullanıcı nöbetçi değeri girdiğinde döngü biter. Nöbetçi değer, kabul edilebilir herhangi bir giriş değeriyle karıştırılmayacak biçimde seçilmelidir.( Bu örnek için -1)
Sınıf Ortalaması Problemini Nöbetçi Kontrollü Döngülerle Çözen Sahte Kod Toplam değişkenini sıfır olarak belirle Sayıcı değişkenini sıfır olarak belirle İlk notu gir Kullanıcı nöbetçi değeri girmediği sürece (while) bu notu o andaki değere ekle Sayıcıyı bir arttır Sıradaki notu al(bu değer nöbetçi değer olabilir) Eğer ( if ) sayıcı sıfıra eşit değilse Ortalamayı, notların toplamını sayıcıya bölerek hesapla Ortalamayı yazdır Aksi takdirde ( else ) “Not girilmemiştir” yazdır
#include <stdio.h> #include <conio.h> int main() { float average; int counter, grade, total; total = 0; counter = 0; printf( "Notu giriniz(Cikis icin -1): " ); scanf( "%d", &grade ); while ( grade != -1 ) { total = total + grade; counter = counter + 1; } if ( counter != 0 ) { average = ( float ) total / counter; printf( "Sinif ortalamsi is %.2f", average ); else printf( "Hic not girilmemistir.\n" ); getch(); return 0;
Yuvalı Kontrol Yapıları Bir kontrol yapısını diğerinin içine yuvalamak. Problem Bir kursun 10 öğrencinin test sonuçları(1=geçti, 2=kaldı) için bir listesi vardır. Sonuçları analiz eden bir program yazınız Eğer 8’den fazla öğrenci geçtiyse ‘yüksek başarı’ mesajını yazdırmanızı istemektedirler. Göz önünde bulundurulmalıdır ki; Program 10 test sonucu işleyecektir. Sayıcı kontrollü döngü kullanılacaktır. İki Sayıcı kullanılacaktır. Bunlardan biri sınavı geçen öğrenci sayısını, diğeri kalan öğrenci sayısını saymak için. Her test sonucu 1 ya da 2 gibi bir sayıdır. Eğer sayı 1 değilse, bunun 2 olduğunu varsaya biliriz.
#include <stdio. h> #include <conio #include <stdio.h> #include <conio.h> int main() { int passes = 0, failures = 0, student = 1, result; while ( student <= 10 ) { printf( "Sonuc Gir( 1=gecti,2=kaldi ): " ); scanf( "%d", &result ); if ( result == 1 ) //if/else,while içine yuvalanmıştır. passes = passes + 1; else failures = failures + 1; student = student + 1; } printf( "Gecenler: %d\n", passes ); printf( "Kalanlar: %d\n", failures ); if ( passes > 8 ) printf( "Yuksek Basari\n" ); getch(); return 0;
Atama Operatörleri
Artırma ve Azaltma Operatörleri
#include <stdio.h> #include <conio.h> int main() { int c = 5; printf( "%d\n", c ); printf( "%d\n", c++ ); printf( "%d\n\n", c ); c = 5; printf( "%d\n", ++c ); getch(); return 0; }
Hatırlatma: Şu ana kadar anlatılan operatörlerin öncelikleri
for Döngü Yapısı Döngüler için kullanıldığında formatı For(ilk değer ataması, döngü koşulu, artırma deyimi) Örneğin; int counter; for(counter = 1; counter <= 10; counter++ ) printf( "%d\n", counter ); Tam sayıları 1’den 10 ‘ a kadar yazdırma.
for Döngü Yapısı Çoğu durumda for yapısı while yapısı biçimine çevrilebilir. İlk değer ataması; while( döngü koşulu){ ifade; artırma; } İlk değer ve artırma Sıklıkla, virgüllerle ayrılmış listelerdir. Örneğin; int i , j; for (i = 0, j = 0; j + i <= 10; j++, i++) printf( "%d\n", j + i );
Tipik Bir for Yapısı
Tipik Bir for Döngüsünün Akış Diyagramı
for Döngü Yapısıyla İlgili Notlar ve Gözlemler İlk değer verme , döngü devam koşulu ve artırma deyimleri aritmetik operatörler içerebilir. Örneğin; . Eğer x = 2 ve y = 10 ise for ( j = x; j <= 4 * x * y; j += y / x ) eşdeğerdir for ( j = 2; j <= 80; j += 5 ) ile. Artırma negatif olabilir. Eğer döngü devam koşulu en baştan yanlışsa, for yapısının gövdesi en baştan atlanır. Kontrol değişkeni, döngü gövdesinde sıklıkla yazdırılır ya da işleme sokulur ancak bu gerekli değildir.
for Yapısı İle İlgili Örnekler 1. Kontrol değişkenini 1‘den 100‘e kadar birer birer arttır. for ( i = 1; i <= 100; i++) 2. Kontrol değişkenini 100‘den 1‘e kadar birer birer azalt. for ( i = 100; i >= 1; i--) 3. Kontrol değişkenini 7‘den 77‘ye kadar yedişer yedişer arttır. for ( i = 7; i <= 77 ; i += 7) 4. Kontrol değişkenini 20‘den 2‘ye kadar ikişer ikişer azalt. for ( i = 20; i >= 2 ;i -= 2) 5. Kontrol değişkenini 2, 5, 8, 11, 14, 17, 20 değerlerini alacak biçimde değiştir. for ( j = 2; j <=20; j += 3) 6. Kontrol değişkenini 99, 88, 77, 66, 55, 44, 33, 22, 11, 0 değerlerini alacak biçimde değiştir. for ( j = 99; j >= 0 ;j -= 11)
#include <conio.h> #include <stdio.h> int main() {//for ile toplama int sum = 0, number; for ( number = 2; number <= 100; number += 2 ) sum += number; printf( "Toplam: %d\n", sum ); getch(); return 0; }
#include <stdio.h> #include <math.h> #include <conio.h> int main() { int year; double amount, principal = 1000.0, rate = .05; printf( "%4s%21s\n", "Yil", "Depozito Miktari" ); for ( year = 1; year <= 10; year++ ) { amount = principal * pow( 1.0 + rate, year ); printf( "%4d%21.2lf\n", year, amount ); } getch(); return 0; Yeni Önişlemci pow fonksiyonu ilk argümanın, ikinci argümanına göre kuvvetini hesaplar. Bir kişi $1000’nı %5 faizle bankaya yatırmıştır. Bütün faizin hesaptaki paraya eklendiğini düşünerek 10 yıl boyunca, her yılsonunda hesapta birikecek parayı hesaplayıp yazdırınız. a = p (1 + r)^n a: n yıl sonra hesapta birikecek miktar p: ilk yatırılan miktar n: yıl sayısı r: faiz oranı
switch Çoklu Seçim Yapısı Bir değişken ya da bir ifadenin ayrı ayır sabitlerle karşılaştırılması ve buna bağlı olarak farklı işlemlerin yapılması gibi bir dizi seçimin yer aldığı durumlarda kullanılır. Format case ve tercihe bağlı default kısımlarında oluşur. switch ( ifade ){ case '1': actions case '2': default: } break; yapıdan çıkmak için
switch Çoklu Seçim Yapısı
#include <stdio.h> #include <conio.h> int main() { char islem; int s1, s2, s3; printf("Önce islemi sonra sayilari girin "); scanf("%c%d%d",&islem, &s1, &s2); switch (islem) case '+' : s3 = s1 + s2; break; case '-' : s3 = s1 - s2; break; case '*' : s3 = s1 * s2; break; case '/' : s3 = s1 / s2; break; default : printf ("Hatali islem"); } printf("\nSonuc = %d",s3); getch(); return 0;
do/while Döngü Yapısı do/while döngü yapısı while yapısına oldukça benzer. Döngü devam koşulu, döngünün gövdesi çalışdıktan sonra kontrol edilir. Bu sebepten, döngü gövdesi en az bir kez çalışır. Format: do { İfade; } while ( condition );
do/while Döngü Yapısı ve Akış Diyagramı Örnek (counter = 1): do { printf( "%d ", counter ); } while (++counter <= 10); 1’den 10’a kadar tamsayıları yazar.
#include <stdio.h> #include <conio.h> int main() { int sayac = 1; do { printf( "%d ", sayac ); } while ( ++sayac <= 10 ); getch(); return 0; }
break ve continue ifadeleri while,for,do/while ve switch ile kullanıldığında o yapıdan çıkış sağlar. Program yapıdan sonraki ilk ifadeyi çağırarak devam eder. En genel kullanımı bir döngüden istenen anda çıkmak ve döngünün belli bir kısmandan çıkmaktır. continue while,for ve do/while yapıları içinde çalıştığında döngü gövdesinin kalan kısmı atlanır. while ve do/while yapılarında döngü koşulu hemen kontrol edilir. for yapısında artırma deyimi çalıştırılır daha sonra ise döngü koşulu kontrol edilir.
#include <stdio.h> #include <conio.h> int main() { int x; for ( x = 1; x <= 10; x++ ) { if ( x == 5 ) break; printf( "%d ", x ); } printf( "\nDonguden x= %d oldugunda cikildi\n", x ); getch(); return 0; #include <stdio.h> #include <conio.h> int main() { int x; for ( x = 1; x <= 10; x++ ) { if ( x == 5 ) continue; printf( "%d ", x ); } printf( "\ncontinue, 5 degerinin atlanmasi icin kullanildi\n" ); getch(); return 0;
Mantık Operatörleri Döngülerde ki koşul durumları; && ( mantıksal VE) İki koşulda true ise true döndürür. || ( mantıksal VEYA) İki koşuldan biri true ise true döndürür. ! ( mantıksal DEĞIL) Koşul yanlış olduğunda izlenecek yollu belirler. Döngülerde ki koşul durumları; İfade Sonuç true && false false true || false true !false true