C Programlama Dilinde While,Do While,For Döngüleri,Break ve Continue Kavramları

Program yazarken kullanacağımız önemli konulardan biri de döngülerdir.Bir listenin veya dizinin elemanlarını kontrol ederken veya işlem yaparken döngülerden faydalanırız.

While Döngüsü

while( koşul ) {
	komut(lar)
}

Koşul sağlandığı sürece blok içerisindeki kod sürekli çalıştırılır.

Örneğin ,ekrana 10 kere “Hello World” yazalım:

#include<stdio.h>
int main( void )
{
	int i = 1;
	while( i <= 10 ) {
		printf("%d: Hello World\n",i);
                i++;
	}
	return 0;
}

Yukarıdaki kodda i’e ilk değerini verdik.Eğer ilk değeri vermeyip artırmaya çalışırsak hata alırız.Çünkü program hangi sayıyı artıracağını bilmez.Yazdığımız i++ işlemi i’yi bir artırır.Yukarıdaki kodu şu şekilde değiştirsek de sonuç aynı olacaktır.

#include<stdio.h>
int main( void )
{	
	int i = 0;
	while( i++ < 10 ) {		
		printf("%d: Hello World\n",i);
	}
	return 0;
}

Örneğin ,1’den kullanıcının gireceği sayı değerine kadar olan sayıların toplamını bulalım:

#include<stdio.h>
int main( void )
{
	int sayi;
	scanf("%d",&sayi);
	printf("Girdiginiz sayi :%d\n",sayi);
	int toplamDeger=0;
	int counter=1;
	
	while(counter<=sayi)
	{
		toplamDeger+=counter;
		counter++;		
	}
	
	printf("1'den %d'e kadar olan sayilarin toplami :%d",sayi,toplamDeger);
	
}

do while Döngüsü

Göreceğimiz ikinci döngü çeşidi, do while döngüsüdür. Yaptığı iş, while ile hemen hemen aynıdır; verilen işi, döngü koşulu bozulana kadar sürdürür. Ancak while’a göre önemli bir farkı vardır.

while döngülerinde, döngü içersindeki işlem yapılmadan önce, sunulan koşul kontrol edilir. Şayet koşul sağlanmıyorsa, o while döngüsünün hiç çalışmama ihtimali de bulunmaktadır. do while döngülerindeyse, durum böyle değildir. İlk çalışmada koşul kontrolü yapılmaz. Dolayısıyla, her ne şartta olursa olsun, döngünüz -en azından bir kere- çalışacaktır.

do {
	komut(lar)
} while( koşul );
#include<stdio.h>
int main( void )
{
	int i = 0;
	do {
		//Önce i'nin değeri arttırılıyor
		//sonra ekrana Merhaba Dünya yazdırılıyor.
		printf("%d: Hello World\n",++i);
	} while( i < 10 );
	return 0;
}
#include<stdio.h>
int main( void )
{
	int sayi;
	scanf("%d",&sayi);
	printf("Girdiginiz sayi :%d\n",sayi);
	int toplamDeger=0;
	int counter=1;
	
	do
	{
		toplamDeger+=counter;
		counter++;		
	}
	while(counter<=sayi);
	printf("1'den %d'e kadar olan sayilarin toplami :%d",sayi,toplamDeger);
	
}

for Döngüsü

For yapısı, yenilemeli-tekrarlamalı (İngilizce iterative) yapılarda kullanıma daha uygundur.

for( ilk_deger_atama; koşul; arttırma/azaltma ){
	komut(lar)
}
#include<stdio.h>
int main( void )
{
	int i;
	for( i = 0 ; i < 10; i++ ) {
		printf("%d: Hello World\n",(i+1));
	}
	return 0;
}

Gördüğünüz gibi çok daha sade ve açık gözükür bir kod oldu. for altında tek satır komut olduğundan, küme parantezleri koymamız opsiyoneldi ama ne yaptığınızı karıştırmamak için, her zaman koymanızı öneririm.

for döngüleriyle ilgili bazı özel durumlarda vardır. for döngüsü içersine yazdığınız ilk değer atama, kontrol ve arttırma işlemlerini tanımlama esnasında yapmanız gerekmez. Aşağıda verilen kod, yukardakiyle tamamen aynı işi yapar. Farkı, i’nin daha önce tanımlanmış olması ve arttırma/azaltma işinin döngü içinde yapılmasıdır.

#include<stdio.h>
int main( void )
{
	int i;
	i = 0;
	for( ; i < 10; ) {
		printf("%d: Hello World\n",(i+1));
		i = i + 1;
	}
	return 0;
}

Break Komutu

Döngüleri aniden sonlandırmak için kullanılır:

/*
0 ile 99 arasında tesadüfi sayılar üreten 
bir programın, kaçıncı seferde 61 sayısını
bulacağını yazan program aşağıdadır.
*/
#include<stdio.h>
int main( void )
{
	int i,tesadufi_sayi;
	int deneme_sayisi = 0;
	//while içinde 1 olduğundan sonsuza kadar döngü çalışır.
	while( 1 ){
		//tesadufi_sayi değişkenine, 0 ile 99 arasında 
		//her seferinde farklı bir sayı atanır.
		//rand( ) fonksiyonu tesadüfi sayı atamaya yarar.
		//mod 100 işlemiyse, atanacak sayının 0 ile 99
		//arasında olmasını garantiler.
		tesadufi_sayi = rand() % 100;
		//Döngünün kaç defa çalıştığını deneme_sayisi
		//değişkeniyle buluruz.
		deneme_sayisi++;
		//Eğer tesadufi sayı 61'e eşit olursa, 
		//döngü kırılıp, sonlandırılır.
		if( tesadufi_sayi == 61 ) break;
	}
	printf("Toplam deneme sayısı: %d\n",deneme_sayisi);
	return 0;
}	

Continue Komutu

Bunun dışında işlem yapmadan döngüyü devam ettirmek gibi durumlara da ihtiyacımız vardır. Bunun içinde continue ( Türkçe: devam ) komutunu kullanırız.

/*
Sadece tek sayıları yazdıran bir
program
*/
#include<stdio.h>
int main( void )
{
	int i;
	for( i = 0; i < 10; i++ ) {
		//i değişkeninin 2'ye göre modu
		//0 sonucunu veriyorsa, bu onun 
		//bir çift sayı olduğunu gösterir.
		//Bu durumda ekrana yazdırılmaması 
		//için döngü bir sonraki adıma geçer.
		if( i%2 == 0 ) continue;
		printf("%2d\n",i);
	}
	return 0;
}	

0 ile 10 arasındaki tek sayıları gösteren program örneğini yukarda görebilirsiniz. Elbette ki bu işi daha farklı ve daha iyi yapan bir program yazabilirdik. Ama şimdilik continue komutunun nasıl kullanıldığını inceleyelim.

Program bir for döngüsü çalıştırmaktadır. Her defasında i değişkenin 2’ye göre modu alınır. Eğer sonuç 0’sa, bu sayının çift olduğunu gösterir. Dolayısıyla, bunun ekrana yazdırılmaması gerekir. Bu yüzden, döngü içersindeki işlemleri sürdürmek yerine, altta kalan kodları atlarız. Burada continue komutu kullanılır ve kullanıldığı noktadan itibaren olan işlemler yapılmaz. Döngü başa döner, aynı işlemleri yapar. Bu sefer i tek sayı olacağından continue komutu çalışmaz ve sayıyı ekrana bastırırız.

#break, #continue, #do-while, #for, #while

C Programlama Dilinde Nested If,Switch Case,Increment-Decrement,Advanced Assignment,Conditional Operator Kullanımı


Nested If

Nested if’ler art arda gelen ifler anlamına gelmektedir.

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lutfen bir sayi giriniz: ");
	scanf("%d",&sayi);
	if( sayi < 20 ) printf("Sayı 20'den kucuk'.\n"); if( sayi >= 20 && sayi <= 30 ) printf("Sayi 20 ile 30 arasindadir!\n"); if( sayi > 30  )
		printf("Sayi 30'dan buyuktur'!\n");
	return 0;
}

Art arda koşullar belirterek nested if kullandık.Yukarıdaki kodu daha efektif şekilde yazmak için if-else yapısını kullanırsak:

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lutfen bir sayi giriniz: ");
	scanf("%d",&sayi);
	if( sayi < 20 ) printf("Sayı 20'den kucuk'.\n"); else { if( sayi >= 20 && sayi <= 30 ) printf("Sayi 20 ile 30 arasindadir!\n"); else if( sayi > 30  )
		        printf("Sayi 30'dan buyuktur'!\n");
	 }
	

	return 0;
}

if else if Yapısı

Yukarıda yazdığımız kodları if else if yapısıyla yazarsak eğer:

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lutfen bir sayi giriniz: ");
	scanf("%d",&sayi);
	if( sayi < 20 ) printf("Sayi 20'den kucuk'.\n"); else if( sayi >= 20 && sayi <= 30 ) printf("Sayi 20 ile 30 arasindadir!\n"); else if( sayi > 30  )
		 printf("Sayi 30'dan buyuktur'!\n");
	return 0;
}

Görüldüğü üzere ilk if ‘den sonra istenilen koşulları else if yapısıyla karşıladık.

switch case yapısı

switch case ,if else if yapısının bir benzeridir.Yalnız switch case de,bir aralık değeri girilmez,ifadelerin eşit olup olmadığı kontrolü yapılmaz.Ve içerisinde case ifadelerinin her birini kontrol eder.


          switch( degisken ) {
                    case sabit1:komut(lar)
                                [break]
                    case sabit2:komut(lar)
                                [break]
                    .
                    .
                    .
                    case sabitN:komut(lar)
                    [break]
                    default:komut(lar);
                             }

Örneğin,Bir not değerlendirme sistemi olsun. 100 – 90 arası A, 89 – 80 arası B, 79 – 70 arası C, 69 – 60 arası D, 59 ve altıysa F olsun. Eğer 100’den büyük veya negatif bir sayı girilirse, o zaman program hatalı giriş uyarısı versin.

#include<stdio.h>
int main( void )
{
	int not;
	printf("Lutfen notunuzu giriniz! > ");
	scanf("%d",&not);
	switch( not / 10 ) {
		case 10: 
		case 9: printf("NOT: A\n"); break;
		case 8: printf("NOT: B\n"); break;
		case 7: printf("NOT: C\n"); break;
		case 6: printf("NOT: D\n"); break;
		case 5:
		case 4:
		case 3:
		case 2: 
		case 1:
		case 0: printf("NOT: F\n"); break;
		default:
			printf("HATA: Bilinmeyen bir deger girdiniz!\n");
	}
	
	return 0;
}

Algoritmaya bakalım: Önce sayıyı alıyor ve 10’a bölüyoruz. Yani girilen not, 57 ise 5.7 sonucunu elde ediyoruz. Ancak iki tam sayının sonucu bir virgüllü sayı veremez, tıpkı işleme giren değişkenler gibi tam sayı olarak döner. Dolayısıyla bilgisayarın elde edeceği sonuç, 5.7 değil, sadece 5’tir. switch case yapısında koşullar yukardan başlayarak kontrol ediliyor. case 5’e gelindiğinde eşitlik sağlanıyor. Ama break konmadığı için, switch case’ten çıkılmıyor. Ve altında kalan işlemlerde yapılıyor. Altında herhangi bir işlem veya break olmadığından case 0’a kadar bu böyle sürüyor. Ve case 0’da ekrana bir çıktı alıp switch case yapısı break ile sonlandırılmaktadır.

Arttırma (Increment) ve azaltma (decrement) işlemleri

aha önceki derslerimizde, aritmetik işlemlerden bahsetmiştik. Bunların dışında yapabileceğimiz başka şeylerde bulunmaktadır. Bunlardan biri de, arttırma ve azaltma işlemleridir.

Eğer i adında bir değişkenin değerini 1 arttırmak isterseniz, i = i + 1 olarak yazarsınız. Veya 1 azaltmak isterseniz, benzer şekilde i = i – 1 de yazabilirsiniz. Arttırma ve azaltma işlemleri bu olayı daha basit bir forma sokmaktadır. i = i + 1 yazmak yerine i++ veya i = i – 1 yazmak yerine i– yazabilirsiniz.

Arttırma ve azaltma işlemleri temelde iki çeşittir. Birinci yöntemde yukarda yazdığımız gibi, arttırma/azaltma sonradan yapılır. İkinci yöntemdeyse arttırma/azaltma ilk başta yapılır. Aşağıdaki örneklere bakalım.

#include<stdio.h>
int main( void )
{
	int i = 10, j = 60;
	printf("i = %d ve j = %d\n", ++i, --j);
	return 0;
}

Yukardaki programı yazar ve çalıştırısanız elde edeceğiniz çıktı şu şekilde görünecektir:

i = 11 ve j = 59

Çünkü arttırma ve azaltma işlemleri ekrana bastırmadan önce yapılmış ve i ile j’nin değerleri değiştirilmiştir. Şimdi programı değiştirip şöyle yazalım:

#include<stdio.h>
int main( void )
{
	int i = 10, j = 60;
	printf("i = %d ve j = %d\n", i++, j--);
	return 0;
}

Bu sefer program çıktısı şöyle olacaktır:

i = 10 ve j = 60

Farkettiğiniz üzere hiçbir değişiklik yapılmamış gibi duruyor. Aslında değişiklik yapıldı ve program sonlanmadan önce i 10 olurken, j’de 59 oldu. Ama arttırma ve azaltma işlemleri printf komutu çalıştırıldıktan sonra yapıldığı için, biz bir değişiklik göremedik.

Kısacası önce arttırma (pre-increment) veya önce azaltma (pre-decrement) kullandığınızda, ilgili komut satırında çalışacak ilk şey bu komutlar olur. Ancak sonra arttırma (post increment) veya sonra azaltma kullanırsanız, o zaman bu işlemlerin etkileri ilgili komut satırından sonra geçerli olacaktır. Aşağıdaki özel tabloya bakabilirsiniz:

Form Tip İsim Açıklama
i++ postfix post-increment İşlem sonrası arttırma
++i prefix pre-increment İşlem öncesi arttırma
i– postfix post-decrement İşlem sonrası azaltma
–i prefix pre-decrement İşlem öncesi azaltma

Gelişmiş atama (Advanced Assignment) yöntemleri

C’de yazım kolaylığı amacıyla sunulmuş bir başka konu da, gelişmiş aşama yöntemleridir. Biraz daha uzun yazacağınız kodu, kısaltmanıza yaramaktadır.

degisken_1 = degisken_1 (operator) degisken_2 şeklinde yazacağınız ifadeleri, daha kısa yazabilmeniz için, degisken_1 (operator) = degisken_2 şeklinde ifade edebilirsiniz. Gelişmiş atamalarda sunulan genel formlar şu şekildedir:

+= , -= , *= , /= , %=

Sanırım aşağıdaki örneklere bakarsanız, konuyu çok daha net anlayacaksınız:

1-) j = j * ( 3 + x )  ==> j *= ( 3 + x )
2-) a = a / ( 5 - z ) ==> a /= ( 5 - z )
3-) x = x - 5 ==> x -= 5

Conditional Operator ( ? )

Türkçe karşılık bulamadığım bir başka C kavramı da, Conditional Operator. Aslında mot a mot çeviri yaparsam, koşullu operatör anlamına geliyor. Ama şu ana kadar gördüğümüz birçok yapıyı da bu şekilde tanımlamak mümkünken, koşullu operatör ifadesini kullanmayı pek tercih etmiyorum. Neyse lafı uzatmayalım…

Conditional Operator, if-else ile tamamen aynı yapıdadır. Hiçbir farkı yoktur. Tek farkı koda bakıldığında anlaşılmasının biraz daha zor oluşudur. Bir de if – else gibi yazıyla ifade edilmez. Onun yerine soru işareti (?) ve iki nokta üst üste ( : ) kullanarak yazarız. Aşağıdaki tabloda if else yapısıyla karşılaştırılmalı olarak, Conditional Operator verilmiştir:

if-else Yapısı Conditional Operator ( ? ) Yapısı
if( koşul ) {
    if_komut(lar)
}
else {
    else_komut(lar)
}
koşul?if_komut(lar):else_komutlar
#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lütfen bir sayı giriniz> ");
	scanf("%d",&sayi);
	( sayi > 10 ) ? printf("Sayı 10'dan büyüktür\n"):
			printf("Sayı 10'dan küçüktür veya 10'a eşittir\n");
	return 0;
}

Kaynak:Çağatay Çebi

#assignment, #c, #conditional, #decrement, #if-else-if, #increment, #nested-if, #operator, #switch-case

C Programlama Dilinde Koşullu İfadeler,Casting,İlişkisel ve Birleşik Operatörler


Cast Operator

Casting programlama dilinde sıkça kullanılan bir yapıdır.Bir değişkeni farklı değer tipine dönüştürmektir aslında.

#include<stdio.h>
int main( void )
{
	int bolunen = 12, bolen = 8;
	float bolum;
	bolum = bolunen / bolen;
	printf("Sonuc: %f\n",bolum);
	return 0;
}

Yukarıda sonuç 0.000000 çıkacaktır.Ama bizim beklediğimiz 1.5 ‘du.bolunen ve bolen değişkenleri integer olarak tanımlanıp bölme işlemide integer değer vereceğinden sonuç 0.000000 çıkmıştır.Burada doğru sonucu bulmamız için casting yapmamız gerekecektir.

#include<stdio.h>
int main( void )
{
	int bolunen = 12, bolen = 8;
	float bolum;
	bolum = (float)bolunen / bolen;
	printf("Sonuc: %f\n",bolum);
	return 0;
}

Yukarıda görüldüğü gibi bölme işleminin başına (float) koyarak sonucun ondalıklı bir sayı olmasını istedik.Sonuç olarak 1.5 değerini bulmuş olacağız.

Aşağıdaki örneği inceleyelim:

#include<stdio.h>
int main( void )
{
	printf("Sonuc: %f\n", 1 / 5);
	return 0;
}

Yukarıdaki sonuç ifadesi de 0 olarak gözükecektir.Bizim istediğimiz 0.2 gözükmesi.Bunu yapmak için yine bir casting ifadesi kullanıyorum.Ayrıca printf içerisinde kullandığım formatın da “%f” olduğuna dikkat ediniz.Bu komut float değer alacağını gösterir.

#include<stdio.h>
int main( void )
{
	printf("Sonuc: %f\n",(float) 2 / 4);
	return 0;
}

Değişkenlerde yüksek tipli değişken daha aşağı seviyelerdeki değişken tipleri kapsar.Aşağıda düşükten yükseğe doğru değişken tiplerinin sıralaması verilmiştir.

(DÜŞÜK) char int long float double (YÜKSEK)

Koşullu (Conditional) İfadeler

Koşullu ifadeler istenilen şartların sağlanması için kullanılır.

If Komutu

if( koşul ) {
komut(lar)
}

ÖRNEK:

#include<stdio.h>
int main( void )
{
	int girilen_sayi;
	printf("Lütfen bir tam sayı giriniz> ");
	scanf("%d",&girilen_sayi);
	if( girilen_sayi > 100 )
		printf("Girilen sayı 100'den büyüktür\n");
	return 0;
}

If Else

Eğer bir şart sağlanıyorsa veya sağlanmıyorsa,bunun tam tersi durumunda yapılması istenilen komutlar “else” bloguna yazılır.

if( koşul ) {
komut(lar)
}
else {
komut(lar)
}

ÖRNEK:

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lütfen bir sayı giriniz> ");
	scanf("%d",&sayi);
	if( sayi> 10)
		printf("Girilen sayı 100'den büyüktür\n");
	else
		printf("Girilen sayı 100'den küçüktür\n");
	return 0;
}

Yukarıdaki örnekte görüldüğü üzere önce kullanıcıdan sayı girilmesi bekleniyor.Daha sonra girilen sayı 10’dan büyükse if blogundaki komutlar,büyük değilse else blogundaki komutlar çalıştırılıyor.

if-then-else-flowchart-javablog

İlişkisel (Relational) Operatörler

Bu operatörler koşul ifadelerinde şartları kontrol ederken kullanılır.

< Küçüktür
> Büyüktür
== Eşittir
<= Küçük eşittir
>= Büyük eşittir
!= Eşit değildir

Birleşik (Compound) Operatörler

Bazen birden fazla koşulu kontrol etmek isteyebiliriz.Örneğin girilen sayının hem 10’dan büyük hem de 20’den küçük olmasını isteyebiliriz.Bunun için iki şartı da birbirine bağlamamız gerekir.

&& and ve
|| or veya
! not tersi

Yukarıda verilen operatörlerin logical tablosu da aşağıdaki gibidir:

p q p&&q p||q !p
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

#if, #if-else, #iliskisel, #kosul, #logical, #operator, #relational

C Programlama Dilinde Standart giriş/çıkış fonksiyonları, Değişkenler, Aritmetik Operatörler

Değişken nedir? Tanımı nasıl yapılır?

Değişkenler,girilen değerleri alan ve programın çalışmasıyla değer atanan veri saklayıcılarıdır.Atamamız gereken değer ,o değişkenin değer tipi ile uygun olmalıdır.Yani ,değişkenimiz tamsayı olarak tanımlanmışsa,bu değişkene atamamız gereken değer de tamsayı olmalıdır.

#include<stdio.h>
int main( void )
{
	int sayi;
	sayi = 100;
	printf("Number: %d",sayi);
	return 0;
}

Yukarıda sayi adındaki değişkenimiz int değer tipi ile tanımlanmıştır.int ingilizcede integer anlamına gelmektedir.Yani tamsayı.Bu sayıyı printf içerisinde ekrana basarken metin içerisinde özel bir karakter kullandık.”%d” ifadesi ile formatlı metnimizi printfe ilk parametre olarak verdik.İkinci parametrede ise sayı değerini yazdık.Burada kullandığımız %d ifadesi bu kısma tamsayı gelecek anlamı taşımaktadır.

Aşağıdaki örnekte iki sayı değeri ve bunların toplam değeri printf içerisinde yazılmıştır:

#include<stdio.h>
int main( void )
{
	int sayi1=100,sayi2=50,toplam;
	toplam=sayi1+sayi2;
	printf("Number1: %d , Number2:%d , Sum:%d" ,sayi1,sayi2,toplam);
	return 0;
}

Birden fazla farklı formattaki ifadeleri printf içerisinde kullanabiliriz.

Şimdi ise sayı değerlerini scanf yardımıyla kullanıcıdan alalaım ve toplayalım:

#include<stdio.h>
int main( void )
{
	int sayi1,sayi2,toplam;
	printf("Sayi1:");
	scanf("%d",&sayi1);
	printf("Sayi2:");
	scanf("%d",&sayi2);
	toplam=sayi1+sayi2;
	printf("Number1: %d , Number2:%d , Sum:%d" ,sayi1,sayi2,toplam);
	return 0;
}

Yukarıdaki kodda sayi1 ve sayi2 değerlerini scanf yardımıyla kullanıcıdan çektik,scanf ilk parametresinde çekilecek değerin formatı olarak ,tamsayı istediğimizden,”%d” kullandık.İkinci parametrede & işaretini değeri atayacağımız sayıdan önce kullandık.

Aşağıdaki tablodan hangi değişken tipinin nasıl deklare edileceğini, kaç byte yer kapladığını, maksimum/minimum alabileceği değerleri ve giriş/çıkış fonksiyonlarıyla nasıl kullanılabileceğini bulabilirsiniz. Tanımlamalar ve fonksiyon uygulamaları, degisken isimli bir değişken için yapılmıştır.

 TİP   DEKLARASYON   
printf(  );
 
scanf(  );
 
 Minimum 
 Maksimum   Byte 
 Karakter  char degisken;  printf(“%c”,degisken);   scanf(“%c”,&degisken);  -128 127 1
 Kısa Tam Sayı  short degisken;  printf(“%d”,degisken);   scanf(“%d”,&degisken);  -32768 32767 2
 Tamsayı  int degisken;  printf(“%d”,degisken);   scanf(“%d”,&degisken);  -32768 32767 2
Uzun Tamsayı long int degisken; printf(“%ld”,degisken); scanf(“%ld”,&degisken); -2147483648 2147483647 4
İşaretsiz Tamsayı unsigned int degisken; printf(“%u”,degisken); scanf(“%u”,&degisken); 0 65535 2
İşaretsiz Uzun Tamsayı long unsigned degisken; printf(“%lu”,degisken); scanf(“%lu”,&degisken); 0 4294967295 4
Virgüllü Sayı float degisken; printf(“%f”,degisken); scanf(“%f”,&degisken); 1,17549e-38 3,40282e+38 4
Uzun Virgüllü Sayı double degisken; printf(“%lf”,degisken); scanf(“%lf”,&degisken); 2,22504e-308 1,79769e+308 8

Yukarıda verilen bu değerler; işletim sisteminden, işletim sistemine, farklılık gösterebilir. En doğru değerleri almak için sizeof( ), fonksiyonunu kullanmak gerekir. Aşağıda yazmış olduğum bir program bulacaksınız. Kendi bilgisayarınızda derleyip, çalıştırırsanız, size değişkenlerin boyutunu ve alabileceği maksimum-minimum değerleri verecektir:

Yukarıda printf içerisinde birden fazla farklı tipdeki değişkenleri yazabileceğimizi söylemiştik.Aynı durum scanf için de geçerlidir.

scanf("%d%f%c",&a,&b,&c);

“%d”=>sayı(integer),”%f”=>Ondalık sayı(float),”%c”=>karakter(character)

printf("%d %f %c",a,b,c);

Aritmetik Operatör ve İfadeleri

Başlıca aritmetik operatörler aşağıdaki gibidir.

( + ) : Artı

( – ) : Eksi

( / ) : Bölme

( * ) : Çarpma

( % ) : Modül

#aritmetik, #c, #degiskenler, #float, #integer, #operator, #printf, #scanf

C Programlama Diline Giriş

C ile ilgili olarak ilk öğrenilen şey giriş-çıkış işlemleridir. C de klavyeden herhangi bir değeri alabilmek için scanf(); fonksiyonunu ,ekrana bir şey yazdırmak için de printf(); fonksiyonu kullanılır.Giriş-çıkış işlemleri için stdio.h kütüphanesini koda eklememiz gerekir.Bunu eklerken #include komutundan faydalanmamız gerekir.

#include<stdio.h>
int main( void )
{
	printf("Hello World");
}

Yukarıdaki kodu derleyip çalıştırdığımızda aşağıdaki görüntü ortaya çıkacaktır.

c1

main( ) methodu, bir programdaki temel fonksyiondur. Bir method ismi tanımlandıktan sonra isminin sonuna parantezler konur.Bu parantezler arasına alması gereken herhangi bir tipte parametreler de eklenebilir.Eğer herhangi bir parametre yoksa boş bırakılır ya da void sözcüğü konulabilir.main methodunun dönüş tipi (return type) int olarak girilmiş.Geriye dönecek değer tipi olarak integer tipi tanımlanmış.

main() methodunnun içeriği ise küme parantezleri arasına eklenmiş.İçerisinde yazılan kodda ,printf yazdığımız metini, ekrana bastırmaya yarayan, standart bir fonksiyonudur. Çift tırnak işaretleri içersine yazdığınız herşey printf sayesinde ekrana basılır.

Dikkat ettiyseniz, her satır sonuna noktalı virgül koyduk. Aslında her satır değil, her komuttan sonra noktalı virgül koyduğumuzu söylemek daha doğru olacak. Çünkü noktalı virgül C dilinde komut ayracı anlamına gelir.

Şimdi kodumuzu biraz daha değiştirelim:

#include<stdio.h>
int main( void )
{
	printf("Hello World\n");
	printf("Hi,Cmeng");
	return 0;
}

Yukarıda farklı olarak printf’de yazdığımız metin sonuna \n ekledik.\n komutu bir alt satıra geçeceğini gösterir.En altta “return 0;” adında yazılan kodda main() methodunun 0 değerini döndürmesini sağlar. Bunu eklemesek de, program yine çalışır; ancak uyarı verir. Çünkü main fonksiyonu, geriye bir tam sayının dönmesini beklemektedir. Yazmış olduğumuz return ifadesiyle bu uyarılardan kurtulabiliriz.

Yukarıdaki kodda yazdığımız \n komutunu şu şekilde de yazabiliriz:

#include<stdio.h>
int main( void )
{
	printf("Hello World");
	printf("\nHi,Cmeng");
	return 0;
}

İki kodunda birbirinden farklı bir çıktısı olmayacaktır.Yukarıda kullandığımız 2 adet printfle yaptığımız işlemi tek printf kullanarak da yapabiliriz.

#include<stdio.h>
int main( void )
{
	printf("Hello World\nHi,Cmeng");
	return 0;
}

Peki printf içerisine çift tırnaklı bir metni nasıl yazabiliriz?Metin içerisinde kullanacağımız çift tırnaktan önce “\” ifadesi konulmalıdır:

#include<stdio.h>
int main( void )
{
	printf("Cmeng said: \"Hello World\"");
	return 0;
}

c2

#c, #language, #main, #printf, #programming, #return, #scanf

ASP.NET MVC’de Bundling ve Minification

Asp.Net MVC’de bu makalemde Bundling ve Minification ‘dan bahsedeceğim.Web sayfalarımızda script ve css kütüphanelerini import ederiz.Scriptleri ,css dosyalarını da elementleri ile sayfaya ekleriz.Şimdi Asp.Net MVC’de bu tanımlamarı BundleConfig ile yapmaya çalışacağız.Öncelikle sayfamıza şu şekilde script ve css kütüphanelerini eklediğimizi varsayalım:

<link href="@Url.Content("~/Scripts/jquery-ui-1.11.4.custom/jquery-ui.css")" rel="stylesheet" />
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-ui-1.11.4.custom/external/jquery/jquery.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-ui-1.11.4.custom/jquery-ui.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"></script>

Şimdi,App_Start klasörü altında oluşturduğumuz BundleConfig sınıfını oluşturalım ve içerisini şu şekilde dolduralım:Script kütüphanelerini ScriptBundle ile ,css kütüphanelerini StyleBundle ile tanımlıyoruz.

using System.Web.Optimization;

namespace Mvc4Application1.App_Start
{
    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-ui-1.11.4.custom/external/jquery/jquery.js"));

            bundles.Add(new ScriptBundle("~/bundles/jquery-validate")
                .Include("~/Scripts/jquery.unobtrusive-ajax.min.js")
                .Include("~/Scripts/jquery.validate.min.js")
                .Include("~/Scripts/jquery.validate.unobtrusive.js")
                );
            bundles.Add(new ScriptBundle("~/bundles/jquery-ui").Include("~/Scripts/jquery-ui-1.11.4.custom/jquery-ui.js"));

            bundles.Add(new StyleBundle("~/Content/css").Include("~/Scripts/jquery-ui-1.11.4.custom/jquery-ui.css"));

           BundleTable.EnableOptimizations = true; 
        }
    }
}

Yukarıda bundle tanımlamarı yaptık.ikinci bundle “Scripts” dizini içerisindeki üç script kütüphanesini tek bundleda toplayacak şekilde yazılmıştır.Son sıradaki BundleTable.EnableOptimizations kodu bundle örneklerini tek dosya halinde toplayıp içerisindeki gereksiz satırları (yorum satırları, boşluklar, yeni satırlar, vb. ) atıp, değişken isimlerini kısaltıp yani script veya stil dosyamızı optimize edip istemciye gönderilecek dosya boyutunu ve talep sayısını azaltıyor.Yani minification işlemini yapmaktadır.

Bu işlemlerden sonra Global.asax dosyasında Application_Start methodunda BundleConfig.RegisterBundles(BundleTable.Bundles); kodunu ekliyoruz.

using System.Web.Optimization;
protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

Bu işlemlerden sonra sayfamıza eklediğimiz kütüphaneleri şu şekilde çağırabiliyor olacağız.

     @Scripts.Render("~/bundles/jquery")
     @Scripts.Render("~/bundles/jquery-validate")
     @Scripts.Render("~/bundles/jquery-ui")
     @Styles.Render("~/Content/css")

Eğer bu adımdan sonra şu hatayı alıyorsanız:

'WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35' dosyasını veya derlemesini ya da bağımlılıklarından birini yükleyemedi. Sistem belirtilen dosyayı bulamıyor.

hata1

Bu hata işe karşılaşıyorsanız eğer ,

1)Öncelikle WebGrease.dll’i reference olarak projenize ekleyiniz.

2)Aşağıdaki kodları web.config dosyanıza ekleyiniz.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

Sonuç olarak yazdığımız bundleları minification yapılmış halde sayfa kaynağında şu şekilde görüntülüyor olacağız.


   <script src="/bundles/jquery?v=yLrUYw8wJsDVphfZd34hBbV8EDUqbXgqcJTvyPCUCRg1"></script>

   <script src="/bundles/jquery-validate?v=rGUXtQZ2M3lKI1DIPIHwqLsySxI_juPKFAqq1PlnVFs1"></script>

   <script src="/bundles/jquery-ui?v=6_R3XtK5S6lnGbFIQcKBAAjuihn8PftKzS7H_pAnUMg1"></script>

   <link href="/Content/css?v=46CkXt7BXGmufoUdkXqbJu_AjN76xHNeHWhMxIq2OxE1" rel="stylesheet"/>

#application_start, #app_start, #asp-net, #bundle, #bundleconfig, #bundletable, #bundling, #global-asax, #minification, #mvc, #optimization, #registerbundle, #registerbundles

ASP.NET MVC’de Helper Method oluşturmak

Asp.Net Mvc’de view de kullanmak üzere Helper Method geliştirebiliriz.Daha önce Html Helperları kendimiz nasıl geliştirebileceğimizi ayrıca şu makalede anlatmıştım.Şimdi ise Helper Methodlarını kullanacağız.Bu methodları yazarken method adının başına @helper yazıyoruz.Bu methodları çağırırken de @method_adi olarak çağırıyoruz.Yani özetle şu şekilde ;

 

@method_adi(...)

@helper method_adi(...)
{
.....
}

Şimdi üç tane KareCiz adında method oluşturalım.Üçü ad olarak aynı parametre olarak farklı olduğundan overload method olacaklardır.


@KareCiz()
@KareCiz("yellow")  
@KareCiz("black","Cmeng.NET","white")

@helper KareCiz()
{
    <div style="width: 100px;height: 100px;background-color: red;float: left"></div>
}

@helper KareCiz(string renk)
{
    <div style="width: 100px;height: 100px;background-color: @renk;float: left"></div>
}

@helper KareCiz(string renk, string yazi,string yaziRengi)
{
    <div style="width: 100px;height: 100px;background-color: @renk;float: left;color:@yaziRengi;text-align:center;">
        <span style="text-align: center; vertical-align: middle; line-height: 100px;">@yazi</span>
    </div>
}

Yukarıda görüldüğü üzere tanımladığımız helper method içerisinde html elementlerini rahatlıkla kullanabiliyoruz.

Bunun yanında projenizde yazmak istediğiniz helperları ayrı ayrı dosyalarda saklamak isteyebilirsiniz.Bunları uzaktan erişebilir olacak şekilde başka bir yerde tutmak istiyorsanız App_Code dizini altına View Page oluşturarak helper methodlarını buraya koyabilirsiniz.

Bunun için öncelikle App_Code altında Helpers adında bir View Page oluşturuyorum.Daha sonra yukarıda oluşturduğum helper methodlarını buraya koyuyorum.

/App_Code/Helpers.cshtml


@helper KareCiz()
{
    <div style="width: 100px;height: 100px;background-color: red;float: left"></div>
}

@helper KareCiz(string renk)
{
    <div style="width: 100px;height: 100px;background-color: @renk;float: left"></div>
}

@helper KareCiz(string renk, string yazi, string yaziRengi)
{
    <div style="width: 100px;height: 100px;background-color: @renk;float: left;color:@yaziRengi;text-align:center;">
        <span style="text-align: center; vertical-align: middle; line-height: 100px;">@yazi</span>
    </div>
}

Daha sonra buradaki helper methodlarını çağırıyorum.

@Helpers.KareCiz()
@Helpers.KareCiz("yellow")  
@Helpers.KareCiz("black", "Cmeng.NET", "white")

HELPERMETHOD

#asp-net, #cshtml, #helper, #method, #mvc, #viewpage