C Programlama Dersi – II

Geçen hafta bilgisayar ve programlamaya dair temel bilgileri ve printf( ); fonksiyonunu öğrendik.Bu hafta, kaldığımız yerden devam edeceğiz. İlk yazıyla ilgili herhangi bir sorunuz varsa, bana [email protected] adresinden ulaşabilirsiniz. Bu ufakbilgiden sonra, kaldığımız yerden devam edelim.

Bloodshed Dev-C++

Okuyucularımızın bir kısmı, Bloodshed Dev-C++’inkullanımıyla ilgili çeşitlisorunlar yaşamış. Programı nasıl kullanabileceğinize dair ufak biraçıklamayla yazımıza başlamak yerinde olacaktır. ( Bu bölüm C derleyicisiolmayanlara yardımcı olmak için yazılmıştır. Eğer hâli hazırda bir derleyicinizvarsa ve sorunsuz kullanıyorsanız, “Değişken nedir? Tanımı nasıl yapılır?”bölümünden devam edebilirsiniz. )

Dev-C++ kullanımı oldukça basit bir program. Bloodshed Dev-C++ web sitesinin Download kısmından Dev-C++’i indirebilirsiniz. Dilerseniz bu bağlantıya tıklayarak yüklemeniz de mümkün. ( Zaman içinde bağlantı adresi çalışmayabilir. )Programı başarıyla indirip kurarsanız, geriye yapacak fazla bir şey kalmıyor.

Program menülerinden, File -> New-> Source File yaparak yeni bir kaynak dosyası açın. ( Ctrl + N ile de aynı işlemi yapabilirsiniz. ) Aşağıdaki kodudeneme amacıyla, açtığınız dosyaya yazın:
#include<stdio.h>
int main( void )
{
// Hello World yazar.
printf( “Hello World” );
// Sizden herhangi bir giriş bekler.
// Böylece program çalışıp, kapanmaz.
getchar( );
return 0;
}

File -> Save As sekmesiyle, yazdığınız dosyayı kaydedin. ( Ctrl + S ile dekaydedebilirsiniz. ) Dosyanın adını verdikten sonra sonuna .c yazın.Örneğin deneme.c gibi…

Execute -> Compile sekmesine tıklayın. ( Kısayol olarak Ctrl + F9’ukullanabilirsiniz. ) Artık programınız derlendi ve çalışmaya hazır.Execute -> Run ile programınızı çalıştırın. ( Ctrl + F10’u dadeneyebilirsiniz. )Ekrana “Hello World” yazacaktır.

Eğer yazdığınız kodu tek seferde derleyip, çalıştırmak isterseniz,Execute -> Compile & Run yolunu izleyin. ( Bu işleminkısayol tuşu, F9’dur. )

Yazdığınız kodu nereye kaydederseniz, orada sonu .exe ile bitençalıştırılabilir program dosyası oluşacaktır. Örneğin C:\Belgelerim klasörüne deneme.c şeklinde bir dosya kaydedip, F9’a bastığınızda, deneme.c’ninbulunduğu klasörde deneme.exe diye bir dosya oluşur. Oluşan bu dosyayı istediğiniz yere taşıyabilir, dilediğiniz gibi çalıştırabilirsiniz.

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

Değişkenler, girdiğimiz değerleri alan veya programın çalışmasıyla bazı değerlerin atandığı, veri tutucularıdır.Değişken tanımlamaysa, gelecek veya girilecek verilerin ne olduğuna bağlı olarak, değişken tipinin belirlenmesidir.Yani a isimli bir değişkeniniz varsa ve buna tamsayı bir değer atamak istiyorsanız, a değişkenini tamsayı olaraktanıtmanız gerekir. Keza, a’ya girilecek değer eğer bir karakter veya virgüllü sayı olsaydı, değişken tipinizinona göre olması gerekirdi. Sanırım bir örnekle açıklamak daha iyi olacaktır.
#include<stdio.h>
int main( void )
{
int a;
a = 25;
printf(“a sayısı %d”,a);
return 0;
}

Şimdi yukarıdaki programı anlamaya çalışalım. En baş satıra, int a -int, İngilizce de integer’ın kısaltmasıdır- dedik. Bunun anlamı, tamsayı tipinde, a isimli bir değişkenim var demektir.a=25 ise, a değişkenine 25 değerini ata anlamına geliyor. Yani, a artık 25 sayısını içinde taşımaktadır.Onu bir yerlerde kullandığınız zaman program, a’nın değeri olan 25’i işleme alacaktır. printf(); fonksiyonununiçersine yazdığımız %d ise, ekranda tamsayı bir değişken değeri gözükecek anlamındadır. Çift tırnaktan sonrakoyacağımız a değeri ise, görüntülenecek değişkenin a olduğunu belirtir. Yalnız dikkat etmeniz gereken, çifttırnaktan sonra, virgül koyup sonra değişkenin adını yazdığımızdır. Daha gelişmiş bir örnek yaparsak;
#include<stdio.h>
int main( void )
{
int a;
int b;
int toplam;
a = 25;
b = 18;
toplam = a + b;
printf(“a sayısı %d ve b sayısı %d, Toplamı %d.\n”, a, b, toplam);
return 0;
}

Bu programın ekran çıktısı şöyle olur; a sayısı 25 ve b sayısı 18, Toplamı 43. Yazdığımız bu programda, a,sonra b, üçüncü olarakta toplam ismiyle 3 adet tamsayı değişken tanıttık. Daha sonra a’ya 25, b’ye 18 değerleriniatadık. Sonraki satırdaysa, a ile b’nin değerlerini toplayarak, toplam ismindeki değişkenimizin içersine atadık.Ekrana yazdırma kısmı ise şöyle oldu: üç tane %d koyduk ve çift tırnağı kapattıktan sonra, ekranda gözükme sırasınagöre, değişkenlerimizin adını yazdık. printf(); fonksiyonu içersinde kullanılan %d’nin anlamı, bir tamsayı değişkenin ekranda görüntüleneceğidir. Değişkenlerin yazılma sırasındaki olaya gelince, hangisini önce görmekistiyorsak onu başa koyar sonra virgül koyup, diğer değişkenleri yazarız. Yani önce a değerinin gözükmesiniistediğimiz için a, sonra b değerinin gözükmesi için b, ve en sonda toplam değerinin gözükmesi için toplam yazdık.

Bu arada belirtmekte fayda var, elimizdeki 3 tamsayı değişkeni, her seferinde int yazıp,belirtmek zorunda değiliz. int a,b,toplam; yazarsakta aynı işlemi tek satırda yapabiliriz.

Şimdi, elimizdeki programı bir adım öteye taşıyalım:
#include<stdio.h>
int main( void )
{
int saat;
float ucret, toplam_ucret;
char bas_harf;
printf(“Çalışanın baş harfini giriniz> “);
scanf(“%c”,&bas_harf);
printf(“Çalışma saatini giriniz> “);
scanf(“%d”,&saat);
printf(“Saat ücretini giriniz> “);
scanf(“%f”,&ucret);
toplam_ucret = saat * ucret;
printf(“%c başharfli çalışanın, alacağı ücret: %f\n”,bas_harf,toplam_ucret);
return 0;
}

Bu yazdığımız program basit bir çarpım işlemini yerine getirerek sonucu ekrana yazdırıyor.Yazılanların hepsini bir anda anlamaya çalışmayın, çünkü adım adım hepsinin üzerinde duracağız.Programı incelemeye başlarsak; değişken tanımını programımızın başında yapıyoruz.Gördüğünüz gibi bu sefer farklı tiplerde değişkenler kullandık. Biri int, diğer ikisi float ve sonuncusunu da char.int’ın tamsayı anlamına geldiğini az evvel gördük. float ise 2.54667 gibi virgüllü sayılar için kullanılır.char tipindeki değişkenler, a,H,q,… şeklinde tek bir karakter saklarlar. Konu biraz karmaşık gözükse de,değişken tanımında bütün yapmanız gereken, değişkeninizin taşıyacağı veriye göre programın başında onun tipinibelirtmektir. Bunun için de tıpkı yukarıdaki programda olduğu gibi, önce tipi belirtir, sonra da adını yazarsınız.

Programımıza dönersek, çalışma saati bir tamsayı olacağından, onu saat isminde bir int olarak tanıttık. Ücretvirgüllü bir sayı olabilirdi. O nedenle onu float (yani virgüllü sayı) olarak bildirdik. Adını da saatucret koyduk.Farkettiğiniz gibi, toplamucret isimli değişkenimiz de bir float. Çünkü bir tamsayı (int) ile virgüllü sayının(float) çarpımı virgüllü bir sayı olmaktadır. Tabii 3.5×2=7 gibi tam sayı olduğu durumlarda olabilir. Ancak hatadansakınmak için toplamucret isimli değişkenimizi bir float olarak belirtmek daha doğrudur.

Üsteki programımızda olmasına karşın, şuana kadar scanf(); fonksiyonunun kullanımına değinmedik.scanf(); geçen haftaki yazımızdan da öğrendiğimiz gibi bir giriş fonksiyonudur. Peki nasıl kullanılır,tam olarak ne işe yarar? scanf(); kabaca klavyeden girdiğiniz sayıyı veya karakteri almaya yarar.Kullanımı ise şöyledir: önce scanf yazar, sonra parantez ve ardından çift tırnak açar, daha sonra alınacakdeğişkene göre, %d, %f veya %c yazılır. %d int, %f float, %c char tipindeki değişkenler için kullanılır.Bundan sonra çift tırnağı kapatıp, virgül koyarsınız. Hemen ardından & işareti ve atanacak değişken adını yazarsınız. Son olarak, parantezi kapatıp noktalı virgül koyarsınız. Hepsi budur.

Yukarıdaki programda da scanf(); fonksiyonu gördüğünüz gibi bu şekilde kullanılmıştır. Sanırım gereğinden çoklaf oldu ve konu basit olduğu halde zor gibi gözüktü. Yukardaki sıkıntıdan kurtulmak için çok basit birprogram yazalım. Bu programın amacı, klavyeden girilen bir sayıyı, ekrana aynen bastırmak olsun.
#include<stdio.h>
int main( void )
{
int sayi;
printf(“Değer giriniz> “);
scanf(“%d”,&sayi);
printf(“Girilen değer: %d\n”,sayi);
return 0;
}

Gördüğünüz gibi hiçbir zor tarafı yok. Klavyeden girilecek bir tamsayınız varsa, yapmanız gereken öncedeğişkenin tipini ve adını belirtmek, sonra scanf( ); fonksiyonunu kullanmak. Bu fonksiyonu kullanmaya gelince,scanf(” yazdıktan sonra değişken tipine göre %d, %c, veya %f, yazıp, ardından & işaretini kullanarak atanacakdeğişkenin adını belirtmekten ibaret. Fark etmişsinizdir, printf(); ve scanf(); fonksiyonlarının her ikisindede %d koyduk. Çünkü scanf( ); ve printf( ); fonksiyonların değişken tipi simgeleri aynıdır. Aşağıdaki tablodanhangi değişken tipinin nasıl deklare edileceğini, kaç byte yer kapladığını, maksimum/minimum alabileceğideğerleri ve giriş/çıkış fonksiyonlarıyla nasıl kullanılabileceğini bulabilirsiniz. Tanımlamalar ve fonksiyonuygulamaları, 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

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:
#include<stdio.h>
#include<limits.h>
#include<float.h>
int main( void )
{
printf( “\nTIP\t\t BOYUT\t\t MIN\t \tMAX\n” );
printf(“==============================================================\n”);
printf( “char\t\t: %d byte(s)\t%d\t\t%d\n”, sizeof(char),CHAR_MIN,CHAR_MAX );
printf( “short\t\t: %d byte(s)\t%d\t\t%d\n”, sizeof(short), SHRT_MIN, SHRT_MAX );
printf( “int\t\t: %d byte(s)\t%d\t%d\n”, sizeof(int), INT_MIN, INT_MAX );
printf( “unsigned int\t: %d byte(s)\t\t\t%u\n”,sizeof(unsigned),UINT_MAX );
printf( “long\t\t: %d byte(s)\t%ld\t%ld\n”, sizeof(long), LONG_MIN, LONG_MAX );
printf( “float\t\t: %d byte(s)\t%e\t%e\n”, sizeof(float), FLT_MIN, FLT_MAX );
printf( “double\t\t: %d byte(s)\t%e\t%e\n\n”, sizeof(double), DBL_MIN, DBL_MAX );

return 0;
}

Programı inceleyip, detaylara girmeyin. Sadece çalıştırıp, sonuçları görmeniz yeterli. Örneğin, Ubuntu yüklü x86 tabanlı bir bilgisayarda, karşınıza şöyle bir ekran gelecektir:
TIP BOYUT MIN MAX
==============================================================
char : 1 byte(s) -128 127
short : 2 byte(s) -32768 32767
int : 4 byte(s) -2147483648 2147483647
unsigned int : 4 byte(s) 4294967295
long : 4 byte(s) -2147483648 2147483647
float : 4 byte(s) 1.175494e-38 3.402823e+38
double : 8 byte(s) 2.225074e-308 1.797693e+308

Sanırım hiç istemediğim bir şey yaparak, kafanızı karıştırdım. Dilerseniz, burada keselim ve bunlar ileriye dönük olarak bir kenarda dursunlar. Yine de daha fazla bilgi isterseniz, Teach Yourself C in 21 Days yazısına göz atabilirsiniz. Ama dediğim gibi bunların sonraya bırakılması, uygun olacaktır.

Şu ana kadar öğrendiklerimizle girilen herhangi iki sayısının ortalamasını hesaplayan bir program yazalım. Başlamadan önce, değişkenlerimizin kaç tane ve nasıl olacağını düşünelim. Şurası kesin ki, alacağımız iki sayı için 2 farklı değişkenimiz olmalı. Bir de ortalamayı hesapladığımızda bulduğumuz değeri ona atayabileceğimiz bir başka değişkene ihtiyacımız var. Peki değişkenlerimizin tipleri ne olacak? Başında belirttiğimiz gibi yazmamız gereken program herhangi iki sayı için kullanılabilmeli. Sadece tamsayı demiyoruz, yani virgüllü bir sayı da girilebilir. O halde, girilecek iki sayının değişken tipi float olmalı. Bunu double da yapabilirsiniz, fakat büyüklüğü açısından gereksiz olacaktır. Ortalamaların atanacağı üçüncü değişkene gelince, o da bir float olmalı. İki virgüllü sayının ortalamasının tamsayı çıkması düşünülemez. Oluşturduğumuz bu önbilgilerle programımızı artık yazabiliriz.
#include<stdio.h>
int main( void )
{
float sayi1,sayi2,ortalama;
printf(“İki sayı giriniz> “);
scanf(“%f%f”,&sayi1,&sayi2);
ortalama = ( sayi1 + sayi2 ) / 2;
printf(“Ortalama sonucu: %f’dir”,ortalama);
return 0;
}

Yukarıda yazılı programda, bilmediğimiz hiçbir şey yok. Gayet basit şekilde izah edersek, 2 sayı alınıp,bunlar toplanıyor ve ikiye bölünüyor. Bulunan değerde ortalama isminde bir başka değişkene atanıyor. Buradayabancı olduğumuz, sadece scanf(); kullanımındaki değişiklik. scanf(); fonksiyonuna bakın. Dikkat edeceğinizgibi, değişkenlerden ikisine de tek satırda değer atadık. Ayrı ayrı yazmamız da mümkündü, ancak kullanımaçısından böyle yazmak açık şekilde daha pratiktir. Bu konuda bir başka örnek verelim. Diyelim ki, biri int,diğeri float, sonuncusuysa char tipinde 3 değişkeni birden tek scanf(); ile almak istiyorum. Değişkenlerinisimleri, d1,d2 ve d3 olsun. Nasıl yaparız?
scanf(“%d%f%c”,&d1,&d2,&d3);

Peki aldığımız bu değişkenleri ekrana tek printf(); ile nasıl yazdırabiliriz?
printf(“%d %f %c”,d1,d2,d3);

Görüldüğü gibi bu işin öyle aman aman bir tarafı yok. Fonksiyonların kullanımları zaten birbirine benziyor.Tek yapmanız gereken biraz pratik ve el alışkanlığı.

Aritmetik Operatör ve İfadeleri

Üste yazdığımız programların hemen hemen hepsinde aritmetik bir işlem kullandık.Ama aritmetik işlemleri tam olarak anlatmadık. Kısaca;
( + ) : Artı

( – ) : Eksi

( / ) : Bölme

( * ) : Çarpma

( % ) : Modül

Burada bilinmeyen olsa olsa modül işlemidir. Modül kalanları bulmaya yarar. Yani diyelim ki 15’in 6’ya olanbölümünden kalanını bulmak istiyorsunuz. O halde 15%6 = 3 demektir. Veya, 7’nin 3’e bölümünden kalanı bulacaksanız,o zamanda 7%3 = 1 elde edilir. Bu C’de sıkça kullanacağımız bir aritmetik operatör olacak.

İşlem sırasına gelince, o da şöyle olur. En önce yapılan işlem parantez ( ) içidir. Sonra * / % gelir.Çarpma, bölme ve modül için, soldan sağa hangisi daha önce geliyorsa o yapılır. En son yapılanlarsa artı ve eksidir.Keza, bu ikisi arasında, önce olan solda bulunandır.

Bölme işlemine dair, bir iki ufak olay daha var. 4/5 normalde 0.8 etmektedir. Ancak C için 4/5 sıfır eder.Çünkü program, iki tamsayının bölünmesiyle, sonucu tamsayı elde etmeyi bekler. İleride tipleri birbiri arasındadeğiştirmeye değineceğiz. Ama şimdilik bu konuda bir-iki örnek yapalım:
* 8/4+2 => 2 + 2 => 4
* 8-4*2+-12 => 8 – 8 + -12 => -12
* 15*4/2%4*7 => 60/2%4*7 => 30%4*7 => 2*7 => 14
* 31+7/2-83%5*2-2 => 31+ 3 – 3 * 2 – 2 => 31 + 3 – 6 – 2 => 26
* (31-7) * 2 + 83 / (5%2) => 24 * 2 + 83 / 1 => 48 + 83 => 131

Bu aritmetik ifadeleri henüz bir C programı için denemedik. Ancak burada keselim. Bunu yapmayı diğer yazımızasaklayalım. Eğer uğraşmak isterseniz klavyeden alınacak 3 sayının ortalamasını bulan bir program yazabilirsiniz.Yada girilecek 2 tamsayı arasında bütün aritmetik işlemleri -ikisin çarpımını, toplamını, birbirine bölümünü vefarkını- bulan ve sonuçları ekrana yazdıran bir program da yazmanız mümkün. Herhangi bir yerde takılır ve banaulaşmak isterseniz mail adresime yazmanız kafi. Haftaya görüşürüz.