Yeditepe Üniversitesi Bilgisayar Topluluğu

Kasım 8, 2008

C’ye giriş (3)

Kategori: C/C++ — shultays @ 5:15 pm
Tags:

C’ye giriş konumuzun 3. ve son bölümünden C’de (ve genel olarak bütün programlama dillerinde) kullanılan basit bir kaç komuttan bahsedeceğim.

if

İlk bahsedeceğim komut if komutu. if komutu sayesinde programımızın istediğimiz bir bölümünü bir şarta bağlı olarak çalıştırabilir veya o kısmın çalışmamasını sağlayabiliriz. if komutunun genel olarak kullanımı şu şekildedir.

if ( … şart … ) {

komutlar

}

Burada eğer şart kısmında belirttiğimiz koşulumuz doğru ise { … } arasında kalan tüm komutlar çalıştırılacaktır, eğer doğru değil iste bu parantezler arasında kalan komutlar görmezden gelinecek, program }’dan sonra gelen satırdan çalışmaya devam edecektir.

şart kısmında belirttiğimiz koşul herhangi bir matematiksel eşitlik olabilir. Örnek olarak

if ( a > b ) {
  ...
}

if içindeki komutlar sadece a değişkeni b’den büyük ise çalışacaktır. a’nın daha küçük veya eşit olma durumlarında … kısmındaki komutlar atlanacaktır. Kullanabileceğimiz diğer şart komutları

a > b (a b’den büyük ise)
a >= b (a b’den büyük veya eşit ise)
a < b (a b’den küçük ise)
a <= b (a b’den küçük veya eşit ise
a == b (a ve b birbirine eşit ise)
a != b (a ve b birbirine eşit değil ise)

Bir örnek program ile daha iyi açıklamaya çalışayım.

#include <stdio.h>

int main(void){ 
  int x;
  scanf("%d", &x);

  if( x > 0 ) {
    printf("X is a positive number!\n");
  }

  if( x < 0 ) {
    printf("X is a negative number!\n");
  }

  if( x == 0 ) {
    printf("X is zero!\n");
  }

  return 0;
}

main fonksiyonumuzu incelediğimizde, ilk satırımızda x isminde bir değişken tanımlıyoruz. Bir sonraki komutta scanf diye bir fonksiyon kullandık. Bu da aynı printf gibi stdio.h kütüphanesinde bulunan bir fonksiyon. İşlevi ise kullanıcının klavye gireceği bir inputu bir değişkene atamak. Bu fonksiyonu kullandığımız yerde program durdurulacak, kullıcıdan bir sayı (veya string) girmesi beklenecektir. Kullanıcı istediği bir değişkeni girip enter’a bastığında girmiş olduğu sayı x değişkenine (veya fonksiyonda hangi değişkeni belirttiysek) atanacaktır. %d kullanmamızın sebebi x in bir integer olması, farklı değişken türleri için farklı harfler kullanılır. Daha fazla bilgi için

http://www.cplusplus.com/reference/clibrary/cstdio/scanf.html

inceleyebilirsiniz. x den önce kullandığımız & işareti ise x değilde x’in adresini gönderdiğimizi gösteriyor, adresler ve pointerlar daha ileri bir konu olduğu için burada bahsetmeyeceğim.

Özet olarak scanf fonksiyonu geldiğinde kullanıcı bir sayı girecek enter a basacak ve bu sayı x e atanmış olacak. Bundan sonra bir if komutu ile karşılaşıyoruz

if( x > 0 ) {
  printf("X is a positive number!\n");
}

Burada { … } içindeki satırlar yani printf fonksiyonumuz eğer if ( … şart …) kısmındaki şart doğru ise çalışacaktır. Yani eğer kullanıcı pozitif bir sayı girmişse ekrana X is a positive number! yazdırılacaktır. Eğer sayı 0 dan büyük değil { … } parantezleri arasındaki bütün komutlar görmezden gelinecek, program } dan sonra gelen ilk satırdan devam etmeye başlayacaktır.

İkinci if komutu yine ilkine benzer bu sefer x in 0′dan küçük olup olmadığını kontrol ediyor, son if komutumuzda x in 0′a eşit olduğu durumları kontrol ediyor.

Yukarda bahsettiğimiz örnekler hep tek bir şarta bağlı olarak çalışıyordu. Eğer gerekiyorsa tek bir if içinde birden fazla şartı kontrol edebilir, tüm bu şartlara bağlı olarak if komutunun içini çalışıp çalıştırabiliriz. İki tip bağlaç ile şartları birbirine bağlayabiliriz. Birincisi && (and) kullanarak, ikincisi || (or) kullanılarak yapılır. Eğer && kullanırsak bütün koşullar doğru olduğunda if çalışacaktır, || kullanır isek herhangi bir koşulun doğru olması yeterli olacaktır. İkisi içinde birer örnek verelim,

if ( a > b && a > 0) {
  printf("a is greater than b and it is a positive number!\n");
}

Burada a sayısı b sayısından büyük olduğunda ve a sayısı 0′dan büyük olduğunda if komutu içinde ki kodlar çalışacaktır, eğer iki koşuldan en az birisi yanlış ise görmezden gelineceklerdir. or için bir örnek:

if ( a == 0 || b == 0 ) {
  printf("a*b is zero!\n");
}

Yukarıdaki örnekte de a veya b sayılarından herhangi birinin 0 olup olmadığını kontrol ediyoruz, eğer bu sayılardan biri 0 ise bunların çarpımlarının sonucu da 0 olacağı için a*b is zero! yazısını ekrana yazdırıyoruz.

2 den fazla şartıda bir birine bağlayabiliriz, hatta bu grupladığımız şartları parantez içine alarak yine başka bir şart ilede birbirine bağlayabiliriz. Bir örnek ile göstermeye çalışayım.

if ( (a > 0 && b > 0) || (a < 0 && b < 0) ){ 
  printf("a*b is a positive number!\n");
}

Yukarıdaki örnekte eğer a ve b değişkenlerinin ikiside 0 dan büyük veya ikiside 0 dan küçük ise printf komutu çalışacaktır.

else, else if

else komutu if komutundan sonra kullanılır. Eğer bir if komutunun şartı doğru değil ise, ve bundan sonra bir else geliyorsa else içindeki kodlar çalışacaktır. Eğer if komutu doğru ise çalışmayacaktır.

if ( a > 0 ) {
  printf("a is a positive number!");
} else {
  printf("a is not a positive number!");
}

Yukarıdaki örnekte ilk önce a değişkeni 0′dan büyük mü diye kontrol ettik, eğer büyük ise if komutundan sonra gelen { … } parantezlerinin içi çalışacaktır, eğer yanlış ise else komutundan sonra gelen { … } parantezlerinin içi çalışacaktır. Yani a sayısı 0 dan büyük ise “a is a positive number!” yazısı ekrana yazdırılacak, değil ise “a is not a positive number!” yazısı ekrana yazdırılacaktır.

else if komutu yine else e benzer bir şekilde bir if komutundan sonra kullanılır fakat bu sefer else den farklı olarak else kısmının içini de bir şarta bağlı olarak çalışmasını sağlayabiliriz.

if ( a > 0 ) {
  printf("a is a positive number!");
} else if ( a < 0 ) {
  printf("a is a negative number!");
} else {
  printf("a is zero!");
}

Yukarıdaki örnekte önce a > 0 şartı kontrol edilecektir. Eğer doğru ise “a is a positive number” ekrana yazılacak, else kısmına hiç bakmadan en son } parantezinden sonraki komuta geçilecektir. Eğer a > 0 şartı yanlış ise else kısmının şartı yani a < 0 kontrol edilecek ve eğer doğru ise ekrana “a is a negative number!” ekrana yazdırılacaktır. Eğer bu şartta doğru değil ise en sonda gelen else kısmı çalışacaktır.

if, else, else if konusunda bilmemiz gerek bir diğer şey de, eğer {…} parantezleri arasında sadece tek satırlı bir komut varsa eğer istersek bu parantezleri kullanmayabiliriz. Mesela

if ( a > b ) {
  printf("a is greater than b!");
}

ile

if ( a > b )
  printf("a is greater than b!");

arasında hiç bir fark yoktur. Fakat eğer if komutu içinde birden fazla satır kullanıyorsak bu şekilde bir  kısaltma yapamayız. Aynı durumu else veya else if içinde kullanılabilir.

Kasım 7, 2008

Seçmeli Sıralama ( Selection Sort )

Kategori: Algoritma, C/C++ — aycanayhan @ 10:13 pm
Tags: ,

Neden Sıralıyoruz?
Elimizde bulunan her türlü bilgiye kolay ulaşmak için o bilgilerin belirli bir düzen ve sıra içinde olması, aradığımız bilgiye kolay ulaşmak için gerekli olan temel ihtiyaçlardan biridir. Basit örnek olarak; elimizde 100 tane gözü olan bir raf ve 1’den 100’e kadar numaralandırılmış 100 tane kitap olsun. Kitapların raflara belirli bir sıra ile değil de rastgele yerleştirilmiş olduğunu düşünürsek, 45 numaralı kitaba ulaşmak için en az 1, en fazla 100 rafa bakmamız gerekebilir. Ama kitapların raflara sırayla yerleştirirsek, istediğimiz numaralı kitaba tek bir rafa bakarak ulaşabiliriz. Elimizdeki bilgilerin sıralı olması bu gibi durumlarda, özellikle arama ( searching ) durumlarında işimizi oldukça kolaylaştıracaktır.
Birçok sıralama algoritması vardır. Bu algoritmalardan selection sort’a değinmeye çalışacağım:

Seçmeli Sıralama ( Selection Sort )
En basit sıralama algoritması olarak gösterilebilir. Elimizdeki dizide sıralanması gereken n tane sayı olsun. Bu sayıları küçükten büyüğe sıralamak gerekirse, sıralama algoritması şöyledir:
1- Dizinin 1. elemanından başlayarak tüm elemanlarını kontrol ederek en küçük sayıyı bul,
2- Bulduğun en küçük sayıyı dizinin 1. sayısıyla yer değiştir (swap).
3- Dizinin 2. elemanından başlayarak tüm elemanlarını kontrol ederek en küçük sayıyı bul,
4- Bulduğun en küçük sayıyı dizinin 2. sayısıyla yer değiştir (swap).
5- ……
6- Dizinin (n-1). elemanından başlayarak tüm elemanlarını kontrol ederek en küçük sayıyı bul,
7- Bulduğun en küçük sayıyı dizinin (n-1). sayısıyla yer değiştir (swap).
Her bir jenerasyonda en küçük sayıyı bulup onu swap ettiğimiz yer, o sayının sıralanmış dizideki uygun yeri olmuş oluyor.


Bir parça c kodu ile;

#include <stdio.h>
int main()
{
	int dizi[6] = { 10,1,9,2,8,3 };
	int n=6;
	int i,j,indexOfMin,temp;
	int min;

	for ( i=0;i<n-1;i++ )
	{
		min=dizi[i];
		indexOfMin=i;
		for ( j=i+1;j<n;j++ )
		{
			if( dizi[j]<min )
			{
				min=dizi[j];
				indexOfMin=j;
			}
		}
		temp=dizi[i];
		dizi[i]=min;
		dizi[indexOfMin]=temp;
	}
	printf("siralanmis dizi\n");
	for( i=0;i<n;i++ )
		printf("%d ",dizi[i] );
	printf("\n");
	return 0;
}

(21-23. satırlar arasında swap işlemi yapılıyor)
Kodda ufak değişiklikler yaparak büyükten küçüğe de sıralama yapmak mümkündür.

Karmaşıklık ( Complexity )
Sıralanmış dizinin herbir elemanını bulurken, sıralanmamış diziyi baştan sonra kontrol etmemiz gerekiyor.
1. en küçük elemanı bulurken n-1,
2. en küçük elemanı bulurken n-2,
3. en küçük elemanı bulurken n-3,
…..
(n-1). en küçük elemanı bulurken 1 tane kontrol yapılır. Yapılan tüm bu kontrollerin toplam sayısı:

( n X (n-1) ) / 2 tanedir. Seçmeli sıralamanın karmaşıklığı O(n2) olur.

Kasım 3, 2008

C’ye giriş (2)

Kategori: C/C++ — shultays @ 3:05 pm
Tags:

Fonksiyonlar

C’deki fonksiyonlar matematik fonksiyonlarına benzer. Bir sayı alırlar onun üzerinde işlem yaparlar ve bir sayı geri döndürürler. Örnek olarak sin(x) fonksiyonu bir açı alır ve bu açının sinüs değerini geri döndürür. C’de bir fonksiyonu kullanmak için öncelikle onu tanımlarız. Mesela bir sayının karesini döndüren bir fonksiyon:

int square(int x)
{
 int y = x*x;
 return y;
}

Yine bu fonksiyonun ne yaptığını satır satır inceleyelim. Burada ilk satırda önce int yazıp fonksiyonumuzun bir integer döndüreceğini belirtiyoruz. Daha sonra yazdığımız “square” fonksiyonumuzun adı oluyor. Son olarak bu satırda fonksiyonumuzun alacağı değerleri yazıyoruz. Bizim square fonksiyonumuz x adında bir integer alıyor, daha sonrada bu x in karesini gene integer olarak bize geri verecek.

Sonraki kısımda fonksiyonumuzun ne yapacağını yazacağız. Bu işlemler { … } parantezleri arasında yapılmalıdır. Şu anki örneğimiz de y isminde bir değişken tanımlıyoruz ve buna x*x (x in karesi) ni atıyoruz. Daha sonrada return y; diyerek y değişkenini geri döndürüp fonksiyonumuzu bitirmiş oluyoruz. Bu fonksiyonu içerecek örnek bir program yazalım

#include <stdio.h>
int square(int x)
{
  int y = x*x;
  return y;
}
int main(void)
{
  int a, b, c;
  a = 2;
  b = square(5);
  c = square(a);
  printf("b is equal to %d.\n", b); 
  printf("c is equal to %d.\n", c);
  return 0;
}

Yukarıda ki örneğimiz de yine önce stdio.h kütüphane mizi yükledik. Daha sonra square fonksiyonu nu tanımladık. main fonksiyonumuz da a, b, c isminde 3 tane integer tanımladık ve bundan sonra a ya 2 değerini atadık.

Bir sonraki satırda (b = square(5);) daha önceden tanımlamış olduğumuz square fonksiyonuna 5 değerini yollayıp, bu fonksiyonun döndürdüğü değeri (25) b ye eşitlemiş oluyoruz. Burada square(5) dediğimizde square fonksiyonu 5′i alıyor x e eşitliyor, y değerini hesaplıyor ve y değerini geri döndürmüş oluyor. Geri döndürdüğü bu değer de b sayısına eşitleniyor.

Bir sonraki adımda bu sefer direk 5 gibi bir tam sayı yollamıyoruz da bir değişken yolluyoruz. square(a) dediğimiz de a değerinin değişkeni (yani 2) square fonksiyonuna yollanıyor, bu değerin karesi hesaplanıp c ye yazılıyor.

Bir sonraki satırımızda b ve c değerlerini ekrana yazmış oluyoruz. Burada Hello world örneğinden farklı olan %d ifadesini kullanmamız. Eğer ekrana bir integer yazmak istiyorsak tırnak içindeki bölümde, integer ın yazılmasını istediğimiz yere %d yazıyoruz, tırnak işaretlerini kapadıktan sonra da virgül ile ayırıp değişkenimizi yazıyoruz. Tırnak içinde yazdığımız \n ise sayır atlanacağını gösteriyor.

Sonuç olarak bizim programımızın çıktısı:

b is equal to 25.
c is equal to 4.

oluyor.

Bu örnekte dikkat ederseniz main de aynı square gibi bir fonksiyon. Hiç bir değer almıyor (void yazdığımızda bir değer almadığını belirtmiş oluyoruz) ve integer döndürüyor. Döndürdüğü integer ise en sonda return 0; ile döndürdüğümüz 0 değeri oluyor. Fonksiyonumuz hiç bir değer döndürmesini istemiyorsak yine başına int değil de void koyarak belirtebiliriz.

void printHello(void)
{
  printf("Hello world!\n");
}

Yukarıdaki örnekte hiç bir şey almayan ve döndürmeyen printHello isminde bir fonksiyon yazdık. Bu fonksiyonu şu şekilde çağırdığımızda

printHello();

ekrana yine Hello world! yazdırmış oluyoruz.

C’ye giriş (1)

Kategori: C/C++ — shultays @ 3:04 pm
Tags:

C’ye yeni başlayacaklar için bir kaynak olsun dedim. İlk önce basit olarak C programları nedir nasıl çalışır ondan bahsedeceğim değişkenler nelerdir onlardan bahsetmeye çalışacağım. Diğer derslerde de fonksiyonlar nasıl tanımlanır ve kullanılır, if, while, switch gibi komutları ne işe yararlar, nasıl kullanılırlar ondan bahsedeceğim.

Hello world!

Giriş olarak basit bir uygulamanın adım adım nasıl çalıştığını anlatacağım. Aşağıdaki program ekrana Hello world! yazısını yazdıracaktır.

#include <stdio.h>
int main(void)
{
  printf("Hello world!");
  return 0;
}

Adım adım kodumuzu inceleyecek olursak:

#include <stdio.h>

Bu satırda stdio.h isimli kütüphaneyi programıza eklemiş olduk. Kütüphaneler içinde programlarımızda kullanabileceğimiz fonksiyonlar ve değişken içeren .h dosyalarıdır. Bir kütüphaneyi ekledikten sonra o kütüphane ile birlikte gelen herhangi bir fonksiyonu artık programımızda kullanabiliriz. stdio.h kütüphanesi kullanıcı ile etkileşime geçebileceğimiz temel fonksiyonları (örnek olarak programımızda kullandığımız printf fonksiyonu) içerir. Fonksiyonlar nedir, nasıl kullanılır ilerde biraz daha fazla değineceğim.

int main(void)
{
  printf("Hello world!");
  return 0;
}

Bu kısım da bizim main fonksiyonumuz. Bir c programı bir çok fonksiyondan oluşur, main fonksiyonu ise bir c programı çalıştırıldığında çağrılan ilk ana fonksiyondur. main fonksiyonu içindeki ilk satırında kullandığımız printf fonksiyonu ekrana bir şey yazdırmak için kullanılır. Bizim örneğimizde de Hello world! yazısı ekrana yazılacaktır.

Son satırımızda da return 0; ile main fonksiyonumuzun başarılı bir şekilde bittiğini söylüyor ve programımızı sonlandırmış oluyoruz.

Değişkenler (Variables)

Bir programda tüm bilgiler değişkenlerde tutulur. Mesela bu bilgi bir öğrencinin numarası, sınav notu veya ismi olabilir. Bir değişkeni fonksiyonun başında bir kez tanımladıktan sonra artık ona herhangibir değer atayabilir, üzerinde matematik işlemleri yapabiliriz. Mesela örnek olarak x isimli bir değişken tanımlayalım.

int x;

Burada önce değişkenin türünü yazıyoruz. Yazdığımız “int” değişkenimizin bir integer (tam sayı) olduğunu belirtiyor. Değişken tipini belirttikten sonra ismini belirtiyoruz. Yani yukarıdaki satırda x isminde bir integer tanımlamış olduk. Daha sonradan bu x e bir değer atamak istediğimizde

x = 5;

gibi bir ifade kullanırız. Yukarıdaki örnekte x i 5′e eşitlemiş olduk. Eğer istersek bu işlemi tanımlama sırasında da yapabiliriz. Mesela örnek bir toplama işlemi yapalım.

int a;
int b;
int c;
a = 5;
b = 3;
c = a + b;

Yukarıdaki örnekte  önce a, b ve c isiminde 3 tane integer tanımlıyoruz. Daha sonradan a ya 5 değerini, b ye 3 değerini atıyoruz. En son adımda da c = a + b; ile a ve b nin toplamını (yani 8′i) c ye atamış oluyoruz.

Eğer istersek bir değişkene tanımlama aşamasında bir değer atayabiliriz. Mesela yukarda önce x i tanımlamış, sonradan ona 5 değerini atamıştık. Bunların hepsini tek adımda yapmak için

int x = 5;

de diyebilirdik. Burada x isminde bir integer tanımlıyoruz ve 5 değerini atıyoruz.

Ayrıca aynı türden birden fazla değişkeni yine bu şekilde tek bir satırda yapabiliriz. Yukarıda ki toplama işlemini şu şekilde de gösterebilirdik.

int a = 5, b = 3, c;
c = a + b;

ilk satırda a, b, c değişkenlerimizi tanımladık ve a ve b ye 5 ve 3 değerlerini atadık. İkinci satırda da c değişkenin a ve b nin toplamını atamış olduk.

Daha önceden bahsettiğim gibi integer sadece tam sayıları (-1, 5, 0 vs) tutabilir. Küsuratlı sayıları tutmak için double veya float kullanmalıyız.

double a = 1.5;
float b = 2.5;

double ve float arasındaki fark double hafızada iki kat daha fazla yer tutar, bu yüzden çok daha büyük sayıları double da tutabiliriz. Eğer çok büyük sayılarla uğraşmayacaksak sadece float kullanabiliriz.

Diğer bir değişken türümüz ise char (character) türüdür. Yine integer gibi sadece tam sayı tutabilen bu değişkenler hafızada tek byte yer kaplar ve sadece -127 ve +127 arasındaki değerleri alırlar. Genel olarak tek bir karakteri tutmak icin kullanılırlar.

Kasım 1, 2008

Linux üzerinde gcc kullanımı, C kodlarını derlemek ve çalıştırmak

Kategori: C/C++, Linux — xaph @ 7:56 pm
Tags: , ,

Linux üzerinde çalışıyorsanız ve C programlaya yeni başladıysanız, başlangıçta C kodlarını yazarken ve derlerken zorluk çekebilirsiniz.
Bunu halletmek için her şeyden önce elinizde C kodlarınızı yazacağınız bir text editorunuz bulunmalıdır. Seçeceğiniz text editörü konsol üzerinde çalışan vi, nano gibi editörler ya da görsel olarak çalışabileceğiniz gedit, kate, emacs gibi editörler olabilir. Hangisini kullanacağınıza karar vermek tamamen size kalmış. Herhangi bir text editöründe kodlarınızı yazdıktan sonra istediğiniz herhangi bir yere kaydedebilirsiniz. Kayıt işleminde dikkat etmeniz gereken nokta C kodlarınızı .c uzantılı olarak kaydetmenizdir.
Kodumuzu ornek.c adıyla /home/kullanıcı_adı klasörünüze kaydettiğimizi düşünelim ve örnek olarak bir C programını çalıştıralım. İlk yapmamız gereken bir konsol açıp kodumuzun bulunduğu dizine geçmek olmalı. Bunu yapmak için

$ cd /home/kullanıcı_adı

yazmamız yeterli olacaktır.
Eğer ki C kodumuzun olduğu klasörde olup olmadığımız hakkında bir şüphemiz varsa bunu

$ ls

komutunu kullanarak kontrol edebiliriz. “ls” komutu bulunduğumuz klasördeki dosyaların isimlerini konsola yazar.
Kodumuzun bulunduğu klasöre geçtikten sonra gcc ile kodumuzu derleyebiliriz. gcc’nin açılımı “gnu c compiler” olmakla linux dağıtımlarında kullanılan standart C derleyicisidir. gcc kullanarak kodumuzu derlemek için yine konsol üzerinde

$ gcc ornek.c

yazmamız yeterli olacaktır. Bu işlem sonunda kodumuz derlenir ve eğer varsa kod üzerindeki hatalar konsola yazılır. Eğer ki sorunsuz bir derleme yaptıysanız kodunuzun bulunduğu dizinde “a.out” adında bir dosya oluştuğunu görmelisiniz. Bu c kodunuzun derlenmiş, çalıştırılabilir(binary) halidir.
Derlenmiş C kodumuzu çalıştırmak için ise konsola

$ ./a.out

yazmamız yeterli olacaktır. Böylece C kodumuzun çıktısını konsol üzerinde görebiliriz.

a.out çıktısından farklı bir çıktı adıyla kod derlemek
Derleme işlemi yaparken birbirinden ayrı birkaç tane kod derlememiz ve hepsini ayrı ayrı kullanmamız gerekebilir. Eğer ki bütün kodlarımız a.out olarak derlenirse her çalıştırma işlemi için kodlarımızı yeniden derlememiz gerekir. Bunu engellemek için gcc’ye -o parametresini girmemiz ve kodumuzun derlenmiş halini başka bir isimde kaydetmemiz gerekmektedir. Örnek olarak ornek.c kodumuzu derleyip ornek adında kaydetmek için

$ gcc ornek.c - ornek

yazmamız yeterli olacaktır. Burada kullanacağımız -o parametresi gcc’ye kodumuzun çıktısı için farklı bir isim seçmek istediğimizi, ornek ise çıktımızın hangi adı alacağını anlatır. Kodumuzu farklı bir isimle derledikten sonra ise dikkat etmemiz gereken şey artık a.out değil de yani dosya adımızı çalıştırmamızdır. Yani son derlememiz için konsola

$ ./ornek

kodunu girmeliyiz. Böylece ornek.c dosyamızın derlenmiş hali olan ornek dosyasını çalıştırmış oluruz.

Derleyici Kavramı ve C’ye Başlangıç

Kategori: C/C++ — xaph @ 7:55 pm
Tags:

Derleyici Nedir?

Herhangi bir dilde programlamaya başlamaya karar veren birisinin ilk karşılaştığı problemlerden birisi oluşturacağı program kodlarını nereye yazması gerektiğidir. C de başlangıç dillerinden birisi olarak gösterildiğine göre C programlama dilinde program yazmak isteyenlerin bir kısmını yeni başlayanlar kategorisine alabiliriz. Bu yüzden sizlere oncelikle derleyici(compiler) nedir ve kullanımı nasıldır bunu anlatmak istedim.

Bir çogunuzun bildiği/duydugu üzere bilgisayarlar sadece 0 ve 1′leri kullanmaktadırlar. Bilgisayarın kullandığı bu 0 ve 1′lerden oluşan dile makine dili adı verilir. Makine diline bilgisayarın anadili diyebiliriz. Ancak makine dili bizim için öğrenmesi ve kullanaması oldukça zor bir dildir. Ayrıca kullanımı da oldukça uzundur Mesela makine dilinde bir A harfi tanımlamak istediğimizde 01000001 yazmak zorundayız. Programlama dillerive derleyiciler işte tam bu noktada devreye girer. Biz kullandığımız dilin kurallarına göre bir A harfi yazdığımızda kullandığımız derleyici onu makine diline yani 01000001 haline çevirir. Yani derleyicilir bizim bilgisayar ile aramızdaki tercümanlardır diyebiliriz. C için kullanabileceğiniz bir derleyiciyi verdiğim linkten ulaşabilirsiniz.

Dev C/C++ İndir

Dev C/C++’ın kurulum aşamasının herhangi bir Windows programından farkı yok ancak ilk çalıştırmada sizden bir özelliğinin kurulumu hakkında onay ister. Kurup kurmamak tamamen size kalmış bir şey. Ancak kurarsanız bilgisayarınızdan normalden daha fazla bir şekilde ram kullanacaktır.

İlk C programımızı Yazalım ve Çalıştıralım:

Derleyicimizi kurduktan sonra C’ye başlangıç için bir program yazabiliriz. Öncelikle birçok programlama kitabında da ilk olarak yapıldığı gibi “Hello World” programı yazalım. Hello World programı çalıştırıldığı zaman ekrana “Hello World yazdıran ve ardından sona eren bir programdır. Henğz derleyicinin nasıl çalıştığını bilmediğiniz için bu örnekte derleme işlemini adım adım yapacağız.

1- Öncelikle kod yazacağımız belgeyi oluşturmakla işe başlayalım. Dev-C’de File menüsünden New->Source File adımlarını izlerseniz boş bir C belgesi oluşturmuş olursunuz.

2- Dilerseniz kodumuzu yazmadan önce belgemizi adlandıralım. Bunun için yine File menüsünden Save as seçeneğine tıklamalısınız. Ya da klavyeden Ctrl+F12 kısayolunu da kullanabilirsiniz. Açılan pencerede Dosya adı olarak “Untitled Document” yazan yere ilk programımızı adlandırmak için HelloWorld.c (C kodları .c uzantısını kullanırlar) yazabilirsiniz. Boylece oluşturduğumuz belgeyi adlandırmış olduk.

3- Şimdi elimizde HelloWorld.c olarak adlandırdığımız boş bir C belgesi var. Artık programımızı yazabiliriz:


//Hello World programı
#include

int main()
{

printf(“Hello World!!\n”);
return 0;

}

4- Kodumuzu yazdıktan sonra execute menüsünden compile seçeneğini seçersek ve kodumuzda hata yoksa derleyicimiz kodumuzu çalıştırılabilir bir hale getirir. Eğer kodda hata çıkarsa derleyicimiz size “1 Warning 3 Error” gibi bir şekilde hata verecek ve hataların hangi satırda meydana geldiğini gösterecektir.

5- Kodumuzu duzgun bir şekilde derlediğimizi varsayarsak yine execute menüsünden run diyerek programımızı çalıştırabiliriz. Ancak programımız sadece ekrana yazı yazıp kapanacağı için siz ekranda bir şey göremeyeceksiniz. kodumuzu kaydettigimiz yerde .exe uzantılı yeni bir dosya olduğunu göreceksiniz. HelloWorld.exe adında olan bu uygulama kodumuzun derlenmiş ve çalıştırılabilir halidir. Programımızın çıktısını görmek için programımızı “komut istemi”nden çalıştırmamız gerekmektedir. Bunun için Başlat menüsünden Çalıştır seçildikten sonra cmd yazıp çalıştırmalı, ardından programımızı(.exe uzantılı halini) sürükleyip komut istemi içine bırakarak ya da adresini yazarak(C:Documents and Settings/kullanıcıAdı/Belgelerim/HelloWorld.exe gibi) enter tuşuna basmalıyız. Böylece kodumuzun verdiği çıktıyı tam olarak görebiliriz.

Bu belgemizde ekrana çıktı veren basit bir program yazdık. Alıştırma olarak printf içerisindeki yazıyı(tırnak işaretlerine dokunmadan) değiştirerek birkaç derleme daha yapabilirsiniz.(printf içerisindeki \n ifadesi yeni bir satıra atlamaya yarar) Bir sonraki belgemizde ise yazdığımız programda hangi kodun ne iş yaptığını detaylı bir şekilde anlatacağım.

İyi kodlamalar:)

Ekim 28, 2008

C’de konsoldan parametre girmek

Kategori: C/C++, Genel — xaph @ 10:47 am
Tags: ,

Operating systems ödevimi yaparken ihtiyacım olan ve bu güne kadar hiç kullanmadığım bir olayla karşılaştım C programlama dili üzerinde.

Eğer programımıza komut satırında çalıştırırken parametre girmemiz gerekirse bu işi nasıl yaparız?

Cevabı internette biraz araştırma yaptıktan sonra şu ana kadar parametresini hep void ile doldurduğum main fonksiyonuna parametre girmekle yapılacağını öğrendim. Şimdi bu iş nasıl gerçekleşiyor bakalım.

Örnek programımızın adı program.c olsun. program.c içerisinde main fonksiyon prototipimizi şu şekilde yazalım:

int main(int argc, char * argv[])

argc ve argv sıklıkla kullanılan değişken isimleridir. Tabi ikisi de değişken olduğu için isimlerini dilediğiniz şekilde değiştirebilirsiniz. Ardından programımızı gcc ile derleyelim:

xaph@linux$ gcc program.c

Son olarak ise programımızı çalıştırırken girmek istediğimiz değişkenleri girelim:

xaph@linux$ ./a.out degisken1 degisken2 degisken2

Bu şekilde çalıştırılan programımızda argc konsoldan girilmiş olan toplam input sayısını tutar. Bizim örneğimiz için bu değer 4tür. Main fonksiyonuna girmek istediğiniz değişkenler ise argv string arrayinde tutulmaktadır. argv[0] programımızın adını tutar. argv[1] den argv[3] e kadar olan dizi ise sırasıyla girdiğimiz degisken1, degisken2, degisken3 değerlerini tutar. Bu değişkenleri programınız içerisinde dilediğiniz gibi kullanabilirsiniz.

Konsoldan integer girişi:
Şu ana kadar girdiğimiz ve kullanmak istediğimiz değişkenler string veri türündeydi. Peki biz programımıza tamsayı girdisi yapmak istersek ne yapmalıyız?

Main fonksiyonunda kullandığımız prototip önceden tanımlı bir durumdadır. Dolayısıyla ikinci parametre olan char* veri türünde değişiklik yapamıyoruz. Bu da gireceğimiz her sayının karakter dizesi olarak tutulması anlamına geliyor. String veri türündeki bir tamsayıyı nümerik veri türlerine çevirmek için standart C kütüphanesinde atoi, atol, atof, strtol gibi fonksiyonlar bulunmakta. En çok kullanılanı olduğu için kısaca atoinin kullanıldığı bir örnek koda bakalım.

#include <stdio.h>
int main(int argc, char* argv[])
{
    int i;
    i=atoi(argv[1]);
    printf("%d", i);
}

Bu şekildeki bir programı derleyip parametre olarak integer değeri girdikten sonra, girdiğiniz değeri çıktı olarak basacaktır. Tabi çıktı sayının integer veri tipine çevrilmiş haliyle basılır.

Artık tek yapmanız gereken konsoldan aldığınız parametreleri istediğiniz hale getirip kullanmak. İyi kodlamalar.

WordPress.com'dan blog alın.