C Aritmetik İşlemciler
ARİTMETİK İŞLEMCİLER * , / ,%,+,- Bunlardan % işlemcisi dışındaki bütün aritmetik işlemcileri temel veri türlerinin tamamı ile birlikte kullanabiliriz. % işlemcisi sadece int veri türü ile kullanılır, NOT : % İşlemcisi bölme işleminde kalanı verir.
#include "stdio.h" main( ) { int d1,d2,d3; d1=32; d2=75; d3=3; printf( " %d %d %d %d ", d3*d2-d1,d3*(d2-d1)); }
MANTIKSAL İŞLEMCİLER ! NOT , && AND , II OR
Doğruları 1, yanlışları 0 ile temsil eder, #include "stdio.h" main( ) { int d1,d2; d1=54; d2=192; printf("%d", d1d2 && d1 !=d2 ); printf("%d", d1>d2 II !d1 !=d2 ); }
İLİŞKİSEL İŞLEMCİLER
< , > <= , >= == , !=
#include "stdio.h" main( ) { int d1,d2; d1=275 ; d2=14; printf ( " %d ", (d1>d2) && (d1<=300) && ( d1>=325) ); }
#include "stdio.h" main( ) { int d1; printf("bir int değer giriniz :"); scanf("%d",&d1); if (d1>100 && d1 % 2 == 0 && d1>200) printf("Girdiğiniz sayı 100 ile 200 arasında çift sayıdır. "); else { printf("Girdiğiniz sayı 100 ile 200 arasında tek bir sayı veya "); printf("100 ile 200 arasında olmayan bir sayıdır. "); } }
Artırma İşlemcileri : Bir değişkenin değerini birer birer artıran ve değişkenin sonundaki 2 adet ++ oluşan işlemciye artırma işlemcisi denir.
d1=d1+1; ile d1++; veya ++d1; aynı anlama gelmektedir.
#include "stdio.h" main( ) { int d1; d1=7; printf("%d ",d1); d1=d1+1; printf("%d ",d1); d1++; printf("%d ",d1); }
Azaltma İşlemcisi : Bir değişkenin değerini birer birer azaltan ve 2 adet -- işlemcisinden oluşan, işlemciye azaltma işlemcisi denir.
d1=d1-1; ile d1--; veya --d1; aynı anlama gelmektedir. #include "stdio.h" main( ) { int d1; d1=7 ; printf ("%d",d1); d1=d1-1; printf(" %d",d1); d1--; printf("%d",d1); } #include "stdio.h" main( ) { int d1,d2,d3,d4; d1=17; d2=5; d3=d1+ d2++ ; d4=d1+d2; printf("%d",d2); printf("%d",d3); printf("%d",d4); }
? İşlemcisi : Bu işlemciyi kullanabilmek için en az 3 işlemciye ihtiyaç vardır.
if (koşul) değişken = ifade1; else değişken = ifade2; ifadesi yerine değişken = koşul ? ifade1 : ifade2;
#include "stdio.h" main( ) { int d1,d2; printf("Bir sayı giriniz :"); scanf("%d",&d1); d2 = ( d1 %2==0 ) ? d1:0; printf( " %d " , d2 ); }
Atama İşlemcisi Aynı işlem satırında birden fazla değişkene değer atanabilir.
d1=d2=d3=17; C'de işlem satırlarını pratik bir şekilde yazabiliriz. d1=d1+10; ifadesi d 1+=10 ifadesine eşittir. Genel ifadesi aşağıdaki gibidir. değişken işlemci =ifade; İşlemci yerine + , - , * , / , % , << , >> , & , ^ işlemcileri yazılabilir.
#include "stdio.h" main( ) { int d1,d2,d3; d1=d2=d3=129; printf("%d %d %d",d1,d2,d3); } #include "stdio.h" main( ) { int d1; for(d1=0; d1<10; d1++) printf("%d",d1); printf("\n"); for(d1=0; d1<10; d1+=1) printf("%d",d1); } #include "stdio.h" void fonk1(int d1); main( ) { int d1,d2; d1=75; d2=112; printf("%d",d1); fonk1(d1); printf("%d",d2); fonk1(d2); d1<<=1; d2>>=1; printf("\n"); printf("%d",d1); fonk1(d1); printf("%d",d2); fonk1(d2); } void fonk1(int d1) { int d2; for (d2=128; d2>0; d2=d2/2) { if (d1&d2) printf("1"); else printf("0"); } } printf("\n"); }
VİRGÜL ( , ) İşlemcisi : Virgül işlemcisi for döngüsünün bölümlerinde birden fazla işlem yapıldığında kullanılır.
# include "stdio.h" main( ) { int d1,d2; for ( d1=0; d2= 0; d1+d2<100; d1+=2 ,d2+=5) printf("%d",d1+d2); } # include "stdio.h" main( ) { intd1,d2; d1=72; d2=(d1,23,45); printf("%d",d2); }
NOT : d2=(d1,23,45); ifadesinde d2'ye en sağda kalan değer atanır.
( ) İşlemcisi : # include "stdio.h" main( ) { int d1,d2; d1=12; d2=15; printf( " %d " ,d1*d2+2 ); printf( " %d " ,d1*( d2+2 ) ); }
# include "stdio.h" main( ) { int d1,d2,d3; printf("Bir sayı giriniz :"); scanf("%d",&d1); d2=3*d1+5; d3=d2*( d2-(15-d2) ); printf("%d %d %d",d1,d2,d3); }
[ ] İşlemcisi :Matris işlemlerinde kullanılmaktadır.Matris elemanlarına direk olarak erişme olanağı sağlar. Aşağıda yer alan ilk işlem satırı 10 elemanlı ve m1 adlı int bir matris bildirimi yapar. İkinci işlem satırı ise bu matrisin ikinci elemanına 5 sayısını atar. int m1[10]; m1[1]=5; Geçici veri türü degiştirme işlemcisini kullanarak bazen bir değişkenin , çeşidini geçici olarak değiştirmek mümkündür. (veri-türü) değişken;
# include "stdio.h" main( ) { int d1,d2,d3; double d4,d5,d6; d1=15; d2=171; d3=2054; d4 =82.151; d5=634.6879; d6=1271.342; printf( " %d %d %d \n " , d1,d2,d3 ); printf( " %f %f %f\n " , d4,d5,d6 ); printf( " \n %f %f %f \n " , ( float )d1 , ( float )d2 , ( float )d3 ); printf( " %d %d %d " , (int)d4 , (int)d5 , (int)d6 ); }
Sizeof İşlemcisi : Sizeof işlemcisi ile herhangi bir veri türünün veya bir değişkenin byte olarak boyutunu elde edebilirsiniz. Aşağıda ilk satır bir veri türünün ikinci satır ise bir değişkenin boyu tunun hesaplanması göstermektedir.
sizeof (veri-türü)
sizeof değişken-adı;
# include "stdio.h" main( ) { int d1,d2; float d3; d1=sizeof (float); d2=sizeof d3; printf ("float veri türü boyutu :%d \n",d1); printf ("d3 float değişken boyutu :%d",d2); }
POINTER İŞLEMCİLERİ Basitçe pointer , bir adrestir.Bir değişken olmak yerine , bir değişkenin hafızadaki adresini taşıyan bir ok işaretidir. Önüne ampersan işareti konmuş bir değişken , o değişkenin adresini belirtir.Önüne yıldız konmuş bir pointer, kendisinin tuttuğu adreste bulunan değeri gösterir. C'de pointerlerle kullanılan 3 adet işlemci vardır. Bunlar * , & , -> işlemcileridir. Pointerler değişkenlerin bellek adreslerini içeren değişkenlerdir. pointer veri türü ,adresini içereceği veri türünden olmalıdır.Pointerleri kullanarak , pointerlerin adresini içereceği değişkenlerle dolaylı yoldan işlem yapılabilir. pointerler önceden tanımlanmalıdır. * işlemcisi pointerlerin tanımlanmasında kullanılır.
veri-türü *pointer-adı; Aşağıdaki satır P1 adlı bir pointer tanımlar; int*p1; Veri türü herhangi bir veri türü , pointer adı ise bizim belirleyeceğimiz bir karakter dizisi olabilir. Pointer tanımlandıktan sonra pointer kullanabilmeniz için aynı veri türünden bir değişkeni pointere atamanız gerekir. Bu işlemi , & işlemcisi ile yaparız. pointer-adı = & değişken-adı; Aşağıda p1 adlı int bir pointer ve d1 adlı bir değişken tanımlar.ikinci işlem satırı ise d1 değişkeninin bellek adresini, p1 pointerine atar. int*p1,d1; p1=&d1;
# include "stdio.h" main( ) { int*p1,d1; p1=&d1; d1=7; printf("%d %d %p", d1 , *p1 , p1); }
C dilinde pointer yoluyla yapı elemanlarına ulaşmak için -> işlemcisi kullanılır.Aşağıdaki işlem satırı, p1 adlı yapının içinde yer alan d1 adlı int bir değişkene p1 yapı pointeri yoluyla 17 sayısını atar. p1->d1=17;
NOKTA ve BİT İşlemcileri . İşlemcisi : . İşlemcisi de , -> işlemcisi gibi yapılarla kullanılır. Bir yapı için pointer tanımladığınızda -> işlemcisini kullanırız.bir değişken tanımladığınızda . işlemcisini kullanırız.Aşağıda yap1 adlı bir yapının içinde, d1 adlı int değişkene y1 adlı yapı değişkeni yoluyla , 17 sayısını atar. y1.d1=17; BİT işlemcisi : C'de bit seviyesinde 4 adet özel işlemci vardır. & AND I OR ^ XOR ~ 1'İN TAMLAYANI Bunlar char ve int veri türünden değerlerle kullanılabilir.Bunlar 8 ve 16 bitlik değerlerle işlem yapar. Bunlar bit işlemcilerinin 2 tarafındaki değerlerin birbirine karşılık gelen bitlerini karşılaştırır.
& İşlem yapılan değerlerin karşılıklı gelen her iki bit'i 1 ise , 1 değerini verir. I İşlem yapılan değerlerin karşılıklı gelen bitlerinden herhangi biri 1 ise, 1 değerini verir. ^ İşlem yapılan değerlerin karşılıklı gelen bitlerinden bir tanesi 1 ise, 1 değerini verir. ~ Tek değere işlem yapar, int veya char bir değere içindeki bütün bit değerlerini tersine çevirir. 23
# include "stdio.h" # include "conio.h" main( ) { char d1; int d2; printf("Bir karakter giriniz :"); d1=getche(); printf("\n"); for( d2=128; d2>0 ; d2=d2/2); { if (d2&d1) printf("1"); else printf("0"); } }
BİT KAYDIRMA İŞLEMCİSİ C'de char ve int değerlerle kullanılan bit kaydırma işlemi << ve >> işaretleri ile sağlanır.değişken << int değer değişken >> int değer Sola kaydırma işlemcisini kullandığınızda,ikili sayı sistemine göre yazılmış değerinde yer alan bitler << işlemcisinin sağında yer alan int değer sola kayar. En sağda boşalan bitlere '0' gelir.Sağa kaydırma işlemcisi bunun tam tersidir.
# include "stdio.h" main( ) { int d21,d2; d1=127; d2=86; printf:("%d",d1); fonk1(d1); printf("%d",d2); fonk (d2); d1=d1<<1; d2=d2>>1; printf("\n"); printf("%d",d1); fonk1(d1); printf("%d",d2); fonk1:(d2); } void fonk1(int d1) { int d2; for (d2=128; d2>0; d2=d2/2) { if (d1&d2) printf("1"); else printf("0"); } printf("\n"); }
C'de bir sayıyı 2'ye bölmek veya 2'yle çarpmak için bu işlemciler kullanılabilir. d1=d1>>1; (d1=d1/2) d1=d1<<1; (d1=d1*2)
# include "stdio.h" main( ) { unsigned d1; d1=12780 ; printf("%u ",d1); fonk1(d1); d1=d1>>1; printf("%u",d1); fonk1(d1); } void fonk1(unsigned.d1) { unsigned long d2; for (d232768; d2>0; d2=d2>>1) { if( d1& d2) printf("1"); else printf("0"); } printf("\n"); }
İfadelerde Veri Çeşidi Değişimi C'de aynı ifade içinde farklı veri çeşitlerini düzenli bir şekilde kullanarak sonuçta tek bir veri çeşidi elde eden bir sistem vardır. C'de, bir ifade içinde bir char ve short int veri kullanıldığında, bu verilerin değerleri içinde bulundukları ifadenin çalışması esnasında int değere çevrilir. Otomatik veri çeşidi değişimleri yapıldıktan sonra program ifadelerde yer alan bütün verileri, ifade içindeki en büyük verinin çeşidine çevirir.
# include "stdio.h" main( ) { unsigned int d1; float d2; d1=41758; d2=457.92; printf ("%f", d1*d2) ; }
Program unsigned int ile float bir değer çarpımını float bir veri olarak verir.
# include "stdio.h" main( ) { unsigned int d1; d1=25; printf ("%d",d1); }
Atamalarda Veri Çeşidi Değişimi C'de atama işlemlerinde, eğer atama işlemcisinin iki tarafındaki verilenlerin çeşitleri farklı ise derleyici veri çeşidini değiştirir. Sağ taraftakinin veri çeşidi, sol taraftakine çevrilir.
# include "stdio.h" main( ) { int d1,d2; char d3,d4; d1=102; d3='A'; d2=d3; d4=d1; printf ("d1 değişken değeri : %d\n",d1); printf ("d2 değişken değeri : %c %d\n",d2,d2); printf ("d3 değişken değeri : %c %d\n",d3,d3); printf ("d4 değişken değeri : %d\n",d4); }
MATRİSLER Matrisler sayesinde aynı adı kullanarak birden fazla değişkene rahatlıkla erişilebilir ve işlem yapılabilir. Matrisler tek ya da çok boyutlu olabilirler. Tek Boyutlu Matrisler : C'de aynı veri tipinden olan değişkenler tekbir matris altında toplanarak tek boyutlu matrisler oluşturulur. Veri-çeşidi matris-adı [boyut]; Aşağıdaki işlem satırı m1 adlı ve 10 elemanlı int bir matris tanımlar. int m1[10]; matrisin ilk elemanına 0 ulaşır. int m1[10]; m1[0]=5; m1[9]=15; 1. elemanı m1[0] ile 10.uncu elemanı m1[9] ile gösterilir.
# include "stdio.h" main(){ int m1[10]; int d1; m1[7]=d1=18; printf("%d",m1[7]); printf("%d",d1); }
Tek Boyutlu Matrislere Klavyeden Değer Atama Scanf() fonksiyonunu kullanarak matris elemanlarına klavyeden değer atanabilir.
# include "stdio.h" main( ) { int m1[5]; int d1; printf ("bir sayı giriniz :"); Scanf ("%d",&d1); printf ("bir sayı daha giriniz:"); Scanf ("%d", &m1[0]); printf ("%d %d";d1,m1[0]); }
Matrislerde Boy Sınırlaması ve Kopyalama C'de matris elemanlarının sayısının sınırlayıcı bir kuralı yoktur. Belirlediğiniz boyutlara daha fazla eleman girebilirsiniz, derleyiciniz hata vermez fakat program düzgün işlemeyebilir.
# include "stdio.h" main( ) { int m1[10]; int d1; printf ("bir sayı giriniz"); scanf ("%d", &m1[0]); for (d1=1; d1<15; d1++); m1[d1]=m1[0]+d1; for (d1=0; d1<15;d1++; printf ("%d", m1[d1]); }
Matrisleri diğer matrislere kopyalama : C'de bir matrisin elemanlarının tamamını bir defada başka bir matrise kopyalayamayız. Elemanlarını teker teker kopyalayabiliriz.
# include "stdio.h" main( ) { int m1[10],m2[10]; int d1; for (d1=0; d1<10;d1++) m1[d1]=d1; for (d1=0; d1<10;d1++) m2[d1]=m1[d1]; printf ("ilk matriste yer alan elemanların değerleri"); for (d1=0; d1<0; d1++) printf ("%d", m1[d1] ); printf ("\n"); printf ("ikinci matriste yer alan elemanların değerleri :"); for (d1=0; d1<10;d1++) printf ("%d",m2[d1] ); }
Karakter Dizileri C'de karakter dizisi olarak tanımlanan veri çeşidi yoktur. Karakter dizisi veri desteği matrisler ile sağlanır.C 'de , klavyeden girdiğiniz karakter dizileri standart bir fonksiyon olan gets( ) fonksiyonu ile okutulur. Aşağıdaki ifade, klavyeden girdiğiniz karakter dizisini, m1 adlı karakter matrisine atar. gets(m1) gets() fonksiyonu siz ENTER'e basana kadar girilen karakterleri okur.
# include "stdio.h" main( ) { char m1[50]; printf ( " Bir karakter dizisi giriniz (50 karakterden az) : \n " ); gets (m1); }
# include "stdio.h" main( ) { char m1[50]; int d1; printf ("Bir karakter dizisi giriniz (50 karakterden az) : \n"); gets (m1); for (d1=0; m1[d1]; d1++) printf("%c",m1[d1] ); }
# include "stdio.h" main( ){ char m1[50]; int d1; printf ("Bir karakter dizisi giriniz (50 karakterden az) : \n"); gets (m1); printf (m1); }
Karakter Dizileri ile İlgili Kütüphaneler C'de karakter dizileri ile ilgili işlemlerde şu 4 kütüphane fonksiyonu kullanılır. Bunlar "string.h" dosyasını kullanır. strcpy( ) strcat( ) strcmp( ) strlen( ) STRCPY( ) : Bir karakter matrisini başka bir karakter matrisine kopyalar. char *strcpy (char*m1,const char *m2);Strcpy( ) fonksiyonu m2 ile gösterilen karakterleri, m1 adlı karakter matrisine kopya eder.Eğer m1'de mevcut bir karakter varsa, bunların üzerine yazılır.Önceki karakterler silinir.
# include "stdio.h" # include "string.h" main( ) { char m1[50]; strcpy(m1,"Kitap"); printf(m1); } # include "stdio.h" # include "string.h" main( ) { char m1[50],m2[20]; strcpy(m1,"Kitap"); strcpy(m2,"Defter"); strcpy(m1,m2); printf("%s %s",m1,m2); }
STRCAT() : Bir karakter dizisini başka bir karakter dizisine ekleyen fonksiyondur.
char *strcat(char*m1,const char*m2);
# include "stdio.h" # include "string.h" main( ) { char m1[50]; strcpy(m1,"Kalem"); strcat(m1," ve silgi"); printf(m1); }
STRCMP( ) : İki karakter dizisini karşılaştıran fonksiyondur.int strcmp(const char*m1,const char*m2);Eğer karşılaştırılan karakter dizileri birbirine eşit ise ,strcmp() fonksiyonu 0 değerini verir. Eğer m1 karakterdizisi m2 karakter dizisinden küçük ise değeri 0'dan küçük ,büyük ise değeri 0'dan büyüktür.Bu fonksiyon büyük ve küçük harf özelliğini de göz önüne alır.
# include "stdio.h" # include "string.h" main( ) { int d1,d2,d3; d1=strcmp ("abc","abc"); d2=strcmp("dkmc","ekdpc"); d3=strcmp("sfeki","blks"); printf("%d %d %d",d1,d2,d3); }
STRLEN( ) : Bir karakter dizisinin karakter olarak uzunluğunu geri veren fonksiyon STRLEN( ) fonksiyonudur. size-strlen(const char*m1); # include "stdio.h" # include "string.h" main( ) { char m1[30]; int d1; strcpy( m1,"Karakter"); d1=strlen(m1); printf("%d",d1); }
Tek boyutlu matrislere ilk değer okuma : Matris elemanlarına da matrisin tanımlandığı işlem satırında bir ilk değer verebilirsiniz. veri-türü matris-adı[boyut]={sabit-değerler}; Sabit değerlerin veri türü ile matris veri türü , aynı olmalıdır. Aşağıda 4 elemanlı m1 matrisine ilk değer atamaktadır. int m1[4]={2,4,6,8} bunu şu şekilde yazabiliriz. int m1[4]; m1[0]=2; m1[1]=4; m1[2]=6; m1[3]=8;
# include "stdio.h" main( ) { int m1[5]={1,2,3,4,5}; int d1; for(d100; d1<5; d1++) printf("%d",m1[d1] ); for (d1=0; d1<5; d1++) m1[d1]=m1[d1]+5; for(d1=0; d1<5; d1++) printf("%d",m1[d1]); }
Çok Boyutlu Matrisler C 'de iki veya daha fazla boyutlu matrisler kullanılabilir. int m1[20]; Tek boyutlu int m2[4][5]; İki boyutlu int m3[3][4][5]; Üç boyutlu Matrisin bellekte kapladığı alan : Matrisin boyutunu hesaplamak için matris boyutlarının çarpılması gerekir.matris eleman sayısı =boyut1*boyut2*boyut3*.............*boyut n m1[4][5][3] eleman sayısı = 4*5*3=60 Bellekte kapladığı alanı hesaplamak için matris bellek alanı =matris eleman sayısı*size of(veri-türü)
# include "stdio.h" main( ) { int m1[4][5]; char m2[4][5]; float m3[4][5]; int d1,d2,d3; d1=4*5*size of( int ); d2=4*5*size of( char ); d3=4*5*size of( float ); printf("m1 matrisinin bellekte kapladığı alan : %d byte \n",d1); printf("m2 matrisinin bellekte kapladığı alan : %d byte \n",d2); printf("m3 matrisinin bellekte kapladığı alan : %d byte ",d3); }
Çok Boyutlu Matrislerde Atama İşlemcisi ile İlk Değer Atama
# include "stdio.h" main( ) { int m2[4][5]; m2[0][0]=m2[0][1]=m2[0][2]=m2[0][3]=m2[0][4]=1; m2[1][0]=m2[1][1]=m2[1][2]=m2[1][3]=m2[1][4]=2; m2[2][0]=m2[2][1]=m2[2][2]=m2[2][3]=m2[2][4]=3; m2[3][0]=m2[3][1]=m2[3][2]=m2[3][3]=m2[3][4]=4; printf("%d %d %d %d %d \n", m2[0][0],m2[0][1],m2[0][2],m2[0][3],m2[0] [4] ); printf("%d %d %d %d %d \n", m2[1][0],m2[1][1],m2[1][2],m2[1][3],m2[1] [4] ); printf("%d %d %d %d %d \n",m2[2][0],m2[2][1],m2[2][2],m2[2][3],m2[2] [4] ); printf("%d %d %d %d %d \n",m2[3][0],m2[3][1],m2[3][2],m2[3][3],m2[3][4] ); }
Karakter Dizisi Matrisleri Çok boyutlu matrislerde birden fazla karakter dizisini aynı matris adı altında tanımlayabiliriz.Aşağıdaki işlem satırında her biri azami 20 karakterden oluşan bir karakter matristir.
char m1[5][20] Aşağıdaki ise 3 karakter dizisi ve her bir dizisi 40 karakter alan bir matristir.
char m1[4][3][40]; #include "stdio.h" main( ) { char m1[10][20] int d1,d2; char d3; for(d1=0 , d3='A'; d1<10; d1++, d3++); for(d2=0; d2<19;d2++) m1[d1][d2]=d3; for(d1=0; d1<10;d1++) { for(d2=0; d2<19;d2++) printf("%c",m1[d1][d2]); printf("\n"); } }
Boyutsuz Matrisler : Matrislere ilk değer atama işlemini uygularken matrislerin boyutunu tanımlamanız şart değildir.Matrisin boyutunu tanımlamadan ilk değer atama işlemini uyguladığınızda derleyici , matrise atadığınız sabit değerlerin sayısını kullanarak matris boyutunu belirler. int m1[ ]={1,2,3,4,5} Boyutu tanımlanmamış matrise sonradan bir kaç sabit daha eklediğinizde, derleyici bu sefer yeni bir matris oluşturur.Bu tür matrislere Boyutsuz Matrisler denir.
#include "stdio.h" main( ) { int m1[ ] ={[1,2,3,4,5,6,7,8,9,10}; int d1,d2; d2=0; for(d1=0; d1<10; d1++) { printf("%d",m1[d1] ); d2=d2+m1[d1]; }
|