Yazılım mühendisi ve Özgür Yazılımcı Sayın Çağatay Cebi'nin hazırladığı C eğitim paketini derleyerek yazı dizisi haline getirdim. Ders I- II şeklinde yayınlayacağım.
C Programlama Dersi - I
Merhaba;
Sanırım, C ve C++ adını bilgisayarla az çok haşır neşir olan herkes en az bir kez duymuştur. Sizde bu isimleri duyanlardansanız ve nedir, ne değildir, nasıl kullanılır gibi birçok soruya yanıt arıyorsanız, doğru yerdesiniz. Çünkü bu yazıyla başlayarak C ve C++ ile programlamaya gireceğiz. Önce C ile yolumuza koyulup, belli bir olgunluğa ulaştıktan sonra C++ ile devam edeceğiz.
Okuyucularımızın genelini düşünerek, konuyu en temelden almayı daha doğru buldum. Yani hedefimiz, programlamayı hiç bilmeyen bir insanın burada okuduklarıyla belli bir yerlere ulaşması. İleri derece de olanlarsa sıkılmamak için biraz beklemeli. Lafı fazla uzatmadan başlayalım.
Bilgisayar ve Programlama nedir?
Bilgisayar çok basit düşündüğümüzde üç ana görevi yerine getiren bir makinedir. Girilen bilgiyi alır (INPUT), işler (PROCESSING) ve bu işlenmiş veriden bir sonuç (OUTPUT) çıkarır. Bilgisayar, sadece donanım olarak çalışmaz. Çünkü yazılım olmadan, donanım ne yapacağını bilemez. Bilgisayar donanımına ne yapacağını söyleyecek bir komutlar dizisi gerekir. Yapacağı görevleri, ona anlatan komutlara program diyebiliriz. Yani donanıma “sen şunu yap, sonra bulduğun sonucu şöyle şuraya ekle” gibisinden işler yaptırmak programın veya bir başka deyişle yazılımın işidir. Bir programcı olarak bundan fazlasını bilmek elbette ki avantajdır. Ama bilgisayarın bütün özelliklerini bilmeniz gerekmez. Yani yazacağınız bir program için o bilgisayarın özelliklerini bilmeseniz de olur.
Bilgisayarın anladığı tek dil, Makine Dilidir. Bu 16’lık (Hexadecimal) sistemden oluşan bir programlama tipidir. Makine dilini anlamak çok zordur ve bu dili kullanmak için o bilgisayarın donanım özelliklerini mutlaka bilmeniz gerekir. C de ekrana yazı yazmanızı sağlayan “printf();” gibi çok basit bir fonksiyon, makine dilinde 1A BB 0D BC D5 FF C2 F7... gibi çok daha karmaşık ve hiçbir anlam ifade etmeyen bir hâle dönüşür. Makine dili programlama dilleri arasında en alt seviyedir.
Makine dilinden sonra Assembler Dili gelir. Makine dilini kullanmanın zorluğu ve karmaşası üzerine geliştirilen Assembler, daha basit bir yapıdadır. Ama yine de C ile mukayese ederseniz çok daha zordur ve kullandığınız bilgisayarın donanımına dair hâlen bilgiye gereksinim duyarsınız. Assembler aşağıdaki gibi karmaşık bir yapıdadır.
SEGMENT COM WORD PUBLIC ‘CODE’
ASSUME CS : COMDS : COM
ORG 100H
ENTRY: MOV DVX,OFFSET MSG
MOV AH,g
.
.
.
Şuan bunu anlamaya çalışıp, hiç zamanınızı harcamayın. Çünkü öğreneceğimiz dil C, işlerimizi ve dolayısıyla hayatımızı çok daha kolaylaştırmaktadır. C, orta seviye bir programlama dilidir. Bunun anlamı, hem yazması kolay, hemde üst seviye dillere göre daha çok erişim hakkınızın olduğudur. Üst seviye programlama dilleri ise BASIC, PASCAL, gibi dillerdir. Üst seviye dillerde, yazması göreceli olarak daha kolay olsa da C ile yapabileceklerimiz daha çoktur.
Program yazmak için ne gerekir?
Program yazabilmek için hiçbir şeye ihtiyacınız yoktur. Program yazmak için Windows’un not defterini veya Linux'da Gedit, Kwrite gibi bir program bile kullanabilirsiniz. Önemli olan yazılan programın derlenmesidir. Derlemeye “compile” ve derleme işini yapan derleyiciyeyse “compiler” denir. C için internet üzerinden birçok Compiler bulabilirsiniz. Ben, program uygulamalarını GCC üzerinden yapacağım. Aynı şekilde bu derleyiciyi kurmanızı tavsiye ederim. GCC gelmiş geçmiş en iyi derleyicilerden biri olduğu gibi, özgür bir yazılımdır! Richard Stallman tarafından açık kaynak koduyla sunulmuştur ve arzu ettiğiniz takdirde, sonuna kadar değişiklik yapma imkanınız vardır.
Şayet Windows işletim sisteminiz varsa GCC'yi kurmanız biraz sıkıntılı olabilir. Basit bir Google araştırmasıyla, Bloodshed Dev-C++ adında bir program buldum. GCC üzerine kurulmuş bir yapısı varmış. GCC ile uğraşmak istemeyen Windows kullanıcıları, bu programı deneyebilir.
Algoritma Geliştirmek
C dilini ve komutlarını öğrenmek, programlamaya başlamak için şarttır ama algoritma oluşturamadığımız sürece bir program oluşturmazsınız. Algoritma, mantıktır. Yani neyi, nasıl yapacağınızı belirtir. Algoritma türetmek için geliştirilmiş bir metot yok. Her program için o metodu sizin bulmanız gerekiyor. Ama hiç merak etmeyin, yazdığınız program sayısı arttıkça, algoritma kurmanız daha kolaylaşır.
Algoritma, programlamanın bel kemiğidir. C dilinde kullanılan komutlar, BASIC veya FORTRAN gibi başka dillerde işe yaramaz. Fakat programlama mantığını bir kere oturttursanız, C komutlarının yerine pekâlâ başka dillere ait komutları da öğrenebilir ve büyük bir zorluk çekmeden diğer dillerde de program yazabilirsiniz.
Basit bir örnek üzerinden düşünelim. Bir markete gittiniz, kasada ki görevliye aldığınız ürünü gösterdiniz, parayı uzattınız, paranın üstünü aldınız. Günlük hayatta gayet normal olan bu durumu biraz değiştirelim. Karşınızda insan değil, elektronik bir kasiyer olsun. Ona göre bir algoritma geliştirirsek,
1-) Ürüne bak;
2-) Ürün Fiyatını bul;
3-) Parayı al;
4-) Alınan paradan ürün fiyatını çıkar;
5-) Kalan parayı ver.
İnsan zekasının otomatik hâle getirdiği eylemleri, ne yazık ki bilgisayar bilmez ve ona biz öğretmek zorundayız. Öğretirken de hata yapma hakkımız yoktur, çünkü yanlış öğreti yanlış programlamayla sonuçlanır.
C Programlama Dili
Temel Giriş/Çıkış İşlemleri (BASIC I/O):
C ile ilgili olarak bu ve önümüzdeki yazılarda birçok komut/fonksiyon göreceğiz. Ama hep kullanacağımız ve ilk öğrenmemiz gerekenler temel giriş çıkış fonksiyonlarıdır. C de klavyeden bir değer alabilmek için scanf(); fonksiyonunu kullanırız. Ekrana herhangi bir şey yazdırmak içinse printf(); fonksiyonu kullanılır.
Bir örnekle görelim;
#include<stdio.h>
int main( void )
{
printf("Hello World");
}
Eğer bunu derleyicinizde yazıp derlerseniz ve sonrasında çalıştırırsanız ekrana Hello World yazılacaktır. #include<stdio.h>, standart giriş çıkış başlık dosyasını, programa dahil et gibi bir anlam taşır. C'de (ve hemen hemen bütün diğer programlama dillerinde) bir kütüphaneyi dahil etmek son derece rutin bir iştir. Aksi halde giriş-çıkış fonksiyonlarını dahi her seferinde bizim baştan tanımlamamız gerekirdi.
main( ), bir programdaki ana fonksyiondur. Ondan sonra gelen ayraç standarttır. Bir bloğu temsil eder. İki ayraç işareti arasındaki alan main fonksiyonuna ait bir bloğu oluşturur. printf ise 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 komutan sonra noktalı virgül koyduğumuzu söylemek daha doğru olacak. Çünkü noktalı virgül C dilinde komut ayracı anlamına gelir.
Şimdi yukarıda yazdığımız basit programı, biraz daha geliştirelim:
#include<stdio.h>
int main( void )
{
printf("Hello World\n");
printf("Merhaba Dünya");
return 0;
}
Birkaç yeni satır görüyorsunuz. Sırayla ne olduklarını açıklayalım. Az evvel yazdığımız "Hello World" yazısının sonuna "\n" ekledik. "\n" bir alt satıra geç anlamına geliyor. Eğer "\n" yazmazsak, ekranda "Hello WorldMerhaba Dünya" şeklinde bir yazı çıkar. "\n" kullanırsak, "Hello World" yazıldıktan sonra, bir alt satıra geçilir ve ikinci satırda "Merhaba Dünya" yazdırılır. En altta "return 0;" adında yeni bir komut fark etmişsinizdir. Bunu eklemezseniz, 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 kurtulabilirsiniz. Detayına girmek için henüz erken, return konusuna ileride değineceğiz.
Yukarıda ki programın aynısını şöyle de yazabilirdik:
#include<stdio.h>
int main( void )
{
printf("Hello World");
printf("\nMerhaba Dünya");
return 0;
}
Bir önce ve şimdi yazdığımız programların ekran çıktısı aynıdır. Bu örnekle anlatmak istediğim, printf( ) fonksiyonunda '\n' konulan yerden sonrasının bir alt satıra düşeceğidir.
#include<stdio.h>
int main( void )
{
printf("Hello World\nMerhaba Dünya");
return 0;
}
Gördüğünüz gibi tek bir printf( ); kullanarak aynı işlemi yaptırdık.
Varsayalım, ekrana çok uzun bir cümle yazmamız gerekti. Örneğin;
#include<stdio.h>
int main( void )
{
printf("Benim adım Çağatay ÇEBİ ve Yazılım Mühendisiyim.\n");
return 0;
}
Bu yazdığımız program hata vermemesine karşın, çalışma verimini azaltır. Çünkü yazacaklarınız editör penceresine sığmazsa, yazılanı okumak daha zahmetli olur. Önemsiz bir detay gibi gelebilir, ama kod yazma verimini ciddi oranda düşüreceğinden emin olabilirsiniz.
Bu programı aşağıdaki gibi yazmamız daha uygundur:
#include<stdio.h>
int main( void )
{
printf("Benim adım "
"Çağatay ÇEBİ"
"ve Yazılım Mühendisiyim.\n");
return 0;
}
Tek bir printf( ); fonksiyonu kullanılmıştır. Ancak alt alta yazarak, metini tek seferde görülebilir hâle getirdik. Programı derleyip çalıştırırsanız, alt alta üç satır yazılmaz. Cümle bütün olarak gösterilir ve bir önceki örnekle tamamen aynıdır. (Satırların alt alta görünmesini isteseydik; daha önce bahsettiğimiz gibi '\n' koymamız gerekirdi.)
Ekrana, Ali: "Naber, nasılsın?" dedi. şeklinde bir yazı yazdırmamız gerekiyor diyelim. Bu konuda ufak bir problem yaşayacağız. Çünkü printf( ); fonksiyonu gördüğü ilk iki çift tırnak üzerinden işlem yapar. Böyle bir şeyi ekrana yazdırmak için aşağıdaki gibi bir program yazmamız gerekir:
#include<stdio.h>
int main( void )
{
printf("Ali: \"Naber, nasılsın?\" dedi.\n");
return 0;
}
printf( ); fonksiyonunu kullanmayı sanırım iyice anladınız. printf( yazıp, sonra çift tırnak açıyor, yazmak istediklerimizi yazıyor, çift tırnağı sonra da parantezi kapatıyor, sonuna noktalı virgül ekliyoruz. Alt satıra geçmek içinse, yazdıklarımızın sonuna '\n' ekliyoruz. Çift tırnaklı bir şey kullanmak içinse \“ ... \” kullanıyoruz. Hepsi bu!
scanf(); fonksiyonuna gelince, bu başında bahsettiğimiz gibi bizim giriş (Input) fonksiyonumuzdur. Ancak yazımı burada noktalıyorum. Çünkü değişkenler işin içine girmekte ve onları anlatmam uzun sürecek. Gelecek haftaki yazımda kaldığımız yerden devam edeceğiz. Yazdıklarımla ilgili öneri, eleştiri veya sorunuz varsa, bana ulaşabilirsiniz.
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 cagataycebi@********** adresinden ulaşabilirsiniz. Bu ufak bilgiden sonra, kaldığımız yerden devam edelim.
Bloodshed Dev-C++ https://prdownloads.sourceforge.net/d....9.2_setup.exe
Okuyucularımızın bir kısmı, Bloodshed Dev-C++'in kullanımıyla ilgili çeşitli sorunlar yaşamış. Programı nasıl kullanabileceğinize dair ufak bir açıklamayla yazımıza başlamak yerinde olacaktır. ( Bu bölüm C derleyicisi olmayanlara yardımcı olmak için yazılmıştır. Eğer hâli hazırda bir derleyiciniz varsa 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 kodu deneme 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 de kaydedebilirsiniz. ) 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'u kullanabilirsiniz. ) Artık programınız derlendi ve çalışmaya hazır. Execute -> Run ile programınızı çalıştırın. ( Ctrl + F10'u da deneyebilirsiniz. ) 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şlemin kı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'nin bulunduğ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ı olarak tanıtmanız gerekir. Keza, a'ya girilecek değer eğer bir karakter veya virgüllü sayı olsaydı, değişken tipinizin ona 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(); fonksiyonunun içersine yazdığımız %d ise, ekranda tamsayı bir değişken değeri gözükecek anlamındadır. Çift tırnaktan sonra koyacağımız a değeri ise, görüntülenecek değişkenin a olduğunu belirtir. Yalnız dikkat etmeniz gereken, çift tı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;
}
Açıklama: (a ile b 25 ile 18 in değerin aldığı için onların rengine büründü, toplam da a+b ye eşit olduğu için a+b nin rengine büründü)
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ğerlerini atadı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ına gö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örmek istiyorsak onu başa koyar sonra virgül koyup, diğer değişkenleri yazarız. Yani önce a değerinin gözükmesini istediğ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 tipini belirtmektir. 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. Ücret virgü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.5x2=7 gibi tam sayı olduğu durumlarda olabilir. Ancak hatadan sakı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ınacak değ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 çok laf oldu ve konu basit olduğu halde zor gibi gözüktü. Yukardaki sıkıntıdan kurtulmak için çok basit bir program 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 önce değ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 atanacak değişkenin adını belirtmekten ibaret. Fark etmişsinizdir, printf(); ve scanf(); fonksiyonlarının her ikisinde de %d koyduk. Çünkü scanf( ); ve printf( ); fonksiyonların değişken tipi simgeleri aynıdır. 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.