BİL131 – DERS 2 // 07.10.2013

0 168
C’YE GİRİŞ
1.1 BİLGİSAYAR NEDİR?
Bilgisayar bilgiyi işleyebilen, transfer edebilen ve saklayabilen elektronik bir alettir. Sayılar, karakterler, grafikler ve sesler gibi değişik veri tiplerini işleyebilir. İnsanlardan milyonlarca, hatta milyarlarca daha hızlı bir şekilde hesap yapabilirler, karar verebilirler. Örneğin, günümüzdeki ev bilgisayarları saniyede onlarca milyon toplama işlemi yapabilirken, bugün en hızlı bilgisayarlar olan süper bilgisayarlar saniyede yüz milyarlarca toplama işlemi
yapabilirler.
Bilgisayarların iki temel bölümü vardır: Donanım ve Yazılım. Donanım bilgisayarın fiziksel elemanları için kullanılır. Bilgisayarı oluşturan parçalar için (klavye, monitör, diskler, bellek, işlemci üniteleri gibi) söylenen terimdir. Yazılım ise, belli komutların kontrolünde bilgiyi işleyen bilgisayar programlarının genel adıdır. Bilgisayar programları bilgisayara yüklenir ve
hafızasının belli kısımlarında saklanır.
1.1.1 Bilgisayar Organizasyonu
Bilgisayarlar altı mantık ünitesinden (biriminden) oluşur. Şekil 1.1 bilgisayar birimlerinin mantıksal organizasyonunu göstermektedir. Bilgisayar birimleri şunlardır:
1. Giriş ünitesi. Herhangi bir bilgiyi (veriler ve bilgisayar programları) diğer birimlerin idaresi altında işlenmek üzere çeşitli giriş araçlarından alır. En sık kullanılan giriş elemanı daktilo benzeri klavyelerdir.
2. Çıkış ünitesi. Bilgisayar tarafından işlenen bilgiyi alarak bu bilginin bilgisayar dışında kullanılmasını sağlamak amacıyla çeşitli çıkış elemanlarına gönderir. En çok kullanılan çıkış elemanları monitörler ve yazıcılardır.
3. Bellek Ünitesi. Giriş ünitesinden alınan veriyi gerektiğinde işlenmek üzere saklı tutar. Bellek Ünitesi genellikle bellek ya da birincil bellek olarak adlandırılır.
4. Aritmetik ve Mantık ünitesi(ALU). Toplama, çıkarma, çarpma, bölme gibi işlemleri yapar. Hafızadaki iki veriyi karşılaştırarak eşit olup olmadıklarını belirlemek gibi karar mekanizmalarını içerir.

 

Şekil 1.1. Bilgisayar Mimarisi
5. Merkezi İşlem Ünitesi(CPU). Burası bilgisayarın “idari” birimidir. Bilgisayarın koordinatörü olmakla birlikte diğer birimlerin çalışmalarını denetler. CPU giriş birimlerine bilginin ne zaman okunacağını, ALU’ya hafızadaki verinin hesaplamalarda ne zaman kullanılacağını, çıkış birimlerine hafızadaki verinin ne zaman gönderileceğini söyler.
6. İkincil hafıza ünitesi. Bu uzun vadede kullanılan, yüksek kapasiteli bir depolama yeridir. Aktif olarak kullanılmayan programlar yada bilgiler ihtiyaç duyulana kadar saatlerce, günlerce, aylarca hatta yıllarca ikincil hafızada (diskler gibi) tutulur.
1.2 PROGRAMLAMA DİLLERİ
Programlar çeşitli programlama dillerinde yazılırlar. Bazıları bilgisayar tarafından diret olarak anlaşılabilirken, diğerlerinin ara çeviri basamaklarına ihtiyaçları vardır. Bilgisayar dilleri üç ana başlık altında toplanırlar:
1. Makine dilleri
2. Assembly dilleri
3. Yüksek seviye diller
Her bilgisayarın makine dili denilen kendine ait bir dili vardır. Makine dili, bilgisayarın devrelerini kontrol eden, anlamları çok açık olmayan çok detaylı komutların toplamına denir.
1 ve 0 sayılarının dizilerinden oluşur. Makine dilinde programlama yapmak kullanışsız ve hataya meyillidir. Makine diliyle yazılmış bir programda değişikler yapmak oldukça güçtür.
Tek bir veriyi silmek için bile, o veriyi oluşturan ve yönlendiren tüm komutlar
değiştirilmelidir. Bu nedenlerden, makine diliyle programlama pek çok programcı için çok yavaş ve de çok zorlu bir işti. Daha sonra programcılar assembly dilinin temellerini oluşturan İngilizce’ye benzer bir dil kullanmaya başladılar. Verilere bazı tanımlanmış isimler atandı.
Bilgisayarlar assembly dilini “anlamadıkları” için, assembly diliyle yazılmış programların öncelikle makine dili komutlarına çevrilmesi gerekiyordu. Fakat, assembly dilinin de, indeksleme ve saklama yerlerinin belirlenmesi, komplike komut satırları yazılması gibi uğraştırıcı detayları vardı. Programlama işini hızlandırmak amacıyla yüksek seviye diller geliştirildi. Günümüzde bilgisayar programları, komut seti insan dillerine ve düşüncesine daha yakın olan yüksek seviye dillerle yazılmaktadır. C, Basic, PL/1, Algol, Pascal, Fortran, cobol vs. bunlardan bazılarıdır. Yüksek seviyeli bir dilde yazılan ( bir uyarlayıcı veya çevirici yardımıyla ) bir program, çalıştırılmadan önce makine diline çevrilmelidir. Nasıl yapıldığına bağlı olarak, bu iş uyarlama veya çevirme olarak adlandırılır. Orijinal yüksek seviye program kaynak program, sonuçta ortaya çıkan makine dili program ise hedef program olarak adlandırılır.
C ilk olarak 1970’lerde Dennis Ritchie tarafından Bell Telephone Laboratuarı (Bugün AT&T Bell Laboratuvarı) ‘nda geliştirildi. 1978’de Brian Kernighan ve Ritchie dilin kesin bir tanımını yayınladıklarında, C’nin yalnızca Bell laboratuarı gibi sınırlı bir kullanım alanı vardı.
1980lerin ortalarında C’nin popülaritesi geniş alanlara yayıldı. Çok sayıda C uyarlayıcısı (compiler) ve çeviricisi (interpreter) her boyuttaki bilgisayar için yazıldı ve pek çok ticari uygulama programı geliştirildi. C’nin çoğu ticari uygulaması, Kenighan ve Ritchie’nin orijinal tanımından farklıydı. Bu durum dilin farklı versiyonları arasında ufak tefek uyumsuzluklara yol açtı. Bunun sonucu olarak Amerikan Ulusal Standartlar Enstitüsü C dilinin standart bir tanımı üzerinde çalışmaya başladı. Bu kitap yazılırken hala geliştirilen
ANSI projesi, yakında bitmek üzeredir. Çoğu ticari C uyarlayıcı ve çeviricilerinin ANSI standartlarına uymaları beklenmektedir.
1.3 BİR C PROGRAMININ YAPISI
Her C programı, biri main olarak adlandırılan bir veya daha fazla fonksiyondan meydana gelir. Program her zaman main fonksiyonunu (ana fonksiyon) çalıştırarak başlar. Main’den önce veya sonra tanımlanmış diğer fonksiyonlar olabilir.
Her fonksiyon şunları içermelidir:
1. Fonksiyonun adını içeren fonksiyon başlığı ve sonrasında parantez içinde
argümanların olduğu bir liste.
2. Başlıkta argümanlar varsa bu argümanların bir listesi.
3. Fonksiyonun kalanını oluşturan ifadeler dizisi.
Argümanlar fonksiyon ve programın diğer kısımları arasında taşınan bilgileri gösteren sembollerdir. Argümanlara parametre de denir. Her ifade dizisi birden fazla temel ifadeden oluşur ve {} parantezlerinin içine yazılır. İfade dizileri başka ifade dizilerini de kapsayabilir. Bu yüzden, ifade dizileri iç içe olabilir. Her bir ifade bir noktalı virgülle (;) bitirilmelidir. /* ve */ işaretleri arasında yer aldıktan sonra, programla ilgili açıklamalar programın içinde herhangi bir yere yazılabilir. Bu açıklamalar, programın temel özelliklerini belirtme veya
programın mantığını açıklama bağlamlarında oldukça faydalıdırlar.
Örnek 1.1. “ C Programına Hoş geldiniz!” ifadesini ekrana basacak basit bir C programı yazalım.
#include <stdio.h>                                           /* Library dosyasını kullan*/
main()                                                                              /* Ana fonksiyon */
{
printf (“C Programına Hoş geldiniz! \n”);             /*Çıktı ifadesi */
}
Örnek 1.2. Karenin bir kenarını alıp alanını hesaplayarak ekranda gösteren basit bir C programı aşağıdaki gibidir:
/* karenin alanını hesaplayan program */
#include <stdio.h>                                           /* Library dosyasına erişim*/
main()
{
float side, area;                                                 /*Değişkenlerin belirtilmesi*/
printf (“Side =? ”);                                            /*Çıktı ifadesi */
scanf(“%f”,&side);                                            /*Girdi ifadesi */
area=side*side;                                                 /*Atama ifadesi */
printf(“Area=%f”,area);                                  /*Çıktı ifadesi*/
}
Açıklamalar tüm programın oluşumunu vurgulamaktadır.
1.4 C’NİN TEMELLERİ
1.4.1 C Karakter Seti
Herhangi bir C programında kullanılabilen karakterlerin setidir. C karakter seti A’dan Z’ye büyük harfler, a’dan z’ye küçük harfler 0’dan 9’a rakamlar ve temel program elemanlarının yapı taşlarını oluşturan belli özel karakterleri ( sabitler, değişkenler, operatörler, ifadeler vs. ) kapsar.
Özel karakterler şunlardır:
! * + \ / “ < > ( ) # = ~ ; { } [ ] ? & , . % ^ – : _ ‘ | @ $
C bu karakterlerin escape dizileriyle açıklanabilen belirli kombinasyonlarını kullanır. Bunlar her zaman ters bölü işaretiyle başlar ve arkalarından bir veya daha fazla özel karakter bunları izler. Örneğin, C’de yeni satır \n şeklinde gösterilebilir.
1.4.2. Tanımlayıcılar ve Anahtar Kelimeler
C’de değişkenlerin, fonksiyonların, etiketlerin ve dizilerin (array) adlarına tanımlayıcı denir. Tanımlayıcılar, ilk karakter bir harf olmak kaydıyla harfler ve rakamlardan oluşur. Büyük ve küçük harflerin ikisi de kullanılabilir, fakat
çoğu tanımlayıcı için küçük harflerin kullanımı daha yaygındır. Büyük harf küçüğüne eşit değildir. Alt çizgi ( _ ) de karakter olarak kullanılabilir.
Geçerli tanımlayıcılara örnek olarak şunlar verilebilir: x z44 orta temperature _isim text_lines FIRST vs.
Şunlar ise geçersizdir: “y” 5ci id-no error flag
C’nin bazı uygulamaları 9 karakter uzunluğundaki tanımlayıcıları tanırken, çoğu uygulama 31 karakteri tanımaktadır.
C’de bazı kelimeler (anahtar kelimeler) in standart, önceden tanımlanmış anlamları vardır. Bunlar belirli amaçlar için kullanılırlar. Örneğin: auto, extern, break, for, while, struct, static, goto, char, if, long, void, float, return, switch vs.
Herhangi bir tanımlayıcı bir C anahtar kelimesiyle aynı olamaz ve C library’sindeki fonksiyonlarla aynı ismi taşıyamaz.
1.4.3 Veri tipleri
Veri çeşitli tiplere ayrıştırılmıştır. Veri tipi, verinin belirli bir değer kümesine ait olmasını sağlar. Örneğin, bazı makinelerde, int veri tipi -32,768’den 32,767’ye kadar olan tam sayı değerlerini alabilir ve hafızada 2 byte’lık yer kaplar. C aşağıdaki temel veri tiplerini desteklemektedir:
Veri tipi                     Tanım                                      Hafızada kapladığı yer
int                                  tam sayı değer                                      2 byte ya da 1 kelime
char                                tek karakter                                           1 byte
float                               ondalık sayı                                           1 kelime (4 byte)
double                          çifte kesinlikle ondalık sayı               2 kelime (8 byte)
Bazı temel tipler veri tipi nitelendiricileri short, long, signed ve unsigned kullanılarak genişletilebilir. short intlong intsigned int, vs. short int ve int 2 byte, long int 4 byte’lık yer kaplar. Unsigned int sıradan int’le aynı miktar belleğe ihtiyaç duyar. int –32,768’den 32,768’e kadar değer alabilir. Unsigned int ise 0’dan 65,535’e kadar değer alır.
char tipi tek karakterleri göstermek için kullanılır. Bu yüzden char tipi 1 byte’lık hafızaya ihtiyaç duyar. 0’dan 255’e kadar olan sıraya izin verir.Unsigned char veri tipi 0’dan 255’e kadar uzanırken, signed char veri tipi -128’den 127’ye kadar değerler alır.
Bazı uyarlayıcılar long nitelendiricisinin float ve double’la kullanılmasına izin verirler. Long float veya long double gibi.
Aşağıdaki tabloda bütün veri tiplerinin minimal uzunlukları ve yaklaşık bit genişlikleri verilmiştir:

 

1.4.4 Değişkenlerin Deklarasyonu
Değişken, bir işlemde kullanılan değerlerin saklanmasını sağlayan şeydir. C’deki her değişkenin bir tipi vardır ve ifadelerde kullanılmadan önce veri tipinin belirlenmiş olması lazımdır. Bir deklarasyon bir veya virgüllerle ayrılmış daha fazla değişken ismiyle takip edilen bir veri tipinden oluşur.
Örnek 1.3. Bir C programı aşağıdaki gibi deklarasyonlara sahip olabilir:
int x, y, z;
float root, balance;
char ch1, line[80];
Böylelikle x, y ve z tam sayı değişkenleri, root ve balance ondalık değişkenler, ch1 karakter tipli bir değişken ve line karakter tipli 80 elemanlı bir dizi olarak tanımlanmışlardır. Köşeli parantezlerin büyüklüğü içerdiğine dikkat ediniz.
1.4.5 Anlatımlar ve İfadeler
Anlatım, tek bir sayı veya tek bir karakter gibi bir veriyi gösterir. Bir tek elemandan veya operatörlerle birleştirilmiş birden fazla benzer elemanlardan oluşabilir. Mantıksal bir durumu da gösterebilir. Bazı basit anlatımlar aşağıda gösterilmiştir.
x+y
y=x
x<=y
++i
İfadeler ise, çeşitli işlemler yapan operatörleri içerirler. Bir anlatım ifadesi noktalı virgülle sonlanmış bir ifadeyi içerir.
Örnek 1.4. Anlatım ifadeleri
x=3;
z=x+y;
++i;
printf(“Alan=%f”,alan);
İfadeler dizisi ise { } parantezleri arasında sıralanmış bazı ifadeleri içerir.
Örnek 1.5. İfade dizisi.
{
8
uzunluk = 15;
en= 10;
alan=uzunluk*en;
}
Kontrol ifadeleri kontrol yapılarını içerirler. Mantık testleri, döngüler ve dallanmalar oluşturmak için kullanılırlar.
Örnek 1.6. Kontrol ifadesi, belli bir koşul sağlanana dek içinde işlemlerin tekrar tekrar yapıldığı şartlı bir döngü oluşturur.
while (i <= n)
{
printf(“x = “);
scanf(“%f”, &x);
sum += x;
++i;
}
Bu kontrol ifadesi aynı zamanda bir ifadeler dizisi(bileşik ifade) içermektedir.
1.4.6 Sembolik Sabitler
Sembolik sabit program çalışırken değeri değişmeyen bir yapıdır. Sembolik sabit nümerik bir değer ( tam veya ondalık sayılar ), bir karakter veya bir dizgi olabilir.
Sembolik sabitler genellikle programın başında tanımlanırlar. Daha sonra, programın içinde gösterdikleri sayının yerine kullanılırlar.
Sembolik sabit şöyle tanımlanır.
#define isim metint
burada isim genellikle büyük harflerle yazılmış sembolik isme, metin de sembolik isimle ilişkilendirilmiş karakter dizisine tekabül etmektedir.metin’in noktalı virgülle bitmediğine dikkat ediniz. Şayet metin noktalı virgülle bitseydi, o noktalı virgül de sembolik ismin yerine geçtiği karakterin bir parçası gibi düşünülecekti.
Örnek 1.7. Bir C programı aşağıdaki sembolik sabit tanımlarını içermektedir.
#define COEF 0.23
#define PI 3.141593
#define TRUE 1
#define ISIM “Sanan”
programda aşağıdaki ifadenin olduğunu varsayınız
alan = PI * radius * radius;
program çalıştığında, yukarıdaki ifade aşağıdaki işlemi gerçekleştirecektir:
alan = 3.141593*radius*radius;
1.5 OPERATÖRLER VE EXPRESSIONLAR
Operatörler, matematiksel ve mantıksal işlemlerin yapılmasını sağlayan sembollerdir. C’de çeşitli kategorilere ayrılabilecek çok sayıda operatör vardır. Özellikle, aritmetik operatörler, tekil operatörler, ilişkisel ve mantıksal operatörler, atama operatörleri ve koşul operatörü anlatımlar oluşturmak üzere kullanılırlar.
Operatörlerin üzerlerinde işlem yaptığı verilere operand denir. Bazı operatörler tek operanda, bazılarıysa iki operanda gereksinim duyarlar. Çoğu operandlar tekil operatörlerin anlatım olmasına izin verirler. Birkaç operatör ise yalnızca tek değişkenleri operand olarak kabul ederler.
1.5.1 Aritmetik Operatörler
C aşağıdaki aritmetik operatörleri kullanır.
Operatör Amaç
+           toplama
–            çıkarma
*            çarpma
/            bölme
% tam sayılarla bölmeden sonra kalan % operatörüne bazen modulus operatör de denir. C’de üstel operatör yoktur. Fakat, üs alma işlemleri için (pow) library fonksiyonu kullanılır.
Aritmetik operatörlerle işlem yapılan operandlar sayısal değerler olmalıdırlar. Bu yüzden, operandlar tam sayı değerler, ondalık değerler veya karakterler olabilirler.
1.5.2 İlişkisel ve Mantıksal Operatörler
C’de aşağıdaki ilişkisel operatörler kullanılır.
Operatör Anlamı
<           küçük
<=        küçük veya eşit
>           büyük
>=        büyük veya eşit
Aşağıdaki iki eşitlik operatörü de ilişkisel operatörlerle yakından ilişkilidir.
Operatör Anlamı
= =       eşit
! =         eşit değil
Bu operatörler soldan sağa doğru işlem yaparlar. Doğru ya da yanlış ( 0 ya da 1 ) durumlarını belirten mantıksal ifadeleri oluşturmak için kullanılırlar. Sonuçtaki ifadeler tam sayı olur. Bunlara ilaveten C iki mantıksal operatör içerir.
Operatör Anlamı
&&        VE
||          VEYA
Bunlar doğru ya da yanlış olan daha kompleks durumlar oluşturmak işin kullanılırlar.
Mantıksal ve (&&) işleminin doğru olması bu işlemin bütün operandlarının doğru olmasıyla doğru olacaktır. Eğer operandlardan biri yanlışsa mantıksalve işleminin sonucu yanlış olur.
Oysa, operandlardan biri doğruysa, mantıksal veya (||) işleminin sonucu doğru olur. İşlem yapılan bütün operandlar yanlışsa mantıksal veyaişleminin sonucu yanlış olur.
Örnek 1.8.
 i = 4; c = ’w’
(i >= 4) && (c == ’w’)       true 1
(i >= 3) || (c == ’119’)       true 1
(i < 3) && (c == ’w’)          false 1
1.5.3 Atama Operatörleri
En sık kullanılan atama operatörü =’tir. Bu operatör aşağıdaki şekilde yazılır:
Tanımlayıcı = anlatım
Burada tanımlayıcı bir değişkeni, anlatım ise herhangi bir sabiti, değişkeni veya daha
karmaşık bir anlatımı ifade eder. Atama operatörlerine tamamlanmış ifadeler olarak yazıldıklarından, genelde atama ifadeleri denir.
Örnek 1.9. Aşağıda = operatörünü kullanan bazı eşitlik ifadeleri yer almaktadır.
x =5;
x = y
delta = 0.001;
toplam = a + b;
s = uzunluk* en;
Atama operatörü = ile eşitlik operatörü == birbirinden tamamıyla farklıdır. Atama
operatörü bir tanımlayıcıya bir değer atamaya, eşitlik operatörü ise iki ifadenin aynı değere sahip olup olmadığını belirlemeye yarar. C’de birden fazla atamayı aynı anda yapabilmek mümkündür.
ifade1 = ifade2 = … = expression
Örnek 1.10. i, j ve k tam sayı değerler olsun. 6 tam sayısı i, j ve k değerlerinin hepsine atanabilir:
i =j = k = 6;
1.5.4 Tekil Operatörler
Yeni bir değer üretmek için tek bir operand üzerinde işlem yapan operatörlere tekil operatörler denir. Tekil operatörler genelde operandlarından önce gelirler. En sık karşılaşılan tekil işlem sayısal bir sabitin, değişkenin veya ifadenin öncesinde eksi işaretinin olduğu tekil eksiişlemidir. Tekil eksi işleminin çıkarmayı sembolize eden ( – ) aritmetik operatöründen tamamıyla farklı olduğuna dikkat ediniz. Çıkarma operatörü iki ayrı operanda gereksinim duyar.
Örnek 1.11. Tekil eksi işleminin kullanılışını gösteren çeşitli örnekler aşağıdadır:
-0.56                -6E-5
-root                -5*(x + y)
Her bir durumda eksi işareti sabit tam sayı, sabit ondalıklı sayı, sayısal bir değişken veya aritmetik bir ifadeyle takip edilmektedir.
Sıklıkla kullanılan diğer tekil operatörler ise arttırma operatörü ++ veazaltma operatörü – – ‘dir. Arttırma operatörü değişkeninin bir artmasını, azaltma operatörü ise değişkeninin bir azalmasını sağlar. Bu operatörlerle kullanılan operandlar tek değişkenli olmalıdır.
Örnek 1.12. i bir tam sayı değişken ve i = 1 olsun. Öyleyse ++i yazmak, i = i + 1 yazmakla aynı şeydir ve i’nin yeni değeri 2 olur. Benzer şekilde, –i ifadesi i = i – 1 ifadesine eşittir ve i’nin değerini 0 yapar.
Operatör operand’dan önce geliyorsa (++i durumunda olduğu gibi) operand programda kullanılmadan önce değiştirilir. Eğer, operatör operand’dan sonra geliyorsa ( i++ gibi) operand kullanıldıktan sonra değiştirilir.
Örnek 1.13. i = 1 olsun ve program aşağıdaki printf ifadelerini içersin.
printf(“i = %d\n”,i);
printf(“i = %d\n”, ++i);
printf(“i= %d\n”, i);
printf(“i = %d\n”, i++);
printf(“i= %d\n”, i);
Her printf komutu bir satır yaratır.
i = 1
i = 2
12
i = 2
i = 2
i = 3
Diğer bir tekil operatör ise sizeof’tur. Bu operatör operandının byte olarak büyüklüğünü döndürür.
Örnek 1.14. i bir tam sayı değişken, x bir ondalık değişken, d çifte-kesinlikli bir değişken, c de bir karakter değişkeni olsun.
printf(“integer: %d\n”,sizeof i);
printf(“float: %d\n”,sizeof x);
printf(“double: %d\n”,sizeof d);
printf(“character: %d\n”,sizeof c);
Aşağıdaki çıktı oluşur:
integer: 2
float: 4
double: 8
character: 1
1.5.5 Koşul Operatörü
koşullu işlemler koşul operatörü ( ? : ) aracılığıyla yapılabilir. Bu tip bir ifade daha çok bilinen if-else ifadesinin yerine kullanılabilir.
expression 1 ? expression 2 : expression 3
bu koşullu ifadede, önce expression 1 hesaplanır. expression 1 doğruysa ( yani değeri 0’den farklıysa ), expression 2 hesaplanır ve sonuç koşullu ifadenin değerini verir. expression 1 yanlışsa (yani değeri sıfırsa),expression 3 hesaplanır ve bu sonuç koşullu ifadenin sonucu olur. Koşullu bir ifadenin sonucunu bulurken iki ifadeden yalnızca birinin ( expression 2 ya da expression 3 ) hesaplandığına dikkat ediniz.
Örnek 1.15. Koşullu içeren bir atama ifadesi aşağıdadır.
min = (x <y) ? x : y ;
x<y ise x, değilse y min değişkenine atanacaktır

Senin bu konuya yorumun ne olacak?

Gerekli *

HAKKIMIZDA

facebook twitter youtube flickr ENOTLAR TV LOGOSU_Artboard 13 - ENOTLAR TV LOGO

Arşivler

KAREKOD-umuz

Lower-Third-(Enotlar)