C Programlama dili C dili, Unix ve Linux gibi işletim sistemlerinin temel dilidir. Bu nedenle program tasarımı, yazılım geliştirme ve sistem konfigürasyonunda vazgeçilmez bir standart oluşturmuştur. C dili bir alt düzel programlama dili gibi doğrudan bellek adresleriyle çalışabilmesinin yanında yeni veri yapıları tanımlayabilme bit seviyesinde çalışabilme, işletim sistemini doğal haliyle kullanabilme gibi özelliklere sahiptir. Bunun yanıonda C dili bir üst düzey programlama dili gibi de kullanılabilmekte ve bir çok hazır fonksiyonları da kütüphanesinde barındırmaktadır. C dili donanımdan bağımsız (machine independent) ve taşınabilir (portable) yani aynı programın farklı donanım ve farklı işletim sistemlerinde çalıştırılabilir bir dildir. C dilinin iki temek bileşeni vardır, 1. Önişlemci direktifleri (preprocessor directives) : # işareti ile başlayan her satır C standart kütüphanesinde yer alır ve program derlenmeden önce C önişlemcisi tarafından işletilir. Her önişlemci direktifinin farklı bir görevi vardır. En çok kullanılanları #include (pogram içerisinde kullanılan fonksiyonlar için gerekli kodları programa dahil eder, örneğin ekrana çıktı yazdırmak için kullanılan printf fonksiyonunun çalışabilmesi için <stdio.h> isimli dosya gereklidir, bu dosyayı programa dahil etmek için program kodunun en başına #include <stdio.h> komutu yazılmalıdır. C dilinde.h uzantılı dosyalara başlık dosyası (header file) adı verilir) ve #define direktifleridir. stdio.h başlık dosyası standart giriş çıkış işlemleri için gerekli kodları içerir. 2. Ana fonksiyon (main function) : Bütün C programlarında bulunması gereken ana fonksiyon gövdesidir ve bunlara kod blokları denir. Kod bloklarında değişkenler ve işlem kodları yer alır. C dili yazım kuralları 1. /* */ içine açıklamalar (comment) yazılır ve bu satırlar bir birden çok olabilir ve program sırasında çalıştırılmazlar. 2. Her bir komut satırı ; ile sonlandırılır. 3. Tüm anahtar kelime ve komutlar küçük harfle yazılır (#define hariç). 4. C dili büyül-küçük harf duyarlıdır (TOP ile top farklı algılanır). 5. C dili program bloklarından oluşur. Bloklar, yani çalıştırılacak ifadeler (kodlar) parantezi içine yazılır. C dili anahtar sözcükleri (keywords) Program yazılında rezerve olarak saklanmış olan kelimelerdir. Bunlar program içinde değişken ve fonksiyon adı olarak kullanılamazlar, bunlara C deyimleri de denilebilir, her birinin program çalışırken özgün anlamı ve işlevi vardır. Auto Default extern long short union _Bool Break Do float register signed unsigned _complex Case Double for sizeof struct void _imaginary Char goto int static stigned volatile Const Else if restrict switch while Continue Enum inline return typedef
Fonksiyonlar, belirli bir için hazırlanan bağımsız parçalardır veya algoritmalardır. Her fonksiyonun bir adı vardır, fonksiyon adlarından sonra () karakterleriyle değişken adları oluşur. Bir fonksiyonun genel yapısı; fonxtür fonxadı (parametre listesi) Parametre-listesi tür- bilgisi; local değişkenlerin bilgisi; Örnek : float bol(a,b) İnt a,b ; float g; g=a/b; return g; Fonksiyonlar arası parametre aktarımı, fonksiyon tanımındaki parametre listesiyle yapılır ve aktarılacak veri türü belirtilmelidir. Fonksiyonun parametre listesinde 0 veya 1 veya daha çok değişken adı olabilir. Fonksiyonun her çağırılışında farklı sayıda parametre gönderilebilir. Main(), ana program anlamındadır, program ilk çalıştırıldığında, ilk bu program çalışır. Ancak yapı olarak diğer fonksiyonlardan bir farkı yoktur. Bir C programı sadece main() fonkiyonundan oluşabilir. Main() programın herhangi bir yerinde olabilir, ancak genellikle en başka kullanılır. return( ): Fonksiyonun çağrıldığı yere geri dönmesini sağlar. main( ) fonksiyonu içinde kullanılan return() komutu programın sonlandırılarak işletim sistemine geri dönülmesini sağlar.
Veriler (değişkenler, sabitler ve operatörler) Veri türü saklanan bilginin türünü (ondalık sayı, tam sayı..) belirtir. Değeri ise değişken içinde saklanan bilginin kendisidir. Veri türü, değişken içerisinde tutulan değerin tipini belirler. Veriler sabitler ve değişkenlerden oluşur. C dilinde dört temel veri tipi vardır. char: bir harf, bir rakam veya özel bir simgeyi saklamak için kullanılan veri tipidir. Char tipindeki her bir değer tek tırnak arasına yazılmalıdır. chartipinde tanımlanan bir değişkenin tuttuğu değer karakterin ASCII tablosundaki sayısal karşılığıdır. Char, 1 byte, (-2 7 ile +2 7-1 arası) -128 ile +127 arası, tek bir karakter veya tamsayı için unsigned char ; 1 byte, (0 ile 2 8 arası) 0 ile +255 arası, tek bir karakter veya tamsayı için int: -32768 ile +32768 (Dos işletim sisteminde) arasındaki tam sayı değerlerini saklamak için kullanılır. short int, 2 byte, -32,768 ile +32767 arası, kısa tamsayı için unsigned short int, 2 byte, 0 +65,535 arası, kısa tamsayı için int, 4 byte, -2,147,483,648 ile +2,147,483,647 arası, tamsayı için unsigned int, 4 byte, 0 ile +4,294,967,295 arası, tamsayı için long int, 8 byte, -9,223,372,036,854,755,809 ile +9,223,372,036,854,755,807 arası, uzun tamsayı için unsigned long int, 8 byte, 0 ile 18,446,744,073,709,551,615 arası, uzun tamsayı için float: 4 byte, -3.4E +/-38 ile +3.4E +/-38 arası, (tek duyarlıklı) ondalıklı olarak verilen gerçel (7 basamaklı) sayıları için (tek duyarlıklı, 7 basamaklı double: 8 byte, -1.7E +/-308 ile +1.7E +/-308 arası (çift duyarlı) ondalıklı olarak verilen çok küçük ve çok büyük gerçel (15 basamaklı) sayılar için. Değişkenler : Programda kullanılacak bütün değişkenlerin kullanılmadan önce C derleyicisine bildirilmesi gerekir. Değişkenleri derleyiciye bildirme işine değişken tanımlama (variable definition) denir. Değişken tanımlamak, değişken için bir isim seçmek ve içerisinde ne tür bir veri saklanacağını söylemekle yapılır. Her değişkenin ismi, veri türü ve değeri vardır. Değişken ismi değişken saklayacak bellek hücresine verilecek isimdir. Değişkenin değeri programın çalışması boyunca değiştirilebilir. Örnek : float alan; Programda kullanılacak değişken isimleri programcı tarafından tanımlanır. Değişkenlere isim verirken aşağıdaki kurallara uyulmalıdır. C dilinin kendine özgü anahtar sözcükleri, komut veya fonksiyon adları değişken ismi olarak kullanılamaz. Değişken isimleri harf, rakam ve (_) birleşiminden oluşabilir, içerisinde, a-z ve A-Z arası İngilizce harfleri, 0-9 arası rakamlar ve özel karakter olarak sadece alt çizgi (_) karakteri kullanılabilir. Özel karakterler (+,-,! vs.) ve Türkçe karakterler kullanılmaz.
Değişken ismi rakam ile başlayamaz. İlk karakteri rakam olamaz C diline ait saklı (reserved) sözcükler kullanılamaz. En fazla 31 karakter olabilir. Küçük - büyük harf ayırımı vardır. Değişken bildirimi : Standart C de üç farklı yerde değişken tanımlanabilir. (1.)fonksiyonların üstünde (2.) blokların içerisinde ilk sırada (3.) fonksiyonlarda parametre olarak. İlk değer ataması yapılmayan değişkenlerin değerleri (eğer main fonksiyonunun üstünde tanımlanmışsa) sayısal olanlar 0 diğerleri boş olarak belirlenir, eğer main içinde tanımlanmışsa bellekte rastgele değerler olarak belirlenir. Değişenlerin bildirim çeşitler aşağıdaki gibidir. genel (global) bildirim: tüm (birden çok) fonksiyonlarda kullanılabilir değişken ise int m,n ; main() yerel (local) bildirim: tek bir fonksiyonda kullanılacak değişken ise, (ancak bu fonksiyon dışında değişken program tarafından tanınmaz). Değişken bildirildiği fonksiyonda çalıştığı anda bellekteki yerini alır. Örnek : main() int m,n ; dışsal (extern) bildirim : başka bir fonksiyonda tanımlanmış ancak bir diğer fonsiyonda tanımlamaksızın kullanılacak ise Örnek : extern int x; extern char y; static : bellekte tüm program süresince eski değeri korunması istenen değişken Örnek : int fibonacci() Static int f1=1, f2=1 ; İnt g ; g=f1+f2 ; f1=f2 f2=g ;
return g ; register : tamsayı ve karekter değişken kullanımında. Bellekte kullanılmaz, direk işlemci üzerinde saklanır ve çok daha hızlı işler. Genellikle döngü indisi gibi yerlerde kullanılır. 16 bitlik işlemcide en çok 2 tane register (saklayıcı) değişken kullanılabilir, fazlası önemsenmez. Örnek : fonk(a,b) register int a ; register char k ; register int m,n ; Register değişlenlerin önüne & işareti kullanılmamalıdır. & işareti sadece bellek değişkenlerin önünde kullanılabilir. volatile : C compiler sırasında bellek ve hız optimizasyonu yapabilir. Bellek optimizasyonu işlemine sokulmaması istenen değişken önüne volatile sözcüğü konur. void : void anlam olarak boş demektir. Daha genel anlamda tipsiz demektir. Bir değişkenin tipi (int, char, float vb.) yoksa (veya belli değilse) o zaman void olur. Örneğin : aşağıdaki f fonksiyonu toplamı döndürür: int f(int a,int b) return a+b; bu fonksiyon toplama işlemi yaptıktan sonra çağrıldığı yere toplamı döndürür. Şayet bunun yerine toplamı yazdıran bir fonksiyon yazacak olsaydık: void f(int a, int b) printf("%d",a+b); bu fonksiyon herhangi bir değer döndürmüyor. Bu durumda fonkisyonun dönüş değeri yoktur. O halde dönüş değerinin tipi void olur diyebiliriz. Sabitler (CONST) CONST (sabit), değeri programın çalışması boyunca değiştirilemez. Tip belirtilmez ise tamsayı kabul edilir. Örnek : const float PI=3.14;
Matematiksel, mantıksal ve atama işlemleri için kullanılan operatörler ile işleme giren değerlere operand adı verilir. Her operatör birden çok operand ile işleme girebilir. Tek operand alanlara unary operatör denir. Operatörler üç grupta incelenir; Matematiksel opertaörler işlem önceliği * çarpma 1 % mod aritmetiğinde bölme 2 / bölme 1 ++ 1 artırma (unary increment) 3 - - 1 eksiltme (unary decrement) 3 + toplama 3 - Çıkartma 3 -- bir azaltma ++ bir arttırma Örnekler : 9. / 2 ---> 4.5 (nokta sayının gerçel yorumlanmasını sağlar) 9 / 2 ---> 4 (sayılar int kabul edilip sonuçta int tipine dönüştürülür) 7 % 2 ---> 1 2 % 7 ---> 2 2 / 7 ---> 0 k = 100 % 99 ; /* işleminin sonucu 1 */ m = j%2 ; /* işleminin sonucu m= 0 veya 1 olabilir, sayı tek-çift sınaması için */ z = rand()%100 ; /* işleminin sonucu rand() 0 32767 arasında rasgele sayı üretir z nini değeri ise 0-99 arasında bir sayı olabilir */ Unary operatörlerin farklı kullanımı A++ ++A A-- --A önce A değerini kullan sonra değerini 1 arttır (postincrement) önce A değerini 1 arttır sonra artmış değeri kullan (preincrement) önce A değerini kullan sonra değerini 1 azalt (postdecrement) önce A değerini 1 eksilt sonra eksiltilmiş değeri kullan (predecrement) Bir arttırma operatör örnekleri : Main() int m=5, n=5 ; /* başlangıç değeri atama */ m++ ; /* m=m+1 işlemi yerine */ ++n ; /* n=n+1 işlemi yerine */
printf( %d,%d,m,n) ; /* 6,6 çıktısı verir */ main() int m=5, n=5, k, l ; k=++m ; /* m=m+1 ve k=m=6 anlamında */ l=n++ ; /* l=n=5 ve n=n+1 anlamında */ printf( %d,%d,k,l) ; / 6, 5 çıktısı verir */ Karşılaştırma (ilişki/relational) operatörleri : Sonucu Doğru veya Yanlış olan ifadelerdir. Büyük mü? < küçük mü? >= büyük veya eşit mi? <= küçük veya eşit mi? == eşit mi? (karşılaştırma)!= eşit değil mi? Mantıksal (logical) operatörler : İki mantıksal ifade arasındaki ilişki üzerindeki ilişkide kullanılır. && ve (and) veya (or)! değil (not invert) X Y X&&Y X Y!X - - - - + - + - + + + - - + - + + + + - İfadelerde operatörlerin işlenme sırası ( operatör öncelikleri) ( ) ilk önce parantez içi ifadeler hesaplanır. İçiçe parantezler var ise öncelik en içteki parantezdedir
! *, / % +, - <, <=, >=, > ==,!= &&, = en düşük (son yürütülür) Öncelik sırası aynı olan işlemlerde hesaplama soldan sağa doğru yapılır.
C programı hazırlama www.codeblocks.org Bir C programı, en az bir veya daha çok fonksiyonun bir araya gelmesi ile oluşturulur. Bir C Programının Genel Yapısı /* program hakkında varsa açıklamalar */ #include <stdio.h> #define e=2.718 İnt main() void prog.a eklenecek kütüphane dosyaları (ön işlemci deyimler # ile başlar) varsa sabit tanımlamaları (ön işlemciler prg derlenmeden önce işleme konur) ana fonx tanımı (gerekli ise int ve void vb ekleri olabilir) sabitler ; sabitlerin tanımlama bölümü değişkenler; değişkenleri tanımlama bölümü deyimler; Program gövdesi return() ; #include Belirtilen dosyanın kopyası ön işlemci komutunun yerine konur, Dosyayı standartkütüphanesinde arar ve standart kütüphanesindeki dosyalar için kullanılır #include<dosya_adı> Örneğin, bu başlık dosyasından başka ileri matematik işlemlerde kullanılan #include <math.h> rastgele sayı üretmek, sıralama yapmak vb. işlemlerde kullanılan #define #include <stdlib.h> Bu ön işlemci komutu sembolik sabit ve makroları oluşturmak için kullanılır Sembolik sabitlerprogram derlendiği zaman, sembolik sabitlerin geçtiği kısımlar tanımlanan metin ile değiştirilir (tip tanımlamaya gerek kalmaz) #define tanımlanan_değişken yer alacak-metin örnek: #define PI 3.14159 #define PI = 3.14159 Tanımlananın sağındaki herşey yer-alacak-metin olarak algılanır, PI yerine"= 3.14159 alır #undef Tanımlanan sembolik sabit veya makro yu tanımsız hale getirir. Eğer sembolik sabit veya makro tanımsız yapılmış ise daha sonra yeniden tanımlanabilirler.
Atama Deyimi (Assignment) Bir değişkene bir değer(sabit, değişken, ifade) atamak. DeğişkenAdı = değer; x = 18 ; Örnek 2.7.2: Vize notunun %40 ve final notunun %60 toplamı başarı notu hesaplama notlarınından geçme notu main() float vize, final, ort; vize = 50; final = 60; ort = vize * 0.4 + final * 0.6; bitişik atama operatörü Atama operatörleri : = atama += toplayarak atama -= çıkartarak atama *= çarparak atama /= bölerek (MOD alarak kalanı) atama %= bölüp kalıntı atama Örnek : x *=y+1 ; ile x=x*(y+1) ; deyimleri aynıdır örnek : ortalama /= 2 ; kare *= kare ; Dizileri fonksiyona aktarma : fonxismi(değişken_tipi değişken_adı[ ], ). aktarılacak dizinin sadece adını yazmak yeterli Örnek : fonkismi(float X[ ], ) fonkismi(int X[ ] [2], ) fonkismi(int X[ ] [4] [6], ) 1.boyut 2.boyut 3.boyut Tek boyutlu ise eleman sayısı yazılmayabilir, çok boyutlu ise 2. Ve daha sonraki boyutlar belirlenmeli.
Temel Giriş Çıkış deyimleri C dilinde giriş ve çıkış işlemleri için oluşturulmuş kütüphane fonksiyonları vardır, bunlar; getchar() ve putchar() genel olarak karekter okutmak ve yazdırmak için kullanılır. Ancak fonksiyon türleri tamsayıdır (int). bildirimi : İnt getchar(void) : İnt putchar(int kr) ; gets() ve puts() Genellikle text okutmak ve yazdırmak için kullanılır bildirimi : char *gets(char *tampon) ; int puts(const char *tampon) ; Örnek : #include <stdio.h> Main() char adi[25] ; puts( adınız : ) ; gets(adi) ; puts(adi) ; /*max 25 harfli bir text değişken bildirimi*/ /*adınız text olarak ekrana yazdırılmış*/ /*klavyeden ad okunup adi değişkenine alınımış*/ /*okunan ad ekrana yazdırılmış*/ printf() ve scanf() printf() fonksiyonu : formatlı ekrana yazdırma fonksiyonudur. İstenenleri standart çıkış birimine (stdout) göndermek ve yazdırmak için kullanılır. Bildirimi: İnt printf(const char *format, argümanlar) ; printf( text= %d\n,değişken_adı);
Printf (%format Stringi, Değer Listesi); Çıkış Format Stringi: Açıklama kısımları Çıkış formatının belirtildiği kısımlar: % Escape düzeninin verildiği kısımlar: \ Sayısal Değerler için Çıkış formatı Tip karakterleri Çıkış biçimi Karakterler için Çıkış formatı Tip karakterleri Çıkış biçimi d İşaretli tamsayı (decimal integer) c Tek karakter i İşaretli tamsayı s string u İşaretsiz tamsayı (Unsigned decimal) % % karakteri f e ld lu le,lf c s Gerçel sayı (float double noktalı) Üssel gerçel sayı (float/double bilimsel gösterim) Long tamsayı (integer) long integer unsigned long Double gerçel sayı Char (tek karekter) string ESCAPE Düzeni Karakterleri \n Kursoru bir alt satırın başına getirir (yeni satır-new line) \r Kursoru satırın başına getirir (carriage return) \b Kursoru bir kolon geri çeker \a Zil sesi (alert) verir \t Yatay tab, Bir sonraki sekme durağına (tabstop) geç. \v Printer için yeni satır başı \f Printer için yeni sayfa başı \0 NULL karakteri \\ Sadece \ karakteri, Ters bölü (blackslash) işaretini yazdırmak \ Sadece tırnak işareti/karakteri yazdırman için
Örnekler: Printf(.. = %d.. = %f, a,b) ; i = 5 ; printf("%d",i) ; 5 printf("'i=%d",i) ; i=5 printf("i=") ; printf("i=\n") ; i= printf("%d",i) ; 5 alt satıra geçer printf('i=%d\n",i) ; i=5 alt satıra geçer printf("%d - %d",i, 5*i); 5-25 Formatlı çıktı (çıktı biçimlendirme) Çıktının boyutu çevirim karakterinin önüne yazılacak bir işaretsiz tamsayı ile kontrol edilebilir. Tamsayı gerekli en az boyutu belirtir. Eğer bilginin uzunluğu belirtilenden kısa ise önüne belirtilen boyutu tamamlayacak kadar boşluk bırakılır. Eğer bilginin uzunluğu belirtilenden uzun ise bilginin hepsi gösterilecek kadar yer ayrılır. Örnek : #include<stdio.h> intmain() inti=12345; floatx=345.678; printf("%3d %5d %8d\n\n", i, i, i) ; printf("%f %10f %13f\n\n",x,x,x) ; return 0 ; Programın ekran çıktısı : 012345678901234567890123456789012345 12345 12345 12345 345.678000 345.678000 345.678000
Reel sayıların ondalık kısmının uzunluğu da kontrol edilebilir. printf("%f %.1f %.3f\n\n",x,x,x) ; Çevirim karakterinin önüne yazılan tamsayının önüne (-) konulması boşluğun önde değil bilgiden sonra olacağını belirtir (yani sola dayalı yaz) printf("%3d %-5d %-8d\n\n", i, i, i) ; % karakteri ile dönüşüm karakteri arasına aşağıdaki karakterler de kullanılabilir. Printf( %m.n, değişken) ; m : yazılacak değer için ayırılan alan n : değerin kaç karekteri yazılacağı Örnek : ekran çıktısı s = "ABCDEF" printf("%10s ",s); printf("%10.3s ",s);.... A B C D E F....... A B C x = 128.5 ; printf("%7.2f",x) ; # 128.50 x = 85.47 ; printf("%6.3f",x) ; 85.470 printf("%6.1f",x) ; ## 85.5 Örnek : printf(çıktı metin formatı, değişken listesi) printf( Yaşınız: %d dir\n, yas); printf(çıktı metin formatı) printf( Merhaba Dünya ); printf çıktı formatındaki % karakterinin dışındaki tüm karakterleri ekrana yazar. % karakterini gördüğünde bunun sağındaki karakteri yazdırılacak değişkenin format karakteri olarak ele alır. printfçıktı formatındaki \karakterine escape karakteri denir. Bu karakterden sonra gelen karakter ise escape serisini ifade eder. Örneğin \n ifadesi, çıktı ekranında yeni bir satıra geçilmesi gerektiğini ifade eder.
scanf() fonksiyonu : standart giriş birimi olarak atanmış (stdin) klavyeden veri okutma fonksiyonudur. Değişkenlerin içerisine klavyeden değer atamak için kullanılır. scanffonksiyonunda dışarıdan değer girilecek bütün değişkenlerin başına & işareti konur. Bildirimi : İnt scanf(const char *format, değişken listesi) ; Scanf (Format Stringi, Adres stringi) scanf ( %d, &a); scanf( %d %d, &x,&y); scanf( %s %s, ad, soyad); giriş format karekterleri karakter d D u U E,e F Lf C S İ Lx Ld O x X Çıkış biçimi İşaretli tamsayı Long işaretli tamsayı (onlu sistem) İşaretsiz tamsayı Long işaretsiz tamsayı double ve float Üssel gerçel sayı Float Gerçel sayı Double/long float gerçel sayı Karakter String (metin) Tamsayılariçin (onluk, sekizlik ve onaltılık sistemde) Uzun tamsayıları onaltılık (hex) sistemde Uzun tamsayılariçin (onluk sistemde) Tamsayılariçin (sekizlik sistemde) Tamsayılariçin (onaltılık (hex) sistemde) Tamsayılariçin (onaltılık (hex) sistemde büyük harfle) C de kullanılan standart giriş-çıkış fonksiyonları, printf() ve scanf() dir. Bu fonksiyonlar C standart giriş çıkış kütüphanesinde stdio.h bulunurlar. Giriş-çıkış fonksiyonlarını program içerisinde kullanabilmek için stdio.hbaşlık dosyasının programa dahil edilmesi gerekir. #include<stdio.h>
Program Örneği #include <stdio.h> Kullanılan işlevler ile ilgili başlık dosyası main() int i ; scanf("%d",&i); Değişken tanımı Programın gövdesi i:=i*i; printf("%d",i); Örnekler : scanf("%d", &a); Klavyeden tamsayı okur. Girilen değer a değişkenine aktarılır. (& her tür sayı için) scanf("%d %d",&a,&b) Klavyeden girilen ilk değer a değişkenine, ikinci değer b değişkenine aktarılır. scanf("%f %d", &m, &a); Klavyeden ilki gerçel, ikincisi tamsayı olmak üzere iki değer okur. scanf(%d,%d,&a,%b); a ve b için giriş şekli 34,35 svanf(%d %d,&a,&b); a ve b için giriş şekli 34 35 (sayı girilirken hangi karak. ile ayrılacak) printf( a katsayısını giriniz : ); scanf( %f, &a); printf( b katsayısını giriniz : ); scanf( %f, &b); printf( c katsayısını giriniz : ); scanf( %f, &c); Örnek : Vize ve final notlarınından ortalamayı hesaplayan programda değerlerin klavyeden okunmuş hali. main() float vize, final, ort; printf( Vize notunu giriniz ); scanf( %f, &vize); printf( Final notunu giriniz ); scanf( %f, &final); ort = vize * 0.4 + final * 0.6; printf( Ortalaması = &f\n, ort);
Örnek : Yarıçapı belli dairenin alanını hesaplayan programı yazınız. (ilk yazılan program) #include <stdio.h> main() const float PI=3.14; float r, alan; r = 7; alan := PI*r*r; printf(('alan = %f', alan); Örnek : En fazla dört basamak olabilen sayının basamak değerlerini yazdır. % ve / işlemlerinin kullanımı. #include <stdio.h> main() int i,y; y=1985; i= y / 1000; printf("%d",i); y= y-i*1000; i= y / 100; printf(" %d",i); y = y-i*100; i= y / 10; printf(" %d",i); y = y-i*10; printf(" %d\n",y); i = 1985; printf("%d ",i / 1000); printf("%d ",(i / 100) % 10); printf("%d ",(i / 10) % 10); printf("%d\n",i % 10);
Örnek : ax 2 +bx+c=0 tipi bir denklemin köklerini veren programı yazınız. #include <stdio.h> /* printf işlevi için */ #include <math.h> /* sqrt işlevi için */ main() float a, b, c; float x1, x2; float d; printf( Katsayıları sırasıyla giriniz (a b c) : ); scanf("%f %f %f ", &a, &b, &c); d = b * b - 4 * a * c; x1 = (-b + sqrt(d)) / (2 * a); x2 = (-b - sqrt(d)) / (2 * a); printf("kökler = %f, %f",x1, x2);
Karar (Koşullu) Deyimleri if-then-else Deyimi if (<koşul>) doğru_işlem_blok; else yanlış_işlem_blok; else kısmı seçimlidir, gerekmiyorsa kullanılmayabilir. Karşılaştırma (?) operatörü : <koşul>? deyim1 : deyim2 ; Örnek : a=(b>c)? b : c ; (x<100)? m++ : m-- ; Örnek : sayınin çift veya tek olduğunu sınayan program. Açıklama : tek bir değişken (k) yalnız başına yazılırsa 0 ile karşılaştırma yapılır, main() int sayi, k ; scanf( %d, &sayi) ; k=sayi%2 if (k) /* k==0 işlemi ile aynı */ printf( sayı tek ); else /* k!=0 işlemi ile aynı */ printf( sayi çift ); Örnek : Girilen sayının tek/çift olduğunu yazan program #include <stdio.h> main() int i; scanf("%d", &i); if ( i % 2 == 1) printf("tek"); else printf("çift");
Örnek : Girilen üç sayıdan en küçüğünün bulunması (İçiçe IF kullanımı). scanf("%d%d%d", &s1, &s2, &s3); if ((s1<s2) && (s1<s3)) ek =s1; else if (s2<s3) ek =s2; else ek = s3; printf('en küçük olanı = %f", ek); II. yol : scanf("%d%d%d", &s1, &s2, &s3); ek = s1; if (ek>s2) ek =s2; if (ek>s3) ek =s3; printf('en küçük olanı = %f", ek); Örnek : Girilen tarihteki günün adını veren programı yazınız. #include <studio.h> main ( ) int gun, ay, yıl ; long gt ; printf( Tarihi gir ) ; scanf ( %d %d %d,&gun,&ay,&yil) /* oncekı yıllardakı gun sayısını hesapla */ gt= yil*365 + yil/4; /* bu yildaki aylardaki gunleri ekle */ if (ay==2)
gt = gt + 28 ; else if (ay ==3) gt = gt + 31 + 28 ; else if (ay ==4) gt = gt + 31 + 28 +31; else if (ay ==5) gt = gt + 31 + 28 +31+ 30 ; else if (ay ==6) gt = gt + 31 + 28 +31+ 30 +31; else if (ay ==7) gt = gt + 31 + 28 +31+ 30 +31+ 30 ; else if (ay ==8) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31 ; else if (ay ==9) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 ; else if (ay ==10) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31; else if (ay ==11) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 ; else if (ay ==12) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 +31; /*Bu ayıın günlerini ekle */ gt = gt+ gun; if(yıl%4==0 && ay>2), gt =gt+1; gt=gt %7, if(gt==1) printf( Pazar ); else if(gt==2) printf( Pazartesi ); else if(gt==3)
printf( Salı ); else if(gt==4) printf( Carsamba ); else if(gt==5) printf( Persembe ); else if(gt==6) printf( Cuma ); else if(gt==7) printf( Cumartesi ); switch Deyimi switch(<seçici>) case seçenek1 : Deyim;break; case seçenek2 : Deyim;break;... default : Deyim; Seçicinin aldığı değere eşit seçeneğin olup olmadığına bakar. Var ise o noktadan sonraki deyimler yürütülür. switch deyiminin sonuna gelindiğinde veya break deyimi ile karşılaşıldığında yürütme işlemi durur ve programın akışı switch deyimini izleyen deyim ile devam eder.. default kısmı seçimliktir. Seçeneklerin hiçbiri uygun değil ise yürütülür. Örnek : aritmetik sembole göre 2 sayı arasında işlem yapam program #include <stdio.h> main() char islem; int s1, s2, s3; printf("önce işlemi sonra sayıları girin ");
scanf("%c %d %d",&islem, &s1, &s2); switch (islem) case '+' : s3 = s1 + s2; break; case '-' : s3 = s1 - s2; break; case '*' : s3 = s1 * s2; break; case '/' : s3 = s1 / s2; break; default : printf ("Hatalı işlem"); printf("\nsonuç = %d",s3); Örnek : Ay sıra sayısını girip, mevsimleri yazdıran program. scanf("%d", &ay); switch (ay) case 3: case 4: case 5: printf("ilkbahar"); break; case 6: case 7: case 8: printf("yaz"); break; case 9: case 10: case 11: printf("sonbahar"); break; case 12: case 1: case 2: printf("kış"); break; Örnek : Sınav notunu harfe dönüştüren programı yazınız. ( >=90 :AA, 85-89:BA, 80-84:BB, 75-79:CB, 70-74:CC, 60-69:D, <60 :F ) Örnek 3.1.2.4: Belirtilen tarihin hangi güne denk geldiğini bulan programı yazınız. else if yapısı yerine switch kullanarak
goto, break, continue deyimleri goto <label> : goto deyimi, program akışını normal akışı dışında başka bir yere göndermek için kullanılır ve label (etiket) ile beraber kullanılır. Program label : olarak, programın herhangi bir istenen belirtilen yere doğrudan sapar ve oradan normal akışına devam eder. break (kırılma) : genellikle switch döngüleri içerisinde kullanılır. Bir döngü içerisinden döngü tamamlanmadan çıkmak istendiğinde kullanılır. Break olan yerde döngü koşuluna bakmaksızın sonlanır ve döngüden bir sonraki satıra gider. Switch yapısında break ten sonraki switch ve case satırları atlanır program switch yapısından bir sonraki satıra sapar. continue : Bir döngü içinde continue deyimi bulunan yerden sonraki kodlar ve deyimler atlanır ve döngünün o anki dönüşü bitti varsayılarak döngü başına gider. Örnek : 0 yazıldığında biten, sadece pozitif sayıların karesini alan program. Main() int x, kare ; do puts( bir sayı gir : ); scanf( %d,&x); if ( x<0 ) continue ; kare=x*x ; printf( karesi=%d\n, kare); while ( x!=0) ; puts( işlem bitti );
Döngü Deyimleri C dilinde while, for ve do-while deyimleri döngü işlemini sağlar. For ve while döngü başında, do-while koşulu döngü sonunda sınar. For Deyimi For döngüsü koşulu döngü işlemleri başında sınar, dolayısı ile döngü içi deyimler hiç çalışmayabilir. for (sayaç başlangıcı ; döngü koşulu ; sayaç artış/azalışı ) döngü içi deyim ;. Döngü koşulu doğru ( veya farklı 0) olduğu sürece ifade yürütülür, bu aynı zamanda döngü bitiş koşuludur. Döngünün ilk adımından önce sayaç başlangıç ifadesi yürütülür ( başlangıç adımı). Döngünün her adımında ise sayaç arttış/azalış ifadesi yürütülür. Örnek : for (i = 1; i < 5; i++) printf("%d ",i); for ( ) parantez içi ifadeler seçimliktir. Döngü koşulu belirtilmez ise herzaman doğru olduğu ( == 1 ) kabul edilir. Yani sonsuz döngü oluşur. for (i = 1; ; i++) printf("%d ",i); Örnek : 1 ile 100 arasındaki tek sayıların karesini hesaplayıp ekrana yazdıran program. Main() İnt k, kare ; for ( k=1 ; k<100 ; k+=2 ) kare=k*k ; printf( %d karesi = %d \ n, k, kare) ;
Örnek : 1'den 100'e kadar olan sayıların toplamı. j =0; for (i=1; i<=100; i=i+1) j =j+i; printf("toplam %d",j); Örnek : Girilen sayının faktöriyelini bul. main() int k, N, fact =1; puts( faktöryei alınacak sayıyı gir : ); scanf( %d,&n) ; for (j=1; j<=n; j++) fact =fact*j; (veya fact*=k ; ) printf("faktöriyel =%d",fact); Örnek : Çarpım tablosu. (içi içe döngüler) main() int i,j; for (i=1; i<=10; i++) for (j =1; j<=10; j++) printf("%d,%d,%d\n",i,j,i*j) ;
while Deyimi while <mantıksal ifade> dögü içi deyimleri ;. Mantıksal ifade doğru olduğu sürece Deyim yürütülür. Eğer yanlış ise kontrol bir sonraki deyime geçer. While deyimi koşulu sonda sınar, bu nedenle while deyiminin döngü içindeki deyimlerinin hiç çalışmama olasılığı vardır. Örnek : 1'den 100'e kadar olan sayıların toplamı. main() int i, j; i =1; j = 0; while (i<101) j =j+i; i =i+1 printf("toplam = %d",j); Örnek : Girilen sayının faktoriyelini hesaplayan programı yazınız. main() int n; long f; printf ( sayıyı giriniz ); scanf( %d, &n); f = 1; while (n > 1) f = f * n; n = n - 1; printf( Sonuç = &d\n, f);
Örnek : Klavyeden girilen sayıları oku. Sayıların toplamı 21'den büyük veya eşit olduğu zaman dur. main() int i, j = 0; while (j<21) scanf("%d",&i); j =j+i; printf("toplam = %d",j); Örnek : Sınavın ortalamasını hesaplayan programı yazınız. 1. Durum : sınava giren öğrenci sayısı belli main() int i, ogr_say, not_top, not; float ort; not_top = 0; i = 0; printf( Öğrenci sayısını giriniz ); scanf( %d, &ogr_say); while (i < ogr_say) printf Sıradaki öğrencinin notu = ); scanf( %d, ¬); not_top = not_top + not; i = i + 1; ort = float (not_top) / ogr_say; printf( Ortalama = &f\n, ort); 2. Durum : sınava giren öğrenci sayısı belli değil Bu durumda girişin bittiğini gösterir bir bilgiye (işarete) ihtiyaç vardır. Sınav notu için 0 dan küçük bir değer girildiğinde girme işleminin sona erdiğinin varsayalım. ogr_say = 0; printf Sıradaki öğrencinin notu = ); scanf( %d, ¬); while (not >= 0)
not_top = not_top + not; ogr_say = ogr_say + 1; printf Sıradaki öğrencinin notu = ); scanf( %d, ¬); do-while Deyimi Bir koşul doğru olana kadar döngü yürütülür. do-while deyimi koşulu döngü deyimleri sonunda sınar, bu nedenle döngü yapıları en az bir kez çalışır. do döngü içi deyim ;. while (<mantıksal ifade>) ; Mantıksal ifade doğru olduğu sürece döngü tekrar edilir. Yanlış olduğunda while sözcüğünden sonraki deyim yürütülür. 5 sayısı girilene kadar oku do scanf("%d",&i); while (i!=5); i =1; do printf("%d",i*i); i =i+1; while (i<=10); Örnek : Sadece +, - kullanarak * işlemini gerçekleştirme. main() int a, b; int c; scanf("%d%d", &a, &b);
c = 0; do c = c + a; b = b - 1; while (b>0); printf("%d\n", c); Karşılaştırma while : Koşul başlangıçta test ediliyor. Döngü sıfır veya daha fazla yürütülüyor. do-while : Koşul sonda test ediliyor. Döngüye en az bir defa kesin giriliyor. Örnek : 0-100 arasında tutulan sayının tahmini. main() int tahmin; /* tahminimiz */ int min; /* Tahminin alt siniri */ int max; /* Tahminin ust siniri */ char cevap; /* Kullanicinin cevabi */ min = 0; max = 100; do tahmin = (max - min) / 2 + min; printf("tahminim %d\n",tahmin); printf("buyuk / Kucuk / Esit "); scanf("%c",&cevap); if (cevap == 'B') max = tahmin - 1; else if (cevap == 'K') min = tahmin + 1; while (cevap!= 'E');
Fonksiyonlar (İşlevler) Problem çözmenin ilkelerinden biri problemi mümkün olduğu kadar çok parçaya bölmek idi. Daha sonra bu parçalar bağımsız olarak düşünülüp çözümleri elde edilebilir. C'de bu bölme işlemi fonksiyon kullanarak yapılır. Belli bir işi gerçekleştiren program deyimlerinin karmaşık programları düzenlemek ve basitleştirmek için programın bir birimi olarak gruplandırılması. (fonksiyon kullanmanın temel nedenleri : divide and conquer, software reusability ) Örnek : Bir tamsayının faktöriyelini hesaplayan fonksiyon main() int i; prinf( Sayıyı giriniz ); scanf( %d, &i); printf( %d\n, fakt(i)); long fakt ( int n) int j; long f = 1; for ( j = 2; j < =n; j = j + 1), f = f * j; return f; Örnek : Bir tamsayının kübünü veren fonksiyon #include <stdio.h> main() int sayi; int kub(int); /* fonksiyonun prototipi */ printf("sayıyı gir "); scanf("%d", &sayi); printf("kübü = %d\n", kub(sayi)); int kub(int i) return i*i*i;
Fonksiyonun tanımlanma biçimi dönüş_tipi fonksiyon_adı(parametreler) yerel tanımlamalar deyimler dönüş_tipi: Eğer fonksiyon bir değer geri gönderecek ise değerin tipini belirtir. Belirtilmez ise Int kabul edilir. Eğer fonksiyon değer göndermeyecek ise dönüş_tipi yerine void yazılır. fonksiyon_adı: İşlev çağırılırken kullanılacak ad (belirleyici). parametreler: Fonksiyon için gerekli değerleri içerir. Her parametre değişken tanımlar gibi tanımlanır. Herbirinin arasında ',' kullanmak gerekir. yerel tanımlamalar: Bu fonksiyona özgü(değişken,sabit) tanımlamalar. Eğer fonksiyon bir değer gönderecek ise bu return deyimi ile yapılır. return değer; Fonksiyonun Prototipi Tanımlana bir fonksiyonun ana modül içerisinde prototipinin yazılması gerekir. Prototip ile fonksiyonun dönüş değeri ve aldığı parametrelerin tipleri tanımlanır. Bu bilgiye göre C derleyecisi fonksiyon çağırıldığında değerlerin uygun olduğunu sınar. int kub(int) kub fonksiyonu int bir değeri alır ve yine int bir değer üretir. Örnek : Üç sayıdan en büyüğünü veren fonksiyon. int max(int s1, int s2, int s3) if (s1>s2 && s1>s2) else return s1; if (s2>s3) else return s2; return s3;
Örnek : Üs alma fonksiyonunu (üs bilgisi tamsayı). Girdi : taban ve üs değeri Çıktı : tabanın üs. kuvveti float us (float a, int b) int i; float r; r = 1; for (i = 1; i<=b; i++) r = r * a; return r; Fonksiyonun program içinden çağırılışı d = us(2,3); d = us(a, 4); d = d * us(3,4); Üs alma işlemini gerçeklemenin diğer yolu a b = e blna = Exp(b * Ln(a)) Exp(x : Real) : Real ex Ln(x : Real) : Real Ln(x) float us (float a, float b) if (a>0) return= exp( b * log (a )); else return= -1;
Genel değişken (global): Her yerde (main ve diğer fonksiyonler) geçerlidir, değerine erişilebilir. Programın en başında, main fonksiyoninin dışında tanımlanır. Yerel değişken (local): Sadece tanımlandığı modülde geçerlidir, değerine erişilebilir. Modül içinde tanımlanır. int a; /*tüm fonksiyonlardan değerine erişilebilir, değeri değiştirilebilir. (global) */ main() int b; /* sadece main fonksiyonu içerisinden erişilebilir (local ) */... Fonksiyon1(...); int b; /* sadece fonksiyon1 fonksiyonu içerisinden erişilebilir. main fonksiyonindeki değişkendan bağımsızdır (local ) */ int c; /* sadece fonksiyon1 fonksiyonu içerisinden erişilebilir (local ) */... Örnek : Girilen harfi büyük harfe dönüştüren fonksiyon Girdi : karakter Çıktı : karakter ( girdi harf ise büyük harfe dönüştürülmüş) char buyuk(char c); if (c >= 'a' && c <= 'z') else return c - 32; return c;
Örnek : Girdi : iki sayı ve aralarındaki işlem Çıktı: iki sayı arasındaki işlemin sonucu int calculate(char islem, int a, ibt b, int c) int s; switch( islem ) case '+' : s = a + b ; break; case '-' : s = a - b ; break; case '*' : s = a * b ; break; case '/' : s = a / b ; break; default : s = 0; return s; Çağırma biçimi a = calculate ('+',4,8'); a = calculate ('/', 4,2) * calculate ('*', 2,2); Özyineleme (Recursive) İşlevler Kendini çağıran fonksiyonlardır. Örnek : Faktoriyel hesabı long fakt(long i) /* fakt = i! */ if (i<2) return 1; else return i*fakt(i-1);
Örneğin n=4 için fonksiyonun kendisini çağırdığı satır şöyledir: 4 * fakt(3), 3 * fakt(2), 2 * Fakt(1) 24 = 4 * 6 <-- 3 * 2 <-- 2 * 1 Örnek : Ortak bölenlerin en büyüğünü bulan program (Euklid yöntemi). gcd = greatest common divisor long gcd (long m, long n ) /* m ve n sayılarının ortak bölenlerinin en büyüğü*/ if (n == 0) return m; else return gcd( n, m % n); Bazı fonksiyonlar C dilinde karekök almak için bir deyim yoktur, bunu yerine getiren C diline eklenmiş olan sqrt() fonksiyonu kullanılır. Aşağıda buna benzer C derleyecilerinde kullanılan bazı fonksiyonlar verilmiştir. Bu fonksiyonlar math.h başlık dosyasında tanımlıdır. Fonksiyon x,y Sonuç abs(x) int int x'in mutlak değeri fabs(x) double double x'in mutlak değeri pow(x, y) double double xy sqrt(x) double double x'in karekökü exp(x) double double ex değeri log(x) double double ln(x) değeri log10(x) double double log10(x) değeri ceil(x) double double x ten büyük ilk tamsayı ceil(5) 5 ceil(5.2) 6 ceil(-5.2) -5 floor(x) double double x ten küçük ilk tamsayı floor(5) 5 floor(5.2) 5 floor(-5.2) -6
Array (Diziler) Dizi veri yapısı: Aynı tip verilerin toplanıp tek isim altında tutulmasıdır. Dizi Tanımı ve Kullanımı Tip_Adı değişken[boyut]; Örneğin : float a[100]; Bu tanımlama ile a isimli değişkeni 100 gerçel değerin saklandığı bir diziyi gösterir. Bu 100 veriye a değişkeni ile erişilir. Dizinin herhangi bir elemanına erişmek veya değiştirmek için kaçıncı eleman olduğunu gösterir indis bilgisini vermek gerekir. İlk elemanın indisi 0 dır. A[4] dizinin 5. elemanı A[0] dizinin ilk elemanı A[1] := 45; dizinin 2. elemanına 45 atanır A[7] := A[7] + A[1]; dizinin 8. elemanına kendisi ile 2. elemanın toplamı atanır Dizinin eleman değerler tanımlama sırasında da yapılabilir. int a[10] = 25, 18, 20, 0, 29, 5, 4, 8,19,13 Örnek: Dizi elemanlarına değer ata, yazdır. /* 1-10 arsındaki sayıların karesini dizi elemanlarına yükle yazdır */ main() int a[10]; int i; for (i=0; i<=9; i++) a[i] = (i+1)*(i+1); for (i=0; i<=9; i++) printf("%d. elemanın değeri = %d\n", i, a[i]);
Ekranda çıkacak görüntü 0. elemanın değeri = 1 1. elemanın değeri = 4... 9. elemanın değeri = 100 Örnek : Dizide ilk 20 Fibonacci sayıyı oluştur /* ilk 20 Fibonacci f[0] = 0, f[1] = 1, f[i+1] = f[i] + h[i-1] */ #include <stdio.h> main() int fib[20]; int i; fib[0] = 0; fib[1] = 1; for (i=2; i<=19; i++) fib[i] = fib[i-1] + fib[i-2]; clrscr(); for (i=0; i<=19; i++) printf("%d. Fibonacci sayısı = %d\n", i, fib[i]); Ekranda çıkacak görüntü 0. Fibonacci sayısı = 0 1. Fibonacci sayısı = 1 2. Fibonacci sayısı = 1... 19. Fibonacci sayısı = 4181
Notlar * Tanımlanan dizi boyutunun dışında bir eleman kullanımı durumunda C dili hata vermez (uyarmaz). * İlk indisin değerinin sıfır olması dolayısıyla dizinin n. elemanın indisi n değil n-1 dir. * Gerektiği durumlarda dizi elemanlarının ilklendirilmesi (sıfırlamak) unutulmamalı - tanımlama anında int a[10] = 13, 45..; /* fazla eleman yazılırsa hata oluşur */ int a[] = 13, 45, 56; /* boyut belirtilen değer kadar olur */ - giriş yaptırarak scanf("%d", &a[i]); - doğrudan değer atayarak a[i] = 4; Diziyi Bir fonksiyona Gönderme Fonksiyonlere gönderilen parametrelerin içeriklerinin fonksiyon içerisinde değiştirilmesi mümkün değildir. Fonksiyona değişkenin değeri gönderilir. Fonksiyon içerisindeki işlemlerden parametre etkilenmez. Dizilerde durum böyle değildir. Normal kullanımda (şu ana kadar görülen) dizi fonksiyone gönderildiğinde elemanlar değiştirilebilir (referans). Dizinin sadece herhangi bir elemanı gönderildiğinde ise değeri değiştirilemez (değer) Diziyi fonksiyone gönderirken sadece adını parametre olarak yazmak yeterlidir. Örnek: fonksiyon içerisnde dizi eleman değerlerinin değiştirilmesi #include <stdio.h> void kareleri(int []); main() int a[10]; int i; for (i=0; i<=9; i++) a[i] = i + 1 ; clrscr(); printf("dizinin elemanlarının değerleri\n"); Ekranda çıkacak görüntü Dizinin elemanlarının değerleri for (i=0; i<=9; i++) 1 2 3.. 10 printf("%d ",a[i]); Kare alma işlemi sonrası dizinin elemanlarının değerleri kareleri(a); 1 4 9.. 100 printf("\n\nkare alma işlemi sonrası dizinin elemanlarının değerleri\n"); for (i=0; i<=9; i++)
printf("%d ",a[i]); void kareleri(int a[]) int i; for (i=0; i<=9; i++) a[i] = a[i] * a[i]; Dizinin Boyutunu Değişken Kılma #define önişlemcisi direktifi (preprocessor directive) Simgesel sabit tanımlanmasını sağlar. C dili deyimlerinden biri değildir (#include gibi). Kullanım biçimi #define SabitAdı Değeri Program çalıştırıldığınde derleme işlemi öncesinde program içerisinde SabitAdı simgesinim geçtiği yerlere Değeri konur. Örnek : 25 kişilik bir sınıftaki öğrencilerin sınav sonuçlarını okuyup ortalamasını bulan program. #include <stdio.h> #define OGR_SAY 25 void giris(int []); /* not bilgilerin saklanacağı veri yapısını belirle ve tipi tanımla */ float ortalama(int []); main() int ogr[ogr_say]; clrscr(); giris(ogr); printf("ortalama = %f\n", ortalama(ogr)); void giris(int ogr[]) int i; for (i=0; i<ogr_say; i++) /* 0 dan başladığı için < kullanıldı */
printf("%d. öğrencinin notunu gir : ",i+1); scanf("%d", &ogr[i]); /* notları girdiren yöntemi */ float ortalama(int ogr[]) float x; int i; x = 0; for (i=0; i<ogr_say; i++) x = x + ogr[i]; return x / OGR_SAY; /* Ortalamayı bulan fonksiyonu yaz* / * 50'den küçük değerleri yazan fonksiyon * 50'den küçük değerlerin sayısını veren fonksiyon * en yüksek notu veren fonksiyon * Standart sapmayı veren işlen ( (abs(xi - Xort) / OGR_SAY)) Örnek : İki dizinin toplamını üçüncü bir diziye yazan programı yazınız (A, B aynı tip dizi, C = A + B ). Doğrudan C := A + B yazılamayacağı için dizinin ilgili elemanlarını tek tek toplamalıyız. #include <stdio.h> #define MAX 20 void dizitopla(int [], int [], int []); main() int a[max], b[max], c[max]; int i; for (i=0; i<max; i++) a[i] = i; b[i] = 2 * i;
dizitopla(a, b, c); clrscr(); for (i=0; i<max; i++) printf(" %4d + %4d = %4d \n", a[i], b[i], c[i]); void dizitopla(int a[], int b[], int c[]) /* c = a +b */ int i; for (i=0; i<max; i++) c[i] = a[i] + b[i]; Sıralama Algoritması Dizi elemanlarının küçükten büyüğe veya büyükten küçüğe doğru dizilmesi işlemi. Selection Sort Dizinin en küçük elemanı bulunur ve birinci eleman ile yer değiştirilir. Bu işlem (n-1). elemana kadar tekrar edilir. Her adımda en küçük eleman dizinin kalan elemanlarından bulunur. 1. Dizinin en küçük elemanının indisini veren fonksiyon 2. Bu fonksiyoni kullanarak diziyi sıralama Buble Sort Bu yöntemde ardışıl iki eleman karşılaştırılır. Eğer önceki eleman sonrakinden büyük ise elemanlar yer değiştirilir. Bu şekilde dizi taranır. Eğer herhangi bir değişiklik yapılmış ise döngü işlemine tekrar edilir.
Çok Boyutlu Diziler Tanımlanması : Örneğin ; Tip Değişken_Adı[ indis1 ][ indis2 ][ indisn ]; float Enf[5][12]; C dilinde boyut sayısında bir sınır yoktur. Biligisayarın belleği boyutu sınırlar.!!! Çok boyutlu dizileri bir fonksiyona gönderirken ilk boyut dışındaki boyutların büyüklüklerini vermek zorunludur. Örnek : Bir kare matrisin 1. Matrisin simetrik olup olmamasını sınayan program 2. Matrisin transpozesini bir diğer matrise kopyalayan program 3. İki matrisinin çarpımını gerçekleştiren program 4. köşegeninin alt kısmındaki elemanları sıfırlayan yöntemi, 5. Determinantını hesaplayan fonksiyonu, 6. M<=P ve N<=Q olmak üzere A matrisi MxN ve B matrisi PxQ boyutlarındadır. B matrisi içerisinde A matrisininin olup olmadığı belirlenecektir. A matrisinin B matrisi içerisinde kaç kez bulunduğunu ve bunların B matrisi içerisinde başlangıç konumlarını (satır ve sütun olarak) veren programı yazınız. 7. MxN elemanlı bir matrisi tek boyutlu bir diziye dönüştüren program 8. P elemanlı bir diziyi MxN boyutlu matrise dönüştüren program (P sayısı M ve N e tam bölünür). /* Program Matris-2 */ #include <stdlib.h> #define SATIR 3 #define SUTUN 3 void matris_oku(int [][SUTUN]); void matris_yaz(int [][SUTUN]); int simetrik(int [][SUTUN]); /* matrisin simetrikliğini sınar */ void transpoze(int [][SUTUN], int [][SUTUN]); /* 2. = 1.nin transpozesi */ void matris_carp(int [][SUTUN], int [][SUTUN], int [][SUTUN]); /* 3 = 1*2 */ /*
alt_ucgen_sifirla(a); matris_yaz(a); printf("------------------------\n"); transpoze(a, b); matris_yaz(b); matris_carp(a, b, c); printf("------------------------\n"); matris_yaz(c); if (simetrik(a)) printf("simetriktir\n"); else printf("simetrik değildir\n"); */ getch(); void matris_oku(int a[][sutun]) int i, j; for (i = 0; i < SATIR; i++) for (j = 0; j < SUTUN; j++) a[i][j] = 1 + random(5); /* matris_oku */ void matris_yaz(int mat[][sutun]) int i, j; for (i = 0; i<satir; i++) for (j = 0; j<sutun; j++) printf("%3d ",mat[i][j]); printf("\n");
int simetrik(int a[][sutun]) int i,j; int durum; durum = 1; /*simetrik olduğunu varsay */ for (i = 0; i<satir; i++) for (j = 0; j<sutun; j++) if (a[i][j]!= a[j][i]) durum = 0; break; return durum; /* simetrik */ void transpoze(int a[][sutun], int b[][sutun]) int i, j; for (i = 0; i<satir; i++) for (j = 0; j<sutun; j++) b[i][j] = a[j][i]; void matris_carp(int a[][sutun], int b[][sutun], int c[][sutun]) /* c = a * b */ int i, j, k; for (i = 0; i<satir; i++) for (j = 0; j<sutun; j++) c[i][j] = 0; for (k=0; k<sutun; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j];
void alt_ucgen_sifirla(int a[][sutun]) int i,j; for (i = 0; i<satir; i++) for (j = 0; j<i; j++) a[i][j] = 0; int det(int a[][sutun]) int i, j, k; int s, sx1, sx2; s = 0; /* for (j = 0; j<sutun; j++) sx1 = 1; sx2 = 1; for (k = 0; k<satir; k++) i = (j + k) % SUTUN; sx1 = sx1 * a[k][i]; sx2 = sx2 * a[k][satir-k]; s = s + sx1 - sx2; */ return s;