Bu günkü konular
• Basit I/O
– scanf/printf
• Expressions (ifadeler)
– Aritmetik Operatörler (+, -, *, /, %, ++, --)
• Önişlemci komutları ve tanımlanmış sabitler
– #define direktifi
1
Klavye Input/ Monitör Output
• scanf/printf fonksiyonlarını kullanmayı başarmak
– Bu fonksiyonların tanımlamaları <stdio.h> dosyasının
içerisindedir. Bu yüzden bu tanımlamaları başlangıçta
eklememiz gerekiyor.
#include <stdio.h>
int main() {
scanf();
printf();
} /* son-main */
2
printf/scanf Foksiyonları
• C de formatlanmış input/output fonksiyonlarıdır
– Tanımlamaları standard I/O kütüphanesi içindedir.
<stdio.h>
– Eğer bu fonksiyonları kullanmak istiyorsak programımızın
başına #include <stdio.h> eklememiz gerekiyor.
printf(FormatString, ifade1, ifade2, …);
scanf(FormatString, &değişken1, &değişken2, …);
• FormatString çift tırnak arasında kullanılır
– "abcdxyz"
– “numara = %d\n"
• %d int (tam sayı) yazdırmak için kullanılan format türüdür.
3
printf Örnekler
int x = 45;
float y = 56.7;
printf(“Hangisi büyük?\n"); /*sadece mesaj yazdır*/
printf("x değeri: %d, ikincisi y: %f\n", x, y);
Format kısmı
İfade
kısmı
printf(“x ve y toplamı = %f\n", x+y);
Hangisi büyük?
x değeri: 45, ikincisi y: 56.70000
x ve y toplamı = 101.7000
4
printf Format belirtecleri
Karakter
Tip
Output Formatı
c
char
Bir byte karakter
d
int
İşaretli desimal integer
f
float
İşaretli ondalıklı sayılar [ – ]dddd.dddd
lf
double
İşaretli ondalıklı sayılar [ – ]dddd.dddd
e
float
double
İşaretli gerçek sayılar - bilimsel kodlamalı
[ – ]d.dddd e [sign]ddd
5
printf Örnekler
printf(“İlk satır.\nikinci satır. Yüzde karakter%% XYZ\n");
printf(“3. satır. Slaş \\, tek tırnak \'\n");
printf(“4. satır. Çift tırnak\". End\n");
printf("5. satır. karakter A:%c, ASCII değeri:%d\n", 'A', 'A');
printf("6. satır. Tab\tTab.\n");
printf("7. satır. Satır başı:\rOK\n");
printf("8. satır.\n");
İlk satır.
İkinci satır. Yüzde karakter% XYZ
3. satır. Slaş \, tek tırnak'
4. satır. Çift tırnak". End
5. satır. karakter A:A, ASCII değer:65
6. satır. Tab
Tab.
OK satır. Satır başı:
8. satır.
6
printf Örnekler
char c1 = 'A', c2 = 'c', c3 = '9', c4 = '\\';
int x = 11, y = 16;
float f = 56.7;
double d = 456.789345;
printf("c1 : <%c>, c2 : <%c>, c3: <%c>, c4: <%c>\n",
c1, c2, c3, c4);
printf("x : <%d>, y : <%d>, ort : <%d>\n", x, y, (x+y)/2);
printf("<%f> + <%lf> = <%lf>\n", f, d, f+d);
c1 : <A>, c2 : <c>, c3: <9>, c4: <\>
x : <11>, y : <16>, ort : <13>
<56.70000> + <456.7893450000000> = <513.4893450000000>
7
printf:
Alan uzunluğu belirtme & sağa-sola
yaslama
char ch = 'A';
printf("+-------+\n");
printf("|%7c|\n", ch);
printf("|%-7c|\n", ch);
printf(“+-------+\n");
ch için 7 boşluk ayrılır
ve sola yaslanır
ch için 7 boşluk ayrılır
ve sağa yaslanır.
+-------+
|
A|
|A
|
+-------+
8
printf:
Alan uzunluğu belirtme & sağa-sola
yaslama
char c1 = 'A', c2 = 'c';
int x = 11, y = 16;
float f = 56.7;
double d = 456.789345;
printf("+-------+-------+\n");
printf("|%7c|%-7c|\n", c1, c2);
printf("|%-7d|%7d|\n", x, y);
printf("|%7.2f|%-7.1lf|\n", f, d);
printf("+-------+-------+\n");
+-------+-------+
f için 7 boşluk ayrılır. 2 |
A|c
|
tanesi virgüllü kısım
|11
|
16|
için bir tanesi nokta ‘.’ | 56.70|456.8 |
için. Sağa yaslanır.
+-------+-------+
d için 7 boşluk ayrılır. 2
tanesi virgüllü kısım
için bir tanesi nokta ‘.’
için. Sola yaslanır.
9
printf Örnekler
printf("%.9f\n", 300.00145678901f);
printf("%.19lf\n", 300.0014567890123456789);
300.001464844
300.0014567890123700000
float ın 7 basamak hassasiyeti var (3000014)
double ın 16 rakam hassasiyeti var
(3000014567890123)
10
scanf Örnekler
char c;
int x;
float y;
double d;
scanf("%d", &x); /* bir int oku */
Format
kısmı
•
•
•
•
"%c" char
"%d" int
"%f" float
"%lf" double
Değişken
Adresi
scanf("%c", &c); /*bir karakter oku*/
scanf("%f", &y); /*bir float oku*/
scanf("%lf", &d); /*bir double oku */
/* 1 int, 1 float, 1 double oku*/
scanf("%d%f%lf", &x, &y, &d);
11
getchar ve putchar Fonksiyonları
• getchar klavyeden tek bir karakter alır
• putchar ekrana tek bir karakter yazar
• Örnek:
char c;
printf(“Ne yapalım Menu \n");
printf("
(a) Bir C programı yazalım\n");
printf("
(b) Yüzmeye gidelim \n");
printf("
(c) TV izleyelim\n");
printf(“Opsiyonlardan birini seç: ");
c = getchar(); /* Kullanıcı seçimini al*/
getchar();
/* yeni satıra geç '\n‘*/
/* karakterini koyar */
putchar('B'); /* Ekrana B yazdır */
c = 'Z';
putchar(c);
/* Ekrana Z yazdır */
12
İfadeler ?
• +,-,*,/,%... gibi matematiksel operatörlerin
kullanıldığı, bir değeri hesaplamak için kullanılan
matematiksel formüller
santigrat = (fahrenheit-32)/1.8;
alan = 3.14*yaricap*yaricap;
cevre = 2*3.14*yaricap;
hacim = uzunluk*genislik*yukseklik;
toplam = toplam + 5;
…
13
Aritmetik Operatörler
• Temel operatörler aritmetik işlemler için
kullanılan operatörlerdir. Genelde tüm
programlama dilleri için aynıdır.
+
Toplama
-
Çıkarma
*
Çarpma
/
Bölme
%
Mod alma (kalan verme)
++
1 Artırma
--
1 Eksiltme
Binary operatörler
(iki operanda uygulanır)
Unary operatörler
(bir tek operanda uygulanır)
14
Aritmetik Operatörler: Örnek
İşlem
Toplama
Çıkarma
Çarpma
Bölme
Modül
Operator
+
*
/
%
denklem
top
top
top
top
top
=
=
=
=
=
top
top
top
top
top
+ 2
– 2
* 2
/ 2
% 3
top un önceki
değeri
top un sonraki
değeri
4
4
4
6
2
8
2
1
4
4
İşlem
Operator
denklem
top un önceki
değeri
top un sonraki
değeri
Artırma
Eksiltme
++
--
++top
--top
4
4
5
3
15
Operator - Notlar
• Eğer iki operant intiger ise, bölme (/) işlemi
tam bölme yapar.
int a = 5;
int b = 4;
int sonuc = a/b; /* 1.25 -> 1 */
printf(“sonuc: %d\n", sonuc); /* ekrana 1 yazar*/
16
Karışık Operandlar
• Eğer operandlardan biri float/double ise diğer
operand işlemden önce otomatik olarak
float/double ye dönüştürülür.
– Eğer sol-değer integer ise, sonuç atanmadan önce tip
dönüştürme ile integer e dönüşür.
– Eğer sol-değer float/double ise, sonuç atanmadan
önce tip dönüştürme ile float/double a dönüşür.
int sonuc;
float fsonuc;
sonuc = 5/4.0;
fsonuc = 5/4.0;
/* 1.25 -> 1 */
/* 1.25 -> 1.25 */
printf(“sonuc: %d, fsonuc: %.2f\n”, sonuc, fsonuc);
17
Unary Operatorler
• sonuc = ++a; /* önce arttırılır, sonra atanır */
• Aşağıdakine denktir:
a = a+1;
sonuc = a;
• sonuc = --a; /* önce eksiltilir, sonra atanır*/
• Aşağıdakine denktir:
a = a-1;
sonuc = a;
18
Unary Operatorler - devam
• sonuc = a++; /* atanır, sonra arttırılır*/
• Aşağıdakine denktir:
sonuc = a;
a = a+1;
• sonuc = a--; /* atanır, sonra eksiltilir */
• Aşağıdakine denktir:
sonuc = a;
a = a-1;
• Unary operatorler int ve float/double operandlar ile
kullanılabilir. Fakat tipik olarak int ile kullanılır.
19
Birleşik Atama Operatörleri
• Birleşik atama operatörleri:
+=
-=
*=
/=
%= …
• Örneğin:
toplam += data;
a -= 6;
carpim *= data;
a %= 2;
a /= b+c;
…
/* toplam = toplam + data */
/* a = a – 6; */
/* carpim = carpim*data */
/* a = a % 2 */
/* a = a / (b + c) */
20
Birleşme & Öncelik
• Bir ifade birden fazla aynı tip operatör
içeriyorsa birleşme özelliği uygulanır.
sonuc = a+b+c;  sonuc = (a+b)+c; /* sol birleşme */
a = b = c;
 a = (b=c);
/* sağ birleşme */
• Eğer bir ifade birbirinden farklı operatörler
içeriyorsa , öncelik kuralı uygulanır.
sonuc = a+b*c;  sonuc = a+(b*c);
/* ‘*’ çarpma ‘+’ toplamadan */
/* daha önceliklidir.
*/
21
Birleşme & Öncelik Kuralları
Öncelik
Operator
1
2
3
4
++, -*, /, %
+, =, +=, -=,
..
• Bütün birleşme ve öncelik kurallarını hatırlamak
zordur.
• Bu yüzden ifadeleri parantez ile ayırmak en iyi
yöntemdir.
• sonuc = (a*b) + (a/b);
22
İfadeler Örnek(1)
int a = 10, b = 22;
int sonuc = a+b*3;
printf("a: %d, b: %d, <sonuc=a+b*3>: %d\n", a, b, sonuc);
a: 10, b: 22, <sonuc=a+b*3>: 76
int a = 10, b = 22;
int sonuc = (a+b)*3;
printf("a: %d, b: %d, <sonuc=(a+b)*3>: %d\n", a, b, sonuc);
a: 10, b: 22, <sonuc=(a+b)*3>: 96
23
İfadeler Örnek(2)
int a = 7, b = 9, c = 4;
int sonuc = (a+10)%b/c;
printf("a: %d, b: %d, c: %d, <sonuc=(a+10)%%b/c>: %d\n",
a, b, c, sonuc);
a: 7, b: 9, c: 4, <sonuc=(a+10)%b/c>: 2
int a = 7, b = 9, c = 4;
int sonuc = (a+10)%(b/c);
printf("a: %d, b: %d, c: %d, <sonuc=(a+10)%%(b/c)>: %d\n",
a, b, c, sonuc);
a: 7, b: 9, c: 4, <sonuc=(a+10)%(b/c)>: 1
24
İfadeler Örnek(3)
int a = 7, b = 8;
printf("a(önce): %d, ", a);
a *= b + 1;
printf("a(sonra): %d, b: %d\n", a, b);
a(önce): 7, a(sonra): 63, b: 8
a = b = c = 1;
printf("a(önce): %d, b(önce): %d, ", a, b);
a += b += c;
printf("a(sonra): %d, b(sonra): %d, c: %d\n", a, b, c);
a(önce): 1, b(önce): 1, a(sonra): 3, b(sonra): 2, c: 1
25
İfadeler Örnek(4)
a = 10; b = 5;
printf("a(önce): %d, b(önce): %d, ", a, b);
sonuc = (++a + ++b);
printf("a(sonra): %d, b(sonra): %d, sonuc: %d\n", a, b,sonuc);
a(önce): 10, b(önce): 5, a(sonra): 11, b(sonra): 6, sonuc: 17
a = 10; b = 5;
printf("a(önce): %d, b(önce): %d, ", a, b);
sonuc = (a++ + ++b);
printf("a(sonra): %d, b(sonra): %d, sonuc: %d\n", a, b,sonuc);
a(önce): 10, b(önce): 5, a(sonra): 11, b(sonra): 6, sonuc: 16
26
Örnek C Program (1)
#include <stdio.h>
Başla
Kullanıcıdan dönüştüreceğin
Fahrenhayt dereceyi girmesini iste
santigrat = (fahrenheit-32)/1.8
Fahrenhayt ve Santigrat
dereceleri ekrana yazdır.
Bitiş
/* Fahrenheit’ı santigrata dönüştür */
main()
{
float fahrenheit,santigrat;
printf(“fahrenheit sıcaklığı gir: “);
scanf(“%f”, &fahrenheit);
santigrat = (fahrenheit-32)/1.8;
printf(“%f fahrenheit derece %f
santigrat dereceye eşittir\n”,
fahrenheit, santigrat );
} /* son-main*/
27
Örnek C Program(2)
Başla
Kullanıcıdan sayı1 ve
sayı2 yi girmelerini iste
toplam = sayı1 + sayı2
çarpım = sayı1 * sayı2
ortalama =toplam/2
toplam, çarpım ve
ortalamayı ekrana yaz
Bitiş
#include <stdio.h>
/* 2 int sayının toplam, çarpım ve */
/* ortalamasını hesaplama */
main() {
int sayi1, sayi2;
int toplam, carpim, ortalama;
printf(“2 sayı girin: “);
scanf(“%d%d”, &sayi1, &sayi2);
toplam = sayi1+sayi2;
carpim = sayi1*sayi2;
ortalama = toplam/2;
printf(“toplam:%d, carpim:%d ort:%d \n”,
toplam, carpim, ortalama);
} /* son-main */
28
Örnek C Program(3)
Başla
Kullanıcıdan çemberin
yarıçapını girmesini iste
Çemberin yarıçapını al
cevre = 2*3.141592*yaricap
alan = 3.141592*yaricap*yaricap;
Çevre ve alanı
ekrana yazdır
Bitiş
#include <stdio.h>
/* çemberin çevresi ve alanını
hesaplama */
main() {
float yaricap, cevre, alan;
printf(“yaricap girin: “);
scanf(“%f”, &yaricap);
cevre = 2*3.141592*yaricap;
alan = 3.141592*yaricap*yaricap;
printf(“cevre: %f, alan: %f\n”, cevre,
alan);
} /* son-main */
29
Sembolik Sabit Gerekliliği…
• Bir önceki C programında iki defa PI =
3.141592 olarak kullandık.
• Bu şekilde sayıları C programlarında kullanmak
genelde hatalara sebebiyet verebilir.
– PI sayılarından birini yanlış yazabiliriz!
– Eğer PI sayısını daha hassas yazmak istesek tüm PI
sayılarını değiştirmemiz gerekecek ki buda hatalara
sebebiyet verebilir.
• Soru: Bir çözüm varmı?
– Evet: Sembolik sabitler
30
Sembolik Sabit Tanımlama
• #define önişlemci direktifi kullanılarak
tanımlanır. - #define
• Örnek:
#define TRUE 1
#define FALSE 0
#define PI 3.1415926535897932
• Sembolik sabit kullanımı:
– cevre = 2*PI*yaricap;
– alan = PI*yaricap*yaricap;
31
C Program -Örnek(3)
#include <stdio.h>
#define PI 3.1415926535897932
/* çemberin çevresi ve alanını hesaplama */
main() {
float yaricap, cevre, alan;
printf(“yarıçap girin: “);
scanf(“%f”, &yaricap);
cevre = 2*PI*yaricap;
alan = PI*yaricap*yaricap;
printf(“cevre: %f, alan: %f\n”, cevre, alan);
} /* son-main */
32
Sembolik Sabitlerin Çözümlenmesi
• Sembolik sabitler derleme
başlamadan önişlemci
tarafından çözümlenir
– Önişlemciler bul/değiştir gibi
çalışırlar
– Bulduğu her PI nin yerine
3.1415926535897932 yazar
– Önişlemciler aynı zamanda
açıklama satırlarını siler. Bu
sayede derleyici onlarla
uğraşmaz.
prog.c
PREPROCESSOR
prog.i
COMPILER
prog.s
ASSEMBLER
prog.o
printf.o
scanf.o
LINKER
prog.exe
LOADER + OS
program çalışması
33
Genel #define Hatası
• Buradaki hatayı bulun:
#define SIZE 5;
int main()
{
printf(“Size = %d\n”, SIZE);
}
• Önişlemcinin bul/değiştir yapmasından sonra:
int main()
{
printf(“Size = %d\n”, 5;);
}
34
Download

Program Kodlama-2