c alıştırmaları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c alıştırmaları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

17 Temmuz 2009 Cuma

C / Çok Boyutlu Diziler

ÇOK BOYUTLU DİZİLER

Bir sınıftaki 40 öğrencinin notlarını saklamak için 40 elemanlı tek boyutlu bir dizi gerekirken; bir sınıftaki 40 öğrencinin 3’er notlarını saklamak için 40 satırı ve 3 sütunu bulunan (40 X 3 ) iki boyutlu bir dizi gerekecektir. İlk öğrencinin ilk notu dizinin [0][0] indis numaralı notudur. Dizinin [23][2] indis numaralı elemanı ise 24. elemana ait 3. notu saklamaktadır. Çünkü dizilerin indis numarası 0(sıfır)’dan başlar.

Eğer sınıftaki 40 öğrencinin, 6’şar dersten aldıkları 3’er notları saklamak isteseydik üç boyutlu bir diziye ihtiyaç duyacaktık. (40 X 10 X 3 )

Elemanlarına birden fazla indis numarası ile ulaşılan dizilere çok boyutlu diziler denir. C dilinde dizi boyutları hafızanın desteklediği ölçüde olabilir. Çok boyutlu diziler arasında en çok kullanılanı 2 boyutlu dizilerdir. 2 boyutlu dizileri bir tablo gibi düşünebiliriz. Bu tablodaki herbir elemana ulaşmak için önce satır sonrada sütun indis numarasını söylemek gerekir.

İKİ BOYUTLU DİZİLERİN TANIMLANMASI

İki boyutlu dizi tanımlanırken dizinin içerisinde saklanacak elemanların tipi, dizinin adı ve satır –sütun boyutları söylenir.

int not [40] [3];

İlk söylenen satır sayıs, ikinci söylenen sütun sayısıdır.

ÇİFT BOYUTLU DİZİLERE İLK DEĞER ATANMASI

Çift boyutlu dizinin herbir elemanına satır ve sütun indis numarası söylenerek ulaşılıp değer atanabilir.

not[23][2] = 78;

Bununla birlikte tıpkı tek boyutlu dizilerde olduğu gibi tanımlama esnasında da ilk değer ataması yapılabilir. Bu defa içiçe iki küme parantesi kullanmak gerekir. Her bir küme parantezi içerisindeki değerler herbir satırdaki değeri ifade eder. Örneği inceleyelim.

int a[3] [4] = { {1,2,3,4} , {5,6,7,8} , {9,10,11,12} }

Böyle bir atama sonunda değerler diziye aşağıdaki şekilde yerleşecektir:


0. Sütun 1. Sütun 2. Sütun 3. Sütun
0. Satır 1 2 3 4
1. Satır 5 6 7 8
2. Satır 9 10 11 12
Bu durumda; a[2][1] indis numaralı elemanın değeri 10’dur. Yukarıdaki gibi bir değer atama işleminin ilk bakışta daha kolay anlaşılabilmesi için şu şekilde bir yazım yöntemi tercih edilebilir:

A[3] [4] = { {1, 2, 3, 4},
{5, 6, 7, 8},
{9,10,11,12} } ;

ÖRNEK:

4 X 3 boyutlarında bir diziye klavyeden eleman girdiriniz. Girilen elemanlar içerisinde en büyüğünü buldurunuz. Diziyi ekrana tablo şeklinde yazdırınız.

#include
#include
void main ( )
{
int a[3][4], i, j, eb;

for ( i=0;i <3; i++) for (j=0; j<4; j++) { printf ( “%d. Sütun %d. Satır elemanını giriniz:”, i+1, j+1); scanf ( “%d”, &a[i][j] ); } eb=a[0][0]; for ( i=0; i<3; i++) for(j=0; j<4; j++) if (a[i][j] > eb)
eb = a[i][j];
printf ( “\n Dizinin en büyük elemanı %d ‘dir...”, eb);
printf(“\nDizi ekrana tablo halinde yazdırılıyor...”);
for (i=0; i<3; i++) { printf (“\n”); /* Her satır elemanını yeni bir satırın başından yazmak için */ for ( j=0; j<4; j++) printf (“%5d”, a[3][4]); } getch(); } NOT: İki boyutlu dizileri hafızanızda daha iyi canlandırabilmeniz için tablo örneğini verdik. Ama iki boyutlu diziler hafızada tablo şeklinde yerleşmezler. Arka arkaya önce ilk satır elemanları, hemen arkalarından ikinci satır elemanları....şeklinde tıpkı tek boyutlu dziler gibi saklanırlar. Biz başlangıç adreslerini (dizinin adında başlangıç adresi saklıdır) ve her satırda kaç eleman olduğunu bildiğimizden hangi elemanın hangi satıra ait olduklarını bulabiliriz. 3X4 boyutundaki bir dizinin ilk 4 elemanı ilk satıra, ikinci 4 elemanı ikinci satıra ait elemanlardır. ÇOK BOYUTLU DİZİLERİN FONKSİYONA PARAMETRE OLARAK GÖNDERİLMESİ Tıpkı tek boyutlu dizilerde olduğu gibi iki boyutlu dizi de fonksiyona gönderilirken sadece adı yazılır. Yani gönderilen dizinin başlangıç adresidir. Ancak fonksiyonda gelen diziyi karşılamak için dizinin boyutlarına uygun dizi tanımlanmalıdır. Gönderilen diziyi karşılayacak dizinin ilk boyut değeri söylenmez ama ikinci boyut değeri mutlaka söylenmelidir. ÖRNEK: Elemanları klavyeden girilecek 3X4 boyutlarında ki bir diziyi fonksiyonda ekrana tablo şeklinde yazdırınız. #include
#include
void dizi_yaz (int [][4]);
void main ( )
{
int a[3][4], i, j;

for ( i=0;i <3; i++)
for (j=0; j<4; j++)
{
printf ( “%d. Sütun %d. Satır elemanını giriniz:”, i+1, j+1);
scanf ( “%d”, &a[i][j] );
}
eb=a[0][0];
dizi_yaz (a);
getch();
}

void dizi_yaz (int b[][4])
{
int i,j;
printf(“\nDizi ekrana tablo halinde yazdırılıyor...”);
for (i=0; i<3; i++)
{
printf (“\n”); /* Her satır elemanını yeni bir satırın başından yazmak için */
for ( j=0; j<4; j++)
printf (“%5d”, a[3][4]);
}
}

ÇALIŞMA SORULARI:
50 elemanlı integer bir diziye 1-10 arasında rasgele değerler atayınız. Her sayıdan kaç tane olduğunu buldurunuz.

Örnek:
1’lerin sayısı: 4
2’lerin sayısı: 12
3’lerin sayısı: 8
.
.
.

50 elemanlı integer bir diziye 1-10 arasında rasgele değerler atayınız. Dizi elemanlarının herbirinin tekrar sayısını bir histogramla gösteriniz.

Örnek:
Eleman Sayısı Histogram
1 3 ***
2 12 ************
3 8 ********
.
.
.
20 elemanlı integer bir diziye 1-100 arasında rasgele değerler aktarınız. Diziyi ters çeviren fonksiyonu tasarlayınız.Ters çvirme işlemini elemanların yerlerini değiştirerek yapınız. Fonksiyon parametre olarak dizinin bşlangıç adresini almalıdır.




Dizi[0] Dizi[1] ..... Dizi[18] Dizi[19]
6 1 ........ 45 7




Elemanları klavyeden girilen 4 X 3 boyutlarında bir tablonun elemanlarını 3 X 4 boyutlarında bir tabloya aktaran fonksiyonu tasarlayınız. İlk tablonun satır elemanları, ikinci tablonun sütun elemanları olmalıdır. Fonksiyon parametre olarak tablonun başlangıç adresini almalıdır.

İLK TABLO

5 3 2
8 1 4
2 6 7
3 7 1

İKİNCİ TABLO

5 8 2 3
3 1 6 7
2 4 7 1

4 Temmuz 2009 Cumartesi

C Do while Loop

C'de işleyeceğimiz bir başka döngü çeşidimiz de do / while döngüsüdür. Yaptığı iş hemen hemen while döngüsü ile aynıdır fakat tek bir fark vardır ki koşul sağlansa da sağlanma sa do / while döngüsü en az 1 kez çalıştırılır.

Konuyu biraz açacak olursak while döngüsünde koşul sağlanmadığı takdirde döngü içindeki komut çalıştırılmaz. Çünkü koşul başta belirtilmiştir. Fakat do / while döngüsünde koşul sonda kontrol edileceği için en az bir kez çalıştırılır.

Şimdi ufak bir örnek yapalım. Şöyle ki kodumudaki sayaç değeri 5'ten küçükse ekrana merhaba dünya yazalım. Eğer 5 ten küçük değilse merhaba dünya yazmasın. While ile do / while arasındaki farkı gözlemlemek için de sayaç degerimizi 10 yapalım.

Şimdi kodlara bakalım:

Aşağıdaki kod while döngüsü ile düzenlenmiştir. Sayaç başlangıç değeri 10 olarak atanmıştır. Koşul sağlanmadığı için ekrana herhangi birşey yazılmayacaktır.

# include
# include

int main()
{
int sayac = 10;

while (sayac < 5) { printf("merhaba dunya"); sayac ++; } getch(); }



Şimdi aynı kodu do / while ile yapıyoruz. Sayaç değeri yine 10 olarak belirlenmiştir. Fakat do / while'ın mantığına göre döngü en az bir kez çalışacağından 1 kez ekrana "merhaba dünya" yazdırılacaktır.

# include
# include

int main()
{
int sayac=10;

do {
printf("merhaba dunya! \n");
sayac++;
} while(sayac<5); getch(); }



Umarım aradaki farkı anlatabilmişimdir. Tüm c sever arkadaşlara kolay gelsin.

Programın kaynak dosyalarına aşağıdaki linkten ulaşabilirsiniz:

http://rapidshare.com/files/252043185/do_while.rar.html

1 Temmuz 2009 Çarşamba

C { İf / Else / Switch Tutorial 2 }

C dilinde yazılmış bir su fatura ücreti hesaplama programı. Programın kaynak kodu ve çalışma metodunu aşağıdaki linkte bulabilirsiniz.

İf / else / switch için gayet güzel ve kapsamlı bir örnek.

İndirmek için:

http://rapidshare.com/files/250859696/su_fatura.rar.html

6 Haziran 2009 Cumartesi

if else tutorial

if / else seçim yapısı:

if / else deyimi hemen hemen tüm programlama dilleri içinde mevcut bir deyimdir. Algoritmalarda ve flowchartlarda veri akışı sırasında karşımıza çıkacak 3 temel yapı var demiştik. 1) seçim 2) çoklu seçim 3) döngü

şimdi ilk olarak seçim yapısını inceleyelim. yine örnek bir soru üzerinde çalışalım:

* Kullanıcıdan 2 sayı girmesini isteyen ve birbirleriyle karşılaştırıp sonucu ekrana yazdıran basit bir program geliştirilmek istenmektedir.

// şimdi programımızı geliştirmeye başlayalım. ilk olarak standart öncü dosyamızı ekleyelim.

#include


// programın main kısmına geçelim
int main()
{
// değişkenleri tanımlayalım
float sayi1, sayi2;

// şimdi kullanıcıdan sayıları girmesini isteyelim

printf("ilk sayiyi girin: \n");
scanf("%f", &sayi1);
printf("2. sayiyi girin: \n");
scanf("%f", &sayi2);

// şimdi seçme kısmına geldik. elimizde 3 durum var ve bu üc durumdan birini seçip ekrana yazdıracağız. 1) 1. sayı 2. den büyük olabilir. 2) 2 sayı da eşit olabilir 3) 2. sayı birinciden büyük olabilir. şimdi kodlamaya devam edelim.

if(sayi1>sayi2) // eger sayi 1 daha buyukse ekrana sayi 1 daha buyuk yaz
printf("Sayi 1 Sayi 2'den daha buyuk \n");

else if(sayi1==sayi2)
printf("Sayi 1 ve Sayi 2 esit \n");

else
printf("Sayi2 sayi 1'den daha buyuk \n");

return 0;
}


Seçme yapısının basit mantığı böyle. seçme yapısı genellikle 2li durumlarda kullanılır. durum sayısı fazla olduğu zaman çoklu seçim yapısını kullanmak hem programın etkinliğini arttırır hem de kodlama yükünü azaltır.

dikkat ederseniz son durum için if kullanmadık. çünkü elimizde olabilecek 3 durumumuz var ve biz zaten 2 si için if(koşul) yapısını kullandık. son durum için tekrar bir if(koşul) yapısı kullanmamıza gerek kalmadı. else burada eğer ilk 2 koşul sağlanmıyorsa diğer tüm koşullar sağlandığı zaman çalışacak komutları yazmamıza olanak sağlar

Basit bir hesaplama programı

* kullanıcıdan gideceği yolu ve gitmek istediği süreyi alıp yol boyunca gitmesi gereken ortalama hızı bulan bir program geliştirin.

#include
#include

int main()
{
double yol, ortalama_hiz;
int zaman;

printf("Lutfen gideceginiz mesafeyi yazin (m): \n");
scanf("%lf", &yol);
printf("Lutfen gitmek istediginiz sureyi yazin (sn): \n");
scanf("%d", &zaman);
ortalama_hiz=yol/zaman;
printf("Yol boyunca ortalama hiziniz: %lf m/sn olmalidir.", ortalama_hiz);
getch();
}



kodlara kendimiz bir göz atalım:

include ile header dosyaları eklenmiştir. header dosyası nedir? header dosyaları program içinde kullanacağınız hazır fonksiyonları içeren dosyalardır. (şimdilik bu kadar yeter. )

int main() { } -> main kısmı programımızın gövdesini oluşturmaktadır. neden main adı veriyoruz? aslında main ana fonksiyon olarak tanımlanabilir. fonksiyon nedir? fonksiyonlar ileriki bölümlerde öğreneceğimiz bir konudur. kısaca değinmek gerekirse programda bazen tekrar etmesi gereken kod öbekleri olabilir. bunları sık sık tekrar yazmak yerine fonksiyon şeklide main kısmının üstünde yada altında tanımlayarak tekrar tekrar kullanabiliriz. programı küçük alt birimlere bölmeye yarar. (böl ve yönet mantığı) şimdilik fonksiyonlar hakkında bu kadar yeter.

ilk kullanacağımız hazır fonksiyonlarımız scanf ve printf. printf kalıbını ekrana bir şey yazdırmak istediğimizde kullanırız. kalıbı printf(" yazılacak metin \n"); şeklindedir.


\n nedir? imleci alt satıra geçirmeye yarar (next) başka kullanım olarak \t olabilir. t-> tab bir miktar ileri kaydırır imleci.

c'de ifadelerin sonuna ; koymamız gerekiyor. derleyici ; geldiğinde komutun sona erdiğini anlamakta. yeri gelmişken söylemek isiyorum derleyici boşlukları ve // ifadesinden sonraki kısımları atlar. // genelde yorum belirtmek için kullanılır. kod öbeklerinin sonuna yada başına // şeklinde açıklama satırları yazabilirsiniz.


neyse konuyu fazla dağıtmadan devam edelim.

scanf ise klavyeden veri girişini sağlayan ve onu bir değişkene atayan fonksiyondur. scanf kalıbı ise scanf("%d",&degisken_adi); şeklindedir. hemen incelersek burda kafamızı karıştırabilecek birkaç nokta olabilir. %d değişkenin tipini belirdir. okunacak değişkenin ne türde olduğunu gösterir. (değişken tipleri ile ilgili bir makale aşağıda vereceğim) daha sonra atama operatörü (ampersant) ile klavyeden okunan değer değişkene atanır.

Veri Tipi Bellek Boyutu Veri Aralığı Açıklama
int 16 bit, 2 byte -32768 ile 32767 Tamsayı Değişkenler
char 8 bit , 1 byte -128 ile 127 Karakter Değişkenler
float 32 bit, 4 byte 3.4x10-38 ile 3.4x10+38 Tek hassasiyet, 7 digit
double 64 bit, 8 byte 1.7x10-308 ile 1.7x10+308 Çift Hassasiyet, 15 digit

veri tiplerini de böylece görmüş olduk.

%d -> int
%c -> char
%f -> float
%lf -> dobule

daha çeşitli değişken tipleri mevcut. bunları lazım oldukça göreceğiz.

şimdi prgrama devam edelim. main'in altında ilk olarak değişkenleri tanımlamalıyız. kullanacağımız değişkenler; yol uzunluğu tam sayı, zaman tam sayı ve ortalama hız ( yol / zaman olacağı için kesirli sayı kullanmalıyız.)

değişkenler tanımlandıktan sonra kullanıcıdan veriler alınmalı ve ortalama hız hesaplanarak ekrana yazdırılır ve program sonlanır.

programı derlediğimizde hemen kapanması gibi bir sorunla karşılaşabilirsiniz. (yukarıdaki kodlarda getch() ifadesi kullanıldığı için kapanmayacaktır.)

getch() ifadesi programın sonuna eklenerek yada return 0; ifadesi eklenerek hallolabilir bu sorun.

not: getch ifadesi için conio.h öncü dosyasını eklemeniz gerekmektedir.